diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 000000000..86c5ce540 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 08c226f57982fca33cc7beee8c87c901 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/README.html b/README.html new file mode 100644 index 000000000..bf39595cc --- /dev/null +++ b/README.html @@ -0,0 +1,753 @@ + + + + + + + + + + + Welcome to the CESM Tutorial — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Welcome to the CESM Tutorial

+ +
+ +
+
+ + + + +
+ +
+

Welcome to the CESM Tutorial#

+
+

In 1983 NCAR created the Community Climate Model (CCM) as a freely available global atmosphere model for use by the climate research community. The scope of CCM development continued to expand and in 1994 NCAR scientists released the Climate System Model (CSM), a global model that included component models for the atmosphere, land surface, ocean, and sea-ice, communicating through a central coupler component. To recognize the broad community of users and sponsors contributing to this effort, the CSM was renamed the Community Climate System Model (CCSM). The CCSM model evolved to include ice sheet and biogeochemical modeling and was renamed the Community Earth System Model (CESM) in 2013.

+

This repository includes materials designed to be an introduction to running the CESM. The materials were developed to support the CESM tutorial and serve as reference documentation for all CESM users.

+
+

Goals of This Tutorial#

+

Through this online tutorial you will learn how to run the CESM model, modify the model experiments, and use the model output. These tutorial materials are designed for the CESM version 2 (CESM2)

+
+
+

Yearly In-Person Tutorials#

+

The CESM tutorial was started in 2010 and is typically offered as an in-person summer workshop. If you are interested in attending the tutorial, please see the CESM webpage for the most up to date information about when the tutorial will next be offered in Boulder, Colorado and the timeline for applying.

+
+
+

CESM Project Funding#

+

This material is based upon work supported by the National Center for Atmospheric Research (NCAR), which is a major facility sponsored by the National Science Foundation (NSF) under Cooperative Agreement No. 1852977. Staff time on this project was also supported by the Climate and Global Dynamics (CGD) laboratory.

+
+
+

Acknowledgements#

+

A number of people have been critical to this effort, including:

+
    +
  • Cecile Hannay, David Bailey, Peter Lawrence, Hui Li, Sophia Macarewich, Jesse Nusbaumer, Adam Phillips, and Kate Thayer-Calder who serve on the CESM tutorial committee and put together the tutorial materials.

  • +
  • Alice DuVivier, Brian Dobbins, Gunter Leguy, and Gustavo Marques, who helped test materials and have contributed substantially.

  • +
  • Elizabeth Faircloth, who supports the CESM program administratively and without whom everything would probably fall apart.

  • +
  • David Lawrence, who supported this effort as CESM chief scientist.

  • +
  • Testers, others…

  • +
+
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_images/19e7e1d8c86213c1e67fd671db564e5bc11031544651f28121af9fd5edf24d5e.png b/_images/19e7e1d8c86213c1e67fd671db564e5bc11031544651f28121af9fd5edf24d5e.png new file mode 100644 index 000000000..bab1510f9 Binary files /dev/null and b/_images/19e7e1d8c86213c1e67fd671db564e5bc11031544651f28121af9fd5edf24d5e.png differ diff --git a/_images/CAMchem_compsets.png b/_images/CAMchem_compsets.png new file mode 100644 index 000000000..f5e1feae1 Binary files /dev/null and b/_images/CAMchem_compsets.png differ diff --git a/_images/CESM2.png b/_images/CESM2.png new file mode 100644 index 000000000..5319aa24a Binary files /dev/null and b/_images/CESM2.png differ diff --git a/_images/CESM2_CIME_Infrastructure.png b/_images/CESM2_CIME_Infrastructure.png new file mode 100644 index 000000000..4d8770c17 Binary files /dev/null and b/_images/CESM2_CIME_Infrastructure.png differ diff --git a/_images/CESM2_Code_Components_List.png b/_images/CESM2_Code_Components_List.png new file mode 100644 index 000000000..fb516aa9f Binary files /dev/null and b/_images/CESM2_Code_Components_List.png differ diff --git a/_images/CESM2_Create_Newcase_Command.png b/_images/CESM2_Create_Newcase_Command.png new file mode 100644 index 000000000..8390902d8 Binary files /dev/null and b/_images/CESM2_Create_Newcase_Command.png differ diff --git a/_images/CESM2_Create_Newcase_Compset.png b/_images/CESM2_Create_Newcase_Compset.png new file mode 100644 index 000000000..5f927d6d2 Binary files /dev/null and b/_images/CESM2_Create_Newcase_Compset.png differ diff --git a/_images/CESM2_Create_Newcase_Resolution.png b/_images/CESM2_Create_Newcase_Resolution.png new file mode 100644 index 000000000..2f1b5c083 Binary files /dev/null and b/_images/CESM2_Create_Newcase_Resolution.png differ diff --git a/_images/CESM2_Discuss.png b/_images/CESM2_Discuss.png new file mode 100644 index 000000000..58f7c9735 Binary files /dev/null and b/_images/CESM2_Discuss.png differ diff --git a/_images/CESM2_Events.png b/_images/CESM2_Events.png new file mode 100644 index 000000000..bd0e2fc08 Binary files /dev/null and b/_images/CESM2_Events.png differ diff --git a/_images/CESM2_MCT_Coupling.png b/_images/CESM2_MCT_Coupling.png new file mode 100644 index 000000000..9822674d2 Binary files /dev/null and b/_images/CESM2_MCT_Coupling.png differ diff --git a/_images/CESM2_Porting.png b/_images/CESM2_Porting.png new file mode 100644 index 000000000..7c027d624 Binary files /dev/null and b/_images/CESM2_Porting.png differ diff --git a/_images/CESM2_Workspaces_Code.png b/_images/CESM2_Workspaces_Code.png new file mode 100644 index 000000000..d78ea9326 Binary files /dev/null and b/_images/CESM2_Workspaces_Code.png differ diff --git a/_images/CESM2_Workspaces_Detail.png b/_images/CESM2_Workspaces_Detail.png new file mode 100644 index 000000000..a6467f77e Binary files /dev/null and b/_images/CESM2_Workspaces_Detail.png differ diff --git a/_images/CESM2_case_build.png b/_images/CESM2_case_build.png new file mode 100644 index 000000000..926ad2909 Binary files /dev/null and b/_images/CESM2_case_build.png differ diff --git a/_images/CESM2_case_setup.png b/_images/CESM2_case_setup.png new file mode 100644 index 000000000..4b4e45274 Binary files /dev/null and b/_images/CESM2_case_setup.png differ diff --git a/_images/CESM2_case_submit.png b/_images/CESM2_case_submit.png new file mode 100644 index 000000000..8a86aed55 Binary files /dev/null and b/_images/CESM2_case_submit.png differ diff --git a/_images/CESM2_create_newcase.png b/_images/CESM2_create_newcase.png new file mode 100644 index 000000000..88eae4a71 Binary files /dev/null and b/_images/CESM2_create_newcase.png differ diff --git a/_images/CESM2_github_CESM.png b/_images/CESM2_github_CESM.png new file mode 100644 index 000000000..7ce5ee078 Binary files /dev/null and b/_images/CESM2_github_CESM.png differ diff --git a/_images/CESM2_github_ESCOMP.png b/_images/CESM2_github_ESCOMP.png new file mode 100644 index 000000000..d9535bc7c Binary files /dev/null and b/_images/CESM2_github_ESCOMP.png differ diff --git a/_images/CESM2_github_main.png b/_images/CESM2_github_main.png new file mode 100644 index 000000000..08f088223 Binary files /dev/null and b/_images/CESM2_github_main.png differ diff --git a/_images/CESM2_short_term_archive.png b/_images/CESM2_short_term_archive.png new file mode 100644 index 000000000..1daa6113e Binary files /dev/null and b/_images/CESM2_short_term_archive.png differ diff --git a/_images/CESM2_xml_files.png b/_images/CESM2_xml_files.png new file mode 100644 index 000000000..04a1dbf4d Binary files /dev/null and b/_images/CESM2_xml_files.png differ diff --git a/_images/CESM_NUOPC_Coupling.png b/_images/CESM_NUOPC_Coupling.png new file mode 100644 index 000000000..13440abd6 Binary files /dev/null and b/_images/CESM_NUOPC_Coupling.png differ diff --git a/_images/CESM_directories_and_SourceMods.png b/_images/CESM_directories_and_SourceMods.png new file mode 100644 index 000000000..76b2f506c Binary files /dev/null and b/_images/CESM_directories_and_SourceMods.png differ diff --git a/_images/CESM_directories_and_log_files.png b/_images/CESM_directories_and_log_files.png new file mode 100644 index 000000000..29e2a87d0 Binary files /dev/null and b/_images/CESM_directories_and_log_files.png differ diff --git a/_images/CESM_directories_and_namelists.png b/_images/CESM_directories_and_namelists.png new file mode 100644 index 000000000..2598d396d Binary files /dev/null and b/_images/CESM_directories_and_namelists.png differ diff --git a/_images/CESM_exp_1.png b/_images/CESM_exp_1.png new file mode 100644 index 000000000..1e302bc66 Binary files /dev/null and b/_images/CESM_exp_1.png differ diff --git a/_images/CESM_exp_2.png b/_images/CESM_exp_2.png new file mode 100644 index 000000000..5ce5d00ca Binary files /dev/null and b/_images/CESM_exp_2.png differ diff --git a/_images/CESM_exp_3.png b/_images/CESM_exp_3.png new file mode 100644 index 000000000..6c5aff854 Binary files /dev/null and b/_images/CESM_exp_3.png differ diff --git a/_images/CESM_github.png b/_images/CESM_github.png new file mode 100644 index 000000000..27c520684 Binary files /dev/null and b/_images/CESM_github.png differ diff --git a/_images/Diagnostics_1.png b/_images/Diagnostics_1.png new file mode 100644 index 000000000..fbd312ac3 Binary files /dev/null and b/_images/Diagnostics_1.png differ diff --git a/_images/Diagnostics_2.png b/_images/Diagnostics_2.png new file mode 100644 index 000000000..6d5a45cff Binary files /dev/null and b/_images/Diagnostics_2.png differ diff --git a/_images/Diagnostics_3.png b/_images/Diagnostics_3.png new file mode 100644 index 000000000..1ae2d4cef Binary files /dev/null and b/_images/Diagnostics_3.png differ diff --git a/_images/Diagnostics_4.png b/_images/Diagnostics_4.png new file mode 100644 index 000000000..cfe049d61 Binary files /dev/null and b/_images/Diagnostics_4.png differ diff --git a/_images/Diagnostics_5.png b/_images/Diagnostics_5.png new file mode 100644 index 000000000..d7b23c815 Binary files /dev/null and b/_images/Diagnostics_5.png differ diff --git a/_images/Diagnostics_6.png b/_images/Diagnostics_6.png new file mode 100644 index 000000000..36f0b4afd Binary files /dev/null and b/_images/Diagnostics_6.png differ diff --git a/_images/Diagnostics_7.png b/_images/Diagnostics_7.png new file mode 100644 index 000000000..361fe6ec1 Binary files /dev/null and b/_images/Diagnostics_7.png differ diff --git a/_images/Diagnostics_8.png b/_images/Diagnostics_8.png new file mode 100644 index 000000000..2115a58bc Binary files /dev/null and b/_images/Diagnostics_8.png differ diff --git a/_images/Diagnostics_duo_pcode.png b/_images/Diagnostics_duo_pcode.png new file mode 100644 index 000000000..e5968c346 Binary files /dev/null and b/_images/Diagnostics_duo_pcode.png differ diff --git a/_images/Fcompset.png b/_images/Fcompset.png new file mode 100644 index 000000000..5c20712ca Binary files /dev/null and b/_images/Fcompset.png differ diff --git a/_images/NCVIEW_App_Window.png b/_images/NCVIEW_App_Window.png new file mode 100644 index 000000000..ddcaa594a Binary files /dev/null and b/_images/NCVIEW_App_Window.png differ diff --git a/_images/NCVIEW_Jan0001_PRECC.png b/_images/NCVIEW_Jan0001_PRECC.png new file mode 100644 index 000000000..d6e61b7ec Binary files /dev/null and b/_images/NCVIEW_Jan0001_PRECC.png differ diff --git a/_images/NCVIEW_Jan0001_PRECL.png b/_images/NCVIEW_Jan0001_PRECL.png new file mode 100644 index 000000000..c6eaf8ec1 Binary files /dev/null and b/_images/NCVIEW_Jan0001_PRECL.png differ diff --git a/_images/NCVIEW_Jan0001_TS.png b/_images/NCVIEW_Jan0001_TS.png new file mode 100644 index 000000000..a3c064ce9 Binary files /dev/null and b/_images/NCVIEW_Jan0001_TS.png differ diff --git a/_images/Precip_isotope_Cartoon.jpg b/_images/Precip_isotope_Cartoon.jpg new file mode 100644 index 000000000..ea34a7794 Binary files /dev/null and b/_images/Precip_isotope_Cartoon.jpg differ diff --git a/_images/WACCM_compsets1.png b/_images/WACCM_compsets1.png new file mode 100644 index 000000000..d4236de65 Binary files /dev/null and b/_images/WACCM_compsets1.png differ diff --git a/_images/WACCM_compsets2.png b/_images/WACCM_compsets2.png new file mode 100644 index 000000000..668980bf2 Binary files /dev/null and b/_images/WACCM_compsets2.png differ diff --git a/_images/a9c31dcbdc46b7741ccba9cf1c77e876cfa663c218434ffb3081171289102baf.png b/_images/a9c31dcbdc46b7741ccba9cf1c77e876cfa663c218434ffb3081171289102baf.png new file mode 100644 index 000000000..ff743729a Binary files /dev/null and b/_images/a9c31dcbdc46b7741ccba9cf1c77e876cfa663c218434ffb3081171289102baf.png differ diff --git a/_images/advanced_plot_1.png b/_images/advanced_plot_1.png new file mode 100644 index 000000000..6ce97e5d7 Binary files /dev/null and b/_images/advanced_plot_1.png differ diff --git a/_images/advanced_plot_11.png b/_images/advanced_plot_11.png new file mode 100644 index 000000000..cab545a4a Binary files /dev/null and b/_images/advanced_plot_11.png differ diff --git a/_images/advanced_plot_12.png b/_images/advanced_plot_12.png new file mode 100644 index 000000000..abcbab592 Binary files /dev/null and b/_images/advanced_plot_12.png differ diff --git a/_images/advanced_plot_2.png b/_images/advanced_plot_2.png new file mode 100644 index 000000000..0c85b788e Binary files /dev/null and b/_images/advanced_plot_2.png differ diff --git a/_images/advanced_plot_21.png b/_images/advanced_plot_21.png new file mode 100644 index 000000000..cdb6b07a3 Binary files /dev/null and b/_images/advanced_plot_21.png differ diff --git a/_images/advanced_plot_3.png b/_images/advanced_plot_3.png new file mode 100644 index 000000000..52e861588 Binary files /dev/null and b/_images/advanced_plot_3.png differ diff --git a/_images/advanced_plot_4.png b/_images/advanced_plot_4.png new file mode 100644 index 000000000..cce74a798 Binary files /dev/null and b/_images/advanced_plot_4.png differ diff --git a/_images/advanced_plot_5.png b/_images/advanced_plot_5.png new file mode 100644 index 000000000..1a51bcfeb Binary files /dev/null and b/_images/advanced_plot_5.png differ diff --git a/_images/advanced_plot_6.png b/_images/advanced_plot_6.png new file mode 100644 index 000000000..e6c081b76 Binary files /dev/null and b/_images/advanced_plot_6.png differ diff --git a/_images/basics_plot_1.png b/_images/basics_plot_1.png new file mode 100644 index 000000000..82b222719 Binary files /dev/null and b/_images/basics_plot_1.png differ diff --git a/_images/basics_plot_10.png b/_images/basics_plot_10.png new file mode 100644 index 000000000..6975fc57b Binary files /dev/null and b/_images/basics_plot_10.png differ diff --git a/_images/basics_plot_101.png b/_images/basics_plot_101.png new file mode 100644 index 000000000..f6ab0cb9f Binary files /dev/null and b/_images/basics_plot_101.png differ diff --git a/_images/basics_plot_11.png b/_images/basics_plot_11.png new file mode 100644 index 000000000..e993653bb Binary files /dev/null and b/_images/basics_plot_11.png differ diff --git a/_images/basics_plot_12.png b/_images/basics_plot_12.png new file mode 100644 index 000000000..539af1541 Binary files /dev/null and b/_images/basics_plot_12.png differ diff --git a/_images/basics_plot_13.png b/_images/basics_plot_13.png new file mode 100644 index 000000000..79dad9fdc Binary files /dev/null and b/_images/basics_plot_13.png differ diff --git a/_images/basics_plot_14.png b/_images/basics_plot_14.png new file mode 100644 index 000000000..0024891ea Binary files /dev/null and b/_images/basics_plot_14.png differ diff --git a/_images/basics_plot_2.png b/_images/basics_plot_2.png new file mode 100644 index 000000000..f67b631e1 Binary files /dev/null and b/_images/basics_plot_2.png differ diff --git a/_images/basics_plot_21.png b/_images/basics_plot_21.png new file mode 100644 index 000000000..76dbbce60 Binary files /dev/null and b/_images/basics_plot_21.png differ diff --git a/_images/basics_plot_22.png b/_images/basics_plot_22.png new file mode 100644 index 000000000..6f038a706 Binary files /dev/null and b/_images/basics_plot_22.png differ diff --git a/_images/basics_plot_23.png b/_images/basics_plot_23.png new file mode 100644 index 000000000..64aca0e5c Binary files /dev/null and b/_images/basics_plot_23.png differ diff --git a/_images/basics_plot_24.png b/_images/basics_plot_24.png new file mode 100644 index 000000000..e0951303c Binary files /dev/null and b/_images/basics_plot_24.png differ diff --git a/_images/basics_plot_3.png b/_images/basics_plot_3.png new file mode 100644 index 000000000..adc30e9bb Binary files /dev/null and b/_images/basics_plot_3.png differ diff --git a/_images/basics_plot_31.png b/_images/basics_plot_31.png new file mode 100644 index 000000000..e1fcde371 Binary files /dev/null and b/_images/basics_plot_31.png differ diff --git a/_images/basics_plot_32.png b/_images/basics_plot_32.png new file mode 100644 index 000000000..a2e4538cd Binary files /dev/null and b/_images/basics_plot_32.png differ diff --git a/_images/basics_plot_33.png b/_images/basics_plot_33.png new file mode 100644 index 000000000..e86b2005f Binary files /dev/null and b/_images/basics_plot_33.png differ diff --git a/_images/basics_plot_34.png b/_images/basics_plot_34.png new file mode 100644 index 000000000..d99cfc318 Binary files /dev/null and b/_images/basics_plot_34.png differ diff --git a/_images/basics_plot_4.png b/_images/basics_plot_4.png new file mode 100644 index 000000000..c9cd072bb Binary files /dev/null and b/_images/basics_plot_4.png differ diff --git a/_images/basics_plot_41.png b/_images/basics_plot_41.png new file mode 100644 index 000000000..bc9e2e5c9 Binary files /dev/null and b/_images/basics_plot_41.png differ diff --git a/_images/basics_plot_42.png b/_images/basics_plot_42.png new file mode 100644 index 000000000..486c0320b Binary files /dev/null and b/_images/basics_plot_42.png differ diff --git a/_images/basics_plot_43.png b/_images/basics_plot_43.png new file mode 100644 index 000000000..4d3c41ce1 Binary files /dev/null and b/_images/basics_plot_43.png differ diff --git a/_images/basics_plot_44.png b/_images/basics_plot_44.png new file mode 100644 index 000000000..c50775965 Binary files /dev/null and b/_images/basics_plot_44.png differ diff --git a/_images/basics_plot_5.png b/_images/basics_plot_5.png new file mode 100644 index 000000000..9b43e3f44 Binary files /dev/null and b/_images/basics_plot_5.png differ diff --git a/_images/basics_plot_51.png b/_images/basics_plot_51.png new file mode 100644 index 000000000..c50aedbc4 Binary files /dev/null and b/_images/basics_plot_51.png differ diff --git a/_images/basics_plot_52.png b/_images/basics_plot_52.png new file mode 100644 index 000000000..4df5cce0e Binary files /dev/null and b/_images/basics_plot_52.png differ diff --git a/_images/basics_plot_53.png b/_images/basics_plot_53.png new file mode 100644 index 000000000..7cacf6076 Binary files /dev/null and b/_images/basics_plot_53.png differ diff --git a/_images/basics_plot_6.png b/_images/basics_plot_6.png new file mode 100644 index 000000000..bf385ae98 Binary files /dev/null and b/_images/basics_plot_6.png differ diff --git a/_images/basics_plot_61.png b/_images/basics_plot_61.png new file mode 100644 index 000000000..faa63c4e3 Binary files /dev/null and b/_images/basics_plot_61.png differ diff --git a/_images/basics_plot_62.png b/_images/basics_plot_62.png new file mode 100644 index 000000000..e971cfc33 Binary files /dev/null and b/_images/basics_plot_62.png differ diff --git a/_images/basics_plot_63.png b/_images/basics_plot_63.png new file mode 100644 index 000000000..83e35ef8a Binary files /dev/null and b/_images/basics_plot_63.png differ diff --git a/_images/basics_plot_7.png b/_images/basics_plot_7.png new file mode 100644 index 000000000..02486d72e Binary files /dev/null and b/_images/basics_plot_7.png differ diff --git a/_images/basics_plot_71.png b/_images/basics_plot_71.png new file mode 100644 index 000000000..f230da811 Binary files /dev/null and b/_images/basics_plot_71.png differ diff --git a/_images/basics_plot_72.png b/_images/basics_plot_72.png new file mode 100644 index 000000000..a214a7e36 Binary files /dev/null and b/_images/basics_plot_72.png differ diff --git a/_images/basics_plot_8.png b/_images/basics_plot_8.png new file mode 100644 index 000000000..07bf83560 Binary files /dev/null and b/_images/basics_plot_8.png differ diff --git a/_images/basics_plot_81.png b/_images/basics_plot_81.png new file mode 100644 index 000000000..1a75cc8b7 Binary files /dev/null and b/_images/basics_plot_81.png differ diff --git a/_images/basics_plot_82.png b/_images/basics_plot_82.png new file mode 100644 index 000000000..5a7b6c661 Binary files /dev/null and b/_images/basics_plot_82.png differ diff --git a/_images/basics_plot_9.png b/_images/basics_plot_9.png new file mode 100644 index 000000000..6c5e53a72 Binary files /dev/null and b/_images/basics_plot_9.png differ diff --git a/_images/basics_plot_91.png b/_images/basics_plot_91.png new file mode 100644 index 000000000..6acc1ed1e Binary files /dev/null and b/_images/basics_plot_91.png differ diff --git a/_images/bgc_table_1.png b/_images/bgc_table_1.png new file mode 100644 index 000000000..5ac4ec985 Binary files /dev/null and b/_images/bgc_table_1.png differ diff --git a/_images/bgc_table_2.png b/_images/bgc_table_2.png new file mode 100644 index 000000000..cad6f508d Binary files /dev/null and b/_images/bgc_table_2.png differ diff --git a/_images/cam_SST_diff.png b/_images/cam_SST_diff.png new file mode 100644 index 000000000..bee9d6a88 Binary files /dev/null and b/_images/cam_SST_diff.png differ diff --git a/_images/cam_topo_diff.png b/_images/cam_topo_diff.png new file mode 100644 index 000000000..73bf4b445 Binary files /dev/null and b/_images/cam_topo_diff.png differ diff --git a/_images/cape.png b/_images/cape.png new file mode 100644 index 000000000..e4d23e4dc Binary files /dev/null and b/_images/cape.png differ diff --git a/_images/chemistry-mechanism-example.png b/_images/chemistry-mechanism-example.png new file mode 100644 index 000000000..1699d41c2 Binary files /dev/null and b/_images/chemistry-mechanism-example.png differ diff --git a/_images/chemistry-ozone-reaction.png b/_images/chemistry-ozone-reaction.png new file mode 100644 index 000000000..78e2ad930 Binary files /dev/null and b/_images/chemistry-ozone-reaction.png differ diff --git a/_images/chemistry-ozone-reaction_orig.png b/_images/chemistry-ozone-reaction_orig.png new file mode 100644 index 000000000..a3159c6cb Binary files /dev/null and b/_images/chemistry-ozone-reaction_orig.png differ diff --git a/_images/chemistry-preprocessor-info.png b/_images/chemistry-preprocessor-info.png new file mode 100644 index 000000000..91e334cb3 Binary files /dev/null and b/_images/chemistry-preprocessor-info.png differ diff --git a/_images/chemistry-rundir-example.png b/_images/chemistry-rundir-example.png new file mode 100644 index 000000000..ccc71d590 Binary files /dev/null and b/_images/chemistry-rundir-example.png differ diff --git a/_images/cice_rsnw2.png b/_images/cice_rsnw2.png new file mode 100644 index 000000000..69995dd6d Binary files /dev/null and b/_images/cice_rsnw2.png differ diff --git a/_images/clim_data_gateway.png b/_images/clim_data_gateway.png new file mode 100644 index 000000000..9202db07b Binary files /dev/null and b/_images/clim_data_gateway.png differ diff --git a/_images/clim_data_guide.png b/_images/clim_data_guide.png new file mode 100644 index 000000000..015b6fea6 Binary files /dev/null and b/_images/clim_data_guide.png differ diff --git a/_images/d5e9aa2b789d8cba96db4711ac132bc332b8449f7f2d6306c8ba66bb9aaa23b4.png b/_images/d5e9aa2b789d8cba96db4711ac132bc332b8449f7f2d6306c8ba66bb9aaa23b4.png new file mode 100644 index 000000000..07e98cfd1 Binary files /dev/null and b/_images/d5e9aa2b789d8cba96db4711ac132bc332b8449f7f2d6306c8ba66bb9aaa23b4.png differ diff --git a/_images/d9bdf37c00b9c590f5d56178f24912181493a22d6ab3f0daa70560ddcb068767.png b/_images/d9bdf37c00b9c590f5d56178f24912181493a22d6ab3f0daa70560ddcb068767.png new file mode 100644 index 000000000..61b4de96d Binary files /dev/null and b/_images/d9bdf37c00b9c590f5d56178f24912181493a22d6ab3f0daa70560ddcb068767.png differ diff --git a/_images/dcs.png b/_images/dcs.png new file mode 100644 index 000000000..0088f8ddd Binary files /dev/null and b/_images/dcs.png differ diff --git a/_images/gcase.png b/_images/gcase.png new file mode 100644 index 000000000..463556c70 Binary files /dev/null and b/_images/gcase.png differ diff --git a/_images/gecocase.png b/_images/gecocase.png new file mode 100644 index 000000000..da51553dd Binary files /dev/null and b/_images/gecocase.png differ diff --git a/_images/geov-2files.png b/_images/geov-2files.png new file mode 100644 index 000000000..5f47d1b36 Binary files /dev/null and b/_images/geov-2files.png differ diff --git a/_images/geov-difference.png b/_images/geov-difference.png new file mode 100644 index 000000000..095ecdc84 Binary files /dev/null and b/_images/geov-difference.png differ diff --git a/_images/geov-openingfile.png b/_images/geov-openingfile.png new file mode 100644 index 000000000..b6263bf9e Binary files /dev/null and b/_images/geov-openingfile.png differ diff --git a/_images/i2000.png b/_images/i2000.png new file mode 100644 index 000000000..98dd5b9c7 Binary files /dev/null and b/_images/i2000.png differ diff --git a/_images/ihist.png b/_images/ihist.png new file mode 100644 index 000000000..cc1966145 Binary files /dev/null and b/_images/ihist.png differ diff --git a/_images/light_dark_mode.png b/_images/light_dark_mode.png new file mode 100644 index 000000000..aab65288f Binary files /dev/null and b/_images/light_dark_mode.png differ diff --git a/_images/modules.png b/_images/modules.png new file mode 100644 index 000000000..e022c9327 Binary files /dev/null and b/_images/modules.png differ diff --git a/_images/namelist_var_search.png b/_images/namelist_var_search.png new file mode 100644 index 000000000..fda53a73f Binary files /dev/null and b/_images/namelist_var_search.png differ diff --git a/_images/ncdump_example.png b/_images/ncdump_example.png new file mode 100644 index 000000000..36eff2c0a Binary files /dev/null and b/_images/ncdump_example.png differ diff --git a/_images/ncview.png b/_images/ncview.png new file mode 100644 index 000000000..5d60b0c3d Binary files /dev/null and b/_images/ncview.png differ diff --git a/_images/ncview_T750-T500.png b/_images/ncview_T750-T500.png new file mode 100644 index 000000000..39f6bfb31 Binary files /dev/null and b/_images/ncview_T750-T500.png differ diff --git a/_images/ncview_diff_dcs.png b/_images/ncview_diff_dcs.png new file mode 100644 index 000000000..48f9cd92f Binary files /dev/null and b/_images/ncview_diff_dcs.png differ diff --git a/_images/nhtfrq.png b/_images/nhtfrq.png new file mode 100644 index 000000000..24eb59fbc Binary files /dev/null and b/_images/nhtfrq.png differ diff --git a/_images/overflows.png b/_images/overflows.png new file mode 100644 index 000000000..f456f158c Binary files /dev/null and b/_images/overflows.png differ diff --git a/_images/term_jupyter_1.png b/_images/term_jupyter_1.png new file mode 100644 index 000000000..a8f427a1c Binary files /dev/null and b/_images/term_jupyter_1.png differ diff --git a/_images/term_jupyter_2.png b/_images/term_jupyter_2.png new file mode 100644 index 000000000..de39f5466 Binary files /dev/null and b/_images/term_jupyter_2.png differ diff --git a/_images/term_mac.png b/_images/term_mac.png new file mode 100644 index 000000000..79f48aa3c Binary files /dev/null and b/_images/term_mac.png differ diff --git a/_images/term_pc.png b/_images/term_pc.png new file mode 100644 index 000000000..0f0ec24a0 Binary files /dev/null and b/_images/term_pc.png differ diff --git a/_images/transport_sections_mom6.png b/_images/transport_sections_mom6.png new file mode 100644 index 000000000..61ee0af5f Binary files /dev/null and b/_images/transport_sections_mom6.png differ diff --git a/_sources/README.md b/_sources/README.md new file mode 100644 index 000000000..0e049979d --- /dev/null +++ b/_sources/README.md @@ -0,0 +1,33 @@ + +# Welcome to the [CESM Tutorial](https://ncar.github.io/CESM-Tutorial/README.html) + +
+ +In 1983 NCAR created the _Community Climate Model_ (CCM) as a freely available global atmosphere model for use by the climate research community. The scope of CCM development continued to expand and in 1994 NCAR scientists released the _Climate System Model_ (CSM), a global model that included component models for the atmosphere, land surface, ocean, and sea-ice, communicating through a central coupler component. To recognize the broad community of users and sponsors contributing to this effort, the CSM was renamed the _Community Climate System Model_ (CCSM). The CCSM model evolved to include ice sheet and biogeochemical modeling and was renamed the _Community Earth System Model_ (CESM) in 2013. + +This repository includes materials designed to be an introduction to running the CESM. The materials were developed to support the CESM tutorial and serve as reference documentation for all CESM users. + +## Goals of This Tutorial + +**Through this online tutorial you will learn how to run the CESM model, modify the model experiments, and use the model output. These tutorial materials are designed for the CESM version 2 (CESM2)** + +## Yearly In-Person Tutorials + +The CESM tutorial was started in 2010 and is typically offered as an in-person summer workshop. If you are interested in attending the tutorial, please see the [CESM webpage](https://www.cesm.ucar.edu/events/tutorials) for the most up to date information about when the tutorial will next be offered in Boulder, Colorado and the timeline for applying. + +## CESM Project Funding + +This material is based upon work supported by the National Center for Atmospheric Research (NCAR), which is a major facility sponsored by the National Science Foundation (NSF) under Cooperative Agreement No. 1852977. Staff time on this project was also supported by the Climate and Global Dynamics (CGD) laboratory. + +## Acknowledgements + +A number of people have been critical to this effort, including: +- Cecile Hannay, David Bailey, Peter Lawrence, Hui Li, Sophia Macarewich, Jesse Nusbaumer, Adam Phillips, and Kate Thayer-Calder who serve on the CESM tutorial committee and put together the tutorial materials. +- Alice DuVivier, Brian Dobbins, Gunter Leguy, and Gustavo Marques, who helped test materials and have contributed substantially. +- Elizabeth Faircloth, who supports the CESM program administratively and without whom everything would probably fall apart. +- David Lawrence, who supported this effort as CESM chief scientist. +- Testers, others... + +
+ +
diff --git a/_sources/notebooks/basics/basics_overview.ipynb b/_sources/notebooks/basics/basics_overview.ipynb new file mode 100644 index 000000000..e4a68bf3f --- /dev/null +++ b/_sources/notebooks/basics/basics_overview.ipynb @@ -0,0 +1,109 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b2cd974a-dfbb-4937-8ed0-ab87ab60f1ef", + "metadata": {}, + "source": [ + "# Basics" + ] + }, + { + "cell_type": "markdown", + "id": "9db9d54e-ef78-44ef-a003-4ddd8a416317", + "metadata": {}, + "source": [ + "The CESM Model is developed around a structured workflow. The first step of this workflow is to set up your workspace, which is usually a one-time task. After setting up your workspace, a basic CESM simulation can be run with only four commands. This section will cover these steps and enable you to complete your first CESM run." + ] + }, + { + "cell_type": "markdown", + "id": "e2abf5cb-c507-408e-8f2a-2fd12934873d", + "metadata": {}, + "source": [ + "## Workflow Elements" + ] + }, + { + "cell_type": "markdown", + "id": "acfe09a5-e3ee-457a-a328-bde665cfe761", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "
\n", + "\n", + "- Set up workspace (one time setup)\n", + " - **``Download``** the CESM code\n", + " - **``Create or Locate ``** an **``Input Data``** Root Directory\n", + " - Possibly **``Porting``** if not on a setup machine\n", + "- Creating, Running and Reviewing a Case\n", + " - **``Create``** a new case\n", + " - **``Invoke``** `case.setup`\n", + " - **``Build``** the executable with `case.build`\n", + " - **``Run``** the model with `case.submit`\n", + " - **``Review``** output data\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0c07b51d-f999-4737-9739-3ea989f20802", + "metadata": {}, + "source": [ + "## Setting up your environment" + ] + }, + { + "cell_type": "markdown", + "id": "9d6954eb-3505-4a58-b6fa-bea7047c63cf", + "metadata": {}, + "source": [ + "Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded. Please refer to the NCAR supercomputer section under Resources to make sure you are setting up your environment properly. \n", + "\n", + "**YOU SHOULD ENSURE YOU CHECK THIS EVERY TIME YOU ARE BUILDING A NEW CASE**\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "523165e7-728b-4305-b9f7-4e6ee530a27d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "715674b2-a858-49ae-b044-7f7fc61a750c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workflow.ipynb b/_sources/notebooks/basics/cesm_workflow.ipynb new file mode 100644 index 000000000..b31e36592 --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow.ipynb @@ -0,0 +1,92 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CESM Workflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "CESM has been designed to be easy to use. Once you have downloaded the CESM code, a CESM `case` can be run with a set of 4 commands. \n", + "\n", + "*Note: In CESM jargon, a case refers to a specific instance of a model simulation.*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "1) Create a new case using `create_newcase`\n", + "2) Set up the case by invoking `case.setup`\n", + "3) Build the executable using `case.build`\n", + "4) Run your case using `case.submit`\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following sections will go into more detail about these 4 commands and also provide information about how to check your job status or create a clone of a previous case." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### More information" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "More detailed information on the CESM2 Workflow is documented in the following links and can be read in detail at a later time." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "\n", + "[CESM2 release](https://escomp.github.io/CESM/release-cesm2/)\n", + " \n", + "[CIME](https://esmci.github.io/cime/versions/master/html/index.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/_sources/notebooks/basics/cesm_workflow/case_build.ipynb b/_sources/notebooks/basics/cesm_workflow/case_build.ipynb new file mode 100644 index 000000000..c94ff71a0 --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow/case_build.ipynb @@ -0,0 +1,258 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f9dac1fe-df62-4560-adf5-2779d9ed8f2d", + "metadata": { + "tags": [] + }, + "source": [ + "# Case Build\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "4f42d8e1-ac3a-4f2d-b9fb-5664e1625fb4", + "metadata": {}, + "source": [ + "After a new case is setup, the tool that builds the new case by compiling the code is `case.build`. This tool is located in the `$CASEROOT` directory.\n", + "\n", + "Running this script results in the following actions:\n", + "- Checks and creates final component namelists\n", + "- Builds individual model component libraries\n", + "- Builds the final CESM model executable" + ] + }, + { + "cell_type": "markdown", + "id": "0d8b2ab4-7976-48b7-81e4-e2ae0f28cd97", + "metadata": {}, + "source": [ + "![CESM case.build](../../../images/basics/CESM2_case_build.png)\n", + "*

Figure: Detailed view of the location of case.build

*\n", + "\n", + "\n", + "For the current tutorial on derecho, the paths are:\n", + "- `$SRCROOT` = `/glade/u/home/$USER/code/my_cesm_code`\n", + "- `$CASEROOT` = `/glade/u/home/$USER/cases/$CASE`\n", + "- `$EXEROOT` =`/glade/derecho/scratch/$USER/$CASE/bld` \n", + "- `$RUNDIR` =`/glade/derecho/scratch/$USER/$CASE/run` " + ] + }, + { + "cell_type": "markdown", + "id": "1892841c-9c0c-4baf-b73e-413b74798e59", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "35ab1731-c0c2-4a39-a6e1-31f86d6f8cdd", + "metadata": {}, + "source": [ + "## Command Syntax" + ] + }, + { + "cell_type": "markdown", + "id": "f2581dbe-4077-43c1-b2bb-1d26c1af544e", + "metadata": {}, + "source": [ + "
\n", + "\n", + "You should still be in the `CASEROOT` directory after running `case.setup`\n", + "```\n", + "cd /glade/u/home/$USER/cases/CASE\n", + "```\n", + " \n", + "
\n", + " \n", + "Example `case.build` command:
\n", + " \n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + " \n", + "
\n", + "\n", + "**NOTE:** Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.
" + ] + }, + { + "cell_type": "markdown", + "id": "8835e60d-6412-4b21-8b50-f122ce6b167d", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + "Building case in directory /glade/u/home/$USER/cases/b1850.basics\n", + "sharedlib_only is False\n", + "model_only is False\n", + "Generating component namelists as part of build\n", + "- Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.pop.ro.0301-01-01-00000\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.mosart.r.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cpl.r.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.pop.r.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cam.r.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cice.r.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cam.rs.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.clm2.r.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cam.i.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cism.r.0301-01-01-00000.nc\n", + "Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.ww3.r.0301-01-01-00000\n", + "Creating component namelists\n", + "Calling /glade/u/home/$USER/my_cesm_code/components/cam//cime_config/buildnml\n", + "...calling cam buildcpp to set build time options\n", + "CAM namelist copy: file1 /glade/u/home/$USER/cases/b1850.basics/Buildconf/camconf/atm_in file2 /glade/derecho/scratch/$USER/b1850.basics/run/atm_in\n", + "Calling /glade/u/home/$USER/my_cesm_code/components/clm//cime_config/buildnml\n", + "Calling /glade/u/home/$USER/my_cesm_code/components/cice//cime_config/buildnml\n", + "...buildnml calling cice buildcpp to set build time options\n", + "Calling /glade/u/home/$USER/my_cesm_code/components/pop//cime_config/buildnml\n", + "... buildnml: calling pop buildcpp to set build time options\n", + "given is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2666.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2667.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2668.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2675.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2676.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2677.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2678.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2679.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2680.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2681.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2682.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2683.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2684.\n", + "Calling /glade/u/home/$USER/my_cesm_code/components/mosart//cime_config/buildnml\n", + "Running /glade/u/home/$USER/my_cesm_code/components/cism//cime_config/buildnml\n", + "Calling /glade/u/home/$USER/my_cesm_code/components/ww3//cime_config/buildnml\n", + "Calling /glade/u/home/$USER/my_cesm_code/cime/src/components/stub_comps/sesp/cime_config/buildnml\n", + "Calling /glade/u/home/$USER/my_cesm_code/cime/src/drivers/mct/cime_config/buildnml\n", + "Finished creating component namelists\n", + "Building gptl with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/gptl.bldlog.240606-134217\n", + "Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.gptl\n", + "Component gptl build complete with 2 warnings\n", + "Building mct with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/mct.bldlog.240606-134217\n", + "Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.mct\n", + "Component mct build complete with 55 warnings\n", + "Building pio with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/pio.bldlog.240606-134217\n", + "Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.pio\n", + "Component pio build complete with 28 warnings\n", + "Building csm_share with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/csm_share.bldlog.240606-134217\n", + "Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.csm_share\n", + "Component csm_share build complete with 85 warnings\n", + "- Building clm4_5/clm5_0 Library\n", + "Building lnd with output to /glade/derecho/scratch/$USER/b1850.basics/bld/lnd.bldlog.240606-134217\n", + "\n", + "Component lnd build complete with 292 warnings\n", + "clm built in 109.479993 seconds\n", + "Building atm with output to /glade/derecho/scratch/$USER/b1850.basics/bld/atm.bldlog.240606-134217\n", + "Building ice with output to /glade/derecho/scratch/$USER/b1850.basics/bld/ice.bldlog.240606-134217\n", + "Building ocn with output to /glade/derecho/scratch/$USER/b1850.basics/bld/ocn.bldlog.240606-134217\n", + "Building rof with output to /glade/derecho/scratch/$USER/b1850.basics/bld/rof.bldlog.240606-134217\n", + "Building glc with output to /glade/derecho/scratch/$USER/b1850.basics/bld/glc.bldlog.240606-134217\n", + "Building wav with output to /glade/derecho/scratch/$USER/b1850.basics/bld/wav.bldlog.240606-134217\n", + "Building esp with output to /glade/derecho/scratch/$USER/b1850.basics/bld/esp.bldlog.240606-134217\n", + "Component esp build complete with 1 warnings\n", + "sesp built in 4.413109 seconds\n", + "Component wav build complete with 35 warnings\n", + "ww built in 33.126202 seconds\n", + "Component rof build complete with 14 warnings\n", + "mosart built in 33.278138 seconds\n", + "Component ice build complete with 74 warnings\n", + "cice built in 51.958399 seconds\n", + "Component ocn build complete with 207 warnings\n", + "pop built in 86.837194 seconds\n", + "Component atm build complete with 528 warnings\n", + "cam built in 105.142718 seconds\n", + "Component glc build complete with 150 warnings\n", + "cism built in 133.173952 seconds\n", + "Building cesm with output to /glade/derecho/scratch/$USER/b1850.basics/bld/cesm.bldlog.240606-134217\n", + "Component cesm exe build complete with 27 warnings\n", + "Time spent not building: 130.716460 sec\n", + "Time spent building: 389.249592 sec\n", + "MODEL BUILD HAS FINISHED SUCCESSFULLY\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7e677c5f-2b85-459b-ad9e-2f4b42904589", + "metadata": {}, + "source": [ + "**Notes:**\n", + "- Notice the `./` before any command run in the CASEROOT. \n", + "- On NCAR HPC machines you must call the `case.build` using `qcmd` because it compiles the model on a compute node rather than a login node. This reduces the load on login nodes and prevents a timeout while you are building the model.\n", + "- The output tells you if it was successful at the end: `MODEL BUILD HAS FINISHED SUCCESSFULLY`" + ] + }, + { + "cell_type": "markdown", + "id": "f6edbb1c-0ca4-49f9-b238-974c1c19de89", + "metadata": {}, + "source": [ + "## Tips" + ] + }, + { + "cell_type": "markdown", + "id": "9b750904-678a-40d2-b5fa-e87c52d5c8eb", + "metadata": {}, + "source": [ + "- To completely rebuild a case, run `./case.build --clean-all` first before building the model.\n", + "- If you want to make any source code modifications in `SourceMods`, do this before building the model. We will cover SourceMods in a later section.\n", + "- If you want to make any modifications to `env_build.xml`, do this before building the model.\n", + "- If any input data is missing the build will abort but provide a list of missing files. To acquire missing data run `./check_input_data --download`. This will download the required data and put it in the `inputdata` directory defined by the XML variable `DIN_LOC_ROOT`. After you have done these steps you can re-run the `case.build` script." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48056ea8-6b71-4485-ad55-d91c8ade8ba0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workflow/case_setup.ipynb b/_sources/notebooks/basics/cesm_workflow/case_setup.ipynb new file mode 100644 index 000000000..a1b30af93 --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow/case_setup.ipynb @@ -0,0 +1,154 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f9dac1fe-df62-4560-adf5-2779d9ed8f2d", + "metadata": {}, + "source": [ + "# Case Setup\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "69d76269-97de-4fed-9816-22f66e13866e", + "metadata": {}, + "source": [ + "After a new case is created, the tool that sets up the new case is `case.setup`. This tool is located in the `$CASEROOT` directory.\n", + "\n", + "After running `case.setup` the following actions occur:\n", + "- The `$RUNDIR` and `$EXEROOT` directories are created as shown on the figure." + ] + }, + { + "cell_type": "markdown", + "id": "93aec491-6938-4d83-adb0-c059c8c8b87e", + "metadata": {}, + "source": [ + "![CESM case.setup](../../../images/basics/CESM2_case_setup.png)\n", + "*

Figure: Detailed view of the location of case.setup

*\n", + "\n", + "\n", + "For the current tutorial on derecho, the paths are:\n", + "- `$SRCROOT` = `/glade/u/home/$USER/code/my_cesm_code`\n", + "- `$CASEROOT` = `/glade/u/home/$USER/cases/$CASE`\n", + "- `$EXEROOT` =`/glade/derecho/scratch/$USER/$CASE/bld` \n", + "- `$RUNDIR` =`/glade/derecho/scratch/$USER/$CASE/run` " + ] + }, + { + "cell_type": "markdown", + "id": "831f1ad8-627d-4c5f-a692-02e16ce0112e", + "metadata": {}, + "source": [ + "Note that other files and directories are created at `case.setup`. This will be covered in more detail in later sections (i.e. [Namelist modifications](https://ncar.github.io/CESM-Tutorial/notebooks/namelist/namelist.html))\n", + "- `user_nl_xxx` files, where the user can customize component namelist files\n", + "- The `case.run` and `case.st_archive` scripts and `Macros.make` file\n", + "- Hidden files like `env_mach_specific.*`\n", + "- The `CaseDocs` directory, which should not be edited" + ] + }, + { + "cell_type": "markdown", + "id": "07a1da51-7e51-4f3d-b63c-d8492fd1f171", + "metadata": {}, + "source": [ + "## Command Syntax" + ] + }, + { + "cell_type": "markdown", + "id": "d630ea67-4c16-495d-8bdd-3d5fb254b530", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Go to the `$CASEROOT` directory \n", + "```\n", + "cd /glade/u/home/$USER/cases/CASE\n", + "```\n", + " \n", + "
\n", + " \n", + "Example `case.setup` command:
\n", + " \n", + "```\n", + "./case.setup\n", + "```\n", + " \n", + "
\n", + " \n", + "NOTE: Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.
" + ] + }, + { + "cell_type": "markdown", + "id": "b68a6c25-55ee-42a6-bff2-93004c84abd5", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + "/glade/u/home/$USER/cases/b1850.basics/env_mach_specific.xml already exists, delete to replace\n", + "job is case.run USER_REQUESTED_WALLTIME None USER_REQUESTED_QUEUE None WALLTIME_FORMAT %H:%M:%S\n", + "Creating batch scripts\n", + "Writing case.run script from input template /glade/u/home/$USERrun\n", + "Writing case.st_archive script from input template /glade/u/home/$USER/code/my_cesm_code/cime/config/cesm/machines/template.st_archive\n", + "Creating file case.st_archive\n", + "Creating user_nl_xxx files for components and cpl\n", + "If an old case build already exists, might want to run 'case.build --clean' before building\n", + "You can now run './preview_run' to get more info on how your case will be run\n", + "\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f12bff84-04f0-4d28-8da9-af706f874933", + "metadata": {}, + "source": [ + "**Notes:**\n", + "- Notice the `./` before any command run in the CASEROOT. \n", + "- You can run the script name followed by the `--h` or `--help` argument to see help documentation for that script and a list of all command line arguments for that script.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bae850c-b342-41d3-9237-12e4c5ef3fc0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workflow/case_submit.ipynb b/_sources/notebooks/basics/cesm_workflow/case_submit.ipynb new file mode 100644 index 000000000..d3870ce8a --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow/case_submit.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "683d9e77-d700-4f75-b3f0-eb813657351b", + "metadata": { + "tags": [] + }, + "source": [ + "# Case Submit\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae2803f9-270d-4dd6-803a-e4158cbf7b86", + "metadata": {}, + "source": [ + "After a new case is built, the tool that submits the experiment to start it running is `case.submit`. This tool is located in the `$CASEROOT` directory.\n", + "\n", + "Running this script results in the following actions:\n", + "- Checking archive and run options\n", + "- Checking in namelists that need to be rebuilt\n", + "- Checking input data\n", + "- Submitting the `case.run` script to the NCAR HPC batch job scheduler\n", + "- Submitting the `case.st_archive` script to archive the model output. This step is dependent on the successful completion of `case.run`" + ] + }, + { + "cell_type": "markdown", + "id": "fd09cd4e-8e74-4867-aaf7-bb480d679e3d", + "metadata": {}, + "source": [ + "![CESM case.submit](../../../images/basics/CESM2_case_submit.png)\n", + "*

Figure: Detailed view of the location of case.submit

*\n", + "\n", + "For the current tutorial on derecho, the paths are:\n", + "- `$SRCROOT` = `/glade/u/home/$USER/code/my_cesm_code`\n", + "- `$CASEROOT` = `/glade/u/home/$USER/cases/$CASE`\n", + "- `$CIME_OUTPUT_ROOT` = `/glade/derecho/scratch/$USER`\n", + "- `$EXEROOT` =`/glade/derecho/scratch/$USER/$CASE/bld` \n", + "- `$RUNDIR` =`/glade/derecho/scratch/$USER/$CASE/run` " + ] + }, + { + "cell_type": "markdown", + "id": "579cb4c8-03f1-4c9f-913f-de2ffeccfbc5", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "d8e6525b-31d9-450d-a3b9-e3b435fc231a", + "metadata": {}, + "source": [ + "## Command Syntax" + ] + }, + { + "cell_type": "markdown", + "id": "12524d65-0037-4652-a77d-3bfea021869e", + "metadata": {}, + "source": [ + "
\n", + "\n", + "You should still be in the `CASEROOT` directory after running `case.build`\n", + "```\n", + "cd /glade/u/home/$USER/cases/CASE\n", + "```\n", + " \n", + "
\n", + " \n", + "Example `case.submit` command:
\n", + " \n", + "```\n", + "./case.submit\n", + "```\n", + " \n", + "
\n", + "\n", + "NOTE: Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.
" + ] + }, + { + "cell_type": "markdown", + "id": "630dfd32-c4fc-40a9-812c-4c62ff6c4862", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + " - Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv\n", + "Creating component namelists\n", + " Calling /glade/u/home/$USER/my_cesm_code/components/cam//cime_config/buildnml\n", + "CAM namelist copy: file1 /glade/u/home/$USER/cases/b1850.basics/Buildconf/camconf/atm_in file2 /glade/derecho/scratch/$USER/b1850.basics/run/atm_in \n", + " Calling /glade/u/home/$USER/my_cesm_code/components/clm//cime_config/buildnml\n", + " Calling /glade/u/home/$USER/my_cesm_code/components/cice//cime_config/buildnml\n", + " Calling /glade/u/home/$USER/my_cesm_code/components/pop//cime_config/buildnml\n", + " given is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2666.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2667.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2668.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2675.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2676.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2677.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2678.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2679.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2680.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2681.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2682.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2683.\n", + "when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2684.\n", + " Calling /glade/u/home/$USER/my_cesm_code/components/mosart//cime_config/buildnml\n", + " Running /glade/u/home/$USER/my_cesm_code/components/cism//cime_config/buildnml \n", + " Calling /glade/u/home/$USER/my_cesm_code/components/ww3//cime_config/buildnml\n", + " Calling /glade/u/home/$USER/my_cesm_code/cime/src/components/stub_comps/sesp/cime_config/buildnml\n", + " Calling /glade/u/home/$USER/my_cesm_code/cime/src/drivers/mct/cime_config/buildnml\n", + "Finished creating component namelists\n", + "Checking that inputdata is available as part of case submission\n", + "Loading input file list: 'Buildconf/clm.input_data_list'\n", + "Loading input file list: 'Buildconf/cpl.input_data_list'\n", + "Loading input file list: 'Buildconf/pop.input_data_list'\n", + "Loading input file list: 'Buildconf/ww3.input_data_list'\n", + "Loading input file list: 'Buildconf/cice.input_data_list'\n", + "Loading input file list: 'Buildconf/cism.input_data_list'\n", + "Loading input file list: 'Buildconf/mosart.input_data_list'\n", + "Loading input file list: 'Buildconf/cam.input_data_list'\n", + " - Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv\n", + " - Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf\n", + "Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv\n", + "Creating component namelists\n", + "Finished creating component namelists\n", + "Check case OK\n", + "submit_jobs case.run\n", + "Submit job case.run\n", + "Submitting job script qsub -q main -l walltime=12:00:00 -A $PROJECT -l job_priority=regular -v ARGS_FOR_SCRIPT='--resubmit' .case.run\n", + "Submitted job id is 4743615.desched1\n", + "Submit job case.st_archive\n", + "Submitting job script qsub -q main -l walltime=0:20:00 -A $PROJECT -l job_priority=regular -W depend=afterok:4743615.desched1 -v ARGS_FOR_SCRIPT='--resubmit' case.st_archive\n", + "Submitted job id is 4743616.desched1\n", + "Submitted job case.run with id 4743615.desched1\n", + "Submitted job case.st_archive with id 4743616.desched1\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "138df653-4e57-4668-ab27-cabe6806076a", + "metadata": {}, + "source": [ + "**Notes:**\n", + "- `case.submit` coordinates all the tasks of running CESM.\n", + "- `case.run` is submitted to the batch job scheduler by `case.submit`. Do not try to submit `case.run` separately.\n", + "- CESM runs in the Build/Run Directory.\n", + "- `case.st_archive` moves the history files to the archive directory runs only after `case.run` completes successfully. If a model run was unsuccessful the output remains in the Run Directory." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2463ac2-7ada-48bd-8662-9e4115f7e8f5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workflow/checking_jobs_and_status.ipynb b/_sources/notebooks/basics/cesm_workflow/checking_jobs_and_status.ipynb new file mode 100644 index 000000000..eea2bb839 --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow/checking_jobs_and_status.ipynb @@ -0,0 +1,201 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Checking Your Run\n" + ] + }, + { + "cell_type": "markdown", + "id": "169d4dc6-f655-4d60-b8c8-46bab0524c91", + "metadata": {}, + "source": [ + "## Batch Job Scheduler Monitoring" + ] + }, + { + "cell_type": "markdown", + "id": "e70a2387-d1d3-41b7-b0df-4811d2246566", + "metadata": {}, + "source": [ + "Once CESM has been submitted the status of the run on derecho can be followed through the qstat command. Qstat accesses the information in the Batch Job Scheduler to see the status of all jobs running on derecho. To simplify the list down the -u option can be specified for a particular user.\n", + "\n", + "
\n", + "Result of running qstat with an active job running:

\n", + "\n", + "```\n", + "qstat -u $USER\n", + "```\n", + "
\n", + " \n", + "Output:
\n", + "\n", + "```\n", + " Req'd Req'd Elap\n", + "Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time\n", + "--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----\n", + "4743615.desche* $USER cpu run.b.day* -- 6 768 1410g 12:00 Q -- \n", + "4743616.desche* $USER cpu st_archiv* -- 1 1 235gb 00:20 H -- \n", + "```\n", + "\n", + "
\n", + "\n", + "Note, there may be a slight delay from submitting CESM until the jobs appear in the queue. Once the jobs have completed they will disappear from the qstat command." + ] + }, + { + "cell_type": "markdown", + "id": "5e079b70-b679-44ff-b13f-0089b0a9e3b1", + "metadata": {}, + "source": [ + "## Monitoring Files in the Run and Archive Directories\n" + ] + }, + { + "cell_type": "markdown", + "id": "a213054b-be89-464b-a596-b6e67fad52db", + "metadata": {}, + "source": [ + "\n", + "As the CESM job runs it will update files in Build / Run Directory. \n", + "Once the job has completed successfully the archiver will transfer history files to the Archive Directory.\n", + "One way to keep track of the progress of the run is to monitor the files in these directories.\n", + "- Check the files in the `$RUNDIR` as the model is running and once it is finished\n", + "- Check the files in the `$DOUT_S_ROOT` after `case.st_archive` runs." + ] + }, + { + "cell_type": "markdown", + "id": "6d99a83a-9b78-4b02-9aa0-e8dbf1cb8d0b", + "metadata": {}, + "source": [ + "## CaseStatus file" + ] + }, + { + "cell_type": "markdown", + "id": "c93c592b-bda0-45a5-97a0-747c600807e1", + "metadata": {}, + "source": [ + "\n", + "All activities for the case are recorded in the CaseStatus file in the CASEROOT directory. By looking through the file the successful or otherwise outcome of each step of the run can be tracked.\n", + "\n", + "
\n", + "Status of the case recorded in the `$CASEROOT` CaseStatus file:

\n", + "\n", + "```\n", + "cd /glade/u/home/$USER/cases/CASE\n", + "more CaseStatus\n", + "```\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "462ea73c-e73c-49cd-a74c-1261ebda445d", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + "2024-06-06 13:41:19: case.setup starting \n", + " ---------------------------------------------------\n", + "2024-06-06 13:41:22: case.setup success \n", + " ---------------------------------------------------\n", + "2024-06-06 13:42:17: case.build starting \n", + " ---------------------------------------------------\n", + "CESM version is release-cesm2.1.5\n", + "Processing externals description file : Externals.cfg (/glade/u/home/$USER/my_cesm_code)\n", + "Processing externals description file : Externals_CAM.cfg (/glade/u/home/$USER/my_cesm_code/components/cam)\n", + "Processing externals description file : Externals_CISM.cfg (/glade/u/home/$USER/my_cesm_code/components/cism)\n", + "Processing externals description file : Externals_CLM.cfg (/glade/u/home/$USER/my_cesm_code/components/clm)\n", + "Processing externals description file : Externals_POP.cfg (/glade/u/home/$USER/my_cesm_code/components/pop)\n", + "Checking local status of required & optional components: cam, chem_proc, carma, clubb, cosp2, cice, cime, cism, source_cism, clm, \n", + "fates, mosart, pop, cvmix, marbl, rtm, ww3, \n", + " ./cime\n", + " clean sandbox, on cime5.6.49\n", + " ./components/cam\n", + " clean sandbox, on cam_cesm2_1_rel_60\n", + " ./components/cam/chem_proc\n", + " clean sandbox, on tools/proc_atm/chem_proc/release_tags/chem_proc5_0_03_rel\n", + " ./components/cam/src/physics/carma/base\n", + " clean sandbox, on carma/release_tags/carma3_49_rel\n", + " ./components/cam/src/physics/clubb\n", + " clean sandbox, on vendor_clubb_r8099_n03\n", + " ./components/cam/src/physics/cosp2/src\n", + " clean sandbox, on v2.1.4cesm\n", + " ./components/cice\n", + " clean sandbox, on cice5_cesm2_1_1_20231220\n", + " ./components/cism\n", + " clean sandbox, on cism-release-cesm2.1.2_04\n", + " ./components/cism/source_cism\n", + " clean sandbox, on release-cism2.1.04\n", + " ./components/clm\n", + " clean sandbox, on release-clm5.0.37\n", + " ./components/clm/src/fates\n", + " clean sandbox, on sci.1.30.0_api.8.0.0\n", + " ./components/mosart\n", + " clean sandbox, on release-cesm2.0.04\n", + " ./components/pop\n", + " clean sandbox, on pop2_cesm2_1_rel_n15\n", + " ./components/pop/externals/CVMix\n", + " clean sandbox, on v0.93-beta\n", + " ./components/pop/externals/MARBL\n", + " clean sandbox, on cesm2.1-n00\n", + " ./components/rtm\n", + " clean sandbox, on release-cesm2.0.04\n", + " ./components/ww3\n", + " clean sandbox, on ww3_181001\n", + "2024-06-06 13:50:57: case.build success \n", + " ---------------------------------------------------\n", + "2024-06-06 13:53:31: case.submit starting \n", + " ---------------------------------------------------\n", + "2024-06-06 13:53:46: case.submit success case.run:4743615.desched1, case.st_archive:4743616.desched1\n", + " ---------------------------------------------------\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a1189f3e-7266-492a-aa42-664a968227e3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workflow/create_clone.ipynb b/_sources/notebooks/basics/cesm_workflow/create_clone.ipynb new file mode 100644 index 000000000..6b1254fd9 --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow/create_clone.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "d6d5e586-3e55-40e2-89ac-43cf2a986a92", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Create Clone (Advanced)" + ] + }, + { + "cell_type": "markdown", + "id": "0848a34c-67f8-4727-b8e5-8e9246927d2b", + "metadata": {}, + "source": [ + "The tool that clones a new case based on an existing case is `create_clone`. This tool is located in the `$SRCROOT` directory under the `cime/scripts` directory." + ] + }, + { + "cell_type": "markdown", + "id": "aa0ffc44-9f53-4b02-bdaf-4035ff768cdd", + "metadata": {}, + "source": [ + "Things that **are** copied into the new case are:\n", + "- Most `env_*.xml` settings (not all!)\n", + "- user_nl_xxx files\n", + "- Macros\n", + "- SourceMods\n", + "- Batch system files\n", + "- README.case\n", + "\n", + "Things that **are not** copied into the new case are:\n", + "- Logs\n", + "- Timing files" + ] + }, + { + "cell_type": "markdown", + "id": "76ae1e16-f343-4149-a82b-a75f5bb94fa9", + "metadata": {}, + "source": [ + "## Command Syntax" + ] + }, + { + "cell_type": "markdown", + "id": "404c5149-3a66-4677-9dc5-19f4f2d0a08b", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Go to the `cime/scripts` directory in the CESM code\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "```\n", + " \n", + "
\n", + " \n", + "Example of basic `./create_clone` syntax to create CASE2:
\n", + " \n", + "```\n", + "./create_clone --clone /glade/u/home/$USER/cases/CASE1 --case /glade/u/home/$USER/cases/CASE2\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "d5d86794-b242-4f85-9b9c-4e1fcf235d46", + "metadata": {}, + "source": [ + "**Notes:**\n", + "- Do not use `cp` or `cp -R` to copy case directories to new experiments. \n", + "- Document changes in CaseStatus and README.case to keep track of the changes you make.\n", + "- If you are making many cases with only a small changes, you can script the steps into a python or shell script of your choice to make the process more automated and less prone to human error." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "839f45aa-3c6b-4170-b913-a6eb9da8feb4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workflow/create_newcase.ipynb b/_sources/notebooks/basics/cesm_workflow/create_newcase.ipynb new file mode 100644 index 000000000..99069c31e --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow/create_newcase.ipynb @@ -0,0 +1,535 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Create New Case" + ] + }, + { + "cell_type": "markdown", + "id": "efcaf0cc-2b3f-49de-8c4e-953464c295ef", + "metadata": {}, + "source": [ + "The tool that generates a new case is `create_newcase`. This tool is located in the `$SRCROOT` directory under the `cime/scripts` directory. \n", + "\n", + "After running `create_newcase`, a `$CASEROOT` directory is created. The directory `$CASEROOT` contains the scripts needed for the following steps (`case.setup`, `case.build` and `case.submit`)" + ] + }, + { + "cell_type": "markdown", + "id": "25ef9ed6-7dea-493f-8ef5-3f1de625a31c", + "metadata": {}, + "source": [ + "![CESM create_newcase](../../../images/basics/CESM2_create_newcase.png)\n", + "*

Figure: Detailed view of the location of create_newcase

*\n", + "\n", + "For the current tutorial on derecho, the paths are:\n", + "- `$SRCROOT` = `/glade/u/home/$USER/code/my_cesm_code`\n", + "- `$CASEROOT` = `/glade/u/home/$USER/cases/$CASE`\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "af956bea-9166-48bf-99df-02f744bd792d", + "metadata": {}, + "source": [ + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "557d4028-7176-4e2a-8a90-7febf2de37ef", + "metadata": {}, + "source": [ + "___\n", + "## Command Syntax" + ] + }, + { + "cell_type": "markdown", + "id": "40696acf-8c56-4c1b-8fab-f9d1b1d3b2d1", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Go to the `cime/scripts` directory in the CESM code
\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "```\n", + " \n", + "
\n", + " \n", + "Example of basic `./create_newcase` syntax:
\n", + " \n", + "```\n", + "./create_newcase --case /glade/u/home/$USER/cases/CASE --res RES --compset COMPSET\n", + "```\n", + " \n", + "
\n", + "\n", + "NOTE: Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.
" + ] + }, + { + "cell_type": "markdown", + "id": "3923b808-2496-4f4d-b5a1-8b4cd44466ba", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + "Compset longname is 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + "Compset specification file is /glade/u/home/$USER/code/cesm2.1.1/cime/../cime_config/config_compsets.xml\n", + "Compset forcing is 1850\n", + "Com forcing is Biogeochemistry intercomponent with diagnostic CO2\n", + "ATM component is CAM cam6 physics:\n", + "LND component is clm5.0:BGC (vert. resol. CN and methane) with prognostic crop:\n", + "ICE component is Sea ICE (cice) model version 5\n", + "OCN component is POP2 EcosystemAbiotic DIC/DIC14\n", + "ROF component is MOSART: MOdel for Scale Adaptive River Transport\n", + "GLC component is cism2 (default, higher-order, can run in parallel):cism ice evolution turned off (this is the standard configuration unless you're explicitly interested in ice evolution):\n", + "WAV component is Wave Watch\n", + "ESP component is \n", + "Pes specification file is /glade/u/home/$USER/code/cesm2.1.1/cime/../cime_config/config_pes.xml\n", + "Compset specific settings: name is RUN_STARTDATE and value is 0001-01-01\n", + "Compset specific settings: name is RUN_REFDATE and value is 0301-01-01\n", + "Compset specific settings: name is RUN_TYPE and value is hybrid\n", + "Compset specific settings: name is RUN_REFCASE and value is b.e20.B1850.f19_g17.release_cesm2_1_0.020\n", + "Compset specific settings: name is CLM_NAMELIST_OPTS and value is use_init_interp=.true.\n", + "Machine is derecho\n", + "Pes setting: grid match is a%1.9x2.5.+l%1.9x2.5.+oi%gx1 \n", + "Pes setting: machine match is derecho \n", + "Pes setting: compset_match is CAM.+CLM.+CICE.+POP.+ \n", + "Pes setting: grid is a%1.9x2.5_l%1.9x2.5_oi%gx1v7_r%r05_g%gland4_w%ww3a_m%gx1v7 \n", + "Pes setting: compset is 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD \n", + "Pes setting: tasks is {'NTASKS_ATM': 288, 'NTASKS_ICE': 108, 'NTASKS_CPL': 288, 'NTASKS_LND': 144, 'NTASKS_WAV': 36, 'NTASKS_ROF': 40, 'NTASKS_OCN': 288, 'NTASKS_GLC': 36} \n", + "Pes setting: threads is {'NTHRDS_ICE': 1, 'NTHRDS_ATM': 1, 'NTHRDS_ROF': 1, 'NTHRDS_LND': 1, 'NTHRDS_WAV': 1, 'NTHRDS_OCN': 1, 'NTHRDS_CPL': 1, 'NTHRDS_GLC': 1} \n", + "Pes setting: rootpe is {'ROOTPE_OCN': 288, 'ROOTPE_LND': 0, 'ROOTPE_ATM': 0, 'ROOTPE_ICE': 144, 'ROOTPE_WAV': 252, 'ROOTPE_CPL': 0, 'ROOTPE_ROF': 0, 'ROOTPE_GLC': 0} \n", + "Pes setting: pstrid is {} \n", + "Pes other settings: {}\n", + "Pes comments: about 12ypd expected\n", + " Compset is: 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD \n", + " Grid is: a%1.9x2.5_l%1.9x2.5_oi%gx1v7_r%r05_g%gland4_w%ww3a_m%gx1v7 \n", + " Components in compset are: ['cam', 'clm', 'cice', 'pop', 'mosart', 'cism', 'ww3', 'sesp', 'drv', 'dart'] \n", + "\n", + "This is a CESM scientifically supported compset at this resolution.\n", + "\n", + "Using project from .cesm_proj: P93300641\n", + "No charge_account info available, using value from PROJECT\n", + "Using project from .cime/config: P93300641\n", + "cesm model version found: cesm2.1_tutorial2022\n", + "Batch_system_type is pbs\n", + "job is case.run USER_REQUESTED_WALLTIME None USER_REQUESTED_QUEUE None WALLTIME_FORMAT %H:%M:%S\n", + "job is case.st_archive USER_REQUESTED_WALLTIME None USER_REQUESTED_QUEUE None WALLTIME_FORMAT %H:%M:%S\n", + " Creating Case directory /glade/u/home/$USER/cases/b1850.basics\n", + "\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "87ae84f9-449b-4051-9dc9-9c53bcb8ac57", + "metadata": {}, + "source": [ + "**Notes:**\n", + "- For all user scripts you can run the script name followed by the `--h` or `--help` argument to see help documentation for that script and a list of all command line arguments for that script.\n", + "- Double dashes `--` are required with command line arguments\n" + ] + }, + { + "cell_type": "markdown", + "id": "d7064891-5a5a-41f2-9b3b-d4acb231a2ee", + "metadata": {}, + "source": [ + "___\n", + "## Command Arguments" + ] + }, + { + "cell_type": "markdown", + "id": "b89a4484-e32c-413a-bfec-4051d666a8a8", + "metadata": {}, + "source": [ + "![Create New Case Command Image](../../../images/basics/CESM2_Create_Newcase_Command.png)" + ] + }, + { + "cell_type": "markdown", + "id": "122cb2ea-b34d-472b-8790-9d3950d8eea4", + "metadata": {}, + "source": [ + "### Casename" + ] + }, + { + "cell_type": "markdown", + "id": "0ea36beb-fe98-4289-a15e-37c21ff2f4ad", + "metadata": {}, + "source": [ + "`--case` is the argument that specifies the **name** and **location** of the case being created. In the example above, the casename is `CASE` and the location of the case is `/glade/u/home/$USER/cases/`. Note that if a path preceding the casename is not specified, then the case is created as a subdirectory of the `$CIMEROOT/scripts` directory.\n" + ] + }, + { + "cell_type": "markdown", + "id": "bb90ccd2-b4d4-4ab7-96ec-749a596f25ae", + "metadata": {}, + "source": [ + "- The path `/glade/u/home/$USER/cases/CASE` is your workspace `CASEROOT`, as described in the [workspaces section](https://ncar.github.io/CESM-Tutorial/notebooks/basics/cesm_workspaces.html#workspace-overview)." + ] + }, + { + "cell_type": "markdown", + "id": "8f080dc7-3bfb-4e61-b112-af418f52018a", + "metadata": {}, + "source": [ + "In this tutorial we will use fairly simple names for the cases you create, build, and run. However, most CESM experiments have much longer casenames that provide information about the experiment at a glance. Knowing the CESM case naming conventions will help you navigate CESM community experiments. Information about the CESM naming is available at:" + ] + }, + { + "cell_type": "markdown", + "id": "2216d55d-6705-4d1d-9734-eddfc225420d", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM case naming conventions](https://www.cesm.ucar.edu/models/cesm2/naming-conventions)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "83b752d0-34c8-42d0-ba5b-efee17ab3386", + "metadata": {}, + "source": [ + "### Resolution" + ] + }, + { + "cell_type": "markdown", + "id": "6e3f9220-e60f-456b-93a2-09c4d52f5e22", + "metadata": {}, + "source": [ + "`--res` is the argument that specifies the **model resolution or grid**. In the example above, the resolution is `RES`. Each model resolution can be specified with the `--res` argument by its alias or its full long name. However, the long name conventions are generally quite lengthy, so it is useful if you become familiar with using the alias version. Because the atmosphere and land share a grid and the ocean and sea ice share a grid only two grids are specified by the alias using the following format: `atm/lnd_ocn/ice`." + ] + }, + { + "cell_type": "markdown", + "id": "4c69afd3-925c-42c8-a54e-017336ef03c6", + "metadata": {}, + "source": [ + "![Create New Case Resolution Image](../../../images/basics/CESM2_Create_Newcase_Resolution.png)" + ] + }, + { + "cell_type": "markdown", + "id": "8143f8da-726e-4db9-99af-ce75e19c4810", + "metadata": {}, + "source": [ + "#### CESM2 Supported Grid Definitions" + ] + }, + { + "cell_type": "markdown", + "id": "83f7274d-95fe-4be3-bf08-a6964eebef10", + "metadata": {}, + "source": [ + " Link for CESM Supported Grids: \n", + "
\n", + "[http://www.cesm.ucar.edu/models/cesm2/config/grids.html](http://www.cesm.ucar.edu/models/cesm2/config/grids.html)\n" + ] + }, + { + "cell_type": "markdown", + "id": "0ffff371-8ee8-45c8-b452-b225a4464b21", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Cime Tool for listing configurations:

\n", + "\n", + "```\n", + "CIMEROOT/scripts/query_config --grids --long\n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "885ef623-f80d-4173-a8f8-cf4232217549", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + " =========================================\n", + " GRID naming convention\n", + " =========================================\n", + " The notation for the grid longname is\n", + " a%name_l%name_oi%name_r%name_m%mask_g%name_w%name\n", + " where\n", + " a% => atm, l% => lnd, oi% => ocn/ice, r% => river, m% => mask, g% => glc, w% => wav\n", + "\n", + " Supported out of the box grid configurations are given via alias specification in\n", + " the file \"config_grids.xml\". Each grid alias can also be associated with the\n", + " following optional attributes\n", + "\n", + " compset (Regular expression for compset matches that are required for this grid)\n", + " not_compset (Regular expression for compset matches that are not permitted this grid)\n", + "\n", + " Using the alias and the optional \"compset\" and \"not_compset\" attributes a grid longname is created\n", + " Note that the mask is for information only - and is not an attribute of the grid\n", + " By default, if the mask is not specified below, it will be set to the ocnice grid\n", + " And if there is no ocnice grid (such as for single column, the mask is null since it does not mean anything)\n", + " \n", + " -------------------------------------------------------------\n", + " default component grids:\n", + "\n", + " component compset value \n", + " -------------------------------------------------------------\n", + " atm SATM null \n", + " lnd SLND null \n", + " ocnice SOCN null \n", + " rof SROF null \n", + " rof DWAV rx1 \n", + " rof RTM r05 \n", + " rof MOSART r05 \n", + " rof DROF rx1 \n", + " rof DROF%CPLHIST r05 \n", + " rof XROF r05 \n", + " glc SGLC null \n", + " glc CISM1 gland5UM \n", + " glc CISM2 gland4 \n", + " glc XGLC gland4 \n", + " wav SWAV null \n", + " wav DWAV ww3a \n", + " wav WW3 ww3a \n", + " wav XWAV ww3a \n", + " -------------------------------------------------------------\n", + "\n", + " alias: g16_g16 (only for compsets that are DATM.+DROF )\n", + " non-default grids are: atm:gx1v6 lnd:gx1v6 ocnice:gx1v6 \n", + " \n", + " gx1v6 is displaced Greenland pole v6 1-deg grid: with domain file(s): \n", + " $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v6.090206.nc (only for grid match: atm|lnd)\n", + " $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v6.090206.nc (only for grid match: ocnice) \n", + "\n", + " alias: g17_g17 (only for compsets that are DATM.+DROF )\n", + " non-default grids are: atm:gx1v7 lnd:gx1v7 ocnice:gx1v7 \n", + " \n", + " gx1v7 is displaced Greenland pole 1-deg grid with Caspian as a land feature: with domain file(s): \n", + " $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v7.151008.nc (only for grid match: atm|lnd)\n", + " $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v7.151008.nc (only for grid match: ocnice) \n", + "\n", + "...\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "82faa8c6-88d6-41ba-a063-52939e664391", + "metadata": {}, + "source": [ + "### Compset" + ] + }, + { + "cell_type": "markdown", + "id": "0ccf426a-57d0-4447-9eb7-c53c18544148", + "metadata": {}, + "source": [ + "`--compset` is the argument that specifies the **component set**. In the example above, the compset is `COMPSET`. The compset specifies the component models and if they are active or not, forcing scenarios, and physics options for the models. As above, the `--compset` can be specified by its alias or its full long name. However, the long name conventions are generally quite lengthy, so it is useful if you become familiar with using the alias version." + ] + }, + { + "cell_type": "markdown", + "id": "160dd746-6ec4-4ea2-85f1-92bbbdd5647d", + "metadata": {}, + "source": [ + "![Create New Case Compset Image](../../../images/basics/CESM2_Create_Newcase_Compset.png)" + ] + }, + { + "cell_type": "markdown", + "id": "ee1cde34-5742-48c3-964b-6362d32288d0", + "metadata": {}, + "source": [ + "**Note**:\n", + "- Compsets are defined by different model components (active or data) and cime.\n", + "- Some compsets are scientifically supported and/or tested, while some are only defined. The CESM project will not provide comprehensive support for compsets that are only defined.\n", + "- Compsets determine which grid is required." + ] + }, + { + "cell_type": "markdown", + "id": "0d522ed3-098c-4194-be32-f219be984248", + "metadata": {}, + "source": [ + "#### CESM2 Supported Compsets" + ] + }, + { + "cell_type": "markdown", + "id": "e8b7943e-0be5-4feb-9b3f-cb8d4fe4aac0", + "metadata": {}, + "source": [ + " Link for CESM2 Supported Compsets: \n", + "
\n", + "[http://www.cesm.ucar.edu/models/cesm2/config/compsets.html](http://www.cesm.ucar.edu/models/cesm2/config/compsets.html)" + ] + }, + { + "cell_type": "markdown", + "id": "e91dff67-7992-48d2-afba-c0acb5528fb8", + "metadata": {}, + "source": [ + "
\n", + "Cime Tool for listing configurations:

\n", + "\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./query_config --compsets\n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "65d58f32-51ff-4dfa-a52d-edc182e6cae4", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + "Active component: allactive\n", + " --------------------------------------\n", + " Compset Alias: Compset Long Name \n", + " --------------------------------------\n", + " B1850 : 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " B1850cmip6 : 1850_CAM60_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BMH6kcmip6 : midH_CAM60_CLM50%BGC_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BLIG127kcmip6 : 127ka_CAM60_CLM50%BGC_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BCO2x4cmip6 : 1850_CAM60%4xCO2_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " B1PCTcmip6 : 1850_CAM60%1PCT_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BW1850 : 1850_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BW1850cmip6 : 1850_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWsc1850 : 1850_CAM60%WCSC_CLM50%BGC-CROP_CICE_POP2%ECO_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWsc1850smyle : 1850_CAM60%WCSC%SMYLE_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BWscHIST : HIST_CAM60%WCSC_CLM50%BGC-CROP_CICE_POP2%ECO_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWCO2x4cmip6 : 1850_CAM60%WCTS%4xCO2_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BW1PCTcmip6 : 1850_CAM60%WCTS%1PCT_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWmaCO2x4cmip6 : 1850_CAM60%WCCM%4xCO2_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWma1PCTcmip6 : 1850_CAM60%WCCM%1PCT_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP126cmip6 : SSP126_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP245cmip6 : SSP245_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP370cmip6 : SSP370_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP585cmip6 : SSP585_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP534oscmip6 : SSP534_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP126 : SSP126_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP245 : SSP245_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP370 : SSP370_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP585 : SSP585_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP534os : SSP534_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWHIST : HIST_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP585extcmip6 : SSP585EXT_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWSSP534osextcmip6 : SSP534EXT_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWHISTcmip6 : HIST_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWma1850 : 1850_CAM60%WCCM_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BWmaHIST : HIST_CAM60%WCCM_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3\n", + " BHIST : HIST_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BHISTcmip6 : HIST_CAM60_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BHISTsmbb : HIST_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BSSP370smbb : SSP370_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BSSP370smbbext : SSP370EXT_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BSSP245smbb : SSP245_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BC5L45BGC : 2000_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV\n", + " B1850L45BGCR : 1850_CAM60_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV\n", + " B1850C5L45BGC : 1850_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV\n", + " BSSP585 : SSP585_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BSSP126 : SSP126_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BSSP245 : SSP245_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BSSP370 : SSP370_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + " BSSP585cmip6 : SSP585_CAM60_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD\n", + "\n", + "...\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "61581a4e-86f4-44e4-92d9-d29aefa9ed8b", + "metadata": {}, + "source": [ + "### Machines" + ] + }, + { + "cell_type": "markdown", + "id": "5e4e5466-8955-4f61-84f7-6228b1aac32b", + "metadata": {}, + "source": [ + "The argument `--mach` is not required on CESM supported machines, but is required on other machines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94b79d8f-2da5-4a3f-b9b9-0cbb45896c0e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workflow/model_output.ipynb b/_sources/notebooks/basics/cesm_workflow/model_output.ipynb new file mode 100644 index 000000000..218f6b861 --- /dev/null +++ b/_sources/notebooks/basics/cesm_workflow/model_output.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "683d9e77-d700-4f75-b3f0-eb813657351b", + "metadata": { + "tags": [] + }, + "source": [ + "# Model Output\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d8e6525b-31d9-450d-a3b9-e3b435fc231a", + "metadata": {}, + "source": [ + "If the model run is successful, the CESM netcdf output history files are automatically moved to a short term archive (`$DOUT_S_ROOT`) by `case.st_archive`." + ] + }, + { + "cell_type": "markdown", + "id": "d62c7e4b-86e0-40ec-8dfa-5744c3884bc0", + "metadata": {}, + "source": [ + "![Case Submit Image](../../../images/basics/CESM2_short_term_archive.png)\n", + "\n", + "\n", + "For the current tutorial on derecho, the paths are:\n", + "- `$SRCROOT` = `/glade/u/home/$USER/code/my_cesm_code`\n", + "- `$CASEROOT` = `/glade/u/home/$USER/cases/$CASE`\n", + "- `$EXEROOT` =`/glade/derecho/scratch/$USER/$CASE/bld` \n", + "- `$RUNDIR` =`/glade/derecho/scratch/$USER/$CASE/run` \n", + "- `$DOUT_S_ROOT` =`/glade/derecho/scratch/$USER/archive/$CASE` " + ] + }, + { + "cell_type": "markdown", + "id": "9be4ca8e-8483-48b1-80e7-821b8627eead", + "metadata": {}, + "source": [ + "**Notes:**\n", + "- If a model run was unsuccessful the output remains in the Run Directory (`$RUNDIR`) and the short term archive is not created.\n", + "- Both `$RUNDIR` and `$DOUT_S_ROOT` are in the NCAR HPC scratch space. This space is scrubbed and files deleted after a number of days. Thus, it is a good idea to move your model output files from the short term archive to a more permanent location as soon as you are able." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b026c623-617e-42d1-a3d1-4f6fce55bd5f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/cesm_workspaces.ipynb b/_sources/notebooks/basics/cesm_workspaces.ipynb new file mode 100644 index 000000000..d287b1c6f --- /dev/null +++ b/_sources/notebooks/basics/cesm_workspaces.ipynb @@ -0,0 +1,180 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Workspaces" + ] + }, + { + "cell_type": "markdown", + "id": "15d62f62-74a4-4936-8283-4d0226dcedab", + "metadata": {}, + "source": [ + "Utilizing the CESM model requires knowledge of the locations of the different parts of the model. The CESM model consists of five main directory tree areas that make up the **CESM Workspace**. \n", + "\n", + "One of the key elements of the Tutorial will be learning where each of these workspace elements are located and how to use them to setup, build, run and analyze the output of model simulations.\n", + "\n", + "\n", + "There are 5 main directories (see figure, below) you will need to navigate:\n", + "1) The path to your **CESM source code**. This is referred to as `$SRCROOT` (or `$CESMCODE`) and contains the `$CIMEROOT`.\n", + "2) The path to the **input data**, referred to as `$CESMDATA`.\n", + "3) The path to your experiment **case directories**. This is referred to as `$CASEROOT`.\n", + "4) The path to your **build** and **run directories**, referred to as the `$EXEROOT` and `$RUNDIR`, respectively.\n", + "5) The path to your **archived model output**, referred to as `$DOUT_S_ROOT`.\n", + "\n", + "We will investigate these in more detail in the remainder of the Tutorial.\n", + "\n", + "**Note on Terminology**
\n", + "- Paths are the directions to the location of different pieces of your workspace.\n", + "- Roots are saved paths that point to a specific piece of the model." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "6b1d1b2e-9c93-4e47-8f4d-d51b96cdab7b", + "metadata": {}, + "source": [ + "## Workspace Overview\n", + "\n", + "![CESM workspace](../../images/basics/CESM2_Workspaces_Detail.png)\n", + "*

Figure: Overview of the CESM2 Workspace Directories

*\n", + "\n", + "For the current tutorial on derecho, the paths are:\n", + "- `$SRCROOT` = `/glade/u/home/$USER/code/my_cesm_code`\n", + "- `$DIN_LOC_ROOT` = `/glade/campaign/cesm/cesmdata/cseg/inputdata`\n", + "- `$CASEROOT` = `/glade/u/home/$USER/cases/$CASE`\n", + "- `$CIME_OUTPUT_ROOT` = `/glade/derecho/scratch/$USER`\n", + "- `$EXEROOT` =`/glade/derecho/scratch/$USER/$CASE/bld` \n", + "- `$RUNDIR` =`/glade/derecho/scratch/$USER/$CASE/run` \n", + "- `$DOUT_S_ROOT` =`/glade/derecho/scratch/$USER/archive/$CASE` \n" + ] + }, + { + "cell_type": "markdown", + "id": "40962c56-fb4d-4862-95a1-8d5c98b82720", + "metadata": {}, + "source": [ + "Each of these directories contains sub-directories. You will need to learn to navigate between these directories." + ] + }, + { + "cell_type": "markdown", + "id": "19acc3aa-fb98-44af-966f-16ca49710135", + "metadata": {}, + "source": [ + "____\n", + "\n", + "## Setting your workspaces\n", + "\n", + "You will need to create a directory for the CESM Code and a directory when you will keep all your cases. \n", + "In the CESM jargon, a `case` refers to a specific instance of a model simulation." + ] + }, + { + "cell_type": "markdown", + "id": "1c6bda59-5302-4454-88bb-dfe5c4bd3209", + "metadata": {}, + "source": [ + "- ### Create CESM Code Directory\n", + "Create a workspace location where you can put your CESM code on the derecho glade file system. In all exercises in this tutorial `$USER` is a placeholder and you should use your NCAR HPC login name when completing the exercise.\n" + ] + }, + { + "cell_type": "markdown", + "id": "b281cda4-e1c0-458b-98df-a1cf34c45a72", + "metadata": {}, + "source": [ + "
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER\n", + "mkdir code\n", + "```\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "76f14c71-ffae-4d67-b496-d6b075d4652d", + "metadata": {}, + "source": [ + "- ### Create Cases Workspace Location\n" + ] + }, + { + "cell_type": "markdown", + "id": "667ca15d-2ef7-40b1-be89-3abac566d472", + "metadata": {}, + "source": [ + "Create a workspace location where all your cases from this tutorial will be located on the derecho glade file system." + ] + }, + { + "cell_type": "markdown", + "id": "37b8b7c6-9152-47d8-af76-7814006a5718", + "metadata": {}, + "source": [ + "
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER\n", + "mkdir cases\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a779263-cb21-443e-a3d8-0bd4a0e267e8", + "metadata": {}, + "source": [ + "- ### Other Workspace Locations\n" + ] + }, + { + "cell_type": "markdown", + "id": "4e972986-5267-43a8-917b-1e36c7117323", + "metadata": {}, + "source": [ + "The `INPUTDATA` directory does not need to be set up directly on NCAR HPC as these data are in a common directory.\n", + "\n", + "We will not directly set up your `Build/Run` or `Archive` workspace locations. These directories will be automatically created when you create a CESM case." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d0ddf488-72e4-40f8-a797-cc2d1b958208", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/code/cesm_code_explore.ipynb b/_sources/notebooks/basics/code/cesm_code_explore.ipynb new file mode 100644 index 000000000..3ddbe7a7c --- /dev/null +++ b/_sources/notebooks/basics/code/cesm_code_explore.ipynb @@ -0,0 +1,347 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Explore CESM Code\n" + ] + }, + { + "cell_type": "markdown", + "id": "285f4d12-6411-4f57-aa81-09ca1106a380", + "metadata": {}, + "source": [ + "Having downloaded the CESM Code component to your workspace we are now going to briefly locate and explore the different code directories within it. To get some familiarity with this area we are going to use the terminal window to explore the directories illustrated below this top level location. Specifically in this exercise we will:\n", + "\n", + "- Step 1. Locate your CESM Code area on the glade file system.\n", + "- Step 2. Examine the CIME Directory area.\n", + "- Step 3. Examine the Model Components area.\n", + "- Step 4. Look at the Community Atmosphere Model (CAM) Component Model.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8a064b52-fc3a-4efd-93b8-ac7d96538e36", + "metadata": {}, + "source": [ + "![CESM directories](../../../images/basics/CESM2_Workspaces_Code.png)\n", + "*

Figure: Detailed view of the CESM2 Code Directory

*\n", + "\n", + "For the current tutorial on derecho, the paths are: \n", + "- `$SRCROOT = /glade/u/home/$USER/code/my_cesm_code` " + ] + }, + { + "cell_type": "markdown", + "id": "44f8925f-4703-44d9-baa7-5ac59da0ede1", + "metadata": {}, + "source": [ + "## Step 1. Locate Your Code Workspace Area\n", + "\n", + "Returning to your terminal window we will now locate your `$SRCROOT` location on the NCAR HPC file system.\n", + "\n", + "
\n", + "Locate your current directory:
\n", + "\n", + "```\n", + "pwd\n", + "```\n", + "
\n", + " \n", + "Expected output:
\n", + "\n", + "```\n", + "/glade/u/home/$USER/code/my_cesm_code\n", + "```\n", + "
\n", + "\n", + " \n", + "If you have not done anything since the last exercise then you will already be in the `$SRCROOT` location. If your output doesn't match the path above, then change the current directory to your Workspace Code directory:
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code\n", + "```\n", + "
\n", + " \n", + "List the contents of the Workspace Code directory with the ls long option:
\n", + "\n", + "```\n", + "ls -l\n", + "```\n", + "
\n", + " \n", + "Expected output:
\n", + "\n", + "```\n", + "total 2119\n", + "-rw-r--r-- 1 $USER ncar 2116708 Jun 3 15:46 ChangeLog\n", + "-rw-r--r-- 1 $USER ncar 2433 Jun 3 15:46 ChangeLog_template\n", + "drwxr-xr-x 10 $USER ncar 4096 Jun 4 09:32 cime\n", + "drwxr-xr-x 4 $USER ncar 4096 Jun 3 15:46 cime_config\n", + "drwxr-xr-x 10 $USER ncar 4096 Jun 4 09:32 components\n", + "-rwxr-xr-x 1 $USER ncar 2475 Jun 3 15:46 describe_version\n", + "drwxr-xr-x 3 $USER ncar 4096 Jun 3 15:46 doc\n", + "-rw-r--r-- 1 $USER ncar 1409 Jun 3 15:46 Externals.cfg\n", + "-rw-r--r-- 1 $USER ncar 5498 Jun 3 15:46 LICENSE.txt\n", + "drwxr-xr-x 5 $USER ncar 4096 Jun 3 15:46 manage_externals\n", + "-rw-r--r-- 1 $USER ncar 8904 Jun 3 15:46 README.rst\n", + "```\n", + "
\n", + "\n", + " \n", + "
\n", + "\n", + "**If the output of these commands does not match for your CESM Workspace then you will need to ask for help in configuring them. This area will be used for the remainder of the Tutorial so it is important to get this step right.**" + ] + }, + { + "cell_type": "markdown", + "id": "d3d8846b-cfa4-4b89-b262-39892ebdb52a", + "metadata": {}, + "source": [ + "## Step 2. Examine the CIME Directory\n", + "\n", + "In your terminal window we will now move to the CIME directory and examine the contents. Remember that CIME is the Common Infrastructure for Modeling the Earth. It is a python-based framework that integrates the various components of the CESM into a single modeling framework. The CIME Scripts directory will be the location where you will start the Workflow of creating a new case through the rest of the Tutorial.\n", + "\n", + "
\n", + "Change into the CIME Directory:
\n", + "\n", + "```\n", + "cd cime\n", + "```\n", + "
\n", + " \n", + "List the contents of the CIME Directory:
\n", + "\n", + "```\n", + "ls -l\n", + "```\n", + "
\n", + " \n", + "Expected output:
\n", + "\n", + "```\n", + "total 648\n", + "-rw-r--r-- 1 $USER ncar 618865 Jun 4 09:32 ChangeLog\n", + "-rw-r--r-- 1 $USER ncar 421 Jun 4 09:32 ChangeLog_template\n", + "-rw-r--r-- 1 $USER ncar 4000 Jun 4 09:32 CMakeLists.txt\n", + "drwxr-xr-x 5 $USER ncar 4096 Jun 4 09:32 config\n", + "-rw-r--r-- 1 $USER ncar 4670 Jun 4 09:32 CONTRIBUTING.md\n", + "drwxr-xr-x 3 $USER ncar 4096 Jun 4 09:32 doc\n", + "-rw-r--r-- 1 $USER ncar 444 Jun 4 09:32 index.html\n", + "-rw-r--r-- 1 $USER ncar 2461 Jun 4 09:32 LICENSE.TXT\n", + "-rw-r--r-- 1 $USER ncar 1747 Jun 4 09:32 README.md\n", + "drwxr-xr-x 7 $USER ncar 4096 Jun 4 09:32 scripts\n", + "drwxr-xr-x 8 $USER ncar 4096 Jun 4 09:32 src\n", + "drwxr-xr-x 7 $USER ncar 4096 Jun 4 09:32 tools\n", + "drwxr-xr-x 3 $USER ncar 4096 Jun 4 09:32 utils\n", + "```\n", + "
\n", + " \n", + "Change into the CIME Scripts directory:
\n", + "\n", + "```\n", + "cd scripts\n", + "```\n", + "
\n", + " \n", + "List the contents of the CIME Scripts directory:
\n", + "\n", + "```\n", + "ls -l\n", + "```\n", + "
\n", + " \n", + "Expected output:
\n", + "\n", + "```\n", + "total 101\n", + "-rwxr-xr-x 1 $USER ncar 5128 Jun 4 09:32 create_clone\n", + "-rwxr-xr-x 1 $USER ncar 11117 Jun 4 09:32 create_newcase\n", + "-rwxr-xr-x 1 $USER ncar 29859 Jun 4 09:32 create_test\n", + "drwxr-xr-x 2 $USER ncar 4096 Jun 4 09:32 data_assimilation\n", + "drwxr-xr-x 4 $USER ncar 4096 Jun 4 09:32 fortran_unit_testing\n", + "drwxr-xr-x 3 $USER ncar 4096 Jun 4 09:32 lib\n", + "-rwxr-xr-x 1 $USER ncar 14663 Jun 4 09:32 query_config\n", + "-rwxr-xr-x 1 $USER ncar 9067 Jun 4 09:32 query_testlists\n", + "drwxr-xr-x 5 $USER ncar 4096 Jun 4 09:32 tests\n", + "drwxr-xr-x 3 $USER ncar 4096 Jun 4 09:32 Tools\n", + "```\n", + "
\n", + "\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "37af6f2c-34ce-4de6-a13e-593e61a90f52", + "metadata": {}, + "source": [ + "## Step 3. Examine the CESM Components Area\n", + "\n", + "In your terminal window we will now move to the Components Directory and examine the contents of the individual sub models. \n", + "\n", + "![CESM directories](../../../images/basics/CESM2_Code_Components_List.png)\n", + "*

Figure: CESM2 Code Components

*\n", + "\n", + "
\n", + "Change back to the Code Workspace Location:
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code\n", + "```\n", + "OR\n", + "Alternatively, you can use the `cd ../..` to move up two levels in the directory hierarchy.\n", + "```\n", + "cd ../..\n", + "```\n", + "\n", + "
\n", + " \n", + "Change into the Components area of the Code Workspace:
\n", + "\n", + "```\n", + "cd components\n", + "```\n", + "
\n", + "\n", + "List the contents of the Components Directory:
\n", + "\n", + "```\n", + "ls -l\n", + "```\n", + "
\n", + " \n", + "Expected Output:
\n", + "\n", + "```\n", + "total 8\n", + "drwxr-xr-x 12 $USER ncar 4096 Jun 4 09:34 cam\n", + "drwxr-xr-x 7 $USER ncar 4096 Jun 4 09:32 cice\n", + "drwxr-xr-x 14 $USER ncar 4096 Jun 4 09:32 cism\n", + "drwxr-xr-x 12 $USER ncar 4096 Jun 4 09:31 clm\n", + "drwxr-xr-x 6 $USER ncar 4096 Jun 4 09:31 mosart\n", + "drwxr-xr-x 15 $USER ncar 4096 Jun 4 09:32 pop\n", + "drwxr-xr-x 6 $USER ncar 4096 Jun 4 09:32 rtm\n", + "drwxr-xr-x 6 $USER ncar 4096 Jun 4 09:31 ww3\n", + "```\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "aa9fb22c-de5f-41d7-ac25-07ba585ad2a9", + "metadata": {}, + "source": [ + "## Step 4. Look at the Community Atmosphere Model (CAM) Component Model\n", + "\n", + "As a final task in this exercise we are going to have a quick look at the Community Atmosphere Model (CAM) component model. At this point we are just exploring the Workspace. \n", + "\n", + "
\n", + "Change into the CAM Directory of the Components area:
\n", + "\n", + "```\n", + "cd cam\n", + "```\n", + "
\n", + "\n", + "List the contents of the CAM Directory:
\n", + "\n", + "```\n", + "ls -l\n", + "```\n", + "
\n", + " \n", + "Expected Output:
\n", + "\n", + "```\n", + "total 26\n", + "drwxr-xr-x 6 $USER ncar 4096 Jun 4 09:32 bld\n", + "drwxr-xr-x 10 $USER ncar 4096 Jun 4 09:34 chem_proc\n", + "drwxr-xr-x 4 $USER ncar 4096 Jun 4 09:32 cime_config\n", + "-rw-r--r-- 1 $USER ncar 7501 Jun 4 09:32 CODE_OF_CONDUCT.md\n", + "drwxr-xr-x 2 $USER ncar 4096 Jun 4 09:32 doc\n", + "-rw-r--r-- 1 $USER ncar 685 Jun 4 09:32 Externals_CAM.cfg\n", + "-rw-r--r-- 1 $USER ncar 1155 Jun 4 09:32 Externals.cfg\n", + "drwxr-xr-x 5 $USER ncar 4096 Jun 4 09:32 manage_externals\n", + "-rw-r--r-- 1 $USER ncar 1925 Jun 4 09:32 README_EXTERNALS\n", + "-rw-r--r-- 1 $USER ncar 282 Jun 4 09:32 README.md\n", + "drwxr-xr-x 11 $USER ncar 4096 Jun 4 09:32 src\n", + "drwxr-xr-x 4 $USER ncar 4096 Jun 4 09:32 test\n", + "drwxr-xr-x 11 $USER ncar 4096 Jun 4 09:32 tools\n", + "```\n", + "\n", + "
\n", + "\n", + "**Congratulations, you have now completed the CESM code exploration exercises!!**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50898f29-f9dd-470c-9918-a05df415b4a8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80d816ff-6217-4a2b-a9d0-4e5ae5e7ab21", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab049642-5bfe-4d46-92c7-c3c2ec6570fc", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18a9a811-0883-410d-bfb1-d3eb16e3fd75", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5191d62a-76ee-4f90-b46b-f70ec0af9909", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/code/git_download_cesm.ipynb b/_sources/notebooks/basics/code/git_download_cesm.ipynb new file mode 100644 index 000000000..a2c13c154 --- /dev/null +++ b/_sources/notebooks/basics/code/git_download_cesm.ipynb @@ -0,0 +1,357 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Download CESM" + ] + }, + { + "cell_type": "markdown", + "id": "9d121236-47a7-48ef-8b67-40ef3b827178", + "metadata": {}, + "source": [ + "You are going to download the CESM code from github into your own personal CESM workspace. Follow the three steps, below, to setup your CESM Code workspace.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "458e826c-60cb-4c5a-980f-b89f47cd06d1", + "metadata": {}, + "source": [ + "
\n", + "We will use the CESM release version `release-cesm2.1.5` for use in this tutorial.

\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c029d6bc-bd76-471a-8126-e888616e70d0", + "metadata": {}, + "source": [ + "Downloading the CESM code is an important step as this will be the code workspace we will be using throughout the rest of the Tutorial. **If you have problems here please ask for help**." + ] + }, + { + "cell_type": "markdown", + "id": "40257a4e-aa6d-4f12-b825-b9986cdf4daf", + "metadata": {}, + "source": [ + "## Step 1: Create CESM Code Directory" + ] + }, + { + "cell_type": "markdown", + "id": "986d1b83-f863-4294-b65b-5c9c65a8ac58", + "metadata": {}, + "source": [ + "\n", + "Create a workspace location where you can put your CESM code on the derecho glade file system. In all exercises in this tutorial `$USER` is a placeholder and you should use your NCAR HPC login name when completing the exercise." + ] + }, + { + "cell_type": "markdown", + "id": "d95a81b5-16b9-4291-9490-4058f98dcb3f", + "metadata": {}, + "source": [ + "
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER\n", + "mkdir code\n", + "```\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e980a755-b914-46eb-b217-3fe15781aeb3", + "metadata": {}, + "source": [ + "## Step 2. Download CESM Code with Git Clone" + ] + }, + { + "cell_type": "markdown", + "id": "76ef78ca-bb75-4340-996f-04f95233c84f", + "metadata": {}, + "source": [ + "First we will change into the `Code` Workspace location then we will use the `git clone` command to download the CESM code.\n", + "\n", + "
\n", + "Change the current directory to the code workspace directory:
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER/code\n", + "```\n", + "
\n", + " \n", + "Download the cesm code to your code workspace directory as `my_cesm_code`:
\n", + "```\n", + "git clone https://github.com/ESCOMP/CESM.git my_cesm_code\n", + "cd my_cesm_code\n", + "git checkout release-cesm2.1.5\n", + "```\n", + " \n", + "Note that while we named the downloaded code `my_cesm_code`, you can name it anything you want and for future downloads outside this tutorial it can be helpful to label the code for the release you are using for your experiments.\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b9211e68-8991-4f08-a6fd-ebd009cafe75", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + " \n", + "```\n", + "Note: switching to 'release-cesm2.1.5'.\n", + "\n", + "You are in 'detached HEAD' state. You can look around, make experimental\n", + "changes and commit them, and you can discard any commits you make in this\n", + "state without impacting any branches by switching back to a branch.\n", + "\n", + "If you want to create a new branch to retain commits you create, you may\n", + "do so (now or later) by using -c with the switch command. Example:\n", + "\n", + " git switch -c \n", + "\n", + "Or undo this operation with:\n", + "\n", + " git switch -\n", + "\n", + "Turn off this advice by setting config variable advice.detachedHead to false\n", + "\n", + "HEAD is now at 7a6c5b0 Update for cesm2.1.5-rc.01\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "97b726d5-99e6-450d-b494-fd9ddc917284", + "metadata": {}, + "source": [ + "### Versions" + ] + }, + { + "cell_type": "markdown", + "id": "cdeef63a-d107-46d2-a89b-d233c8ed13c2", + "metadata": {}, + "source": [ + "One thing you will need to determine is what version of the CESM code you should use. Some things to consider when making that decision include: \n", + "- What versions of the code are supported scientifically or technically?\n", + "- Things you may want to consider are what sort of model features do you need and what versions of the model are these available in? \n", + "- If you want to compare your sensitivity experiment against a community experiment (e.g. CESM2-LE) then you should use the same version of the code.\n", + "\n", + "\n", + "More information can be found on the [CESM Models website](https://www.cesm.ucar.edu/models)." + ] + }, + { + "cell_type": "markdown", + "id": "d5db54cd-0018-4187-afa7-6da675ea55ba", + "metadata": {}, + "source": [ + "
\n", + " \n", + "If you want to check which other release versions are available, you can use the command:\n", + "```\n", + "git tag --list 'release-cesm2*' \n", + "``` \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "195d4a4b-514b-446e-9d2b-4c7aeae60aa2", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + " \n", + "```\n", + "release-cesm2.0.0\n", + "release-cesm2.0.1\n", + "release-cesm2.1.0\n", + "release-cesm2.1.1\n", + "release-cesm2.1.2\n", + "release-cesm2.1.3\n", + "release-cesm2.1.4\n", + "release-cesm2.1.5\n", + "release-cesm2.2.0\n", + "release-cesm2.2.1\n", + "release-cesm2.2.2\n", + "\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "88bd0742-e990-4fcf-9b40-5c8b21a9ec43", + "metadata": {}, + "source": [ + "## Step 3. Download the Component Models with checkout_externals" + ] + }, + { + "cell_type": "markdown", + "id": "615c0e7b-5e6c-4352-b1a2-3f8ac03b4b6b", + "metadata": {}, + "source": [ + "\n", + "The CESM code downloaded with the branch tain the previous step does not include all of the code and support for the component models. These are developed and maintained in other Github repositories. To include all of the component models into your code workspace you need to download them as an additional step. The checkout_externals tool is located in manage_externals directory in the `my_cesm_code` code directory.\n", + "\n", + "
\n", + "Exercise: Run the `checkout_externals` command to download all the component models:
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code\n", + "./manage_externals/checkout_externals\n", + "```\n", + "
\n", + "*Note: If you get a message about accepting a certificate permanently or temporarily, accept the certificate permanently. If you do not get this message, do not worry, you are still on track!\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "8341952a-2c3b-4892-a7ea-6b0407ecb78c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for example output \n", + "\n", + "
\n", + "\n", + " where `$USER` will be replaced by your user name\n", + "```\n", + "Processing externals description file : Externals.cfg (/glade/u/home/$USER/code/my_cesm_code)\n", + "Checking local status of required & optional components: cam, cice, cime, cism, clm, mosart, pop, rtm, ww3, \n", + "Checking out externals: cime, cam, Processing externals description file : Externals_CAM.cfg (/glade/u/home/$USER/code/my_cesm_code/components/cam)\n", + "Checking out externals: chem_proc, carma, clubb, cosp2, \n", + "cice, cism, Processing externals description file : Externals_CISM.cfg (/glade/u/home/$USER/code/my_cesm_code/components/cism)\n", + "Checking out externals: source_cism, \n", + "clm, Processing externals description file : Externals_CLM.cfg (/glade/u/home/$USER/code/my_cesm_code/components/clm)\n", + "Checking out externals: fates, ptclm, \n", + "mosart, pop, Processing externals description file : Externals_POP.cfg (/glade/u/home/$USER/code/my_cesm_code/components/pop)\n", + "Checking out externals: cvmix, marbl, \n", + "rtm, ww3, \n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "74d14003-78cc-48e6-bcbc-622f0150dfed", + "metadata": {}, + "source": [ + "- The path `/glade/u/home/$USER/code/my_cesm_code` is your workspace `$SRCROOT`, as described in the [workspaces section](https://ncar.github.io/CESM-Tutorial/notebooks/basics/cesm_workspaces.html#workspace-overview)." + ] + }, + { + "cell_type": "markdown", + "id": "ff11dd07-faa2-42a2-8692-83d0895bc9f3", + "metadata": {}, + "source": [ + "**Congratulations, you have now downloaded the CESM code component of your workspace!!**" + ] + }, + { + "cell_type": "markdown", + "id": "a9a323ca-575d-4d80-ae5d-6e5402cccc75", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "You downloaded the CESM code with the instructions above. In which directory is the CESM code? How do you navigate to that directory?\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "4e18eab9-75d1-4bf0-8d60-454f0cb6ce7d", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + "Click here for the solution
\n", + "If you download CESM with the instructions above, the CESM code is located in:\n", + "\n", + "```\n", + "/glade/u/home/$USER/code/my_cesm_code\n", + "```\n", + "\n", + "To navigate to that directory, use the UNIX command `cd`:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code\n", + "```\n", + "\n", + "If you are not familiar with UNIX commands, please review the [UNIX chapter](https://ncar.github.io/CESM-Tutorial/notebooks/resources/unix.html) of this documentation. \n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9630dee5-2e36-4c2f-81b6-f8abd736a73f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/code_overview.ipynb b/_sources/notebooks/basics/code_overview.ipynb new file mode 100644 index 000000000..b22cf4e8c --- /dev/null +++ b/_sources/notebooks/basics/code_overview.ipynb @@ -0,0 +1,80 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8c2d8431-0e66-4597-96bb-858874da9235", + "metadata": {}, + "source": [ + "# CESM code" + ] + }, + { + "cell_type": "markdown", + "id": "56f53601-ba7c-41b0-8d9e-d56f67689734", + "metadata": {}, + "source": [ + "Before you can start running the CESM model you must first download CESM from Github and set up your Workspace. This exercise is estimated to take around 30-60 minutes, depending on your previous experience with NCAR HPC and Github." + ] + }, + { + "cell_type": "markdown", + "id": "9dcb3c4e-df54-4e99-892c-8ce99ea35410", + "metadata": {}, + "source": [ + "## Learning Objectives" + ] + }, + { + "cell_type": "markdown", + "id": "f7a8cc2d-e2eb-4f06-a173-9ca19a1dc383", + "metadata": {}, + "source": [ + "
\n", + " \n", + "- Download CESM to your workspace with Git commands.\n", + "- Explore your CESM workspace for CESM Code.\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "89b36bf1-182b-4460-af55-6f05b7a4a086", + "metadata": {}, + "source": [ + "If you are unfamiliar with logging into NCAR HPC resources, please go back to this [section](https://ncar.github.io/CESM-Tutorial/notebooks/prereqs/prereqs_overview.html#ncar-high-performance-computing-hpc) to learn more about logging into derecho.\n", + "\n", + "Github and Git software are used as development and management tools for supporting and distributing CESM. This tutorial is not intended to be a Github or Git software tutorial, so we will provide the basic git commands needed to download CESM. If you want to learn more about using these tools go to this [section](https://ncar.github.io/CESM-Tutorial/notebooks/resources/github.html#github).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "729b1035-407c-4a7a-8da2-97402230fc75", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/exercises/examine_history_B1850.ipynb b/_sources/notebooks/basics/exercises/examine_history_B1850.ipynb new file mode 100644 index 000000000..edc0a54f2 --- /dev/null +++ b/_sources/notebooks/basics/exercises/examine_history_B1850.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Examine History Files\n" + ] + }, + { + "cell_type": "markdown", + "id": "0f737e0e-3ba8-40e4-8a82-8484830e002a", + "metadata": {}, + "source": [ + "Having successfully completed your first month of the new CESM B1850 case you will now examine the history files that have been transfered to the Archive directory. You will be using the NetCDF viewer ncview to look at the monthly average values for the single month. For this exercise you will be looking at the output from the Community Atmospheric Model (CAM) component of CESM, however the ncview tool can be applied to other components such as the Community Land Model (CLM). In this exercise we will:\n", + "\n", + "- Step 1. Explore the b1850.basics Archive directory.\n", + "- Step 2. Open the b1850.basics cam h0 in ncview.\n", + "- Step 3. Examine Average Monthly Surface Temperature.\n", + "- Step 4. Examine Average Monthly Precipitation." + ] + }, + { + "cell_type": "markdown", + "id": "736b22e8-4b55-4c33-bff9-1ab1a026931c", + "metadata": {}, + "source": [ + "## Step 1. Explore the b1850.basics Archive directory" + ] + }, + { + "cell_type": "markdown", + "id": "0c778f29-eacc-4e41-b729-1cb6e45cc65f", + "metadata": {}, + "source": [ + "The short term archive directory has a range of model component directories along with the restart (rest) and logs directories. First change directory into the archive directory and then list the contents of the restart and logs directories. " + ] + }, + { + "cell_type": "markdown", + "id": "27929215-8026-42f7-acf7-84c259f944e2", + "metadata": {}, + "source": [ + "
\n", + "Change into the b1850.basics short term archive directory:

\n", + "\n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/b1850.basics\n", + "```\n", + "
\n", + "\n", + "List the logs directory:
\n", + "\n", + "```\n", + "ls -l logs\n", + "```\n", + "
\n", + " \n", + "This is where all the log files from the model run are kept.
\n", + "\n", + "List the logs directory:
\n", + "\n", + "```\n", + "ls -l rest/0001-02-01-00000\n", + "```\n", + "
\n", + "\n", + "These are the files that CESM will use to restart the model.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f1fad1f2-8f0a-4555-a40b-c226877d9c06", + "metadata": {}, + "source": [ + "## Step 2. Open the CAM h0 monthly history file" + ] + }, + { + "cell_type": "markdown", + "id": "b7a357a4-fec5-44df-8a2d-db27dd57d9fe", + "metadata": {}, + "source": [ + "You will now use `ncview` to look at the b1850.basics case CAM monthly average values for the single month you ran.\n", + "\n", + "If you are unfamiliar with `ncview` you can learn more at [this link](https://ncar.github.io/CESM-Tutorial/notebooks/resources/netcdf.html#ncview). \n", + "\n", + "**Note**: you must load the `ncview` module to your environment. If you loaded the tutorial `.profile` or `.tcshrc` file it should already be loaded. Check that it is in your environment.\n", + "\n", + "```\n", + "module list\n", + "```\n", + "\n", + "If you don't see `ncview` in the list of modules, you can load it by doing:\n", + "\n", + "```\n", + "module load ncview\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "e4952d0c-ce4b-4274-9850-1f6e9e8fe7b6", + "metadata": {}, + "source": [ + "
\n", + "Change into the CAM history directory:

\n", + "\n", + "```\n", + "cd atm/hist\n", + "```\n", + "
\n", + "\n", + "List the files in the directory:
\n", + "\n", + "```\n", + "ls -l\n", + "```\n", + "
\n", + " \n", + "There should be a single file, b1850.basics.cam.h0.0001-01.nc.
\n", + "\n", + "Open the file using `ncview`:
\n", + "```\n", + "ncview b1850.basics.cam.h0.0001-01.nc &\n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "3c1fc1c9-910a-40e6-9a5e-77306885925d", + "metadata": {}, + "source": [ + "If your X11 environment is correctly set up then the ncview tool should appear as shown below on the left. Note the ` &` at the end of the command. This puts the command into the background allowing other tasks to be run from the derecho terminal window. The view on the right shows the ncview application once the Surface Temperature variable has been selected.\n", + "\n", + "
\n", + "\n", + "![NCView App Window](../../../images/basics/NCVIEW_App_Window.png)\n", + "*

Figure: NCView App Window

*" + ] + }, + { + "cell_type": "markdown", + "id": "24a515d6-95e5-48be-b7c4-b335ec0ad88a", + "metadata": {}, + "source": [ + "## Step 3. Examine Average Monthly Surface Temperature" + ] + }, + { + "cell_type": "markdown", + "id": "0b5d30af-109a-40a8-a49f-01ac21734dfb", + "metadata": {}, + "source": [ + "Using ncview with the b1850.basics January 0001 CAM monthly average values file loaded, examine the Surface Temperature variable. Update the color palette used to plot values and change the size of the plot.\n", + "\n", + "
\n", + "Select the Surface Temperature Variable:

\n", + "\n", + "Click on the **(244) 2d vars** button shown above. This will pull up a list of all 2d vars on the b1850.basics January 0001 CAM history file. This is a long list but it is in alphabetical order. You are looking for the `TS` variable. \n", + "
\n", + "\n", + "Change the color selection from detail to bright:
\n", + "\n", + "Click on the color button marked with **detail**. This will change the color selection to **3gauss**. Clicking again will change this to **ssec** and finally **bright**.\n", + " \n", + "
\n", + " \n", + "Increase the map plot size:
\n", + "\n", + "Click on the magnify button marked with **M X3**. This will change the magnification to \"M X4\". Clicking again will change this to \"M X5\" and finally \"M X6\"\n", + " \n", + "
\n", + "\n", + "![NCView TS](../../../images/basics/NCVIEW_Jan0001_TS.png)\n", + "*

Figure: NCView b1850.basics TS Jan 0001

*\n", + "\n", + "The Surface Temperature variable is in Kelvin. A value of 273.15K represents 0°C and 32°F. There are many options to better view and explore data with ncview. Some of these will come up over the next few days of the tutorial." + ] + }, + { + "cell_type": "markdown", + "id": "14ba2172-2188-4bca-b861-deb6bb45731a", + "metadata": {}, + "source": [ + "## Step 4. Examine Average Monthly Precipitation" + ] + }, + { + "cell_type": "markdown", + "id": "25c204c4-d1f2-4af8-93c1-d9296b5cba9c", + "metadata": {}, + "source": [ + "Using ncview with the b1850.basics January 0001 CAM monthly average values file loaded, examine the the two variables representing Convective Precipitation and Large Scale Precipitation.\n", + "\n", + "
\n", + "Exercise: Select the Convective Precipitation Variable:

\n", + "\n", + "Click on the \"(244) 2d vars\" button shown above. Find and select the PRECC variable. \n", + "
\n", + "\n", + "
\n", + "\n", + "![NCView PRECC](../../../images/basics/NCVIEW_Jan0001_PRECC.png)\n", + "*

Figure: NCView b1850.basics PRECC Jan 0001

*\n", + "\n", + "
\n", + "Exercise: Select the Convective Precipitation Variable:

\n", + "\n", + "Click on the \"(244) 2d vars\" button shown above. Find and select the PRECL variable. \n", + " \n", + "
\n", + "\n", + " \n", + "
\n", + "\n", + "![NCView PRECL](../../../images/basics/NCVIEW_Jan0001_PRECL.png)\n", + "*

Figure: NCView b1850.basics PRECL Jan 0001

*\n", + "\n", + "Precipitation in the model is recorded in m/s. To convert to mm/day we can multiply the values by 1000 mm in a meter and 86,400 seconds in a day. Can you see the differences in Convective and Large Scale Precipitation?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aefd9392-3406-466a-939e-3382755675ad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/exercises/extra.ipynb b/_sources/notebooks/basics/exercises/extra.ipynb new file mode 100644 index 000000000..61f342479 --- /dev/null +++ b/_sources/notebooks/basics/exercises/extra.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Explore Further\n" + ] + }, + { + "cell_type": "markdown", + "id": "0f737e0e-3ba8-40e4-8a82-8484830e002a", + "metadata": {}, + "source": [ + "The focus of this exercise has been to get the model running. We will learn more about how to modify runs in this section, and we will cover details in further sections of this tutorial. For now, if you have extra time, try the following actions to better familiarize yourself with the CESM code." + ] + }, + { + "cell_type": "markdown", + "id": "b86bda30-feb3-4cc4-aa4e-90bde99a8d1d", + "metadata": {}, + "source": [ + "## Explore the `CASE` directory" + ] + }, + { + "cell_type": "markdown", + "id": "19338922-d825-435d-bc21-4b6bf78c2ad9", + "metadata": {}, + "source": [ + "
\n", + " \n", + "```\n", + "cd /glade/u/home/$USER/cases/b1850.basics/\n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b349d98b-d239-4760-bc52-54300f47d6c9", + "metadata": { + "tags": [] + }, + "source": [ + "Look around your case directory to become familiar with the structure. Note there are scripts (e.g. case.setup, case.submit, etc.), xml files, etc. We will delve into these in more detail in future sections of the tutorial." + ] + }, + { + "cell_type": "markdown", + "id": "33e05339-2796-427a-867d-5891dba3803e", + "metadata": { + "tags": [] + }, + "source": [ + "### Check the CaseStatus file" + ] + }, + { + "cell_type": "markdown", + "id": "be1faf19-5e5b-48fa-ad77-89cdc01a6fc5", + "metadata": {}, + "source": [ + "All activities for the case are recorded in the CaseStatus file. By looking through the file the successful or otherwise outcome of each step of the run can be tracked." + ] + }, + { + "cell_type": "markdown", + "id": "972ea62f-d33d-49c4-a615-bb4efd603946", + "metadata": {}, + "source": [ + "
\n", + " \n", + "```\n", + "more CaseStatus \n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e8455397-9f25-4108-ba7d-5636dd6f14df", + "metadata": {}, + "source": [ + "### Check the Job Queue and Project" + ] + }, + { + "cell_type": "markdown", + "id": "67bef6ac-3a5a-4594-9fb4-bb0aadfe9fb8", + "metadata": {}, + "source": [ + "
\n", + " \n", + "```\n", + "./xmlquery JOB_QUEUE\n", + "./xmlquery PROJECT\n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "bc61ce2c-016d-42a1-807f-d9429b60c8b2", + "metadata": { + "tags": [] + }, + "source": [ + "## Explore the `cime/scripts` directory" + ] + }, + { + "cell_type": "markdown", + "id": "6d59eac7-637a-4ab5-aa13-e58c76402ffb", + "metadata": {}, + "source": [ + "
\n", + " \n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts\n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0bf92c97-a6f3-42d1-81dc-3afb5df626e6", + "metadata": {}, + "source": [ + "### Check the CESM compset definitions" + ] + }, + { + "cell_type": "markdown", + "id": "0fea9ec7-4dfe-4901-be41-2815b8d0408c", + "metadata": {}, + "source": [ + "
\n", + " \n", + "```\n", + "./query_config --compsets | more\n", + "```\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b20b8542-59e8-4f7f-9a47-daf1d324794f", + "metadata": {}, + "source": [ + "Note the ` | more` after the command sends the output of the query_config script to the `more` tool so you can scroll through it more easily. You can use the spacebar to move to the next page and the q key to quit out of the tool." + ] + }, + { + "cell_type": "markdown", + "id": "ca441693-1d6a-47d9-add7-cba4754fe18a", + "metadata": {}, + "source": [ + "### Check the CESM grid resolutions" + ] + }, + { + "cell_type": "markdown", + "id": "8407b1f3-5e5f-4b85-aee5-b2b197b8c6b1", + "metadata": {}, + "source": [ + "
\n", + " \n", + "```\n", + "./query_config --grids --long | more\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cff6ac2f-b73d-4585-805d-79267555b707", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/exercises/first_B1850.ipynb b/_sources/notebooks/basics/exercises/first_B1850.ipynb new file mode 100644 index 000000000..e19562969 --- /dev/null +++ b/_sources/notebooks/basics/exercises/first_B1850.ipynb @@ -0,0 +1,180 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7013ccab-46dc-4a38-8039-7ec464251982", + "metadata": {}, + "source": [ + "# Your first CESM run" + ] + }, + { + "cell_type": "markdown", + "id": "30c6953e-8197-4fea-b398-5a090db1a762", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Run a basic, out-of-the-box (that is, no user changes are implemented) CESM experiment

\n", + " \n", + "Create a case called **b1850.basics** using the compset ``B1850`` at ``f19_g17`` resolution. \n", + "\n", + "Check the status of the run after submitting.\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "73e4cb02-1717-420c-8a28-f56c0078956c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**Is my workspace set up?**\n", + "\n", + "Did you already create a `cases` directory where you will put all new cases\n", + "```\n", + "cd /glade/u/home/$USER\n", + "mkdir cases\n", + "```\n", + " \n", + "**Did you create a new case?**\n", + "\n", + "You can create a new case with the command:\n", + "```\n", + "./create_newcase --case /glade/u/home/$USER/cases/CASE --res RES --compset COMPSET\n", + "```\n", + "Make sure you use the correct information for the CASE, RES, and COMPSET inputs.\n", + "\n", + "**Did you set up the case?**\n", + "\n", + "You can invoke case set up as follows:\n", + "```\n", + "./case.setup\n", + "```\n", + "**How do I compile?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "**How do I check my job status?**\n", + "\n", + "You can check job status using the command:\n", + "```\n", + "qstat -u $USER\n", + "```\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f7c918d3-6475-463d-a10e-2badb6728cb5", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a new case b1850.basics with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts\n", + "./create_newcase --case /glade/u/home/$USER/cases/b1850.basics --res f19_g17 --compset B1850\n", + "```\n", + "\n", + "Case setup:\n", + "``` \n", + "cd /glade/u/home/$USER/cases/b1850.basics \n", + "./case.setup\n", + "```\n", + " \n", + "Do not make any other changes since we are running an out-of-the-box simulation.\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + " \n", + "Remember that `qcmd` is used on derecho only.\n", + "\n", + "Check the status:\n", + "```\n", + "qstat -u $USER\n", + "``` \n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "b1850.basics. \n", + " \n", + "Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/b1850.basics\n", + "ls \n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "9c66385f-055c-4b74-b6fe-6fc189c02690", + "metadata": { + "tags": [] + }, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "8218314c-f299-4171-b0fe-bac655c2d4f5", + "metadata": { + "tags": [] + }, + "source": [ + "- Did your run complete successfully?\n", + "- What sorts of files did you get as output?\n", + "- How long did the run go for?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a7b563b-7afd-4699-954b-8a3cc1e7bc4e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/exercises/review_questions.ipynb b/_sources/notebooks/basics/exercises/review_questions.ipynb new file mode 100644 index 000000000..5742e8c53 --- /dev/null +++ b/_sources/notebooks/basics/exercises/review_questions.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Review Questions\n", + "\n", + "If time allows here are some review questions to go back over the material in the [Introduction](https://ncar.github.io/CESM-Tutorial/notebooks/intro.html#introduction) and [Basics](https://ncar.github.io/CESM-Tutorial/notebooks/basics.html#basics) sections." + ] + }, + { + "cell_type": "markdown", + "id": "400791b9-2296-448b-a246-3eddd1ee828f", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 1: What is the CESM Workspace? How many separate directory areas are there?

\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "41bfb932-b6bc-4bce-adb9-6bb568abc0c5", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "The CESM model consists of five main directory tree areas that make up the CESM Workspace. The individual directories represent different elements including the source code, your experiment cases, the area where the model runs, the location of input data, and the location where the output data from the model will be archived for later use.\n", + " \n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "f1d27e05-48e4-476f-8714-abd94ff8b38c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 2: Where is the CESM Code Development Managed?

\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c081edba-611f-4f08-88c5-57d4ce94ea5b", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "The CESM Project is hosted on Github under under the Earth System Community Modeling Portal (ESCOMP) which is managed by the University Corporation for Atmospheric Research (UCAR). Code can be directly downloaded from Github using Git commands.\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "9b6dd2e6-d422-4460-acf5-08843d505872", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 3: Where do you find the create_newcase command? What does it do?

\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "740a99b4-14df-4167-9dfd-75b464a91ef3", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "The create_newcase script is located in the CIME Scripts Directory. The create_newcase script creates a new case in your CASE Directory. The command takes the new casename, compset, and resolution as values.\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7fe2eb40-6373-4a71-a488-a3b98b8e1dc8", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 4: What are the three commands required to start running a new case?

\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7c13abe3-e7f2-4371-a43a-f3a82856f40a", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "After create_newcase you need to change to the new case directory where you need to run case.setup, case.build and case.submit. As an additional step you can run the script preview_namelists.\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "30282de3-e5e8-4886-88c8-409c74ca9506", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 5: How can you monitor your CESM submission while it is running?

\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "4392489e-96c9-44d7-8897-a6560891c6e9", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "There are three main ways to monitor your CESM job while it is running. The first is with the qstat command, the second is with the build/run directory files, and the last is with the archive directory files. \n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "1a83b705-7035-4614-a13b-1ecf153a5f1c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 6: What is the main way to understand how a CESM simulation ran?

\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "197fefcd-c57a-431b-b517-5e2aacc4948c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "The main output from your CESM job is the history files. These can be specified to output the status of the component models at various levels of detail and for different time averaging periods. \n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "69723db1-9640-4744-94e1-78f327581c0f", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 7: What is an XML file? What is it used for in the Case Directory?

\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "70243d30-f462-4254-957e-e40ef33118ad", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "The XML files are Markup Language files that contain variables used by the CESM scripts. In the Case Directory there are seven xml files:\n", + " \n", + "- env_archive.xml specifies rules for short-term archival script case.st_archive\n", + "- env_batch.xml set by create_newcase to define batch specific settings used by script case.submit\n", + "- env_build.xml specifies build information used by script case.build\n", + "- env_case.xml set by create_newcase and cannot be modified\n", + "- env_mach_pes.xml specifies PE layout of components used by script case.run\n", + "- env_mach_specific.xml specifies machine specific information used by script case.build\n", + "- env_run.xml sets run time information (such as length of run, frequency of\n", + "restarts, …) User interacts with this file most frequently\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "12cb104f-bc23-4464-b531-a89934b9bb54", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Question 8: What are the main ways to investigate and modify XML values in the Case Directory?

\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "b030bacf-4dfb-42aa-8c56-8dc199840fd2", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "While the values in XML files can be modified directly with an editor, CESM provides tools for querying and changing values. The xmlquery and xmlchange tools ensure that the values found and updated are valid for the files they belong to and that any changes made are recorded in the CaseStatus file in the CASE Directory.\n", + " \n", + "
\n", + "
\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/exercises/second_B1850.ipynb b/_sources/notebooks/basics/exercises/second_B1850.ipynb new file mode 100644 index 000000000..2858576b3 --- /dev/null +++ b/_sources/notebooks/basics/exercises/second_B1850.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7013ccab-46dc-4a38-8039-7ec464251982", + "metadata": {}, + "source": [ + "# Extending your run" + ] + }, + { + "cell_type": "markdown", + "id": "30c6953e-8197-4fea-b398-5a090db1a762", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Run the same case, but for longer

\n", + "\n", + "The default value for a new case run length is 5 days. The run length is set by the XML variables STOP_OPTION and STOP_N. As the 5 days is too short to produce a monthly history file we will change these to run for a single month. In the next section you will learn more about `xml` files, but for now we will just provide the commands.\n", + " \n", + "From your `CASE` directory, extend the run b1850.basics with the command:\n", + "```\n", + "./xmlchange STOP_OPTION=nmonths\n", + "./xmlchange STOP_N=1\n", + "```\n", + "\n", + "After you have changed these variables, submit the job again and check its status.\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "73e4cb02-1717-420c-8a28-f56c0078956c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**Submit:**\n", + "```\n", + "./case.submit\n", + "```\n", + "\n", + "**Check the Status:**\n", + "```\n", + "qstat -u $USER\n", + "``` \n", + " \n", + "**List the contents of the Run directory**\n", + "\n", + "```\n", + "ls -lt /glade/derecho/scratch/$USER/b1850.basics/run\n", + "```\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f7c918d3-6475-463d-a10e-2badb6728cb5", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Go to your b1850.basics case directory:\n", + "```\n", + "cd /glade/u/home/$USER/cases/b1850.basics\n", + "```\n", + "\n", + "Changing xml files:\n", + "``` \n", + "./xmlchange STOP_OPTION=nmonths\n", + "./xmlchange STOP_N=1\n", + "```\n", + " \n", + "Do not make any other changes since we are running an out-of-the-box simulation.\n", + "\n", + "Submit:\n", + "```\n", + "./case.submit\n", + "```\n", + "\n", + "Check the job status:\n", + "```\n", + "qstat -u $USER\n", + "``` \n", + " \n", + " \n", + "When the run is completed, look into the archive directory for: \n", + "b1850.basics. \n", + " \n", + "Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/b1850.basics\n", + "ls \n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "9c66385f-055c-4b74-b6fe-6fc189c02690", + "metadata": { + "tags": [] + }, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "8218314c-f299-4171-b0fe-bac655c2d4f5", + "metadata": { + "tags": [] + }, + "source": [ + "- Did your run complete successfully?\n", + "- What sorts of files did you get as output and how are these different from before?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a7b563b-7afd-4699-954b-8a3cc1e7bc4e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/basics/exercises_overview.ipynb b/_sources/notebooks/basics/exercises_overview.ipynb new file mode 100644 index 000000000..c19cacae1 --- /dev/null +++ b/_sources/notebooks/basics/exercises_overview.ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8c2d8431-0e66-4597-96bb-858874da9235", + "metadata": {}, + "source": [ + "# Exercise Overview \n", + "\n", + "\n", + "## Learning Goals:\n", + "\n", + "- The student will successfully set up and run their first (short) CESM simulation.\n", + "- This lab exercise is designed to build off the one-time setup section and uses the CESM workflow information presented. \n", + "\n", + "## Exercise overview:\n", + "\n", + "By then end of this exercise you will have:\n", + "- created, setup, updated, built, run, and examined the output of a standard B1850 control case\n", + "\n", + "**You should not proceed in working on this exercise until you have successfully [set up your workspaces](https://ncar.github.io/CESM-Tutorial/notebooks/basics/cesm_workspaces.html) and [downloaded the CESM code](https://ncar.github.io/CESM-Tutorial/notebooks/basics/code/git_download_cesm.html). You must have have a `cases` directory and have successfully downloaded CESM using git to begin this exercise.**\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e062147c-f8f3-4a21-877e-b1c5755c6cad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/bgc/bgc.ipynb b/_sources/notebooks/challenge/bgc/bgc.ipynb new file mode 100644 index 000000000..6e85a9dda --- /dev/null +++ b/_sources/notebooks/challenge/bgc/bgc.ipynb @@ -0,0 +1,213 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Biogeochemistry" + ] + }, + { + "cell_type": "markdown", + "id": "c0590b2a-ae3f-48b2-b287-8fa40eae213d", + "metadata": {}, + "source": [ + "## Biogeochemistry in CESM" + ] + }, + { + "cell_type": "markdown", + "id": "34516fd8-ed12-44c0-ba57-b684c1c279cf", + "metadata": {}, + "source": [ + "Biogeochemistry features have been available since CESM1.0 and are on by default in CESM2.0. \n", + "\n", + "Three components of CESM have biogeochemistry features:\n", + "\n", + "**CAM**\n", + "- CO$_{2}$ constituents in CAM that use the land and ocean fluxes of CO$_{2}$ as surface boundary conditions.\n", + "- CAM passes CO$_{2}$ to the coupler for land and ocean flux computations. \n", + "- The CO$_{2}$ consitutients are coupled with radiation computations.\n", + "\n", + "**POP**\n", + "- Includes the MARBL ecosystem library in CESM2.0\n", + "\n", + "**CLM**\n", + "- Features covered elsewhere [LINK]" + ] + }, + { + "cell_type": "markdown", + "id": "f6f495f2-b20f-441e-877e-b0f5e9ec5755", + "metadata": {}, + "source": [ + "## Coupled BGC Compsets" + ] + }, + { + "cell_type": "markdown", + "id": "ef4e3af3-cc84-4dda-b483-daf8bf2b1b30", + "metadata": {}, + "source": [ + "**Terminology**\n", + "- BGC CO$_{2}$: what is used by surface components\n", + "- RAD CO$_{2}$: what is used by the atmospheric radiative code\n", + "- Diagnostic CO$_{2}$: prescribed atmospheric CO$_{2}$ concentrations. (E.g. constant, read from file, 1% ramp, etc.)\n", + "- Prognostic CO$_{2}$: predicted atmospheric CO$_{2}$ concentrations. Atmospheric consitutent is computed from surface CO$_{2}$ fluxes.\n", + "\n", + "\n", + "**B1850, BHIST**\n", + "- Compset long name has BCG%BDRD\n", + "- Coupled model, BGC & RAD CO$_{2}$ are diagnostic\n", + "\n", + "**B1850_BPRP, BHIST_BPRP**\n", + "- Shortnames introduced in CESM2.1.1\n", + "- Compset long name has BGC%BPRP\n", + "- Coupled model, BGC & RAD CO$_{2}$ are prognostic" + ] + }, + { + "cell_type": "markdown", + "id": "0a62ca85-30f9-409d-86d4-8bc2c1da2bcd", + "metadata": {}, + "source": [ + "## Ocean Specific BGC Compsets" + ] + }, + { + "cell_type": "markdown", + "id": "64720908-da20-491c-9c03-dea85f6f770f", + "metadata": {}, + "source": [ + "**C1850ECO**\n", + "- Ocean alone, 1850 aerosols, normal year forcing\n", + "\n", + "**G1850ECO**\n", + "- Ocean and sea ice, 1850 aerosols, normal year forcing\n", + "\n", + "**G1850ECOIAF**\n", + "- Ocean and sea ice, 1850 aerosols, interannually varying forcing\n", + "\n", + "These can be found by using the following command in the same directory as `create_newcase`\n", + "```\n", + "./query_config --compsets pop\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "acd0ff2e-fceb-4245-a8fb-0b7ff86aeb8c", + "metadata": {}, + "source": [ + "## BGC Initial Conditions" + ] + }, + { + "cell_type": "markdown", + "id": "56ffb1dc-1d35-4859-85f7-b3a47e9b567d", + "metadata": {}, + "source": [ + "**Coupled BDRD compsets**\n", + "- BDRD is default RUN_REFCASE set for f09_g17 or f19_g17 resolution experiments\n", + "- Provided initial conditions were spun-up with f09_g17 resolution model. *Note that the carbon cycle is not as well balanced in f19_g17 resolution experiments as it is with f09_g17 resolution.*\n", + "\n", + "**Coupled BPRP compsets**\n", + "- PBRP is the default RUN_REFCASE set for f09_g17\n", + "\n", + "**Ocean alone or Ocean-ice compsets**\n", + "- Initial conditions are provided but are not spun up." + ] + }, + { + "cell_type": "markdown", + "id": "d52161c7-d87e-455d-848f-6be823d6d110", + "metadata": {}, + "source": [ + "## BGC env*xml variables" + ] + }, + { + "cell_type": "markdown", + "id": "644683f9-5b69-4756-8643-84af9fdf7e6c", + "metadata": {}, + "source": [ + "**CCSM_BGC**\n", + "- Controls which CO$_{2}$ fields are exchanged between CESM components.\n", + "\n", + "![bgc_settings](../../../images/challenge/bgc_table_1.png)\n", + "\n", + "*

Figure: CCSM_BGC settings.

*\n", + " - CO2A: land only or ocean only runs.\n", + " - CO2B: atmosphere-land runs. Ocean and fossil fuel CO$_{2}$ fluxes are read for m a file.\n", + " - CO2C: fully coupled runs.\n", + "\n", + "**CCSM_CO2_PPMV**\n", + "- Constant CO$_{2}$ reference value used in some configurations.\n", + "\n", + "**OCN_CO2_TYPE or LND_CO2_TYPE**\n", + "- Controls CO$_{2}$ used by ocean and land components.\n", + "- Constant, prognistic, diagnostic.\n", + "\n", + "**OCN_TRACER_MODULES**\n", + "- Controls which ocean tracers are used.\n", + "- Ocean ecosystem model is called ecosys." + ] + }, + { + "cell_type": "markdown", + "id": "387d8807-75a6-40d2-97b2-eb20a7f7930a", + "metadata": {}, + "source": [ + "## BGC units and sign conventions" + ] + }, + { + "cell_type": "markdown", + "id": "255b3eff-e3f2-4a8d-9733-f4ba018588c7", + "metadata": {}, + "source": [ + "![bgc_units](../../../images/challenge/bgc_table_2.png)\n", + "\n", + "*

Figure: BGC units and sign conventions.

*" + ] + }, + { + "cell_type": "markdown", + "id": "a150934b-18e6-48da-98f4-b1a464e74343", + "metadata": {}, + "source": [ + "- CAM variables CO2, CO2_LND, CO2_OCN, CO2_FF all have units of (kg CO2)/(kg dry air). Note that these are not typical units for carbon cycle modelers. To convert to ppmv multipy by 1.0e6*28.966/44.0 . 28.966 is the molecular weight of dry air and 44.0 is the molecular weight of CO$_{2}$." + ] + }, + { + "cell_type": "markdown", + "id": "7e7c19a6-9a75-42a3-8338-59ffb4061acb", + "metadata": {}, + "source": [ + "* Same quantity in different CESM component output has: different names, different units, different sign conventions (for fluxes)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/bgc/bgc_exercise_1.ipynb b/_sources/notebooks/challenge/bgc/bgc_exercise_1.ipynb new file mode 100644 index 000000000..e3e910b22 --- /dev/null +++ b/_sources/notebooks/challenge/bgc/bgc_exercise_1.ipynb @@ -0,0 +1,81 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 1: Set up a BGC case" + ] + }, + { + "cell_type": "markdown", + "id": "f4238578-b8ac-4e94-aa01-2aac2c42a9dc", + "metadata": {}, + "source": [ + "We will create two different cases and compare the case directories. We want to check if the differences make sense. You will **NOT** run the model in this challenge exercise." + ] + }, + { + "cell_type": "markdown", + "id": "6457c1d2-0530-435d-ae27-d0f1eeabe583", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Set up a BGC control case

\n", + " \n", + "Create a case called **b_1850** using the compset ``B1850`` at ``f19_g17`` resolution. \n", + "\n", + "Create a case called **b_1850_bprp** using the compset ``B1850_BPRP`` at ``f19_g17`` resolution.\n", + "- What happens when you run create_newcase? Follow the instructions to get this working, but don't do it for real unless you know what you're doing.\n", + "\n", + "Run case.setup and preview_namelists for each case.\n", + "- What changes occur when the carbon cycle is made prognostic?\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "5efef9de-221c-411d-b209-23e53668a101", + "metadata": {}, + "source": [ + "## POP BGC Specific Output" + ] + }, + { + "cell_type": "markdown", + "id": "5d25903c-cd61-42fe-9631-04517ac35103", + "metadata": {}, + "source": [ + "**ocn/hist/$CASE.pop.h.ecosys.nday1.????-??-??.nc**\n", + "- selected ocean ecosys variables at daily resolution\n", + "- surface flux related, productivity, and functional group vertical integrals.\n", + "\n", + "**ocn/hist/$CASE.pop.h.ecosys.nyear1.????.nc**\n", + "- selected three dimensional ocean ecosys tracer budget terms." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam-chem_waccm/cam-chem_waccm.ipynb b/_sources/notebooks/challenge/cam-chem_waccm/cam-chem_waccm.ipynb new file mode 100644 index 000000000..8d2b202b4 --- /dev/null +++ b/_sources/notebooks/challenge/cam-chem_waccm/cam-chem_waccm.ipynb @@ -0,0 +1,130 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "curious-gibraltar", + "metadata": {}, + "source": [ + "# Atmospheric chemistry" + ] + }, + { + "cell_type": "markdown", + "id": "available-federation", + "metadata": { + "tags": [] + }, + "source": [ + "## Learning Goals\n", + "\n", + "- Student will learn about different chemistry (CAM-chem/WACCM) compsets and how to run one.\n", + "- Student will learn how to modify chemistry and change output settings.\n", + "- Student will learn how to change emissions.\n" + ] + }, + { + "cell_type": "markdown", + "id": "brave-copyright", + "metadata": {}, + "source": [ + "## CAM-chem and WACCM component sets\n", + "\n", + "The CESM2 components can be combined in numerous ways to carry out various scientific or software experiments. A particular mix of components, along with component-specific configuration and/or namelist settings, is called a component set or ``compset``. \n", + "\n", + "**WACCM** (Whole Atmosphere Community Climate Model) and **CAM-chem** (Community Atmosphere Model with chemistry) are atmospheric components of CESM, like CAM. They can be run as ``F`` and ``B`` compsets, as well as with nudged meteorology (for example towards reanalysis). They can be run using various dycores and resolutions.\n", + "In contrast to CAM, WACCM and CAM-chem run with different possibilities of chemistry complexity, whereby CAM uses simplified chemistry. CAM and CAM-chem use the same vertical resolution and model top.\n", + "Different chemical mechanisms for CAM-chem with more or less complexity have been developed based on the MOZART-TS1 and TS2 (currently the most comprehensive) chemical mechanism.\n", + "WACCM has a model top at about 150km and therefore covers the Troposphere, Stratosphere, Mesosphere and Lower-Thermosphere. The most comprehensive WACCM mechanism is therefore called the TSMLT chemical mechanism.\n", + "WACCM can also run with Middle Atmosphere (MA) chemistry (e.g., FWmaHIST, which includes very simplified chemistry in the troposphere, and with Specified Chemistry (e.g., FWscHIST), similar to the CAM chemistry.\n" + ] + }, + { + "cell_type": "markdown", + "id": "weekly-brass", + "metadata": {}, + "source": [ + "## CAM-chem and WACCM tested F component sets\n", + "\n", + "In CESM2.2 only the CAM-chem F compsets have been scientifically tested and no PI-control or transient history simulation has been scientifically validated. In contrast, WACCM has been used for CMIP6 simulations.\n", + "Two different nudging approaches exist using CAM-chem and WACCM, both using MERRA2 or GEOS5 meteorological analysis fields. The ``nudged`` approach is the recommended approach that uses meteorological fields (U, V, T) on CESM model levels.\n", + "The older specified dynamics (SD) approach requires the model to run on the vertical MERRA2 grids.\n", + "\n", + "An overview of different compsets can be found in the diagrams below.\n", + "\n", + "\n", + "![CAMChem tested F compsets](../../../images/challenge/CAMchem_compsets.png)\n", + "

Figure 1: CAM-chem tested F compsets.

\n", + "\n", + "![WACCM scientifically supported F compsets](../../../images/challenge/WACCM_compsets1.png)\n", + "

Figure 2: WACCM scientifically supported F compsets.

\n", + "\n", + "![WACCM tested F compsets](../../../images/challenge/WACCM_compsets2.png)\n", + "

Figure 3: WACCM tested F compsets.

" + ] + }, + { + "cell_type": "markdown", + "id": "unsigned-cooling", + "metadata": {}, + "source": [ + "## Overview of the Challenge Exercises for CAM-chem/WACCM\n", + "Start running one control case and choose between two options:\n", + "\n", + "a) Run a CAM-chem compset with TS1 chemistry, historical SSTs and 0.9x1.25 degrees horizontal resolution
\n", + "b) Run a WACCM with TSMLT1 chemistry, historical SSTs and 0.9x1.25 degrees horizontal resolution\n", + "\n", + "Once a control case has been configured and run, perform two test cases - one changing chemistry and one changing emissions." + ] + }, + { + "cell_type": "markdown", + "id": "adolescent-plaintiff", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "\n", + "\n", + "### Finding more information CAM-chem and WACCM\n", + "\n", + "More explanation (and some more options) can be found in the docs:
\n", + "https://wiki.ucar.edu/display/camchem/Home
\n", + "https://www.cesm.ucar.edu/models/cesm2/config/compsets.html
\n", + "https://ncar.github.io/CAM/doc/build/html/users_guide/atmospheric-configurations.html\n", + "\n", + "**Discussion board:**
\n", + "CAM-chem: https://bb.cgd.ucar.edu/cesm/forums/cam-chem.154/
\n", + "WACCM: https://bb.cgd.ucar.edu/cesm/forums/waccm.155/
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "equal-ethics", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam-chem_waccm/exercise_1.ipynb b/_sources/notebooks/challenge/cam-chem_waccm/exercise_1.ipynb new file mode 100644 index 000000000..5556bab11 --- /dev/null +++ b/_sources/notebooks/challenge/cam-chem_waccm/exercise_1.ipynb @@ -0,0 +1,259 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1: Control case: running with chemistry" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise 1: Run a present-day compset that includes chemistry

\n", + " \n", + "Create, configure, build and run a case for one of these following configurations: \n", + "- **CAM-chem:** ``f.e21.FCHIST.f09_f09_mg17.tutorial.test1`` with the ``FCHIST`` compset; or \n", + "- **WACCM:** ``f.e21.FWHIST.f09_f09_mg17.tutorial.test1`` with the ``FWHIST`` compset. \n", + " \n", + "Run a simulation for 5 days, with daily instantaneous output of the variables: ‘PS’,’Z3’,’T’,’U’,’V’,’O3’.\n", + "You are also welcome to output your own additional variables.\n", + "Remember, F compsets have data ocean and data sea ice. \n", + "Check your model output in your run directory.\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**How do I output daily instantaneous variables?**\n", + "\n", + "- Modify history stream 2 with namelist variable ``fincl2``\n", + "- Use namelist variables: ``nhtfrq``, ``mfilt``\n", + "- For more information, look at the chapter:
\n", + " **NAMELIST MODIFICATIONS** -> [Changing CAM namelist options](https://ncar.github.io/CAM/doc/build/html/users_guide/customizing-compsets.html#changing-cam-namelist-options)\n", + "- The default set up for these namelist variables can be found in ``CaseDocs/atm_in``\n", + "\n", + "**What is the resolution for FCHIST and FWHIST?**\n", + "\n", + "- Use resolution: f09_f09_mg17\n", + " \n", + "**Important! Check the newly generated namelist prior run**\n", + "\n", + "``ls CaseDocs/*``\n", + " \n", + "``atm_in`` \n", + "``atm_modelio.nml`` \n", + "``chem_mech.doc`` \n", + "``chem_mech.in`` \n", + "``cism.config`` \n", + "``cism_in`` \n", + "``cpl_modelio.nml`` \n", + "``docn_in ice_in`` \n", + "``docn.streams.txt.prescribed``\n", + "``drv_flds_in``\n", + "``drv_in`` \n", + "``esp_modelio.nml`` \n", + "``glc_modelio.nml``\n", + "``ice_modelio.nml``\n", + "``lnd_in``\n", + "``lnd_modelio.nml``\n", + "``mosart_in``\n", + "``ocn_modelio.nml``\n", + "``rof_modelio.nml``\n", + "``seq_maps.rc``\n", + "``wav_modelio.nml``\n", + " \n", + "- atm_in: atmospheric namelist variables\n", + "- chem_mech.in: chemical mechanism file\n", + "- drv_flds_in: dry deposition variables, MEGAN variables (if used)\n", + "- lnd_in: land namelist variables\n", + "- …\n", + "\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "**# Set environment variables**\n", + " \n", + "Use the following commands
\n", + "for **CAM-chem**:\n", + "```\n", + "set CASENAME = f.e21.FCHIST.f09_f09_mg17.tutorial.test1\n", + "set CASEDIR = /glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET = FCHIST\n", + "set RESOLUTION = f09_f09_mg17\n", + "```\n", + "\n", + "or for **WACCM**\n", + " \n", + "```\n", + "set CASENAME = f.e21.FWHIST.f09_f09_mg17.tutorial.test1\n", + "set CASEDIR = /glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET = FWHIST\n", + "set RESOLUTION = f09_f09_mg17\n", + "```\n", + "\n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET\n", + "```\n", + "You may need to add ``--project \"UESM0013\"`` when creating a new case.\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "**If needed**, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the tutorial project number ``UESM0013``\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "From within the case directory, invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + " \n", + "**# Build**\n", + " \n", + "Perform an initial build within the case directory\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "namelists (``atm_in``, ``ice_in``, ``lnd_in``, ``docn_in``) will appear in the CaseDocs\n", + "subdirectory, as well as in your $rundir\n", + "\n", + "**# Customize namelists**\n", + "\n", + "Edit the file ``user_nl_cam``. First open the ``CaseDocs/atm_in`` and find the lines for avgflag_pertap, mfilt, nhtfrq and copy and paste them into ``user_nl_cam``. Then make changes to those lines in ``user_nl_cam`` and add a line to write out a second history file, ``fincl2``. The namelist lines should look something like:\n", + "```\n", + "&cam_history_nl\n", + " avgflag_pertape = 'A','I','A','A','A','A','A','A','I'\n", + " mfilt = 1,30,365,240,240,480,365,73,30\n", + " nhtfrq = 0,-24,-24,-3,-1,1,-24,-120,-240\n", + " fincl2 = 'PS','Z3','T','U','V','O3'\n", + "/\n", + "``` \n", + " \n", + "You can do this with a text editor.\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Submit:**\n", + "```\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the run files and history files. \n", + " \n", + "(1) Find your model output in your run directory (``$run_dir``) after finished:\n", + "\n", + "```\n", + "ls /glade/derecho/scratch/$USER/$CASENAME/run\n", + "```\n", + "\n", + "![rundir example](../../../images/challenge/chemistry-rundir-example.png)\n", + "\n", + " \n", + "(2) Check that your archive directory on derecho (the path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "(3) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "```\n", + "ncdump –h f.e21.FCHIST.f09_f09_mg17.tutorial.test1.cam.h1.1995-01-01-00000.nc\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam-chem_waccm/exercise_2.ipynb b/_sources/notebooks/challenge/cam-chem_waccm/exercise_2.ipynb new file mode 100644 index 000000000..2f27827ce --- /dev/null +++ b/_sources/notebooks/challenge/cam-chem_waccm/exercise_2.ipynb @@ -0,0 +1,277 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2: Test case: changing the chemistry" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise 2: Building the model with new chemistry

\n", + " \n", + "Create, configure, build a new case as done in exercise 1, for one of these following configurations: \n", + "- **CAM-chem:** ``f.e21.FCHIST.f09_f09_mg17.tutorial.test2`` with the ``FCHIST`` compset; or \n", + "- **WACCM:** ``f.e21.FWHIST.f09_f09_mg17.tutorial.test2`` with the ``FWHIST`` compset. \n", + "\n", + "Set up this simulation to run for 5 days, with daily instantaneous output of the variables: ‘PS’,’Z3’,’T’,’U’,’V’,’O3’. \n", + " \n", + "**To change the chemistry**, copy your chemistry preprocessor file chem_mech.in from CaseDocs to your case directory as my_chem_mech.in and change reaction rate for the O1D reaction with O2 to 1.65e-12. Point the simulation to your new mechanism file using ``CAM_CONFIG_OPTS`` and re-build and submit. Once the simulation is complete, compare the 5th day output to the results from exercise 1.\n", + "\n", + "\n", + "**Extra information:**\n", + " \n", + "The chemistry preprocessor generates CAM Fortran source code to solve chemistry. The input is an ASCII file listing chemical reactions and rates. The chemistry preprocessor input file used in your previous run is in your\n", + "``$CASEROOT/CaseDocs/chem_mech.in``\n", + "\n", + "An example of a simple chemistry mechanism file content can be seen below:\n", + "![chemistry mechanism example](../../../images/challenge/chemistry-mechanism-example.png)\n", + "\n", + "Additional input files for default chemical mechanisms are in each source code subdirectory for mechanisms under:\n", + "``$SRCROOT/components/cam/src/chemistry/pp_*``\n", + "(i.e. ``pp_waccm_tsmlt_mam4``). You do not need to change these additional files for this exercise.\n", + "\n", + "Below is an overview of the different types of reactions and rates that can be defined in the mechanism file.\n", + "![chemistry preprocessor options example](../../../images/challenge/chemistry-preprocessor-info.png)\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**Creating a new chemistry input file**\n", + "``` \n", + "less CaseDocs/chem_mech.in\n", + "cp CaseDocs/chem_mech.in my_chem_mech.in\n", + "```\n", + "Open your copied new chemistry mechanism file with a text editor and change the reaction rate:\n", + " \n", + "![chemistry ozone reaction](../../../images/challenge/chemistry-ozone-reaction.png)\n", + "\n", + "**How to tell CESM to read your new chemistry mechanism file**\n", + "\n", + "- First look at the ``CAM_CONFIG_OPTS`` default setting for CAM-chem
\n", + "``./xmlquery CAM_CONFIG_OPTS``
\n", + "``CAM_CONFIG_OPTS: -phys cam6 -chem trop_strat_mam4_vbs -age_of_air_trcs``
\n", + "(note this will be different for WACCM)\n", + " \n", + "- Use xmlchange to append a pointer to your user mechanism:
\n", + "``./xmlchange --append CAM_CONFIG_OPTS=\"--usr_mech_infile `pwd`/my_chem_mech.in\"``\n", + " \n", + "- Check the ``CAM_CONFIG_OPTS`` has been changed
\n", + "``./xmlquery CAM_CONFIG_OPTS``
\n", + "``CAM_CONFIG_OPTS: -phys cam6 -chem trop_strat_mam4_vbs -age_of_air_trcs --usr_mech_infile /glade/u/home/$USER/cases/$CASENAME/my_chem_mech.in``\n", + " \n", + "- When an important xml variable like CAM_CONFIG_OPTS is changed, resetting the setup is needed. You will need to reset the case setup, and rebuild before submitting. (Note that in general, you only need to reset or clean build when a message shows up in the command prompt stating to reset or clean build).\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution \n", + "
\n", + " \n", + "**# Set environment variables**
\n", + "Use the commands
\n", + "for **CAM-chem**\n", + "```\n", + "set CASENAME = f.e21.FCHIST.f09_f09_mg17.tutorial.test2\n", + "set CASEDIR = /glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET = FCHIST\n", + "set RESOLUTION = f09_f09_mg17\n", + "```\n", + "\n", + "or for **WACCM** \n", + "```\n", + "set CASENAME = f.e21.FWHIST.f09_f09_mg17.tutorial.test2\n", + "set CASEDIR = /glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET = FWHIST\n", + "set RESOLUTION = f09_f09_mg17\n", + "```\n", + "\n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET\n", + "```\n", + "You may need to add ``--project \"UESM0013\"`` when creating a new case.\n", + " \n", + "**# Change the job queue and account number**\n", + "\n", + "**If needed**, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "From within the case directory, invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + " \n", + "**# Build**\n", + " \n", + "Perform an initial build within the case directory\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "namelists (``atm_in``, ``ice_in``, ``lnd_in``, ``docn_in``) will appear in the CaseDocs\n", + "subdirectory, as well as in your $rundir\n", + "\n", + "**# Customize namelists**\n", + "\n", + "As before, edit the file ``user_nl_cam``. First open the ``CaseDocs/atm_in`` and find the lines for avgflag_pertap, mfilt, nhtfrq and copy and paste them into ``user_nl_cam``. Then make changes to those lines in ``user_nl_cam`` and add a line to write out a second history file, ``fincl2``. The namelist lines should look something like:\n", + "```\n", + "&cam_history_nl\n", + " avgflag_pertape = 'A','I','A','A','A','A','A','A','I'\n", + " mfilt = 1,30,365,240,240,480,365,73,30\n", + " nhtfrq = 0,-24,-24,-3,-1,1,-24,-120,-240\n", + " fincl2 = 'PS','Z3','T','U','V','O3'\n", + "/\n", + "``` \n", + "You can do this with a text editor.\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "**# Change the chemistry**\n", + " \n", + "Copy the default mechanism to your own user defined file \n", + "``` \n", + "cp CaseDocs/chem_mech.in my_chem_mech.in\n", + "```\n", + "\n", + "Open your mechanism file with a text editor (e.g. nedit) and change the reaction rate for O1D with O2\n", + "```\n", + "nedit my_chem_mech.in &\n", + "```\n", + " In CAM-chem\n", + "![chemistry ozone reaction](../../../images/challenge/chemistry-ozone-reaction.png)\n", + "\n", + " In WACCM:\n", + "![chemistry ozone reaction](../../../images/challenge/chemistry-ozone-reaction_orig.png)\n", + "\n", + "\n", + "Append a pointer in the to the user mechanism:\n", + "```\n", + "./xmlchange --append CAM_CONFIG_OPTS=\"--usr_mech_infile `pwd`/my_chem_mech.in\"\n", + "```\n", + "\n", + "**# Re-build the model**\n", + "```\n", + "./case.setup --reset\n", + "./case.build --clean\n", + "qcmd -- ./case.build\n", + "```\n", + " \n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Submit:**\n", + "```\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the run files and history files. \n", + " \n", + "(1) Find your model output in your run directory (``$run_dir``) after finished:\n", + "\n", + "```\n", + "ls /glade/derecho/scratch/$USER/$CASENAME/run\n", + "```\n", + " \n", + "(2) Check that your archive directory on derecho (the path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "(3) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "```\n", + "ncdump –h f.e21.FCHIST.f09_f09_mg17.tutorial.test2.cam.h1.1995-01-01-00000.nc\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam-chem_waccm/exercise_3.ipynb b/_sources/notebooks/challenge/cam-chem_waccm/exercise_3.ipynb new file mode 100644 index 000000000..f37778428 --- /dev/null +++ b/_sources/notebooks/challenge/cam-chem_waccm/exercise_3.ipynb @@ -0,0 +1,361 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3: Test case: changing the emissions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise 3: Using different emissions

\n", + " \n", + "Create, configure, build a new case as done in exercise 1 or 2, for one of these following configurations: \n", + "- **CAM-chem:** ``f.e21.FCHIST.f09_f09_mg17.tutorial.test3`` with the ``FCHIST`` compset; or \n", + "- **WACCM:** ``f.e21.FWHIST.f09_f09_mg17.tutorial.test3`` with the ``FWHIST`` compset. \n", + "\n", + "Set up this simulation to run for 5 days, with daily instantaneous output of the variables: ‘PS’,’Z3’,’T’,’U’,’V’,’O3’. \n", + " \n", + "Change the namelist variables to use daily fire emissions from QFED. This will also require a change of model STARTDATE. Once the simulation is complete, compare the 5th day output to the previous results.\n", + " \n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**Pointing to new emission files**\n", + "\n", + "Point to new emission files in your ``user_nl_cam`` file. Note that you will also need to include pointers to emissions that you are not changing. The namelist variable for emissions is srf_emis_specifier. Copy the whole srf_emis_specifier entry from ``atm_in`` to ``user_nl_cam`` before editing. Emission files will add up in CESM.\n", + "\n", + "The location of qfed fire emissions on glade is described on the wiki: https://wiki.ucar.edu/display/camchem/Emission+Inventories\n", + "Search for files with bb in their name, which are fire / biomass burning emissions. Global one degree emissions are usually stored under an 'f09' folder.\n", + " \n", + "**Make sure your model start date is covered by the emissions files**\n", + "For this model set up will also need to double check the following are available:\n", + "- The SST file covers your selected dates (``env_run.xml`` file)\n", + "- Lower boundary condition file must include your selected dates (``atm_in`` file)\n", + "- Consider that the initialization file will be for the default 1995. If you don't change your initialization file, you will need to run your own model spin up.\n", + "\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "**# Set environment variables**\n", + "Use the commands:\n", + " \n", + "**CAM-chem**\n", + "```\n", + "set CASENAME = f.e21.FCHIST.f09_f09_mg17.tutorial.test3\n", + "set CASEDIR = /glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET = FCHIST\n", + "set RESOLUTION = f09_f09_mg17\n", + "```\n", + "\n", + "or for **WACCM**\n", + " \n", + "```\n", + "set CASENAME = f.e21.FWHIST.f09_f09_mg17.tutorial.test3\n", + "set CASEDIR = /glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET = FWHIST\n", + "set RESOLUTION = f09_f09_mg17\n", + "```\n", + "\n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET\n", + "```\n", + "You may need to add ``--project \"UESM0013\"`` when creating a new case.\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "**If needed**, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "From within the case directory, invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + " \n", + "**# Change the dates to cover emission files**
\n", + "Here, we choose 2010\n", + "```\n", + "./xmlchange RUN_STARTDATE=2010-01-01\n", + "```\n", + "\n", + "Make sure the sea surface temperature and ice (SSTICE) data file covers your dates of interest\n", + "```\n", + "./xmlquery SSTICE_DATA_FILENAME\n", + "```\n", + " \n", + "should return: \n", + "```\n", + "SSTICE_DATA_FILENAME: /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/sst/sst_HadOIBl_bc_0.9x1.25_1850_2017_c180507.nc\n", + "```\n", + "\n", + " \n", + "**# Build**\n", + " \n", + "Perform an initial build within the case directory\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "namelists (``atm_in``, ``ice_in``, ``lnd_in``, ``docn_in``) will appear in the CaseDocs\n", + "subdirectory, as well as in your $rundir\n", + "\n", + "**# Customize namelists**\n", + "\n", + "As before, edit the file ``user_nl_cam``. First open the ``CaseDocs/atm_in`` and find the lines for avgflag_pertap, mfilt, nhtfrq and copy and paste them into ``user_nl_cam``. Then make changes to those lines in ``user_nl_cam`` and add a line to write out a second history file, ``fincl2``. The namelist lines should look something like:\n", + "```\n", + "&cam_history_nl\n", + " avgflag_pertape = 'A','I','A','A','A','A','A','A','I'\n", + " mfilt = 1,30,365,240,240,480,365,73,30\n", + " nhtfrq = 0,-24,-24,-3,-1,1,-24,-120,-240\n", + " fincl2 = 'PS','Z3','T','U','V','O3'\n", + "/\n", + "``` \n", + "You can do this with a text editor.\n", + "\n", + "**# Add in different emissions**\n", + "Also add in the namelist pointers to emission files, replacing the fire emissions (every file with 'bb' in the name) with qfed files found at ``/glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/``\n", + "\n", + "```\n", + "&chem_inparm\n", + " srf_emis_specifier\t\t= 'BENZENE -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_BENZENE_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'BENZENE -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_BENZENE_0.9x1.25_mol_2000_2022.nc',\n", + " 'BIGALK -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_BIGALK_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'BIGALK -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_BIGALK_0.9x1.25_mol_2000_2022.nc',\n", + " 'BIGENE -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_BIGENE_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'BIGENE -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_BIGENE_0.9x1.25_mol_2000_2022.nc',\n", + " 'C2H2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H2_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'C2H2 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H2_0.9x1.25_mol_2000_2022.nc',\n", + " 'C2H4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'C2H4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H4_0.9x1.25_mol_2000_2022.nc',\n", + " 'C2H4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H4_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'C2H5OH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H5OH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'C2H5OH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H5OH_0.9x1.25_mol_2000_2022.nc',\n", + " 'C2H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H6_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'C2H6 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H6_0.9x1.25_mol_2000_2022.nc',\n", + " 'C2H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H6_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'C3H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H6_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'C3H6 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C3H6_0.9x1.25_mol_2000_2022.nc',\n", + " 'C3H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H6_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'C3H8 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H8_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'C3H8 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C3H8_0.9x1.25_mol_2000_2022.nc',\n", + " 'C3H8 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H8_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'CH2O -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH2O_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'CH2O -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH2O_0.9x1.25_mol_2000_2022.nc',\n", + " 'CH3CHO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3CHO_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'CH3CHO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3CHO_0.9x1.25_mol_2000_2022.nc',\n", + " 'CH3CN -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3CN_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'CH3CN -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3CN_0.9x1.25_mol_2000_2022.nc',\n", + " 'CH3COCH3 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3COCH3_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'CH3COCH3 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3COCH3_0.9x1.25_mol_2000_2022.nc',\n", + " 'CH3COCHO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3COCHO_0.9x1.25_mol_2000_2022.nc',\n", + " 'CH3COOH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3COOH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'CH3COOH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3COOH_0.9x1.25_mol_2000_2022.nc',\n", + " 'CH3OH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3OH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'CH3OH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3OH_0.9x1.25_mol_2000_2022.nc',\n", + " 'CO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CO_anthro_surface_1750-2015_0.9x1.25_c20180504.nc',\n", + " 'CO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CO_0.9x1.25_mol_2000_2022.nc',\n", + " 'CO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CO_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'E90 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions_E90global_surface_1750-2100_0.9x1.25_c20170322.nc',\n", + " 'GLYALD -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_GLYALD_0.9x1.25_mol_2000_2022.nc',\n", + " 'HCN -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_HCN_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'HCN -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_HCN_0.9x1.25_mol_2000_2022.nc',\n", + " 'HCOOH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_HCOOH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'HCOOH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_HCOOH_0.9x1.25_mol_2000_2022.nc',\n", + " 'ISOP -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_ISOP_0.9x1.25_mol_2000_2022.nc',\n", + " 'IVOC -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_IVOC_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'IVOC -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_IVOC_0.9x1.25_mol_2000_2022.nc',\n", + " 'MEK -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_MEK_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'MEK -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_MEK_0.9x1.25_mol_2000_2022.nc',\n", + " 'MTERP -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_TERPENES_0.9x1.25_mol_2000_2022.nc ',\n", + " 'NH3 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NH3_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'NH3 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_NH3_0.9x1.25_mol_2000_2022.nc ',\n", + " 'NH3 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NH3_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'NO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NO_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'NO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_NO_0.9x1.25_mol_2000_2022.nc ',\n", + " 'NO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NO_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'SVOC -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SVOC_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'SVOC -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_SVOC_0.9x1.25_mol_2000_2022.nc ',\n", + " 'TOLUENE -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_TOLUENE_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'TOLUENE -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_TOLUENE_0.9x1.25_mol_2000_2022.nc ',\n", + " 'XYLENES -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_XYLENES_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'XYLENES -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_XYLENES_0.9x1.25_mol_2000_2022.nc ',\n", + " 'bc_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_bc_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'bc_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_bc_a4_0.9x1.25_mol_2000_2022.nc ',\n", + " 'DMS -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_DMS_0.9x1.25_mol_2000_2022.nc ',\n", + " 'DMS -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_DMS_other_surface_1750-2015_0.9x1.25_c20170322.nc',\n", + " 'num_a1 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_num_so4_a1_0.9x1.25_mol_2000_2022.nc ',\n", + " 'num_a1 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_so4_a1_anthro-ag-ship_surface_1750-2015_0.9x1.25_c20170616.nc',\n", + " 'num_a2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_so4_a2_anthro-res_surface_1750-2015_0.9x1.25_c20170616.nc',\n", + " 'num_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_num_bc_a4_0.9x1.25_mol_2000_2022.nc ',\n", + " 'num_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_bc_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'num_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_pom_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'num_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_num_pom_a4_0.9x1.25_mol_2000_2022.nc ',\n", + " 'pom_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_pom_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',\n", + " 'pom_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_pom_a4_0.9x1.25_mol_2000_2022.nc ',\n", + " 'SO2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SO2_anthro-ag-ship-res_surface_1750-2015_0.9x1.25_c20170616.nc',\n", + " 'SO2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SO2_anthro-ene_surface_1750-2015_0.9x1.25_c20170616.nc',\n", + " 'SO2 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_SO2_0.9x1.25_mol_2000_2022.nc',\n", + " 'so4_a1 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a1_anthro-ag-ship_surface_1750-2015_0.9x1.25_c20170616.nc',\n", + " 'so4_a1 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_so4_a1_0.9x1.25_mol_2000_2022.nc ',\n", + " 'so4_a2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a2_anthro-res_surface_1750-2015_0.9x1.25_c20170616.nc'\n", + "/\n", + "```\n", + "\n", + "**# Lower boundary condition file check**\n", + "\n", + "Make sure the LBC files cover your dates of interest. In ``CaseDocs/atm_in`` you should see:\n", + "```\n", + " flbc_file = '/glade/campaign/cesm/cesmdata/cseg/inputdata/atm/waccm/lb/LBC_1750-2014_CMIP6_0p5degLat_c170126.nc'\n", + "```\n", + "\n", + "**# Initialization files for your new startdate**\n", + "\n", + "Note: Below are initialization files for 2010. For scientifically valid simulations you need to point to an initialization file for the start date you choose. If one is not available, you will need to spin up the model.\n", + "\n", + "For **CAM-chem**:\n", + "atmospheric initialization files are redefined in ``user_nl_cam``\n", + "\n", + "```\n", + "&cam_initfiles_nl\n", + " ncdata = '/glade/campaign/cesm/acom/acom-climate/tilmes/inputdata/init/camchem/FCnudged_MAM4_f09.carma_trop_strat09.aqchem.2001_2020.cam.i.2010-01-01-00000.nc'\n", + "/\n", + "```\n", + "\n", + "\n", + "For **WACCM**:\n", + "atmospheric initialization files are redefined in ``user_nl_cam``\n", + "\n", + "```\n", + "&cam_initfiles_nl\n", + " ncdata = '/glade/campaign/cesm/acom/acom-climate/tilmes/inputdata/init/waccm/f.e21.FWHISTBgcCrop.f09_f09_mg17.CMIP6-AMIP-WACCM.001.cam.i.2010-01-01-00000.nc'\n", + "/\n", + "``` \n", + "\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Submit:**\n", + "```\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the run files and history files. \n", + " \n", + "(1) Find your model output in your run directory (``$run_dir``) after finished:\n", + "\n", + "```\n", + "ls /glade/derecho/scratch/$USER/$CASENAME/run\n", + "```\n", + " \n", + "(2) Check that your archive directory on derecho (the path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "(3) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "```\n", + "ncdump –h f.e21.FCHIST.f09_f09_mg17.tutorial.test3.cam.h1.2010-01-01-00000.nc\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam-chem_waccm/visualization.ipynb b/_sources/notebooks/challenge/cam-chem_waccm/visualization.ipynb new file mode 100644 index 000000000..881ee7115 --- /dev/null +++ b/_sources/notebooks/challenge/cam-chem_waccm/visualization.ipynb @@ -0,0 +1,84 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4: Visualization option with GEOV" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Visualization with GEOV

\n", + " \n", + "CESM history files are in standard netCDF format, and may be analyzed with standard\n", + "analysis tools, including Matlab, Python, IDL, NCL, and NCO and ncview.\n", + " \n", + "GEOV is an IDL-based viewer with a graphical user interface (GUI) for geophysical history files created by NCAR's CAM, WACCM and MOZART models. GEOV can be downloaded from the WACCM webpage
\n", + "http://www.cesm.ucar.edu/working_groups/Whole-Atmosphere/code-release.html
\n", + "It is useful for quick viewing and comparisons.\n", + " \n", + "**#To use GEOV on derecho/casper:**\n", + " \n", + "Add the idl module:
\n", + "``module load idl``
\n", + " \n", + "Then go to the location of GEOV and start it\n", + "```\n", + "cd /glade/u/home/fvitt/geov4.8e\n", + "idl geov\n", + "```\n", + " \n", + "Then you can use the GEOV interface to find files and explore the model output. Some examples of using the GEOV interface are below:\n", + "\n", + "![GEOV opening](../../../images/challenge/geov-openingfile.png)\n", + "

Figure 1: Example using GEOV to browse to a file to open.

\n", + " \n", + "![GEOV 2 files](../../../images/challenge/geov-2files.png)\n", + "

Figure 2: Example using GEOV to plot surface layer ozone for two files.

\n", + " \n", + "![GEOV difference](../../../images/challenge/geov-difference.png)\n", + "

Figure 3: Example using GEOV to look at zonal average difference in model ozone (left).

\n", + " \n", + " \n", + " \n", + "If you quit GEOV, you will need to type ``exit`` to also exit IDL.\n", + "\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam/cam.ipynb b/_sources/notebooks/challenge/cam/cam.ipynb new file mode 100644 index 000000000..d7f6ff304 --- /dev/null +++ b/_sources/notebooks/challenge/cam/cam.ipynb @@ -0,0 +1,158 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Atmosphere" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Learning Goals\n", + "\n", + "- Student will learn what a F compset is, the types of forcing available to run one, and how to run one.\n", + "- Student will learn how to modify datasets using nco operators." + ] + }, + { + "cell_type": "markdown", + "id": "e73ce5d6-d2b1-4f32-b64f-337a1b02e2d0", + "metadata": {}, + "source": [ + "## What is a F compset ?\n", + "\n", + "The CESM2 components can be combined in numerous ways to carry out various scientific or software experiments. A particular mix of components, along with component-specific configuration and/or namelist settings is called a component set or ``compset``. \n", + "\n", + "In the previous chapter, we have run experiments with the ``B`` compset. In this chapter we will run the experiments with the ``F`` compset. \n", + "The ``F`` compsets use prescribed ocean (observed sea-surface temperature data) and prescribed sea-ice (observed sea-ice thickness and area)\n", + "\n", + "- ``F2000climo`` uses climatological forcings from around year 2000\n", + "- ``F2010climo`` uses climatological forcings from around year 2010\n", + "- ``FHIST`` use time varying forcing\n", + "\n", + "![B compsets versus F compsets](../../../images/challenge/Fcompset.png)\n", + "\n", + "*

Figure: Differences between a F and a B compset.

*" + ] + }, + { + "cell_type": "markdown", + "id": "815e0869-0518-4cf9-9417-cd9b08965ca1", + "metadata": {}, + "source": [ + "## Overview of CAM Challenge Exercises\n", + "Start running a control case with the compset ``F2000climo``\n", + "\n", + "Then choose one or more exercises to try:\n", + "- Use historical SSTs/forcings instead of fixed (compset change)\n", + "- Try running starting 1850 with spun-up pre-industrial model\n", + "- Increase orographic height over the western US (dataset change)\n", + "- Modify sea surface temperature in the tropics \n", + "- Increase the triggering threshold for deep convection over land (code change--simple)\n", + "- Add a (fake) physics parameterization (code change--advanced)\n", + "Compare your test exercise(s) to your control\n" + ] + }, + { + "cell_type": "markdown", + "id": "f01e969b-ab1a-466a-9cf0-5da2a137c35f", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "\n", + "\n", + "### Finding more information about compsets\n", + "\n", + "If you want to run a different configuration from what you’ve learned here, it is important to learn how to find and/or modify a compset.\n", + "\n", + "The tool `query compsets` allows you to find more information about the available. This tool is located in the same directory as `create_newcase` in `/glade/u/home/$USER/code/my_cesm_code/cime/scripts/`:\n", + "\n", + "The command is:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./query_config --compsets\n", + "```\n", + "\n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "Using the tool above and/or web searches below, find a CESM compset with an active atmosphere version cam6.0, that uses historical forcing data including sea surface temperatures. If you find several candidates, look at the components option and/or webpage to decide. Is it scientifically validated? For what resolutions?\n", + "
\n", + "\n", + "
\n", + " \n", + "
\n", + "Click here for the solution
\n", + "\n", + "The command gives a list of all the compsets available, and what components are included. \n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./query_config --compsets\n", + "```\n", + "This can show exactly what you ran before, and what is possible. To narrow down your choices:\n", + "```\n", + " ./query_config --compsets | grep -i hist\n", + "```\n", + "
\n", + "
\n", + "\n", + "\n", + "If you want to build your own, you can see all your options, perhaps modify one of the above with changes\u000b", + "\n", + "```\n", + "./query_config --components\n", + "```\n", + "More explanation about `compsets` can be found in the docs?|:\n", + "https://www.cesm.ucar.edu/models/cesm2/config/compsets.html\n", + "\n", + "\n", + "There are a number of atmospheric models which can run within CESM. While CAM is the basic atmospheric model within CESM, there are several models with significant extensions to CAM which may also be run within CESM. The available atmospheric models in CESM2 are:\n", + "\n", + "- CAM: Community Atmosphere Model\n", + "- CAM-chem: Community Atmosphere Model with Chemistry\n", + "- WACCM: Whole Atmosphere Community Climate Model\n", + "- WACCM-X: Whole Atmosphere Community Climate Model with thermosphere and ionosphere extension\n", + "\n", + "https://ncar.github.io/CAM/doc/build/html/users_guide/atmospheric-configurations.html\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e961b1bd-a1c8-4e54-bafc-46dcf78454f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam/exercise_1.ipynb b/_sources/notebooks/challenge/cam/exercise_1.ipynb new file mode 100644 index 000000000..fb6f12c60 --- /dev/null +++ b/_sources/notebooks/challenge/cam/exercise_1.ipynb @@ -0,0 +1,267 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 1: Control case: F2000climo" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Customize your CAM history files

\n", + " \n", + "Create, configure, build and run a case called ``f2000_control`` with the ``F2000climo`` compset (data ocean and climatological forcings from around year 2000). \n", + "\n", + "Run for 5 days, with 3-hourly instantaneous output of the variables: TS, PS, Z500, U850, U200, T850, T500, T200, CLDLOW, PRECT, LHFLX, SHFLX, FLNT, FLNS.\n", + "You are also welcome to output your own variables\n", + "\n", + "**About the resolution for F2000climo?**\n", + "\n", + "- Supported resolution for this compset is: ``f09_f09_mg17`` (i.e. 1 degree)\n", + "- During the tutorial, we recommend to use : ``f19_f19_mg17`` (i.e. 2 degree) because it will be faster.\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**How do I output 3 hourly instantaneous variables?**\n", + "\n", + "- Use namelist variables: ``nhtfrq``, ``mfilt``, ``fincl``. \n", + "- For more information, look at the chapter:
\n", + "**NAMELIST MODIFICATIONS** -> **Customize CAM output**\n", + "\n", + "**What is the resolution for F2000climo?**\n", + "\n", + "- Supported resolution for this compset is: ``f09_f09_mg17`` (i.e. 1 degree)\n", + "- During the tutorial, we recommend to use : ``f19_f19_mg17`` (i.e. 2 degree) because it will be faster.\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "**# Set environment variables** \n", + "\n", + "Set environment variables with the commands:\n", + " \n", + "**For tcsh users** \n", + " \n", + "```\n", + "set CASENAME=f2000_control\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=F2000climo\n", + "set RESOLUTION=f19_f19_mg17\n", + "```\n", + "**For bash users** \n", + " \n", + "```\n", + "export CASENAME=f2000_control\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=F2000climo\n", + "export RESOLUTION=f19_f19_mg17\n", + "```\n", + "\n", + "**# Make a case directory**\n", + "\n", + "If needed create a directory `cases` into your home directory:\n", + " \n", + "```\n", + "mkdir /glade/u/home/$USER/cases/\n", + "```\n", + " \n", + "\n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET\n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``. You should use the project number given for this tutorial.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "**# Customize namelists**\n", + "\n", + "Edit the file ``user_nl_cam`` and add the lines:\n", + "```\n", + "nhtfrq(2) = -3\n", + "mfilt(2) = 240\n", + "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\n", + "```\n", + "You can do this with a text editor. Alternatively, you can use the echo command:\n", + "```\n", + "echo \"nhtfrq(2) = -3\">> user_nl_cam \n", + "echo \"mfilt(2) = 240\">> user_nl_cam\n", + "echo \"fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\">> user_nl_cam\n", + "echo \"\">> user_nl_cam \n", + "```\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Build and submit**:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "(2) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ncdump -h f2000_control.cam.h1.0001-01-01-00000.nc\n", + "```\n", + "\n", + "- The file should contain the instantaneous output in the file ``h1`` for the variables:\n", + "```\n", + " float FLNS(time, lat, lon) ;\n", + " FLNS:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNS:units = \"W/m2\" ;\n", + " FLNS:long_name = \"Net longwave flux at surface\" ;\n", + " float FLNT(time, lat, lon) ;\n", + " FLNT:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNT:units = \"W/m2\" ;\n", + " FLNT:long_name = \"Net longwave flux at top of model\" ;\n", + " float LHFLX(time, lat, lon) ;\n", + " LHFLX:units = \"W/m2\" ;\n", + " LHFLX:long_name = \"Surface latent heat flux\" ;\n", + " float PRECT(time, lat, lon) ;\n", + " PRECT:units = \"m/s\" ;\n", + " PRECT:long_name = \"Total (convective and large-scale) precipitation rate (liq + ice)\" ;\n", + " float PS(time, lat, lon) ;\n", + " PS:units = \"Pa\" ;\n", + " PS:long_name = \"Surface pressure\" ;\n", + " float SHFLX(time, lat, lon) ;\n", + " SHFLX:units = \"W/m2\" ;\n", + " SHFLX:long_name = \"Surface sensible heat flux\" ;\n", + " float T850(time, lat, lon) ;\n", + " T850:units = \"K\" ;\n", + " T850:long_name = \"Temperature at 850 mbar pressure surface\" ;\n", + " float TS(time, lat, lon) ;\n", + " TS:units = \"K\" ;\n", + " TS:long_name = \"Surface temperature (radiative)\" ;\n", + " float U850(time, lat, lon) ;\n", + " U850:units = \"m/s\" ;\n", + " U850:long_name = \"Zonal wind at 850 mbar pressure surface\" ;\n", + "```\n", + "Note that these variables have no ``cell_methods`` attribute becasue the output is instantaneous. \n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "472131c7-88f9-4863-a2bc-d7364333542d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "815be0bc-515a-474b-a3dd-b7ba02831b9a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam/exercise_2.ipynb b/_sources/notebooks/challenge/cam/exercise_2.ipynb new file mode 100644 index 000000000..48c5a2d05 --- /dev/null +++ b/_sources/notebooks/challenge/cam/exercise_2.ipynb @@ -0,0 +1,249 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 2: Historical compset: FHIST" + ] + }, + { + "cell_type": "markdown", + "id": "ef3504b5-0dc7-4cc8-b874-bb4bdf7eab96", + "metadata": {}, + "source": [ + "CAM is capable of running over historical periods with time-varying sea surface temperatures (SSTs) as well as anthropogenic and natural forcings. This is called the AMIP protocol.\n", + "\n", + "\n", + "
\n", + "\n", + "For more information about the [AMIP protocol](https://pcmdi.llnl.gov/mips/amip/) and the [HadSST data sets](https://climatedataguide.ucar.edu/climate-data/sst-data-hadisst-v11)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Customize your CAM history files

\n", + " \n", + "Create, configure, build and run a case called ``fhist`` with the compset ``FHIST`` at the resolution ``f09_f09_mg17`` using the same history file output as in the control.\n", + "Run for 5 days. \n", + "\n", + "- How can you check that there is a difference between the set up of this and your control?\n", + "- How can you check that it is running the way you intended: using ssts & ghg forcings from time-varying, historical files?\n", + "- What year is the model running?\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**How do I output 3 hourly instantaneous variables?**\n", + "\n", + "- Use namelist variables: ``nhtfrq``, ``mfilt``, ``fincl``. \n", + "- For more information, look at the chapter:
\n", + "**NAMELIST MODIFICATIONS** -> **Customize CAM output**\n", + "\n", + "**I am getting an error: ``This compset and grid combination is untested in CESM``**\n", + "\n", + "- overide this error by adding ``--run-unsupported`` to the create_newcase command\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "**# Set environment variables** \n", + " \n", + "Set environment variables with the commands:\n", + "\n", + "**tcsh user**\n", + "```\n", + "set CASENAME=fhist\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=FHIST\n", + "set RESOLUTION=f19_f19_mg17\n", + "```\n", + "**bash user**\n", + "```\n", + "export CASENAME=fhist\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=FHIST\n", + "export RESOLUTION=f19_f19_mg17\n", + "``` \n", + " \n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --run-unsupported\n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``. You should use the project number given for this tutorial.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "**# Customize namelists**\n", + "\n", + "Edit the file ``user_nl_cam`` and add the lines:\n", + "```\n", + "nhtfrq(2) = -3\n", + "mfilt(2) = 240\n", + "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\n", + "```\n", + "You can do this with a text editor. Alternatively, you can use the echo command:\n", + "```\n", + "echo \"nhtfrq(2) = -3\">> user_nl_cam \n", + "echo \"mfilt(2) = 240\">> user_nl_cam\n", + "echo \"fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\">> user_nl_cam\n", + "echo \"\">> user_nl_cam \n", + "```\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Build and submit**:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "Note that by default the starting year for a `FHIST` compset is `1950` instead of the year `0001` with a `F2000climo` compset.\n", + "\n", + "(2) Look at the contents of the ``h1`` files using ``ncdump``.\n", + " \n", + "- The file should contain the instantaneous output in the file ``h1`` for the variables:\n", + "```\n", + " float FLNS(time, lat, lon) ;\n", + " FLNS:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNS:units = \"W/m2\" ;\n", + " FLNS:long_name = \"Net longwave flux at surface\" ;\n", + " float FLNT(time, lat, lon) ;\n", + " FLNT:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNT:units = \"W/m2\" ;\n", + " FLNT:long_name = \"Net longwave flux at top of model\" ;\n", + " float LHFLX(time, lat, lon) ;\n", + " LHFLX:units = \"W/m2\" ;\n", + " LHFLX:long_name = \"Surface latent heat flux\" ;\n", + " float PRECT(time, lat, lon) ;\n", + " PRECT:units = \"m/s\" ;\n", + " PRECT:long_name = \"Total (convective and large-scale) precipitation rate (liq + ice)\" ;\n", + " float PS(time, lat, lon) ;\n", + " PS:units = \"Pa\" ;\n", + " PS:long_name = \"Surface pressure\" ;\n", + " float SHFLX(time, lat, lon) ;\n", + " SHFLX:units = \"W/m2\" ;\n", + " SHFLX:long_name = \"Surface sensible heat flux\" ;\n", + " float T850(time, lat, lon) ;\n", + " T850:units = \"K\" ;\n", + " T850:long_name = \"Temperature at 850 mbar pressure surface\" ;\n", + " float TS(time, lat, lon) ;\n", + " TS:units = \"K\" ;\n", + " TS:long_name = \"Surface temperature (radiative)\" ;\n", + " float U850(time, lat, lon) ;\n", + " U850:units = \"m/s\" ;\n", + " U850:long_name = \"Zonal wind at 850 mbar pressure surface\" ;\n", + "```\n", + "Note that these variables have no ``cell_methods`` attribute becasue the output is instantaneous. \n", + "\n", + "
\n", + "
\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam/exercise_3.ipynb b/_sources/notebooks/challenge/cam/exercise_3.ipynb new file mode 100644 index 000000000..b0b2adf0b --- /dev/null +++ b/_sources/notebooks/challenge/cam/exercise_3.ipynb @@ -0,0 +1,264 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 3: Starting FHIST from spunup state in 1850" + ] + }, + { + "cell_type": "markdown", + "id": "ef3504b5-0dc7-4cc8-b874-bb4bdf7eab96", + "metadata": {}, + "source": [ + "By default the FHIST starts from a default initial condition in 1979, but you can start from another year and use initial conditions coming from a previous run. " + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Customize your CAM history files

\n", + " \n", + "Create, configure, build and run a case called `fhist.1850` with the compset FHIST at the resolution `f09_f09_mg17` using the same history file output as in the control. \n", + "- Use initialization datasets from a previous case.
For instance, use the data from the run: `b.e21.B1850.f19_g17.CMIP6-piControl-2deg.001` at year `321`\n", + "- Start model in `1850`. \n", + "- Run for 5 days. \n", + "\n", + "Check your solution:\n", + "- How can you check that there is a difference between the set up of this and your control?\n", + "- How can you check that it is running the way you intended: using ssts & ghg forcings from time-varying, historical files?\n", + "- What year is the model running?\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + " \n", + "**How do I start my run using initialization datasets from a previous run?**\n", + "\n", + "- Look at chapter `Modifify the run type`. In that chapter, you learned different ways to start up the model, and how to use initial conditions/restart files from a different case to start up a hybrid case. Use that method for the current exercise. \n", + "\n", + "- Data from spun-up model runs can be found in inputdata (DIN_LOC_ROOT) . \n", + " \n", + "**How do I start my run in 1850?**\n", + "\n", + "- Look at the description of the xml variable `RUN_STARTDATE`\n", + " \n", + " \n", + "**How do I output 3 hourly instantaneous variables?**\n", + "\n", + "- Use namelist variables: ``nhtfrq``, ``mfilt``, ``fincl``. \n", + "- For more information, look at the chapter:
\n", + "**NAMELIST MODIFICATIONS** -> **Customize CAM output**\n", + "\n", + "**I am getting an error: ``This compset and grid combination is untested in CESM``**\n", + "\n", + "- overide this error by adding ``--run-unsupported`` to the create_newcase command\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "**# Set environment variables** \n", + "\n", + "Set environment variables with the commands:\n", + "\n", + "**tcsh**\n", + "```\n", + "set CASENAME=fhist.1850\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=FHIST\n", + "set RESOLUTION=f19_f19_mg17\n", + "```\n", + "**bash**\n", + "```\n", + "export CASENAME=fhist.1850\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=FHIST\n", + "export RESOLUTION=f19_f19_mg17\n", + "```\n", + " \n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --run-unsupported\n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "**# Customize namelists**\n", + "\n", + "Edit the file ``user_nl_cam`` and add the lines:\n", + "```\n", + "nhtfrq(2) = -3\n", + "mfilt(2) = 240\n", + "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\n", + "```\n", + "You can do this with a text editor. Alternatively, you can use the echo command:\n", + "```\n", + "echo \"nhtfrq(2) = -3\">> user_nl_cam \n", + "echo \"mfilt(2) = 240\">> user_nl_cam\n", + "echo \"fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\">> user_nl_cam\n", + "echo \"\">> user_nl_cam \n", + "```\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "**# change starting date and ref case**\n", + "\n", + "``` \n", + "./xmlchange RUN_STARTDATE=1850-01-01 \n", + "./xmlchange RUN_REFCASE=b.e21.B1850.f19_g17.CMIP6-piControl-2deg.001\n", + "./xmlchange RUN_REFDATE=0321-01-01\n", + "```\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Build and submit**:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "Notice that the start year is `1850`.\n", + "\n", + "(2) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "- The file should contain the instantaneous output in the file ``h1`` for the variables:\n", + "```\n", + " float FLNS(time, lat, lon) ;\n", + " FLNS:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNS:units = \"W/m2\" ;\n", + " FLNS:long_name = \"Net longwave flux at surface\" ;\n", + " float FLNT(time, lat, lon) ;\n", + " FLNT:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNT:units = \"W/m2\" ;\n", + " FLNT:long_name = \"Net longwave flux at top of model\" ;\n", + " float LHFLX(time, lat, lon) ;\n", + " LHFLX:units = \"W/m2\" ;\n", + " LHFLX:long_name = \"Surface latent heat flux\" ;\n", + " float PRECT(time, lat, lon) ;\n", + " PRECT:units = \"m/s\" ;\n", + " PRECT:long_name = \"Total (convective and large-scale) precipitation rate (liq + ice)\" ;\n", + " float PS(time, lat, lon) ;\n", + " PS:units = \"Pa\" ;\n", + " PS:long_name = \"Surface pressure\" ;\n", + " float SHFLX(time, lat, lon) ;\n", + " SHFLX:units = \"W/m2\" ;\n", + " SHFLX:long_name = \"Surface sensible heat flux\" ;\n", + " float T850(time, lat, lon) ;\n", + " T850:units = \"K\" ;\n", + " T850:long_name = \"Temperature at 850 mbar pressure surface\" ;\n", + " float TS(time, lat, lon) ;\n", + " TS:units = \"K\" ;\n", + " TS:long_name = \"Surface temperature (radiative)\" ;\n", + " float U850(time, lat, lon) ;\n", + " U850:units = \"m/s\" ;\n", + " U850:long_name = \"Zonal wind at 850 mbar pressure surface\" ;\n", + "```\n", + "Note that these variables have no ``cell_methods`` attribute becasue the output is instantaneous. \n", + "\n", + "
\n", + "
\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam/exercise_4.ipynb b/_sources/notebooks/challenge/cam/exercise_4.ipynb new file mode 100644 index 000000000..5dcafc9c0 --- /dev/null +++ b/_sources/notebooks/challenge/cam/exercise_4.ipynb @@ -0,0 +1,291 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 4: Increase orographic height over the western US" + ] + }, + { + "cell_type": "markdown", + "id": "ef3504b5-0dc7-4cc8-b874-bb4bdf7eab96", + "metadata": {}, + "source": [ + "Change input boundary datasets by increasing surface geopotential height by 50% in the western USA" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Increase orographic height over the western US

\n", + "\n", + "Create a case similar to control case but change input boundary datasets by increasing surface geopotential height by 50% in the western USA.\n", + "\n", + "\n", + "![Increase orographic height over the western US](../../../images/challenge/cam_topo_diff.png)\n", + "\n", + "*

Figure: Increase orographic height over the western US.

*\n", + " \n", + "Create, configure, build and run a case called ``f2000.topo`` with the compset ``F2000climo`` at the resolution ``f09_f09_mg17`` using the same history file output as in the control. Change the topography input datasets\n", + "Run for 5 days. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**How do I output 3 hourly instantaneous variables?**\n", + "\n", + "- Use namelist variables: ``nhtfrq``, ``mfilt``, ``fincl``. \n", + "- For more information, look at the chapter:
\n", + "**NAMELIST MODIFICATIONS** -> **Customize CAM output**\n", + "\n", + "\n", + "**Where do I change the topography dataset?**\n", + "\n", + "- Look at the namelist definition for the variable `bnd_topo` \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "\n", + "**# Set environment variables** \n", + " \n", + "Set environment variables with the commands:\n", + "\n", + "**tcsh user**\n", + "```\n", + "set CASENAME=f2000.topo\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=F2000climo\n", + "set RESOLUTION=f19_f19_mg17\n", + "```\n", + "**bash user**\n", + "```\n", + "export CASENAME=f2000.topo\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=F2000climo\n", + "export RESOLUTION=f19_f19_mg17\n", + "```\n", + " \n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET \n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``. You should use the project number given for this tutorial.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "**# Modify orography**\n", + "\n", + "Copy the topography file into your case directory and modify it over there. \n", + "\n", + "Here we use the `nco` operators but feel free to use any other tool that you familiar with.\n", + "```\n", + "cd $CASEDIR\n", + "cp \\\n", + "/glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/topo/fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.nc .\n", + "\n", + "ncap2 -O -s 'lat2d[lat,lon]=lat ; lon2d[lat,lon]=lon' \\\n", + "-s 'omask=(lat2d >= 30. && lat2d <= 50.) && (lon2d >= 235. && lon2d <= 260.)' \\\n", + "-s 'PHIS=(PHIS*(1.+omask*0.5))' \\\n", + "fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.nc \\\n", + "fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc\n", + "``` \n", + "\n", + "**# Visualize your modification to orography**\n", + "\n", + "You could create a file `diff_topo.nc` with the differences of topography `ncdiff`and then visualize the that file with `ncview`. You also welcome to use your own tools to visualize your mods to orography.\n", + "\n", + "- Create a file `diff_topo.nc` with the differences in topographic:\n", + "```\n", + "ncdiff \\\n", + "fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.nc \\\n", + "fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc \\\n", + "diff_topo.nc\n", + "```\n", + "\n", + "- Look at the `diff_topo.nc` with `ncview`:\n", + "```\n", + "ncview diff_topo.nc\n", + "```\n", + "\n", + "![Increase orographic height over the western US](../../../images/challenge/cam_topo_diff.png)\n", + "\n", + "*

Figure: View the increase in orographic height over the western US with ncview.

*\n", + "\n", + "\n", + "**# Customize namelists**\n", + "\n", + "Edit the file ``user_nl_cam`` and add the lines:\n", + "```\n", + "nhtfrq(2) = -3\n", + "mfilt(2) = 240\n", + "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\n", + "bnd_topo = '$CASEDIR/fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc'\n", + "```\n", + "You can do this with a text editor. Alternatively, you can use the echo command:\n", + "```\n", + "echo \"nhtfrq(2) = -3\">> user_nl_cam \n", + "echo \"mfilt(2) = 240\">> user_nl_cam\n", + "echo \"fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\">> user_nl_cam\n", + "echo \"bnd_topo = '$CASEDIR/fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc' \" >> user_nl_cam\n", + "echo \"\">> user_nl_cam \n", + "```\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Build and submit**:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "(2) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "- The file should contain the instantaneous output in the file ``h1`` for the variables:\n", + "```\n", + " float FLNS(time, lat, lon) ;\n", + " FLNS:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNS:units = \"W/m2\" ;\n", + " FLNS:long_name = \"Net longwave flux at surface\" ;\n", + " float FLNT(time, lat, lon) ;\n", + " FLNT:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNT:units = \"W/m2\" ;\n", + " FLNT:long_name = \"Net longwave flux at top of model\" ;\n", + " float LHFLX(time, lat, lon) ;\n", + " LHFLX:units = \"W/m2\" ;\n", + " LHFLX:long_name = \"Surface latent heat flux\" ;\n", + " float PRECT(time, lat, lon) ;\n", + " PRECT:units = \"m/s\" ;\n", + " PRECT:long_name = \"Total (convective and large-scale) precipitation rate (liq + ice)\" ;\n", + " float PS(time, lat, lon) ;\n", + " PS:units = \"Pa\" ;\n", + " PS:long_name = \"Surface pressure\" ;\n", + " float SHFLX(time, lat, lon) ;\n", + " SHFLX:units = \"W/m2\" ;\n", + " SHFLX:long_name = \"Surface sensible heat flux\" ;\n", + " float T850(time, lat, lon) ;\n", + " T850:units = \"K\" ;\n", + " T850:long_name = \"Temperature at 850 mbar pressure surface\" ;\n", + " float TS(time, lat, lon) ;\n", + " TS:units = \"K\" ;\n", + " TS:long_name = \"Surface temperature (radiative)\" ;\n", + " float U850(time, lat, lon) ;\n", + " U850:units = \"m/s\" ;\n", + " U850:long_name = \"Zonal wind at 850 mbar pressure surface\" ;\n", + "```\n", + "Note that these variables have no ``cell_methods`` attribute becasue the output is instantaneous. \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "815be0bc-515a-474b-a3dd-b7ba02831b9a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam/exercise_5.ipynb b/_sources/notebooks/challenge/cam/exercise_5.ipynb new file mode 100644 index 000000000..0cce4aefb --- /dev/null +++ b/_sources/notebooks/challenge/cam/exercise_5.ipynb @@ -0,0 +1,302 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 5: Modify sea surface temperature in the tropics" + ] + }, + { + "cell_type": "markdown", + "id": "ef3504b5-0dc7-4cc8-b874-bb4bdf7eab96", + "metadata": {}, + "source": [ + "Change input boundary datasets (Sea Surface Temperature) by increasing its value by 2K in the tropical Central Pacific. " + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Modify sea surface temperature in the tropics

\n", + "\n", + "Create a case similar to control case but change input boundary datasets (Sea Surface Temperature) by increasing its value by 2K in the tropical Central Pacific. \n", + "\n", + "\n", + "![Increase orographic height over the western US](../../../images/challenge/cam_SST_diff.png)\n", + "\n", + "*

Figure: Increase orographic height over the western US.

*\n", + " \n", + "Create, configure, build and run a case called ``f2000.sst`` with the compset ``F2000climo`` at the resolution ``f09_f09_mg17`` using the same history file output as in the control. Change the SST input datasets\n", + "Run for 5 days. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**How do I output 3 hourly instantaneous variables?**\n", + "\n", + "- Use namelist variables: ``nhtfrq``, ``mfilt``, ``fincl``. \n", + "- For more information, look at the chapter:
\n", + "**NAMELIST MODIFICATIONS** -> **Customize CAM output**\n", + "\n", + "\n", + "**Where do I change the SST dataset?**\n", + "\n", + "- Look at the xml variable `SSTICE_DATA_FILENAME` \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "\n", + "**# Set environment variables** \n", + " \n", + "Set environment variables with the commands:\n", + "\n", + "**tcsh user**\n", + "```\n", + "set CASENAME=f2000.sst\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=F2000climo\n", + "set RESOLUTION=f19_f19_mg17\n", + "```\n", + "\n", + "\n", + "**bash user**\n", + "```\n", + "export CASENAME=f2000.sst\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=F2000climo\n", + "export RESOLUTION=f19_f19_mg17\n", + "```\n", + " \n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET \n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``. You should use the project number given for this tutorial.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "**# Modify orography**\n", + "\n", + "Copy the SST file into your case directory and modify it over there. \n", + "\n", + "Here we use the `nco` operators but feel free to use any other tool that you familiar with.\n", + "```\n", + "cd $CASEDIR\n", + "cp /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/sst/sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc .\n", + "\n", + "ncap2 -O -s 'lat2d[lat,lon]=lat ; lon2d[lat,lon]=lon' \\\n", + " -s 'omask=(lat2d >= -10. && lat2d <= 10.) && (lon2d >= 180. && lon2d <= 240.)'\\\n", + " -s 'SST_cpl=(SST_cpl+omask*2.)' sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc \\\n", + " sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc.warmtcp.nc\n", + "``` \n", + "\n", + "**# Visualize your modification to orography**\n", + "\n", + "You could create a file `diff_sst.nc` with the differences of SST `ncdiff`and then visualize the that file with `ncview`. You also welcome to use your own tools to visualize your mods to orography.\n", + "\n", + "- Create a file `diff_sst.nc` with the differences in SSTs:\n", + "```\n", + "ncdiff \\\n", + "sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc \\\n", + "sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc.warmtcp.nc \\\n", + "diff_sst.nc\n", + "```\n", + "\n", + "- Look at the `diff_sst.nc` with `ncview`:\n", + "```\n", + "ncview diff_sst.nc\n", + "```\n", + "\n", + "![Increase orographic height over the western US](../../../images/challenge/cam_SST_diff.png)\n", + "\n", + "*

Figure: View the increase in orographic height over the western US with ncview.

*\n", + "\n", + "**# Point to the new SST file**\n", + "\n", + "```\n", + "./xmlchange SSTICE_DATA_FILENAME=\"$CASEDIR/sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc.warmtcp.nc\"\n", + "```\n", + "\n", + "**# Customize namelists**\n", + "\n", + "Edit the file ``user_nl_cam`` and add the lines:\n", + "```\n", + "nhtfrq(2) = -3\n", + "mfilt(2) = 240\n", + "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\n", + "```\n", + "You can do this with a text editor. Alternatively, you can use the echo command:\n", + "```\n", + "echo \"nhtfrq(2) = -3\">> user_nl_cam \n", + "echo \"mfilt(2) = 240\">> user_nl_cam\n", + "echo \"fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\">> user_nl_cam\n", + "echo \"\">> user_nl_cam \n", + "```\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Build and submit**:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "(2) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "- The file should contain the instantaneous output in the file ``h1`` for the variables:\n", + "```\n", + " float FLNS(time, lat, lon) ;\n", + " FLNS:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNS:units = \"W/m2\" ;\n", + " FLNS:long_name = \"Net longwave flux at surface\" ;\n", + " float FLNT(time, lat, lon) ;\n", + " FLNT:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNT:units = \"W/m2\" ;\n", + " FLNT:long_name = \"Net longwave flux at top of model\" ;\n", + " float LHFLX(time, lat, lon) ;\n", + " LHFLX:units = \"W/m2\" ;\n", + " LHFLX:long_name = \"Surface latent heat flux\" ;\n", + " float PRECT(time, lat, lon) ;\n", + " PRECT:units = \"m/s\" ;\n", + " PRECT:long_name = \"Total (convective and large-scale) precipitation rate (liq + ice)\" ;\n", + " float PS(time, lat, lon) ;\n", + " PS:units = \"Pa\" ;\n", + " PS:long_name = \"Surface pressure\" ;\n", + " float SHFLX(time, lat, lon) ;\n", + " SHFLX:units = \"W/m2\" ;\n", + " SHFLX:long_name = \"Surface sensible heat flux\" ;\n", + " float T850(time, lat, lon) ;\n", + " T850:units = \"K\" ;\n", + " T850:long_name = \"Temperature at 850 mbar pressure surface\" ;\n", + " float TS(time, lat, lon) ;\n", + " TS:units = \"K\" ;\n", + " TS:long_name = \"Surface temperature (radiative)\" ;\n", + " float U850(time, lat, lon) ;\n", + " U850:units = \"m/s\" ;\n", + " U850:long_name = \"Zonal wind at 850 mbar pressure surface\" ;\n", + "```\n", + "Note that these variables have no ``cell_methods`` attribute becasue the output is instantaneous. \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "54e459f8-1ebc-4746-b667-4fd6bd2ce867", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "815be0bc-515a-474b-a3dd-b7ba02831b9a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cam/exercise_6.ipynb b/_sources/notebooks/challenge/cam/exercise_6.ipynb new file mode 100644 index 000000000..fbbe84368 --- /dev/null +++ b/_sources/notebooks/challenge/cam/exercise_6.ipynb @@ -0,0 +1,295 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 6: Adjust threshold for deep convection over land" + ] + }, + { + "cell_type": "markdown", + "id": "ef3504b5-0dc7-4cc8-b874-bb4bdf7eab96", + "metadata": {}, + "source": [ + "The purpose of this exercise is to add a code change to the deep convection to delay the initiation of convection. This is done by increasing the minimum required convective available potential energy (CAPE) to initiate convection over land. " + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Effects of delaying the initiation of convection

\n", + "\n", + "Create a case similar to control case but add code to delay the initiation of convection over land by increasing the minimum required convective available potential energy (CAPE) to initiate convection. \n", + "\n", + "\n", + "![Increase orographic height over the western US](../../../images/challenge/cape.png)\n", + "\n", + "*

Figure: CAPE.

*\n", + " \n", + "Create, configure, build and run a case called ``f2000.cape`` with the compset ``F2000climo`` at the resolution ``f09_f09_mg17`` using the same history file output as in the control. \n", + "Run for 5 days. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**How do I output 3 hourly instantaneous variables?**\n", + "\n", + "- Use namelist variables: ``nhtfrq``, ``mfilt``, ``fincl``. \n", + "- For more information, look at the chapter:
\n", + "**NAMELIST MODIFICATIONS** -> **Customize CAM output**\n", + "\n", + "\n", + "**Where do I change threshold for CAPE?**\n", + "\n", + "- Look for the file `zm_conv.F90` into the cesm code\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "\n", + "**# Set environment variables** \n", + " \n", + "Set environment variables with the commands:\n", + "\n", + "**Tcsh user**\n", + "```\n", + "set CASENAME=f2000.cape\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=F2000climo\n", + "set RESOLUTION=f19_f19_mg17\n", + "```\n", + "**bash user**\n", + "```\n", + "export CASENAME=f2000.cape\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=F2000climo\n", + "export RESOLUTION=f19_f19_mg17\n", + "```\n", + " \n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET \n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change ``job queue`` and ``account number``.
\n", + "For instance, to run in the queue ``tutorial`` and the project number ``UESM0013``. You should use the project number given for this tutorial.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "
\n", + "\n", + "**# Modify code**\n", + "\n", + "- copy `zm_conv.F90` into the `SourceMods/src.cam` directory and modify it\n", + "```\n", + "cp /glade/u/home/$USER/code/my_cesm_code/components/cam/src/physics/cam/zm_conv.F90 SourceMods/src.cam\n", + "```\n", + "\n", + "- In the subroutine `zm_convr`\n", + "\n", + "Replace the code:\n", + "```\n", + "if (cape(i) > capelmt) then \n", + " lengath = lengath + 1 \n", + " ideep(lengath) = i \n", + " end if\n", + "```\n", + "by\n", + "```\n", + "if (landfrac(i) > 0.5_r8) then\n", + " capelmt_mask = 10._r8*capelmt\n", + "else\n", + " capelmt_mask = capelmt\n", + "end if\n", + "\n", + "if (cape(i) > capelmt_mask) then \n", + " lengath = lengath + 1 \n", + " deep(lengath) = i \n", + "end if\n", + "\n", + "write(iulog,*) 'HELLO WORLD'\n", + "\n", + "```\n", + "\n", + "- Near the top of subroutine `zm_convr`:\n", + "\n", + "Add the line\n", + "```\n", + "real(r8) :: capelmt_mask\n", + "```\n", + "right after:\n", + "```\n", + "real(r8) pblt(pcols) \t\n", + "```\n", + "\n", + "**# Customize namelists**\n", + "\n", + "Edit the file ``user_nl_cam`` and add the lines:\n", + "```\n", + "nhtfrq(2) = -3\n", + "mfilt(2) = 240\n", + "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\n", + "```\n", + "You can do this with a text editor. Alternatively, you can use the echo command:\n", + "```\n", + "echo \"nhtfrq(2) = -3\">> user_nl_cam \n", + "echo \"mfilt(2) = 240\">> user_nl_cam\n", + "echo \"fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'\">> user_nl_cam\n", + "echo \"\">> user_nl_cam \n", + "```\n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "**# Set run length**\n", + "\n", + "If needed, change the ``run length``. If you want to run 5 days, you don't have to do this, as 5 days is the default. \n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=ndays\n", + "```\n", + "\n", + "\n", + "**# Build and submit**:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is only 5-day, there should be no monthly file (``h0``)\n", + "\n", + "(2) Look at the contents of the ``h1`` files using ``ncdump``.\n", + "\n", + "- The file should contain the instantaneous output in the file ``h1`` for the variables:\n", + "```\n", + " float FLNS(time, lat, lon) ;\n", + " FLNS:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNS:units = \"W/m2\" ;\n", + " FLNS:long_name = \"Net longwave flux at surface\" ;\n", + " float FLNT(time, lat, lon) ;\n", + " FLNT:Sampling_Sequence = \"rad_lwsw\" ;\n", + " FLNT:units = \"W/m2\" ;\n", + " FLNT:long_name = \"Net longwave flux at top of model\" ;\n", + " float LHFLX(time, lat, lon) ;\n", + " LHFLX:units = \"W/m2\" ;\n", + " LHFLX:long_name = \"Surface latent heat flux\" ;\n", + " float PRECT(time, lat, lon) ;\n", + " PRECT:units = \"m/s\" ;\n", + " PRECT:long_name = \"Total (convective and large-scale) precipitation rate (liq + ice)\" ;\n", + " float PS(time, lat, lon) ;\n", + " PS:units = \"Pa\" ;\n", + " PS:long_name = \"Surface pressure\" ;\n", + " float SHFLX(time, lat, lon) ;\n", + " SHFLX:units = \"W/m2\" ;\n", + " SHFLX:long_name = \"Surface sensible heat flux\" ;\n", + " float T850(time, lat, lon) ;\n", + " T850:units = \"K\" ;\n", + " T850:long_name = \"Temperature at 850 mbar pressure surface\" ;\n", + " float TS(time, lat, lon) ;\n", + " TS:units = \"K\" ;\n", + " TS:long_name = \"Surface temperature (radiative)\" ;\n", + " float U850(time, lat, lon) ;\n", + " U850:units = \"m/s\" ;\n", + " U850:long_name = \"Zonal wind at 850 mbar pressure surface\" ;\n", + "```\n", + "Note that these variables have no ``cell_methods`` attribute becasue the output is instantaneous. \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc170590-11bc-40fa-a209-4ed1d1f64849", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/challenge.ipynb b/_sources/notebooks/challenge/challenge.ipynb new file mode 100644 index 000000000..0cd561b2d --- /dev/null +++ b/_sources/notebooks/challenge/challenge.ipynb @@ -0,0 +1,45 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Challenge Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "33e420f8-dca3-47ed-9999-17da427c6443", + "metadata": {}, + "source": [ + "This section of the CESM tutorial is designed to test your understanding of the CESM model that you have learned about in previous sections. \n", + "\n", + "We provide challenge exercises for the individual model components for you to test yourself. \n", + "\n", + "Feel free to try all the challenge exercises or just the one(s) that are relevant for the CESM components of interest to you." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cice/cice.ipynb b/_sources/notebooks/challenge/cice/cice.ipynb new file mode 100644 index 000000000..3f01f39f1 --- /dev/null +++ b/_sources/notebooks/challenge/cice/cice.ipynb @@ -0,0 +1,218 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Sea Ice\n", + "\n", + "The sea ice component of CESM is CICE. This is developed by the [CICE Consortium](https://github.com/CICE-Consortium/CICE). Note that CESM2 uses CICE version 5. In version 6 of CICE, the vertical thermodynamics was separated into a submodule known as Icepack. CICE6 will be the sea ice component in CESM3. \n", + "\n", + "It can be useful for people interested in sea ice science to run simulations with only active sea ice and ocean components and atmospheric forcing. In this exercise, you will learn how to run one of these ice-ocean simulations.\n", + "\n", + "This exercise was created by David Bailey and Alice DuVivier." + ] + }, + { + "cell_type": "markdown", + "id": "ea051c12-642e-4194-8291-2c1924d2e1e8", + "metadata": {}, + "source": [ + "## Learning Goals" + ] + }, + { + "cell_type": "markdown", + "id": "346cbd7b-3b8e-41f0-b120-b369ab20f6cc", + "metadata": {}, + "source": [ + "- Student will learn what a G compset is, the types of forcing available to run one, and how to run one.\n", + "- Student will learn how to make a namelist modification that changes snow albedo and compare results with a control experiment.\n", + "- Student will learn how to make a source code modification that changes the conductivity through snow (ksno) and compare results with a control experiment.\n" + ] + }, + { + "cell_type": "markdown", + "id": "47c3af32-d018-441e-bcb0-c74e86ef4272", + "metadata": {}, + "source": [ + "## Exercise Details" + ] + }, + { + "cell_type": "markdown", + "id": "df216c41-3ec4-43e0-b7bd-be2b1e4294bd", + "metadata": {}, + "source": [ + "- This exercise uses the same code base as the rest of the tutorial. \n", + "- You will be using the G compset at the T62_g37 resolution.\n", + "- You will run a control simulation and two experimental simulations. Each simulation will be run for one year. \n", + "- You will use simple, command line netcdf tools to evaluate how the experiments differ from the control simulation." + ] + }, + { + "cell_type": "markdown", + "id": "fd2ff959-6ec0-4534-8713-f5dfdb13b955", + "metadata": {}, + "source": [ + "## Useful CICE references" + ] + }, + { + "cell_type": "markdown", + "id": "baa2afd1-4289-4baf-8bdf-83de7592d76b", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM CICE User's Guide](https://www.cesm.ucar.edu/models/cesm2/sea-ice)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "523878ee-2bfa-4363-a8ec-5ff151b15d57", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "\n", + "[CESM CICE Discussion Forum](https://bb.cgd.ucar.edu/cesm/forums/cesm-cice.137/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cb8a0e10-a920-41dd-8bc4-5c03395d231e", + "metadata": {}, + "source": [ + "## What is a G case?" + ] + }, + { + "cell_type": "markdown", + "id": "69988cae-fd26-4fda-8fee-6ab52e79f42d", + "metadata": {}, + "source": [ + "The G compset has active and coupled ocean and sea-ice components. The G compset requires boundary forcing from the atmosphere. The G compset is forced with atmospheric data that does not change interactively as the ocean and sea-ice evolve in time. The land and land ice are not active during a G compset experiment run and the runoff is specified. " + ] + }, + { + "cell_type": "markdown", + "id": "68ca54e2-d8ad-41bc-be8f-31a85eec6e65", + "metadata": {}, + "source": [ + "![gcase](../../../images/challenge/gcase.png)\n", + "\n", + "*

Figure: G Compset definition.

*" + ] + }, + { + "cell_type": "markdown", + "id": "c93817fd-8031-4917-bf45-eb0f442578f9", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Compset Definitions](https://www2.cesm.ucar.edu/models/cesm2/config/compsets.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "5cbebcff-7d58-4d34-8613-6c1613ab438e", + "metadata": {}, + "source": [ + "## G Compset forcing data" + ] + }, + { + "cell_type": "markdown", + "id": "6deea789-4c3f-475d-9fc9-a1153fb3061b", + "metadata": {}, + "source": [ + "There are two types of temporal forcing for G compsets:\n", + "- Normal Year Forcing (NYF) is 12 months of atmospheric data (like a climatology) that repeats every year. NYF is the default forcing.\n", + "- Interannual varying forcing (GIAF) is forcing that varies by year over the time period (1948-2017). \n", + "\n", + "There are two datasets that can be used for G compsets:\n", + "- JRA55-do atmospheric data \\([Tsujino et al. 2018](https://doi.org/10.1016/j.ocemod.2018.07.002)\\)\n", + "- Coordinated Ocean-ice Reference Experiments (CORE) version 2 atmospheric data \\([Large and Yeager 2009](http://doi.org/10.1007/s00382-008-0441-3)\\).\n", + "\n", + "In these exercises we will use the CORE NYF." + ] + }, + { + "cell_type": "markdown", + "id": "da3d9215-30c1-4152-abc0-ccb1e709cde3", + "metadata": {}, + "source": [ + "## Post processing and viewing your output\n", + "\n", + "You will use [ncview](https://ncar.github.io/CESM-Tutorial/notebooks/resources/netcdf.html#ncview) and [NCO operator](https://ncar.github.io/CESM-Tutorial/notebooks/resources/netcdf.html#netcdf-operators-nco) tools to evaluate how the experiments differ from the control simulation.\n", + "\n", + "These modules should already be loaded into your environment, so verify that they are in your environment and it not load them using the NCAR HPC [modules](https://ncar.github.io/CESM-Tutorial/notebooks/tools/unix/modules.html).\n", + "\n", + "```\n", + "module list\n", + "```\n", + "\n", + "If they are not listed, then you can load the modules:\n", + "\n", + "```\n", + "module load ncview\n", + "module load nco\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "828e538d-3558-4747-9b61-3b29da04e294", + "metadata": {}, + "source": [ + "1) You can create an annual average of the first year's data for each simulationg using the `ncra` (netCDF averager) command from the netCDF operators package \\([NCO](https://nco.sourceforge.net/)\\). \n", + "```\n", + "ncra $OUTPUT_DIR/*.cice.h.*nc $CASENAME.cice.h.0001.nc\n", + "```\n", + "\n", + "2) Create a file that contains differences between each of the experiments and the control simulation\n", + "```\n", + "ncdiff $CASENAME.cice.h.0001.nc $CONTROLCASE.cice.h.0001.nc $CASENAME_diff.nc\n", + "```\n", + "\n", + "3) Examine variables within each annual mean and the difference files using `ncview`\n", + "```\n", + "ncview $CASENAME_diff.nc\n", + "```\n", + "\n", + "4) You can also look at other monthly-mean outputs or component log files." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cice/cice_exercise_1.ipynb b/_sources/notebooks/challenge/cice/cice_exercise_1.ipynb new file mode 100644 index 000000000..188207cd9 --- /dev/null +++ b/_sources/notebooks/challenge/cice/cice_exercise_1.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 1: Control case" + ] + }, + { + "cell_type": "markdown", + "id": "e2bfe3d7-3e5f-46ea-a30c-65fc1743c69e", + "metadata": {}, + "source": [ + "**NOTE:** Building the control case for the CICE challenge exercises is idential to building the control case in the POP challenge exercises. If you have already completed the POP challenge exercises you can skip this step." + ] + }, + { + "cell_type": "markdown", + "id": "6457c1d2-0530-435d-ae27-d0f1eeabe583", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Run a control case

\n", + " \n", + "Create a case called **g_control** using the compset `G` at `T62_g37` resolution. \n", + " \n", + "Set the run length to **1 year**. \n", + "\n", + "Build and run the model. Since this is a control case, we want to build it \"out of the box\" without any modifications. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2e33a95-e93c-4aca-86d7-1a830cc0562c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "
\n", + " \n", + "**How do I compile?**\n", + "
\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "
\n", + " \n", + "**How do I control the output?**\n", + "
\n", + "\n", + "Use namelist variables: `histfreq`, `histfreq_n`, and `f_var`. \n", + "\n", + "```\n", + "histfreq = 'm','d','x','x','x'\n", + "histfreq_n = 1,1,1,1,1\n", + "\n", + "f_aice = 'mdxxx'\n", + "f_hi = 'mdxxx'\n", + "```\n", + "
\n", + "\n", + "[CICE History](https://cesmcice.readthedocs.io/en/latest/users_guide/ice_history.html#history-files)\n", + "
\n", + "\n", + "**How do I check my solution?**\n", + "
\n", + "\n", + "When your run is completed, go to the archive directory. \n", + "\n", + "(1) Check that your archive directory contains the files:\n", + "\n", + "- `h` files\n", + "```\n", + "g_control.cice.h.0001-01.nc\n", + "```\n", + "- `h1` files\n", + "```\n", + "g_control.cice.h1.0001-01-01.nc\n", + "g_control.cice.h1.0001-01-02.nc\n", + "```\n", + "
\n", + "\n", + "(2) Compare the contents of the `h` and `h1` files using `ncdump`.\n", + "```\n", + "ncdump -h g_control.cice.h.0001-01.nc\n", + "ncdump -h g_control.cice.h1.0001-01-01.nc\n", + "```\n", + "
\n", + "\n", + "Look at the sizes of the files. \n", + "```\n", + "ls -l g_control.cice.h.0001-01.nc\n", + "ls -l g_control.cice.h1.0001*.nc\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a new case g_control with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case /glade/u/home/$USER/cases/g_control --compset G --res T62_g37 \n", + "```\n", + "
\n", + "\n", + "Case setup:\n", + "``` \n", + "cd ~/cases/g_control \n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Change the run length:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nyears\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "
\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "g_control. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/g_control/ice/hist\n", + "\n", + "ls \n", + "```\n", + "
\n", + "\n", + "(2) Compare the contents of the `h` and `h1` files using `ncdump`.\n", + "\n", + "(3) Check the number of timesteps / files for the `h` and the `h1` files. \n", + "\n", + "- `h1` has 31 time samples / files.\n", + " \n", + "- Check the size of the files\n", + "```\n", + "du –ks –h /glade/derecho/scratch/$USER/archive/g_control/ice/hist/*\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17cf7e19-1211-45f2-97cd-fe2badc69dac", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cice/cice_exercise_2.ipynb b/_sources/notebooks/challenge/cice/cice_exercise_2.ipynb new file mode 100644 index 000000000..01b6d2a79 --- /dev/null +++ b/_sources/notebooks/challenge/cice/cice_exercise_2.ipynb @@ -0,0 +1,261 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 2: Tune the albedo" + ] + }, + { + "cell_type": "markdown", + "id": "0037b73f-f174-48e7-8e4f-0744d7d23fe0", + "metadata": {}, + "source": [ + "One of the most common changes to the cice model involves changing the albedo of the snow on the surface of the sea ice using the delta-Eddington radiation scheme. To tune the albedo, you must actually change the inherent optical properties of the snow, bare ice, or ponds.\n", + "\n", + "Here we will experiment with changing the snow properties using the `r_snw` parameter. \n", + "\n", + "`r_snw` specifies the number of **standard deviations** away from the base optical properties of the shortwave radiative transfer code. `r_snw` is used to determine the non-melting snow grain radius using the following equation:" + ] + }, + { + "cell_type": "markdown", + "id": "d49c7e65-cc71-4838-91a9-0bbc27393e24", + "metadata": {}, + "source": [ + "$$\n", + " {rsnw}_{nonmelt} = 500 - r_{snw} * 250\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "737f543b-8c17-42a2-98a0-da3b5de9368e", + "metadata": {}, + "source": [ + "This is in microns $(\\mu m)$ and `rsnw_nonmelt` has a minimum value of 100 and a maximum value of `rsnw_mlt`. As can be seen, when `r_snw` is larger then there is a lower value of `rsnw_nonmelt`. When `rsnw_nonmelt` is lower then the albedos are higher and vice versa. This is because smaller grains lead to higher albedos. Hence the sign of `r_snw` is positive for higher albedos and negative for lower albedos." + ] + }, + { + "cell_type": "markdown", + "id": "67bee263-c16d-43d3-989b-03959c0b31dd", + "metadata": {}, + "source": [ + "The figure below shows how this works. The x-axis is temperature and the y-axis is effective snow grain radius." + ] + }, + { + "cell_type": "markdown", + "id": "1ce8051e-1439-4c94-8d10-07712dd9c9d3", + "metadata": {}, + "source": [ + "![rsnw](../../../images/challenge/cice_rsnw2.png)\n", + "\n", + "*

Figure: r_snw parameter plot.

*" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Change snow albedo

\n", + " \n", + "Create a case called **g_snowalbedo** by cloning the control experiment case. \n", + " \n", + "Verify that the run length is set to **1 year**. \n", + "\n", + "In user_nl_cice make the following modifications:`r_snw = 2.0`.\n", + "\n", + "Build and run the model for one year. \n", + "\n", + "Provide info about how to compare the simulations using ncview/ncdiff, etc.\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2e33a95-e93c-4aca-86d7-1a830cc0562c", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + " \n", + "**How do I compile?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "
\n", + "\n", + "**How do I control the output?**\n", + "\n", + "Use namelist variables: `histfreq`,`histfreq_n`, and `f_var`.\n", + "\n", + "Look at the online documentation for these variables.\n", + "\n", + "**How do I check my solution?**\n", + "\n", + "When your run is completed, go to the archive directory. \n", + "\n", + "(1) Check that your archive directory contains the files:\n", + "\n", + "- `h` files\n", + "```\n", + "g_snowalbedo.cice.h.0001-01.nc\n", + "```\n", + "- `h1` files\n", + "```\n", + "g_snowalbedo.cice.h1.0001-01-01-00000.nc\n", + "g_snowalbedo.cice.h1.0001-02-01-00000.nc\n", + "```\n", + "
\n", + "\n", + "(2) Compare the contents of the `h` and `h1` files using `ncdump`.\n", + "\n", + "```\n", + "ncdump -h g_snowalbedo.cice.h.0001-01-01-00000.nc\n", + "ncdump -h g_snowalbedo.cice.h1.0001-01-01-00000.nc\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Clone a new case g_snowalbedo from your control experiment with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_clone --case /glade/u/home/$USER/cases/g_snowalbedo --clone /glade/u/home/$USER/cases/g_control\n", + "```\n", + "
\n", + "\n", + "Case setup:\n", + "``` \n", + "cd /glade/u/home/$USER/cases/g_snowalbedo\n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Verify that the run length is 1 year:\n", + "``` \n", + "./xmlquery STOP_N\n", + "./xmlquery STOP_OPTION\n", + "```\n", + "
\n", + "\n", + "Edit the file user_nl_cice and add the lines:\n", + "```\n", + " r_snw = 2.0\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "
\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "g_snowalbedo. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/g_snowalbedo/ice/hist\n", + "ls \n", + "```\n", + "
\n", + "\n", + "(2) Compare to control run:\n", + "```\n", + "ncdiff g_snowalbedo.cice.h.0001-01.nc /glade/derecho/scratch/$USER/archive/g_control/ice/hist/g_control.cice.h.0001-01.nc g_diff.nc\n", + "\n", + "ncview g_diff.nc\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "ff6921a7-bb56-4617-8e13-1d9169c9dd8f", + "metadata": { + "tags": [] + }, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "e46ea9f9-937c-48f8-bbec-7b16dc7b2266", + "metadata": { + "tags": [] + }, + "source": [ + "- What changes do you see from the control case with an increased snow albedo? Try other values of `r_snw`.\n", + "- What time of year did you start your run and which season do you expect to see the biggest impact for shortwave changes?\n", + "- How did changes in the Arctic vs. the Antarctic compare?\n", + "- Are the modified `r_snw` values physically realistic? Why or why not? Why do you think this parameter is sometimes used to tune ESMs?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57e44486-5057-4394-9e00-46ed9c2623d9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cice/cice_exercise_3.ipynb b/_sources/notebooks/challenge/cice/cice_exercise_3.ipynb new file mode 100644 index 000000000..34807f1f0 --- /dev/null +++ b/_sources/notebooks/challenge/cice/cice_exercise_3.ipynb @@ -0,0 +1,241 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 3: Modify the snow conductivity" + ] + }, + { + "cell_type": "markdown", + "id": "63f3e4ed-fcf6-4b6e-bdfd-2eccb16b640d", + "metadata": {}, + "source": [ + "One of the more sensitive sea ice parameters is the snow thermal conductivity or `ksno` parameter \\([Urrego-Blanco et al. 2016](https://doi.org/10.1002/2015JC011558)\\). Thermal conductivity determines the ability of the snow to conduct heat through it.\n", + "\n", + "$$\n", + "F_{cond} = - k_{sno} * dT / dz\n", + "$$\n", + "\n", + "Here you will see how this impacts a simulation by multiplying this value by a factor of three. In this version of the CICE model, this is actually a hard coded parameter in a Fortran module. It was found that this parameter was important enough that it was included in the namelist in future versions of CICE.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "ee251754-9068-46b7-a36c-78784d7fc6c9", + "metadata": {}, + "source": [ + "
\n", + "Exercise 3: Something with source code

\n", + " \n", + "Create a case (clone) called **g_ksno** using the compset `G` at `T62_g37` resolution. \n", + " \n", + "Set the run length to **1 year**. \n", + "\n", + "Go to the main source directory under /glade/u/home/$USER/code/my_cesm_code/components/cice/src and search for the variable `ksno`.\n", + " \n", + "Copy the source module from the main CESM code directory into $CASE/SourceMods/src.cice.\n", + "\n", + "Edit the fortran code in SourceMods/src.cice.\n", + " \n", + "Find the variable \"ksno\" and change this to 0.9.\n", + " \n", + "Build and run the model for one year. \n", + "\n", + "Provide info about how to compare the simulations using ncview/ncdiff, etc.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "604924a5-bf6e-4102-a019-8f50cbf35c35", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**How do I compile?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "
\n", + "\n", + "**How do I control the output?**\n", + "\n", + "Use namelist variables: `histfreq`,`histfreq_n`, and `f_var`.\n", + "\n", + "Look at the online documentation for these variables.\n", + "\n", + "**How do I check my solution?**\n", + "\n", + "When your run is completed, go to the archive directory. \n", + "\n", + "(1) Check that your archive directory contains the files:\n", + "\n", + "- `h` files\n", + "```\n", + "g_ksno.cice.h.0001-01.nc\n", + "```\n", + "- `h1` files\n", + "```\n", + "g_ksno.cice.h1.0001-01-01-00000.nc\n", + "g_ksno.cice.h1.0001-02-01-00000.nc\n", + "```\n", + "
\n", + "\n", + "(2) Compare the contents of the `h` and `h1` files using `ncdump`.\n", + "\n", + "```\n", + "ncdump -h g_ksno.cice.h.0001-01-01-00000.nc\n", + "ncdump -h g_ksno.cice.h1.0001-01-01-00000.nc\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "031b65a2-ab0f-4784-bab3-1b4824e6e029", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " Clone a new case g_ksno from your control experiment with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_clone --case /glade/u/home/$USER/cases/g_ksno --clone /glade/u/home/$USER/cases/g_control\n", + "```\n", + "
\n", + "\n", + "Case setup:\n", + "``` \n", + "cd /glade/u/home/$USER/cases/g_ksno\n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Verify that the run length is 1 year:\n", + "``` \n", + "./xmlquery STOP_N\n", + "./xmlquery STOP_OPTION\n", + "```\n", + "
\n", + "\n", + "Copy the file from the $CODEROOT directory:\n", + "```\n", + "cp /glade/u/home/$USER/code/my_cesm_code/components/cice/src/drivers/cesm/ice_constants.F90 /glade/u/home/$USER/cases/g_ksno/SourceMods/src.cice\n", + "\n", + "vi /glade/u/home/$USER/cases/g_ksno/SourceMods/src.cice/ice_constants.F90\n", + "```\n", + "
\n", + "\n", + "Change the following line to a value of `0.90_dbl_kind`:\n", + "```\n", + " ksno = 0.30_dbl_kind ,&! thermal conductivity of snow (W/m/deg)\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "
\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "g_ksno. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/g_ksno/ice/hist\n", + "ls \n", + "```\n", + "
\n", + "\n", + "(2) Compare to control run:\n", + "```\n", + "ncdiff g_ksno.cice.h.0001-01.nc /glade/derecho/scratch/$USER/archive/g_control/ice/hist/g_control.cice.h.0001-01.nc g_diff.nc\n", + "\n", + "ncview g_diff.nc\n", + "``` \n", + " \n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "928576e7-dc1e-4b85-88e7-1b6e9b09f0d8", + "metadata": { + "tags": [] + }, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "617f643f-50e3-4867-996a-0a72080d1d6e", + "metadata": { + "tags": [] + }, + "source": [ + "- What changes do you see in the ice state from the control case with increased thermal conductivity? Are these changes in line with what you expect?\n", + "- How did changes in the Arctic vs. the Antarctic compare?\n", + "- How does the magnitude of the changes compare to the snow albedo changes done in exercise 2? Do these results agree with those of [Urrego-Blanco et al. 2016](https://doi.org/10.1002/2015JC011558)?\n", + "- Are the modified `ksno` values physically realistic? Why or why not? Could you imagine this being used as a tuning parameter for ESMs?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e311bb4-822f-4150-ad15-0572864365dc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cism/cism.ipynb b/_sources/notebooks/challenge/cism/cism.ipynb new file mode 100644 index 000000000..72044ffdb --- /dev/null +++ b/_sources/notebooks/challenge/cism/cism.ipynb @@ -0,0 +1,152 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cd674360-c487-4160-92f8-67a283d8104d", + "metadata": {}, + "source": [ + "# Land Ice\n", + "\n", + "The land ice component of CESM is the Community Ice Sheet Model (CISM). Running CESM with a fully evolving ice sheet and 2-way coupling is relatively new and is not the default CESM fully-coupled setup. \n", + "\n", + "However, it can be useful for people interested in land ice science to investigate the impact of atmospheric forcing on the ice sheet. In this exercise, you will learn how to evolve CISM in an uncoupled configuration using an existing CESM forcing dataset.\n", + "\n", + "This exercise was created by Gunter Leguy and Kate Thayer-Calder." + ] + }, + { + "cell_type": "markdown", + "id": "e220126d-bde0-4f98-a9ed-889932480f54", + "metadata": {}, + "source": [ + "## Learning Goals" + ] + }, + { + "cell_type": "markdown", + "id": "edf500e6-fbd0-42ca-88ea-e0e94ceb5813", + "metadata": {}, + "source": [ + "- Student will learn what a T compset is, the types of forcing available to run one, and how to run one.\n", + "- Student will learn how to make XML variable modifications to force CISM with forcing data from an existing run.\n", + "- Student will learn how to look at 2D and time series CISM history datasets.\n", + "- Student will learn how to compute the sea level change due ice sheet evolution. " + ] + }, + { + "cell_type": "markdown", + "id": "3caefecd-731a-496d-9245-1586cdec05ba", + "metadata": { + "tags": [] + }, + "source": [ + "## Exercise Details" + ] + }, + { + "cell_type": "markdown", + "id": "01b99858-0566-4d36-a5b5-0f0d7550d6a0", + "metadata": {}, + "source": [ + "- This exercise uses the same codebase as the rest of the tutorial. \n", + "- You will be using the T compset at the f19_g17_gl4 resolution.\n", + "- You will run an experimental simulation for 86 years. \n", + "- You will then use jupyter notebooks to look at your simulation." + ] + }, + { + "cell_type": "markdown", + "id": "cefcfbc6-e5c7-4323-b292-5bba542ddabb", + "metadata": {}, + "source": [ + "## Useful CISM references" + ] + }, + { + "cell_type": "markdown", + "id": "2b884ee2-d45d-4b76-ab55-f69be8acbe64", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM CISM User's Guide](https://www.cesm.ucar.edu/models/cesm2/land-ice)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1c520b9a-5e96-4aee-927d-5b9124a45ac7", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "\n", + "[CESM CISM Discussion Forum](https://bb.cgd.ucar.edu/cesm/forums/cism.135/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d720b227-8b14-4bcf-8b99-04acf4e2a94b", + "metadata": {}, + "source": [ + "## What is a T case?" + ] + }, + { + "cell_type": "markdown", + "id": "3b6cd7b4-1086-4397-bb58-f9ab8f475e5f", + "metadata": {}, + "source": [ + "The CESM T compset runs only the ice sheet component (here CISM). Within a T compset case, CISM can run in Evolve or Non-Evolve mode and is forced by output from a previous CESM run. A \"plain\" T compset (like T1850) runs CISM in Non-Evolve mode and a \"TG\" compset (like T1850G) runs CISM in Evolve mode. All other components of a T compset are stubs. Before running a T compset, you must have coupler history files from a previous run that included CLM (version 4.5 or later). You can run with either existing forcing data or with your own forcing data.\\\n", + "Typically, coupler history files for CISM are yearly averages downscaled onto the CISM grid. For now, downscaled variables include surface temperature and glacier ice flux available at each elevation class. (In the future, ocean data will also be available.)" + ] + }, + { + "cell_type": "markdown", + "id": "e0126170-58d9-4f81-82d7-c5b1406a196a", + "metadata": {}, + "source": [ + "![Tcase](../../images/challenge/Tcompset.png)\n", + "\n", + "*

Figure: TG compset definition.

*" + ] + }, + { + "cell_type": "markdown", + "id": "94de8f70-6391-4201-83fe-3a61c514750a", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[T Compset definition](https://www2.cesm.ucar.edu/models/cesm2/config/compsets.html)\n", + "\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CMIP6 2019.10", + "language": "python", + "name": "cmip6-201910" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cism/cism_exercise_1.ipynb b/_sources/notebooks/challenge/cism/cism_exercise_1.ipynb new file mode 100644 index 000000000..84423b7c8 --- /dev/null +++ b/_sources/notebooks/challenge/cism/cism_exercise_1.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a76577f4-b549-4ae4-afd4-5e58e83375be", + "metadata": {}, + "source": [ + "# CISM Challenge Exercise" + ] + }, + { + "cell_type": "markdown", + "id": "bcd30c0c-7ae2-47ef-b228-b32b5bdbb0a0", + "metadata": {}, + "source": [ + "In this challenge, you will set up and run a T compset forced with existing output from a B compset simulation (fully coupled climate simulation with no evolving ice sheet). The experiment will force the Greenland ice sheet (GrIS) with atmospheric forcing spanning 2015-2100 that were created from a 2 degree fully-coupled SSP5-8.5 scenario experiment. \n", + "\n", + "**WARNING**\\\n", + "The forcing data you will use in this exercise has not been scientifically validated yet, or ever been looked at carefully. You are entering the world of research that we deal with daily at NCAR :)." + ] + }, + { + "cell_type": "markdown", + "id": "f3d1fec9-fad1-48ab-ba75-ac1c0177aeb4", + "metadata": {}, + "source": [ + "
\n", + "Step 1: Create your T compset experiment

\n", + " \n", + "Create a case called **T_GrIS_SSP585_2015_2100** using the compset ``T1850G`` at ``f19_g17_gl4`` resolution. \n", + "\n", + "**Note 1:** The 2 deg grid we are using in this exercise is not scientifically validated. \n", + "**Note 2:** In the new version of CESM, the compset names will be different and T1850G is replaced by T1850Gg (evolving GrIS) and the grid resolution f19_g17_gl4 will be replaced by f19_g17_gris4. \n", + "**Note 3:** The grid resolution for this case and the forcing data are both f19_g17_gl4. For a T compset, the forcing data and experiment must be at the same grid resolution.\n", + "\n", + "Step 2: Make the changes to the case XML variables

\n", + "\n", + "**Note 1:** The run length is **86 years**. \\\n", + "**Note 2:** The forcing data for this case can be found here: **/glade/u/home/gunterl/workshops/CESM-Tutorial/data/cpl_SSP585**\n", + "\n", + "Step 3: Build and run the model

\n", + " \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "860bdf2f-c173-4e46-859c-dc45c9ca60a0", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "\n", + "**How to I create a case a case that is not scientifically supported?**\n", + "\n", + "You need to add the option \n", + "```\n", + "--run-unsupported\n", + "```\n", + "at the end of your call to **./create_newcase**\n", + " \n", + " \n", + "**How do I make changes to case xml variables?**\n", + "\n", + "Make your changes to xml variables using the command:\n", + "```\n", + "./xmlchange\n", + "```\n", + " \n", + " \n", + "**How do I compile?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "cdaee5ee-b575-4484-a78e-23a88c140ffd", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "Create a new case T_GrIS_SSP585_2015_2100 with the command:\n", + "```\n", + "cd /glade/campaign/cesm/development/cross-wg/tutorial/release-cesm2.1.5/cime/scripts\n", + "./create_newcase --case ~/cases/T_GrIS_SSP585_2015_2100 --compset T1850G --res f19_g17_gl4 --run-unsupported\n", + "```\n", + "\n", + "Case setup:\n", + "``` \n", + "cd ~/cases/T_GrIS_SSP585_2015_2100\n", + "./case.setup\n", + "```\n", + " \n", + "Change the run length:\n", + "``` \n", + "./xmlchange STOP_N=86,STOP_OPTION=nyears\n", + "```\n", + "\n", + "If you are completing this exercise outside of the tutorial, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=main,PROJECT=UESM0013\n", + "```\n", + "\n", + "Modify the case XML variables:\n", + "```\n", + "./xmlchange DLND_CPLHIST_DIR=/glade/u/home/gunterl/workshops/CESM-Tutorial/data/cpl_SSP585\n", + "./xmlchange DLND_CPLHIST_CASE=b.e21.BSSP585cmip6.f19_g17.CMIP6-SSP5-8.5.001\n", + "./xmlchange DLND_CPLHIST_YR_START=2015\n", + "./xmlchange DLND_CPLHIST_YR_END=2100\n", + "./xmlchange RUN_STARTDATE=2015-01-01\n", + "./xmlchange DLND_CPLHIST_YR_ALIGN=2015\n", + "```\n", + "\n", + "Confirm that you have set up the paths and file names correctly by running:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "and examine the generated file,\n", + "```\n", + "CaseDocs/dlnd.streams.txt.sno.cplhist\n", + "```\n", + "\n", + "Set up the environment variable for qcmd. If using tcsh or csh:\n", + "```\n", + "setenv PBS_ACCOUNT UESM0013\n", + "```\n", + "and for bash:\n", + "```\n", + "export PBS_ACCOUNT=UESM0013\n", + "```\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "\n", + "If you see errors saying the dlnd forcing files are missing or unable to be downloaded since they lives outside of the input_data_root, then you may need to copy all of the forcing files into your case run directory.\n", + "```\n", + "cp /glade/u/home/gunterl/workshops/CESM-Tutorial/data/cpl_SSP5/* /glade/scratch/derecho/[username]/T_GrIS_SSP585_2015_2100/run/\n", + "```\n", + "And then submit the run again.\n", + "When the run is completed, look into the archive directory for: \n", + "T_GrIS_SSP585_2015_2100. \n", + " \n", + "(1) Check your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/T_GrIS_SSP585_2015_2100/glc/hist\n", + "ls \n", + "```\n", + " \n", + "(2) Take a look at the contents of a file using ``ncdump``.\n", + "```\n", + "ncdump -h T_GrIS_SSP585_2015_2100.cism.h.2016-01-01-00000.nc\n", + "```\n", + "\n", + "You will notice that CISM outputs are written yearly (by default) even though the time step is 0.1 year. Changes in ice sheet variables that are typically looked at (such as changes in ice mass or ice thickness) will be captured at this output frequency. \n", + "\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d6654a2-778c-4de9-909e-eb1fb2e10a42", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2024b", + "language": "python", + "name": "npl-2024b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cism/cism_exercise_2.ipynb b/_sources/notebooks/challenge/cism/cism_exercise_2.ipynb new file mode 100644 index 000000000..8ac04912c --- /dev/null +++ b/_sources/notebooks/challenge/cism/cism_exercise_2.ipynb @@ -0,0 +1,649 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b94bf6b6-ccac-40e8-ad8f-1b5d993ec48d", + "metadata": {}, + "source": [ + "# Looking at the simulation\n", + "\n", + "Here we will plot a few diagnostics to see what happens to the ice sheet during the simulation. We will focus on comparing the last time slice to the first time slice.\n", + "\n", + "\n", + "First, and for convenience, we will rename the first output file corresponding to year 2015." + ] + }, + { + "cell_type": "markdown", + "id": "49386dc4-979d-4919-b72d-f8a7b6757b9e", + "metadata": {}, + "source": [ + "
\n", + " \n", + " Find your history output on derecho (descibed above as well):

\n", + "``cd /glade/derecho/scratch/$USER/archive/T_GrIS_SSP585_2015_2100/glc/hist``
\n", + "``ls``
\n", + " \n", + " Rename the initial_hist file to the start date and time:

\n", + "\n", + "``\n", + "mv T_GrIS_SSP585_2015_2100.cism.initial_hist.2015-01-01-00000.nc T_GrIS_SSP585_2015_2100.cism.h.2015-01-01-00000.nc\n", + "``\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "916e2e9b-fd7e-4fc3-83f9-4f69c052a16b", + "metadata": {}, + "source": [ + "### Loading packages" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e78178bd-6f9f-420c-9a5d-1da6201d6fab", + "metadata": {}, + "outputs": [], + "source": [ + "#import xarray as xr \n", + "import numpy as np \n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt \n", + "import matplotlib.colors as mplc\n", + "import matplotlib.cm as mcm\n", + "from netCDF4 import Dataset\n", + "import netCDF4\n", + "\n", + "# to display figures in notebook after executing the code.\n", + "%matplotlib inline " + ] + }, + { + "cell_type": "markdown", + "id": "071fa04b-c689-4c76-8da6-eed739ca6398", + "metadata": {}, + "source": [ + "### Set your user name " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "988024ed-5662-4f7c-bc78-670f27710d4f", + "metadata": {}, + "outputs": [], + "source": [ + "User = ''" + ] + }, + { + "cell_type": "markdown", + "id": "177b05f1-ec2b-4086-9f26-2234c19d18c6", + "metadata": {}, + "source": [ + "### Set the 2 years you would like to compare" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74fd7507-61c7-4b62-8f93-2a555c58c9ca", + "metadata": {}, + "outputs": [], + "source": [ + "year1 = '2016'\n", + "year2 = '2101'" + ] + }, + { + "cell_type": "markdown", + "id": "e57243eb-3968-4a6d-9e6a-b477507507ed", + "metadata": {}, + "source": [ + "### Defining the path and filenames " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "12cf918c-9dee-4595-84da-a1522ea9e1a6", + "metadata": {}, + "outputs": [], + "source": [ + "# Defining the path\n", + "path_to_file = '/glade/derecho/scratch/' + User + '/archive/T_GrIS_SSP585_2015_2100/glc/hist/'\n", + "\n", + "# Defining the files to compare\n", + "file1 = path_to_file + 'T_GrIS_SSP585_2015_2100.cism.h.' + year1 + '-01-01-00000.nc'\n", + "file2 = path_to_file + 'T_GrIS_SSP585_2015_2100.cism.h.' + year2 + '-01-01-00000.nc'\n", + "\n", + "# Loading the data\n", + "ncfile = Dataset(file1,'r')\n", + "thk1 = np.squeeze(ncfile.variables[\"thk\"][0,:,:]) # ice thickness\n", + "artm1 = np.squeeze(ncfile.variables[\"artm\"][0,:,:]) # air temperature\n", + "smb1 = np.squeeze(ncfile.variables[\"smb\"][0,:,:])/1000. # surface mass balance, switching the units from mm/yr w.e. to m/yr w.e\n", + "ncfile.close()\n", + "\n", + "ncfile = Dataset(file2,'r')\n", + "thk2 = np.squeeze(ncfile.variables[\"thk\"][0,:,:])\n", + "artm2 = np.squeeze(ncfile.variables[\"artm\"][0,:,:])\n", + "smb2 = np.squeeze(ncfile.variables[\"smb\"][0,:,:])/1000. # switching the units from mm/yr w.e. to m/yr w.e\n", + "ncfile.close()\n", + "\n", + "# Computing the differences in the different variables\n", + "diff_thk = thk2 - thk1 # thickness difference\n", + "diff_artm = artm2 - artm1 # air temperature difference\n", + "diff_smb = smb2 - smb1 # SMB difference" + ] + }, + { + "cell_type": "markdown", + "id": "918d524b-c3f9-40cd-84dd-e1924ff15ea9", + "metadata": {}, + "source": [ + "## Looking at 2D plots\n", + "\n", + "**Note:**\n", + "In these plots, you can adjust the range of the colorbars by adjusting the \"vmin\" and \"vmax\" values of each subplot." + ] + }, + { + "cell_type": "markdown", + "id": "8630fc1d-8656-4b52-b51c-c00f1ca43d51", + "metadata": {}, + "source": [ + "### Air temperature" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cbb7265a-095b-4bf5-b700-523fef9fe1a9", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "labelsize=15\n", + "\n", + "my_cmap = mcm.get_cmap('Spectral_r')\n", + "\n", + "\n", + "fig, ax = plt.subplots(1, 3, sharey=True, figsize=[21, 9])\n", + "\n", + "\n", + "# Plotting air temperature for year1\n", + "\n", + "vmin = -20\n", + "vmax = 20\n", + "\n", + "last_panel0 = ax[0].imshow(artm1, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title0 = 'Air temperature (deg C), ' + year1 \n", + "ax[0].set_title(title0, fontsize=labelsize)\n", + "\n", + "fig.subplots_adjust(right=0.8)\n", + "\n", + "pos = ax[0].get_position()\n", + "cax = fig.add_axes([0.32, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "cbar = fig.colorbar(last_panel0,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "cbar.ax.get_yaxis().labelpad = 15\n", + "\n", + "\n", + "\n", + "# Plotting air temperature for year2\n", + "\n", + "last_panel1 = ax[1].imshow(artm2, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title1 = 'Air temperature (deg C), ' + year2 \n", + "\n", + "ax[1].set_title(title1, fontsize=labelsize)\n", + "\n", + "pos = ax[1].get_position()\n", + "cax = fig.add_axes([0.56, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "cbar = fig.colorbar(last_panel1,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "cbar.ax.get_yaxis().labelpad = 15\n", + "\n", + "\n", + "\n", + "# Plotting the difference in air temperature\n", + "\n", + "\n", + "vmin = -15\n", + "vmax = 15\n", + "\n", + "last_panel2 = ax[2].imshow(diff_artm, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title2 = 'Difference (deg C), ' + year2 + '-' + year1 \n", + "ax[2].set_title(title2, fontsize=labelsize)\n", + "pos = ax[2].get_position()\n", + "cax = fig.add_axes([0.8, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "cbar = fig.colorbar(last_panel2,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "\n", + "\n", + "for i in range(len(ax)):\n", + " ax[i].invert_yaxis()\n", + " ax[i].set_xlabel('')\n", + " ax[i].set_ylabel('')\n", + " ax[i].set_xticklabels('')\n", + " ax[i].set_yticklabels('')\n", + " ax[i].set_xticks([])\n", + " ax[i].set_yticks([])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e352d623-3525-4b67-b86c-23e25ceb4608", + "metadata": {}, + "source": [ + "### Surface mass balance" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "053ef542-d289-4dd7-8881-8a1a6b324ac0", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "labelsize=15\n", + "\n", + "my_cmap = mcm.get_cmap('Spectral_r')\n", + "\n", + "\n", + "fig, ax = plt.subplots(1, 3, sharey=True, figsize=[21, 9])\n", + "\n", + "\n", + "# Plotting SMB for year1\n", + "\n", + "vmin = -4\n", + "vmax = 4\n", + "\n", + "last_panel0 = ax[0].imshow(smb1, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title0 = 'SMB (m/yr w.e), ' + year1 \n", + "\n", + "ax[0].set_title(title0, fontsize=labelsize)\n", + "\n", + "\n", + "fig.subplots_adjust(right=0.8)\n", + "\n", + "pos = ax[0].get_position()\n", + "cax = fig.add_axes([0.32, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "\n", + "cbar = fig.colorbar(last_panel0,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "\n", + "cbar.ax.get_yaxis().labelpad = 15\n", + "\n", + "\n", + "\n", + "# Plotting SMB for year2\n", + "\n", + "last_panel1 = ax[1].imshow(smb2, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title1 = 'SMB (m/yr w.e), ' + year2 \n", + "\n", + "ax[1].set_title(title1, fontsize=labelsize)\n", + "pos = ax[1].get_position()\n", + "cax = fig.add_axes([0.56, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "cbar = fig.colorbar(last_panel1,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "cbar.ax.get_yaxis().labelpad = 15\n", + "\n", + "\n", + "\n", + "# Plotting the difference in SMB\n", + "\n", + "\n", + "vmin = -3\n", + "vmax = 3\n", + "\n", + "last_panel2 = ax[2].imshow(diff_smb, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title2 = 'Difference (m/yr w.e), ' + year2 + '-' + year1 \n", + "\n", + "ax[2].set_title(title2, fontsize=labelsize)\n", + "\n", + "\n", + "pos = ax[2].get_position()\n", + "cax = fig.add_axes([0.8, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "cbar = fig.colorbar(last_panel2,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "\n", + "\n", + "for i in range(len(ax)):\n", + " ax[i].invert_yaxis()\n", + " ax[i].set_xlabel('')\n", + " ax[i].set_ylabel('')\n", + " ax[i].set_xticklabels('')\n", + " ax[i].set_yticklabels('')\n", + " ax[i].set_xticks([])\n", + " ax[i].set_yticks([])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e003a818-7fe2-49e3-b973-fa90e169acfd", + "metadata": {}, + "source": [ + "### Ice Thickness" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "fe0a05e5-13e7-450f-a8f1-6f7be9a90c12", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "labelsize=15\n", + "my_cmap = mcm.get_cmap('Spectral_r')\n", + "\n", + "\n", + "fig, ax = plt.subplots(1, 3, sharey=True, figsize=[21, 9])\n", + "\n", + "# Plotting thickness for year1\n", + "\n", + "vmin = 0\n", + "vmax = 3500\n", + "\n", + "last_panel0 = ax[0].imshow(thk1, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title0 = 'Ice thickness (m), ' + year1 \n", + "ax[0].set_title(title0, fontsize=labelsize)\n", + "\n", + "fig.subplots_adjust(right=0.8)\n", + "\n", + "pos = ax[0].get_position()\n", + "cax = fig.add_axes([0.32, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "\n", + "cbar = fig.colorbar(last_panel0,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "\n", + "cbar.ax.get_yaxis().labelpad = 15\n", + "\n", + "\n", + "\n", + "# Plotting thickness for year2\n", + "\n", + "last_panel1 = ax[1].imshow(thk2, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title1 = 'Ice thickness (m), ' + year2 \n", + "\n", + "ax[1].set_title(title1, fontsize=labelsize)\n", + "\n", + "pos = ax[1].get_position()\n", + "cax = fig.add_axes([0.56, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "cbar = fig.colorbar(last_panel1,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "cbar.ax.get_yaxis().labelpad = 15\n", + "\n", + "\n", + "\n", + "# Plotting the difference in ice thickness\n", + "\n", + "vmin = -300\n", + "vmax = 300\n", + "\n", + "last_panel2 = ax[2].imshow(diff_thk, vmin=vmin, vmax=vmax,\n", + " cmap=my_cmap)\n", + "\n", + "title2 = 'Difference (m), ' + year2 + '-' + year1 \n", + "\n", + "ax[2].set_title(title2, fontsize=labelsize)\n", + "pos = ax[2].get_position()\n", + "cax = fig.add_axes([0.8, pos.y0, 0.015, pos.y1 - pos.y0])\n", + "cbar = fig.colorbar(last_panel2,cax=cax)\n", + "cbar.ax.tick_params(labelsize=labelsize)\n", + "\n", + "\n", + "for i in range(len(ax)):\n", + " ax[i].invert_yaxis()\n", + " ax[i].set_xlabel('')\n", + " ax[i].set_ylabel('')\n", + " ax[i].set_xticklabels('')\n", + " ax[i].set_yticklabels('')\n", + " ax[i].set_xticks([])\n", + " ax[i].set_yticks([])\n" + ] + }, + { + "cell_type": "markdown", + "id": "38529a7f-2e31-4853-83b2-02218e85290e", + "metadata": {}, + "source": [ + "## Looking at time series\n", + "Each output history file contains a few scalars that give information about the state of the ice sheet. Here we are going to look at:\n", + "- the grounded ice area\n", + "- the ice mass\n", + "- the ice mass above flotation" + ] + }, + { + "cell_type": "markdown", + "id": "e8014b04-4075-4eb0-b01c-157383637c7b", + "metadata": {}, + "source": [ + "
\n", + " Combining all time for each scalar in a single time series file

\n", + "\n", + "While we could create an array using python for each scalar by looping through every single file, it is convenient to extract them in their own file using nco. \n", + "To do this we will use the command \"ncrcat\"\n", + " \n", + "On derecho: \n", + "```\n", + "module load nco\n", + "```\n", + " \n", + "**For mass**\n", + "```\n", + "ncrcat -v imass T_GrIS_SSP585_2015_2100.cism.h.*.nc mass.nc\n", + "```\n", + "\n", + "**For grounded ice area**\n", + "```\n", + "ncrcat -v iareag T_GrIS_SSP585_2015_2100.cism.h.*.nc area_ground.nc\n", + "```\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b3bfbfe2-c8f1-4bf0-88ed-a967843ad2db", + "metadata": {}, + "source": [ + "Now we can look at the time series evolution" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8935ff8e-37ef-4238-b8cd-35841f0565d2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Loading the variables\n", + "file_mass = path_to_file + \"mass.nc\"\n", + "file_areag = path_to_file + \"area_ground.nc\"\n", + "\n", + "ncfile = Dataset(file_mass,'r')\n", + "mass = ncfile.variables[\"imass\"][:]\n", + "time_mass = ncfile.variables[\"time\"][:]\n", + "ncfile.close()\n", + "\n", + "ncfile = Dataset(file_areag,'r')\n", + "area = ncfile.variables[\"iareag\"][:]\n", + "time_area = ncfile.variables[\"time\"][:]\n", + "ncfile.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf483b28-980c-4311-bb32-2eacb1b4eea2", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Ice area evolution (m2)')" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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K1eOHTt2sHnzZk/m3YvIWlUtkewH9lBi++0//viDfPny2f8p4M8//+TZZ59l/vz5VK9enZEjR9r5I8YkocT22XaHS2OS0Pr16ylZsiTr1q1j0qRJqb5ICEZhYWGMHTuWv//+m9atW9vIYQoRajfXSYybb76Z7777jk8//ZQff/yRIkWKMGvWLK9jGWNiYMW3MUlAVfn6668pW7YsAMuXL6dBgwYepzIxKVSoEO+//z4zZ860K6CkEGvXriVdunQUK1bM6yhBQURo374969ev57bbbqNevXpMmTLF61jGmGhY8W1MAJ08eZJBgwZRpEgRGjVqRLFixVizZo0VCClAhw4dKFeuHC+//DLr1q3zOo6Jw9atW7njjjtInz6911GCyt13382SJUt48MEHadSoEdOmxXaBMmOMF6z4NiYAjh07xksvvcTNN99Mhw4dyJo1KyNHjmTRokXceOONXsczfkibNi1ffvkl2bNnp2LFivz4449eRzKx2LZtG4UKFfI6RlDKmjUr8+bNo1SpUjz99NPMmDEj7o2MMcnGim9jEuHSpUsMGDCAO++8k6FDh9KkSRPWrVvH6tWree6552xULoUJDw9n+fLl3HbbbVSrVo2pU6d6HclE48qVK+zcudOK71hcd911fPfddxQvXpynnnqKDh06sHXrVq9jGWOw4tuYBNu9ezdFihShY8eOPPTQQ/z666+MGDHCppikcLfccgtLly6lZMmSNGjQwOaAB6F9+/Zx+fJlK77jcP311/Pdd9/RsGFDhg0bxj333EOVKlX4/vvvvY5mTKpmxbcxCXD48GEee+wxjh8/zty5c5k3bx733nuv17FMgOTIkYP58+dTtmxZXn31Vc6ePet1pCQlIqNE5IiIbIphfWefezVsEpGrIpLTXZddRKaKyFYR2SIiSX75kW3btgFY8e2H7NmzM27cOH7//Xc++OADdu3aRdWqVenbt69d2ccYj1jxbUw8nT59mmrVqnHw4EHmzJlDtWrVvI5kkkDmzJnp378/x48fZ8iQIV7HSWpjgKoxrVTVfqpaVFWLAl2BJT43PxsIfKeqdwMPAFuSOKsV3wmQJ08eunTpwtatW3n66ad54403aNeuHVeuXPE6mjGpjhXfxsTDhQsXqFu3Lhs3bmTq1Kk8+OCDXkcySah06dJUq1aNfv36hfTot6ouBfy9k3AjYCKA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "labelsize=15\n", + "\n", + "timemin = 2015\n", + "timemax = 2101\n", + "\n", + "color = 'black'\n", + "line = '-'\n", + "\n", + "plt.figure(figsize=(12,5))\n", + "\n", + "# Plotting the Ice mass evolution time series\n", + "\n", + "plt.subplot(121)\n", + "plt.plot(time_mass, mass, line, ms=3, mfc=color, color=color)\n", + "plt.xlim([timemin, timemax])\n", + "plt.xlabel('Time (yr)', multialignment='center',fontsize=labelsize)\n", + "plt.title('Ice mass evolution (kg)',fontsize=labelsize)\n", + "\n", + "\n", + "# Plotting the Ice area evolution time series\n", + "\n", + "plt.subplot(122)\n", + "plt.plot(time_area, area, line, ms=3, mfc=color, color=color)\n", + "plt.xlim([timemin, timemax])\n", + "plt.xlabel('Time (yr)', multialignment='center',fontsize=labelsize)\n", + "plt.title('Ice area evolution (m2)',fontsize=labelsize)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff2ee88c-52ec-4dc2-b9df-5cfd71984df4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CMIP6 2019.10", + "language": "python", + "name": "cmip6-201910" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/cism/cism_exercise_3.ipynb b/_sources/notebooks/challenge/cism/cism_exercise_3.ipynb new file mode 100644 index 000000000..5c6e688ee --- /dev/null +++ b/_sources/notebooks/challenge/cism/cism_exercise_3.ipynb @@ -0,0 +1,219 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "69f9f86e-e033-441c-99d0-3e5bd35214b2", + "metadata": {}, + "source": [ + "# Computing ice sheet related sea level change from a CISM simulation" + ] + }, + { + "cell_type": "markdown", + "id": "b2cc6d1d-7ae7-4c31-ac57-862997b422dd", + "metadata": {}, + "source": [ + "Global sea level varies as a function of primarily 3 component changes:\n", + "- Ocean thermal expension\n", + "- Glacier\n", + "- Ice sheets\n", + "\n", + "**Note 1:** Here we are talking about **global** and not local changes. Local impact, on different time scales, needs to include the effect of tides and winds among other parameters.\\\n", + "**Note 2:** In our case, we will look at the sea level changes from the Greenland ice sheet only, as that is the only actively evolving ice sheet in our simulation.\\\n", + "**Note 3:** Articles have been published (e.g. [Goelzer et al. (2020)](https://tc.copernicus.org/articles/14/833/2020/)) arguing that the computation of sea level change from stand alone ice sheet model output needs to correct for other factors (e.g. bedrock elevation changes, density correction due to the small difference between ice and fresh water density). In this exercise, we will only be accounting for the changes in total ice volume above floatation. The other correcting factors account for about 10% of the total sea level change magnitude (in general). " + ] + }, + { + "cell_type": "markdown", + "id": "2f6f9e38-9ac8-4a9d-b632-6ec56bf11cfa", + "metadata": {}, + "source": [ + "
\n", + "Step 1: Understanding ice sheet sea level contribution

\n", + "\n", + "\n", + "Only looking at the change of mass of an ice sheet is not enough to compute sea level contribution. In fact, any ice already in the ocean (including the bits still attached to the ice sheet) is already displacing sea water, hence contributing to sea level. What we need to compute is the change of mass that is not displacing sea water, or in other words, the change of mass above floatation.

\n", + " \n", + " \n", + "Step 2: Knowing the conversion
\n", + "\n", + "Because ice, fresh water, and ocean water have different densities, it takes about **360 Gt** of ice to raise the mean global sea level (MGSL) by **1 mm**. \n", + "A good description on how this number of 360 Gt was obtained can be found here:\\\n", + "[Calculating glacier ice volumes and sea level equivalents](https://www.antarcticglaciers.org/wp-content/plugins/antarcticglaciers-pdf/download.php?p=7657#:~:text=In%20the%20same%20way%2C%201,sea%20levels%20by%201%20mm.)\n", + " \n", + "
\n", + "Step 3: Compute the contribution of the GrIS to sea level change from this experiment.

\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "bae11c14-9fe4-4f5a-95b7-ab47b05edf8f", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + " \n", + "**(1) Compute the change in mass above flotation**\n", + "\n", + "Luckily, this scalar is part of the CISM history output variables and is called **imass_above_flotation**\n", + " \n", + "**(2) Create a time series for mass above flotation**\n", + " \n", + "You can follow similar steps as done previously for ice mass.\n", + "\n", + "**(3) Load the time series data and use the conversion number above to finalize your computation**\n", + "\n", + "**(4) Plot your results**\n", + " \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "5005a00b-2a07-4cef-86b3-4e264539b6e7", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "\n", + "Create a time series for imass_above_flotation scalars in a single file:\n", + "\n", + "```\n", + "ncrcat -v imass_above_flotation T_GrIS_SSP585_2015_2100.cism.h.*.nc mass_above_flotation.nc \n", + "```\n", + "\n", + "Copy and execute the text bellow in a new jupyter window\n", + "\n", + "```\n", + "# Defining the conversion constant\n", + "mm_equiv = 360.e12 # converting Gt to kg \n", + "\n", + "# Reading in the mass above flotation data\n", + "User = 'username'\n", + "path_to_file = '/glade/derecho/scratch/' + User + '/archive/T_GrIS_SSP585_2015_2100/glc/hist/'\n", + "file_mass_above_flotation = path_to_file + \"mass_above_flotation.nc\"\n", + "ncfile = Dataset(file_mass_above_flotation,'r')\n", + "mass_af = ncfile.variables[\"imass_above_flotation\"][:]\n", + "time_maf = ncfile.variables[\"time\"][:]\n", + "ncfile.close()\n", + "\n", + "\n", + "# Computing the overal sea level contribution from the GrIS during this experiment\n", + "slc = -(mass_af[:] - mass_af[0])/mm_equiv\n", + "print('The GrIS contribution of global mean sea level is ',slc[-1],'mm')\n", + "\n", + "\n", + "# Plotting the time series of see level change\n", + "sizefontx = 13\n", + "sizefonty = 13\n", + "sizefonttitle = 13\n", + "color = 'black'\n", + "line = '-'\n", + "\n", + "\n", + "timemin = 2015\n", + "timemax = 2101\n", + "\n", + "plt.figure(figsize=(7,5))\n", + "\n", + "plt.plot(time_maf, slc, line, ms=3, mfc=color, color=color)\n", + "plt.xlim([timemin, timemax])\n", + "plt.xlabel('Time (yr)', multialignment='center',fontsize=sizefontx)\n", + "plt.ylabel('Sea level change (mm)', multialignment='center',fontsize=sizefonty)\n", + "plt.title('GrIS contribution to sea level change',fontsize=sizefonttitle)\n", + "\n", + "\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "7e76b55a-c994-4475-ad9b-09ae72e9663d", + "metadata": {}, + "source": [ + "
\n", + "Food for thought

\n", + " \n", + "\n", + "(1) Based on the sea level change figure, the Greenland ice sheet has been accumulating more ice than it has lost leading to a sea level sink. What do you think about these results?\n", + "\n", + "(2) Do you have any suspicions about the forcing used in this experiment? If so, what are they?\n", + " \n", + "(3) What else could you be suspicious about?\n", + "\n", + "(4) What would you do to validate these results?\n", + "\n", + "\n", + "Note:
these questions are quite challenging. Contact Gunter Leguy (gunterl@ucar.edu) for further discussion.\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1f57aa63-503b-418d-a955-04fbd8c1bedc", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for some answers
\n", + " \n", + "\n", + "Question 1\n", + "The current observations show a positive Greenland ice sheet (GrIS) contribution to sea level change of about 1 mm per year over the past decade. For this reason, it is surprising to see it contribute negatively in this set of experiments especially under a strong warming scenario and these results are highly suspicious. \n", + "\n", + "Question 2\n", + "Looking at the SMB forcing, the values are negative along the coasts and positive in the interior of the ice sheet (especially in the south). Looking at the CISM thickness difference plot between the end and beginning of the simulation, the ice thickness evolution correlates closely with the changes in SMB. It is difficult (without further analyzes) to draw any conclusions about the forcing. One can always suspect whether we set the experiment properly. Also, this experiment has not yet been analyzed and one can suspect that the 2 deg version of the CESM model could lead to unexpected climate simulations. \n", + " \n", + "Question 3\n", + "In this exercise, we have not talked about how the GrIS was initialized and then used in CESM. Initialization is one of the greatest uncertainties in ice sheet modeling. Here, the model was spun-up using the SMB and air temperature of the RACMO2.3 regional climate model. This way we could invert for the basal physics using observed ice thickness and bed topography. However, there are some biases between RACMO results and the CESM simulated SMB and air temperature which will impact the ice sheet evolution. Ideally, a simulation would correct for these biases which is not the case here. \n", + " \n", + "Question 4\n", + "At least a couple of steps should be considered to validate these results:\n", + "1. Look at the biases between the observed fields used to initialize CISM and compare them to those in CESM at the beginning of the simulation.\n", + "2. Compare the forcing of the FV2 (2 deg model) output to the FV1 (1 deg model) output and look for potential biases due to the CESM model resolution. \n", + "\n", + "
\n", + "
\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CMIP6 2019.10", + "language": "python", + "name": "cmip6-201910" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/clm_ctsm/clm_ctsm.ipynb b/_sources/notebooks/challenge/clm_ctsm/clm_ctsm.ipynb new file mode 100644 index 000000000..fd254f236 --- /dev/null +++ b/_sources/notebooks/challenge/clm_ctsm/clm_ctsm.ipynb @@ -0,0 +1,196 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Land\n", + "\n", + "The land component of CESM is the Community Land Model (CLM), also refered to as the Community Terrestrial Systems Model (CTSM).\n", + "\n", + "It can be useful for people interested in land science to run simulations with only an active land components and atmospheric forcing. In this exercise, you will learn how to run one of these land-only simulations.\n", + "\n", + "This exercise was created by Peter Lawrence, Erik Kluzek and Alice DuVivier." + ] + }, + { + "cell_type": "markdown", + "id": "ea051c12-642e-4194-8291-2c1924d2e1e8", + "metadata": {}, + "source": [ + "## Learning Goals" + ] + }, + { + "cell_type": "markdown", + "id": "346cbd7b-3b8e-41f0-b120-b369ab20f6cc", + "metadata": {}, + "source": [ + "- Student will learn what a I compset is, the types of forcing available to run one, and how to run one.\n", + "- Student will learn how to run a case with satellite phenology and one with prognostic crops and compare the two experiments.\n", + "- Learn what inputs CLM needs and what they look like.\n" + ] + }, + { + "cell_type": "markdown", + "id": "47c3af32-d018-441e-bcb0-c74e86ef4272", + "metadata": {}, + "source": [ + "## Exercise Details" + ] + }, + { + "cell_type": "markdown", + "id": "df216c41-3ec4-43e0-b7bd-be2b1e4294bd", + "metadata": {}, + "source": [ + "- This exercise uses the same code base as the rest of the tutorial. \n", + "- You will be using the I2000Clm50Sp and IHistClm50BgcCrop compsets at the f09_g17_gl4 resolution.\n", + "- You will run a control simulation and two experimental simulations. \n", + "- You will modify netcdf input files. \n", + "- You will use simple, command line netcdf tools to evaluate how the experiments differ from the control simulation." + ] + }, + { + "cell_type": "markdown", + "id": "fd2ff959-6ec0-4534-8713-f5dfdb13b955", + "metadata": {}, + "source": [ + "## Useful CLM references" + ] + }, + { + "cell_type": "markdown", + "id": "baa2afd1-4289-4baf-8bdf-83de7592d76b", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM CLM/CTSM User's Guide](https://escomp.github.io/ctsm-docs/versions/master/html/users_guide/index.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "523878ee-2bfa-4363-a8ec-5ff151b15d57", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "\n", + "[CESM CLM/CTSM Discussion Forum](https://bb.cgd.ucar.edu/cesm/forums/ctsm-clm-mosart-rtm.134/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cb8a0e10-a920-41dd-8bc4-5c03395d231e", + "metadata": {}, + "source": [ + "## What is an I case?" + ] + }, + { + "cell_type": "markdown", + "id": "69988cae-fd26-4fda-8fee-6ab52e79f42d", + "metadata": {}, + "source": [ + "The I compset has active clm with a data atmosphere. The sea ice, ocean, atmosphere, and wave models are not active. There are two types of options for I compsets:\n", + "- SP: Satellite Phenology\n", + "- BGC: Biogeochemistry \n", + "\n", + "We will use the Satellite Phenology option for our control case." + ] + }, + { + "cell_type": "markdown", + "id": "68ca54e2-d8ad-41bc-be8f-31a85eec6e65", + "metadata": {}, + "source": [ + "![icase](../../../images/challenge/i2000.png)\n", + "\n", + "*

Figure: I2000 compset definition.

*" + ] + }, + { + "cell_type": "markdown", + "id": "c93817fd-8031-4917-bf45-eb0f442578f9", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[I Compset definition](https://www2.cesm.ucar.edu/models/cesm2/config/compsets.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "da3d9215-30c1-4152-abc0-ccb1e709cde3", + "metadata": {}, + "source": [ + "## Post processing and viewing your output\n", + "\n", + "You will use [ncview](https://ncar.github.io/CESM-Tutorial/notebooks/tools/netcdf_tools.html#ncview) and [NCO operator](https://ncar.github.io/CESM-Tutorial/notebooks/tools/netcdf_tools.html#netcdf-operators-nco) tools to evaluate how the experiments differ from the control simulation.\n", + "\n", + "These tools will need to be loaded into your environment using the NCAR HPC [modules](https://ncar.github.io/CESM-Tutorial/notebooks/tools/unix/modules.html)." + ] + }, + { + "cell_type": "markdown", + "id": "828e538d-3558-4747-9b61-3b29da04e294", + "metadata": {}, + "source": [ + "1) You can create an annual average of the first year's data for each simulationg using the `ncra` (netCDF averager) command from the netCDF operators package \\([NCO](https://nco.sourceforge.net/)\\). \n", + "```\n", + "ncra $OUTPUT_DIR/*.clm.*nc $CASENAME.cln.h.0001.nc\n", + "```\n", + "\n", + "2) Create a file that contains differences between each of the experiments and the control simulation\n", + "```\n", + "ncdiff i.day5.b.clm2.XXX.nc /glade/derecho/scratch/$user/archive/i.day5.a/lnd/hist/i.day5.a.clm2.XXX.nc i_diff.nc\n", + "```\n", + "\n", + "3) Examine variables within each annual mean and the difference files using `ncview`\n", + "```\n", + "ncview i_diff.nc\n", + "```\n", + "\n", + "4) You can also look at other monthly-mean outputs or component log files." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0a882d4-0c0e-4d2e-b59f-df2a648fa93d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CMIP6 2019.10", + "language": "python", + "name": "cmip6-201910" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/clm_ctsm/clm_exercise_1.ipynb b/_sources/notebooks/challenge/clm_ctsm/clm_exercise_1.ipynb new file mode 100644 index 000000000..02560e734 --- /dev/null +++ b/_sources/notebooks/challenge/clm_ctsm/clm_exercise_1.ipynb @@ -0,0 +1,123 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 1: Control case" + ] + }, + { + "cell_type": "markdown", + "id": "6457c1d2-0530-435d-ae27-d0f1eeabe583", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Run a control case

\n", + " \n", + "Create a case called **i.day5.a** using the compset `I2000Clm50Sp` at `f09_g17_gl4` resolution. \n", + " \n", + "Set the run length to **5 days**. \n", + "\n", + "Build and run the model. Since this is a control case, we want to build it \"out of the box\" without any modifications. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a new case i.day5.a with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts\n", + "./create_newcase --case ~/cases/i.day5.a --compset I2000Clm50Sp --res f09_g17_gl4 --run-unsupported\n", + "```\n", + "
\n", + "\n", + "Case setup:\n", + "``` \n", + "cd ~/cases/i.day5.a \n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Change the clm namelist using user_nl_clm by adding the following lines:\n", + "``` \n", + "hist_nhtfrq = -24\n", + "hist_mfilt = 6\n", + "```\n", + "
\n", + " \n", + "Check the namelist by running:\n", + "``` \n", + "./preview_namelists\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue, account number, or wallclock time. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force,JOB_WALLCLOCK_TIME=0:15:00\n", + "```\n", + "
\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "i.day5.a. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/i.day5.a/lnd/hist\n", + "\n", + "ls \n", + "```\n", + "
\n", + "\n", + "(2) Look at the output using ncview\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17cf7e19-1211-45f2-97cd-fe2badc69dac", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CMIP6 2019.10", + "language": "python", + "name": "cmip6-201910" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/clm_ctsm/clm_exercise_2.ipynb b/_sources/notebooks/challenge/clm_ctsm/clm_exercise_2.ipynb new file mode 100644 index 000000000..5deca8949 --- /dev/null +++ b/_sources/notebooks/challenge/clm_ctsm/clm_exercise_2.ipynb @@ -0,0 +1,188 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 2: Use the BGC model" + ] + }, + { + "cell_type": "markdown", + "id": "0037b73f-f174-48e7-8e4f-0744d7d23fe0", + "metadata": {}, + "source": [ + "We can use a different I compset: IHistClm50BgcCrop. This experiment is a 20th century transient run using GSWP3v1 and the biogeochemistry model including crops." + ] + }, + { + "cell_type": "markdown", + "id": "bdd131c8-d1ec-4568-81dd-701f8bdbe6cb", + "metadata": {}, + "source": [ + "![icase](../../../images/challenge/ihist.png)\n", + "\n", + "*

Figure: IHIST compset definition.

*" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Run an experimental case with prognostic BGC

\n", + " \n", + "Create a case called **i.day5.b** using the compset `IHistClm50BgcCrop` at `f09_g17_gl4` resolution. \n", + " \n", + "Set the run length to **5 days**. \n", + "\n", + "Build and run the model.\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a new case i.day5.b :\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts\n", + "./create_newcase --case ~/cases/i.day5.b --compset IHistClm50BgcCrop --res f09_g17_gl4 --run-unsupported\n", + "```\n", + "
\n", + "\n", + "Case setup:\n", + "``` \n", + "cd ~/cases/i.day5.b\n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Note differences between this case and the control case:\n", + "``` \n", + "diff env_run.xml ../i.day5.a/env_run.xml\n", + "```\n", + "
\n", + "\n", + "Change the clm namelist using user_nl_clm by adding the following lines:\n", + "``` \n", + "hist_nhtfrq = -24\n", + "hist_mfilt = 6\n", + "```\n", + "
\n", + " \n", + "Check the namelist by running:\n", + "``` \n", + "./preview_namelists\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue, account number, or wallclock time. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force,JOB_WALLCLOCK_TIME=0:15:00\n", + "```\n", + "
\n", + "\n", + "Build case:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "
\n", + " \n", + "Compare the namelists from the two experiments:\n", + "```\n", + "diff CaseDocs/lnd_in ../i.day5.a/CaseDocs/lnd_in\n", + "```\n", + "
\n", + " \n", + "Submit case:\n", + "```\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "i.day5.b. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/i.day5.b/lnd/hist\n", + "\n", + "ls \n", + "```\n", + "
\n", + "\n", + " \n", + "(2) Compare to control run:\n", + "```\n", + "ncdiff -v TLAI i.day5.b.clm2.XXX.nc /glade/derecho/scratch/$USER/archive/i.day5.a/lnd/hist/i.day5.a.clm2.XXX.nc i_diff.nc\n", + "\n", + "ncview i_diff.nc\n", + "```\n", + "\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "d69c456a-fdc6-4625-bbcc-ed32ab6ae8e8", + "metadata": { + "tags": [] + }, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "b3f28ecf-02b8-4cc0-bdc4-c36c8fc9e7aa", + "metadata": {}, + "source": [ + "- What changes do you see from the control case with the prognostic BGC?\n", + "- ... OTHERS?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b5a8cee-0ca9-4076-a731-e6ec200b70d4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CMIP6 2019.10", + "language": "python", + "name": "cmip6-201910" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/clm_ctsm/clm_exercise_3.ipynb b/_sources/notebooks/challenge/clm_ctsm/clm_exercise_3.ipynb new file mode 100644 index 000000000..e4654ce82 --- /dev/null +++ b/_sources/notebooks/challenge/clm_ctsm/clm_exercise_3.ipynb @@ -0,0 +1,197 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 3: Modify input data" + ] + }, + { + "cell_type": "markdown", + "id": "0037b73f-f174-48e7-8e4f-0744d7d23fe0", + "metadata": {}, + "source": [ + "We can modify the input to CLM by changing one of the plant functional type properties. We will then compare these results with the control experiment.\n", + "\n", + "Note that you will need to change a netcdf file for this exercise. Because netcdf are in binary format you will need a type of script or interperter to read the file and write it out again. (e.g. ferret, IDL, NCL, NCO, Perl, Python, Matlab, Yorick). Below in the solution we will show how to do this using NCO.\n", + "\n", + "NOTE: For any tasks other than setting up, building, submitting cases you should probably do these tasks on the Data Visualization Cluster - casper, and not on the derecho login nodes." + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Run an experimental case

\n", + " \n", + "Create a case called **i.day5.a_pft** using the compset `I2000Clm50Sp` at `f09_g17_gl4` resolution. \n", + "\n", + "Look at variable “rholvis” in the forcing file using ncview or ncdump –v rholvis. This is the visible leaf reflectance for every pft. Modify the rholvis parameter to .\n", + "`/glade/campaign/cesm/cesmdata/cseg/inputdata/lnd/clm2/paramdata/clm5_params.c171117.nc`\n", + " \n", + "Set the run length to **5 days**. \n", + "\n", + "Build and run the model.\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a clone from the control experiment i.day5.a_pft :\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts\n", + "./create_clone --case ~/cases/i.day5.a_pft --clone ~/cases/i.day5.a\n", + "```\n", + "
\n", + "\n", + "Modify the rholvis parameter in the physiology file:\n", + "``` \n", + "cd /glade/derecho/scratch/$USER\n", + "cp /glade/campaign/cesm/cesmdata/cseg/inputdata/lnd/clm2/paramdata/clm5_params.c171117.nc .\n", + "chmod u+w clm5_params.c171117.nc\n", + "cp clm5_params.c171117.nc clm5_params.c171117.new.nc\n", + "ncap2 -A -v -s 'rholvis(4)=0.4' clm5_params.c171117.nc clm5_params.c171117.new.nc\n", + "```\n", + "
\n", + "\n", + "Check the new rholvis parameter to be sure the modification worked:\n", + "``` \n", + "ncdump -v rholvis clm5_params.c171117.new.nc\n", + "# and compare it to the original file\n", + "ncdiff clm5_params.c171117.nc clm5_params.c171117.new.nc ncdiff.nc\n", + "ncdump -v rholvis ncdiff.nc\n", + "```\n", + "
\n", + " \n", + "Case setup:\n", + "``` \n", + "cd ~/cases/i.day5.a_pft\n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Change the clm namelist using user_nl_clm to point at the modified file. Add the following line:\n", + "``` \n", + "paramfile = '/glade/derecho/scratch/$USER/clm5_params.c171117.new.nc' \n", + "```\n", + "
\n", + " \n", + "Check the namelist by running:\n", + "``` \n", + "./preview_namelists\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue, account number, or wallclock time. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force,JOB_WALLCLOCK_TIME=0:15:00\n", + "```\n", + "
\n", + "\n", + "Build case:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "
\n", + " \n", + "Compare the namelists from the two experiments:\n", + "```\n", + "diff CaseDocs/lnd_in ../i.day5.a/CaseDocs/lnd_in\n", + "```\n", + "
\n", + " \n", + "Submit case:\n", + "```\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "i.day5.a. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/i.day5.a_pft/lnd/hist\n", + "\n", + "ls \n", + "```\n", + "
\n", + "\n", + "(2) Compare to control run:\n", + "```\n", + "ncdiff i.day5.a_pft.clm2.XXX.nc /glade/derecho/scratch/$USER/archive/i.day5.a/lnd/hist/i.day5.a.clm2.XXX.nc i_diff.nc\n", + "\n", + "ncview i_diff.nc\n", + "```\n", + "\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b3ffd3cc-676e-4e7c-9ff4-cd65d4745397", + "metadata": { + "tags": [] + }, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "03ac3664-5360-45d7-a3ad-0797a839a1d3", + "metadata": {}, + "source": [ + "- How did rholvis change (increase/decrease)? Given this, what do you expect the model response to be?\n", + "- What changes do you see from the control case with the modified rholvis parameter?\n", + "- ... OTHERS? " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27f332b2-5799-43a8-9060-50315ebdf6dc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CMIP6 2019.10", + "language": "python", + "name": "cmip6-201910" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/mom/mom_exercise_5.ipynb b/_sources/notebooks/challenge/mom/mom_exercise_5.ipynb new file mode 100644 index 000000000..552ceccc4 --- /dev/null +++ b/_sources/notebooks/challenge/mom/mom_exercise_5.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 5: Control case using MOM6" + ] + }, + { + "cell_type": "markdown", + "id": "0bdbbd2b-8255-44f3-8c8c-da725d26f845", + "metadata": {}, + "source": [ + "
\n", + "We will use a different CESM tag (cesm2_3_beta17) for this exercise.
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "92d9d3d2-3476-47fb-9b46-f26f5f79fdb2", + "metadata": {}, + "source": [ + "## Download CESM (tag cesm2_3_beta17)\n", + "\n", + "If needed, revisit the [Download CESM](https://ncar.github.io/CESM-Tutorial/notebooks/basics/code/git_download_cesm.html) section before executing the following steps.\n", + "\n", + "### Git Clone\n", + "
\n", + "Change the current directory to the code workspace directory:
\n", + "\n", + "```\n", + "cd /glade/u/home/$USER/code\n", + "```\n", + "
\n", + " \n", + "Download the cesm code to your code workspace directory as `cesm2_3_beta17`:
\n", + "```\n", + "git clone https://github.com/ESCOMP/CESM.git cesm2_3_beta17\n", + "cd cesm2_3_beta17\n", + "git checkout cesm2_3_beta17\n", + "``` \n", + "
\n", + "\n", + "### Download the Component Models with checkout_externals\n", + "\n", + "MOM6 is still an optional component in this version of CESM. Therefore, we need to run the `checkout_externals` command with the `-o` (optional) argument to download the required and optional component models:\n", + "\n", + "
\n", + " \n", + "```\n", + "cd /glade/u/home/$USER/code/cesm2_3_beta17\n", + "./manage_externals/checkout_externals -o\n", + "```\n", + "
\n", + "\n", + "*Note: If you get a message about accepting a certificate permanently or temporarily, accept the certificate permanently. If you do not get this message, do not worry, you are still on track!\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d708d564-464b-49fb-96c5-a98b91e9b91b", + "metadata": {}, + "source": [ + "**Congratulations, you have now downloaded the cesm2_3_beta17 tag on your workspace!!**" + ] + }, + { + "cell_type": "markdown", + "id": "a03b1449-5e68-43db-a36b-6f3baab8e757", + "metadata": {}, + "source": [ + "## Exercise" + ] + }, + { + "cell_type": "markdown", + "id": "6457c1d2-0530-435d-ae27-d0f1eeabe583", + "metadata": {}, + "source": [ + "
\n", + "Run a JRA-forced MOM6 control case

\n", + " \n", + "Create a case called **gmom_jra.run_length** using the compset ``GMOM_JRA`` at ``TL319_t232`` resolution. \n", + " \n", + "Set the run length to **5 year**. \n", + "\n", + "Build and run the model. Since this is a control case, we want to build it \"out of the box\" without any modifications. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2e33a95-e93c-4aca-86d7-1a830cc0562c", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "**How do I check the composets with MOM6?**\n", + "\n", + "Go to [CESM2.2.0 Component Sets Definitions](https://docs.cesm.ucar.edu/models/cesm2/config/compsets.html) and look for \"MOM\" using the \"Search\" box.\n", + "\n", + "\n", + "**How do I compile?**\n", + "\n", + "You can compile with the command:\n", + " \n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "
\n", + "\n", + "**How do I check my solution?**\n", + "\n", + "When your run is completed, go to the archive directory. \n", + "\n", + "(1) Check that your archive directory contains files *mom6.h.z*, *mom6.h.sfc*, etc\n", + "\n", + "\n", + "(2) Compare the contents of the ``h.z`` and ``h.sfc`` files using ``ncdump``.\n", + "\n", + "```\n", + "ncdump -h gmom_jra.run_length.mom6.h.z.0005-12.nc\n", + "ncdump -h gmom_jra.run_length.mom6.h.sfc.0005-12.nc\n", + "```\n", + "\n", + "(3) Look at the sizes of the files. \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a new case gmom_jra.run_length with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/cesm2_3_beta17/cime/scripts/\n", + "./create_newcase --case /glade/u/home/$USER/cases/gmom_jra.run_length --compset GMOM_JRA --res TL319_t232 \n", + "```\n", + "
\n", + "\n", + "Case setup:\n", + "``` \n", + "cd ~/cases/gmom_jra.run_length \n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Change the run length:\n", + "``` \n", + "./xmlchange STOP_N=5,STOP_OPTION=nyears\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "
\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "gmom_jra.run_length. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/gmom_jra.run_length/ocn/hist\n", + "\n", + "ls \n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/paleo/exercise_1.ipynb b/_sources/notebooks/challenge/paleo/exercise_1.ipynb new file mode 100644 index 000000000..9696d2ae9 --- /dev/null +++ b/_sources/notebooks/challenge/paleo/exercise_1.ipynb @@ -0,0 +1,223 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 1: Preindustrial control case\n" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Run a preindustrial control simulation

\n", + " \n", + "Create, configure, build and run a fully coupled preindustrial case called ``b.e21.B1850.f19_g17.piControl.001`` following [CESM naming conventions](https://www.cesm.ucar.edu/models/cesm2/naming-conventions). \n", + "\n", + "Run for 1 year. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**What is the compset for fully coupled preindustrial?**\n", + "\n", + "- ``B1850`` \n", + "\n", + "**What is the resolution for B1850?**\n", + "\n", + "- Use resolution ``f19_g17`` for fast throughput \n", + "\n", + "**Which XML variable should you change to tell the model to run for one year?**\n", + "\n", + "- Use ``STOP_OPTION`` and ``STOP_N`` \n", + "\n", + "**How to check if each XML variable is modified correctly?**\n", + "\n", + "- Use ``xmlquery -p`` \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "**# Set environment variables** \n", + "\n", + "Set environment variables with the commands:\n", + " \n", + "**For tcsh users** \n", + " \n", + "```\n", + "set CASENAME=b.e21.B1850.f19_g17.piControl.001\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=B1850\n", + "set RESOLUTION=f19_g17\n", + "set PROJECT=UESM0013\n", + "```\n", + "\n", + "Note: You should use the project number given for this tutorial.\n", + "\n", + "**For bash users** \n", + " \n", + "```\n", + "export CASENAME=b.e21.B1850.f19_g17.piControl.001\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=B1850\n", + "export RESOLUTION=f19_g17\n", + "export PROJECT=UESM0013\n", + "```\n", + "\n", + "Note: You should use the project number given for this tutorial.\n", + "\n", + "**# Make a case directory**\n", + "\n", + "If needed create a directory `cases` into your home directory:\n", + " \n", + "```\n", + "mkdir /glade/u/home/$USER/cases/\n", + "```\n", + " \n", + "\n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --project $PROJECT\n", + "```\n", + "\n", + "**# Change the job queue**\n", + "\n", + "If needed, change ``job queue``.
\n", + "For instance, to run in the queue ``main``.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=main\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "\n", + "**# Set run length**\n", + "\n", + "```\n", + "./xmlchange STOP_N=1,STOP_OPTION=nyears\n", + "```\n", + "\n", + "**# Build and submit**\n", + "\n", + "```\n", + "qcmd -A $PROJECT -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "**# Check on your run**\n", + "\n", + "\n", + "After submitting the job, use ``qstat -u $USER`` to check the status of your job. \n", + "It may take ~16 minutes to finish the one-year simulation. \n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is one-year, there should be 12 monthly files (``h0``) for each model component. \n", + "\n", + "\n", + "Success! Now let's look back into the past... \n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "472131c7-88f9-4863-a2bc-d7364333542d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "815be0bc-515a-474b-a3dd-b7ba02831b9a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/paleo/exercise_2.ipynb b/_sources/notebooks/challenge/paleo/exercise_2.ipynb new file mode 100644 index 000000000..49a5caae4 --- /dev/null +++ b/_sources/notebooks/challenge/paleo/exercise_2.ipynb @@ -0,0 +1,330 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 2: mid-Holocene case \n", + "\n", + "The Holocene Epoch started ~11,700 before present (11.7 ka BP) and is the current period of geologic time. \n", + "\n", + "Although humans were already well established before the Holocene, this period of time is also referred to as the Anthropocene Epoch because its primary characteristic is the global changes caused by human activity.\n", + "\n", + "The Holocene is an interglacial period, marked by receding ice sheets and rising greenhouse gases that were accompanied by changes in the Earth's orbit around the Sun. \n", + "\n", + "Today, we will use CESM to investigate influence of Holocene orbital forcing on climate. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Run a mid-Holocene simulation with orbital forcing

\n", + " \n", + "Create, configure, build and run a fully coupled mid-Holocene (~6 ka BP) case called ``b.e21.B1850.f19_g17.midHolocene.001`` following [CESM naming conventions](https://www.cesm.ucar.edu/models/cesm2/naming-conventions). \n", + "\n", + "Run for 1 year. \n", + "\n", + "Compare and visualize differences between preindustrial and mid-Holocene runs using NCO and Ncview. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**What is the compset for fully coupled mid-Holocene run?**\n", + "\n", + "- Use ``B1850`` and modify preindustrial orbital configuration (no mid-Holocene compset available) \n", + "\n", + "**What is the resolution for B1850?**\n", + "\n", + "- Use resolution ``f19_g17`` for fast throughput \n", + "\n", + "**What was the orbital configuration 6 ka BP?**\n", + "\n", + "- According to Table 1 of [Otto-Bliesner et al., (2017)](https://doi.org/10.5194/gmd-10-3979-2017), Eccentricity = 0.018682, Obliquity (degrees) = 24.105, Perihelion = 0.87 (for simplicity, we don't consider the other forcings here, i.e., CO2) \n", + "\n", + "**How to modify orbital configuration in CESM world?**\n", + "\n", + "- Edit ``user_nl_cpl`` \n", + "- ``orb_mode = 'fixed_parameters'`` \n", + "- ``orb_eccen = 0.018682`` \n", + "- ``orb_obliq = 24.105`` \n", + "- ``orb_mvelp = 0.87`` \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "**# Set environment variables** \n", + "\n", + "Set environment variables with the commands:\n", + " \n", + "**For tcsh users** \n", + " \n", + "```\n", + "set CASENAME=b.e21.B1850.f19_g17.midHolocene.001\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=B1850\n", + "set RESOLUTION=f19_g17\n", + "set PROJECT=UESM0013\n", + "```\n", + "\n", + "You should use the project number given for this tutorial.\n", + "\n", + "**For bash users** \n", + " \n", + "```\n", + "export CASENAME=b.e21.B1850.f19_g17.midHolocene.001\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=B1850\n", + "export RESOLUTION=f19_g17\n", + "export PROJECT=UESM0013\n", + "```\n", + "\n", + "You should use the project number given for this tutorial.\n", + "\n", + "**# Make a case directory**\n", + "\n", + "If needed create a directory `cases` into your home directory:\n", + " \n", + "```\n", + "mkdir /glade/u/home/$USER/cases/\n", + "```\n", + " \n", + "\n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --project $PROJECT\n", + "```\n", + "\n", + "**# Change the job queue**\n", + "\n", + "If needed, change ``job queue``.
\n", + "For instance, to run in the queue ``main``.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=main\n", + "```\n", + "This step can be redone at anytime in the process. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "\n", + "**# Set run length**\n", + "\n", + "```\n", + "./xmlchange STOP_N=1,STOP_OPTION=nyears\n", + "```\n", + "\n", + "\n", + "**# Add the following to user_nl_cpl**\n", + "\n", + "```\n", + "orb_mode = 'fixed_parameters' \n", + " orb_eccen = 0.018682\n", + " orb_obliq = 24.105\n", + " orb_mvelp = 0.87\n", + "```\n", + "\n", + "\n", + "**# Build and submit**\n", + "\n", + "```\n", + "qcmd -A $PROJECT -- ./case.build\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "\n", + "**# Validate your simulation setup**\n", + "\n", + "\n", + "(1) If you want to check the log file, ``cpl.log.xxx``, in the Run Directory (when model is still running) or in your Storage Directory (when the simulation and archiving have finished). \n", + "\n", + "Note: The ``less`` command in Linux is a terminal pager program used to view (but not change) the contents of a text file one screen at a time. It is particularly useful for large files, as it does not need to read the entire file before starting, hence it loads large files faster than editors like vi or emacs. \n", + "\n", + "To skip to the bottom of the file, press `` + g`` \n", + "To stop viewing the contents of the file with ``less``, press ``q``. \n", + "```\n", + "less /glade/derecho/scratch/$USER/$CASENAME/run/cpl.log.* \n", + "less /glade/derecho/scratch/$USER/archive/$CASENAME/logs/cpl.log.*.gz \n", + "```\n", + "\n", + "\n", + "Alternatively, use the real-time monitoring mode with ``less`` that you can activate with the ``+F`` (forward) option. Now, new lines will be continuously displayed as they are added to the file during the run. \n", + "To exit forward mode and revert to the standard interactive mode of less, press `` + C``. \n", + "```\n", + "less +F /glade/derecho/scratch/$USER/$CASENAME/run/cpl.log.* \n", + "```\n", + "\n", + "\n", + "(2) Type ``/orb_params`` to search, you should see the following \n", + "```\n", + " (shr_orb_params) Calculate characteristics of the orbit:\n", + " (shr_orb_params) Calculate orbit for year: -4050\n", + " (shr_orb_params) ------ Computed Orbital Parameters ------\n", + " (shr_orb_params) Eccentricity = 1.868182E-02\n", + " (shr_orb_params) Obliquity (deg) = 2.410538E+01\n", + " (shr_orb_params) Obliquity (rad) = 4.207183E-01\n", + " (shr_orb_params) Long of perh(deg) = 8.696128E-01\n", + " (shr_orb_params) Long of perh(rad) = 3.156770E+00\n", + " (shr_orb_params) Long at v.e.(rad) = -5.751115E-04\n", + "```\n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is one-year, there should be 12 monthly files (``h0``) for each model component. \n", + "\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here to visualize results \n", + "
\n", + "\n", + "**# Use Ncview to visualize solar insolation**\n", + "\n", + "Earth's orbital configuration influences incoming solar insolation.\n", + "Take a look at the ``SOLIN`` CAM variable for August in the pre-industrial and mid-Holocene runs.\n", + "``` \n", + "module load ncview\n", + "cd /glade/derecho/scratch/$USER/archive\n", + "ncview b.e21.B1850.f19_g17.piControl.001/atm/hist/b.e21.B1850.f19_g17.piControl.001.cam.h0.0001-08.nc b.e21.B1850.f19_g17.midHolocene.001/atm/hist/b.e21.B1850.f19_g17.midHolocene.001.cam.h0.0001-08.nc\n", + "```\n", + "\n", + "Using the right arrow button in the Ncview window, you can toggle between pre-industrial and mid-Holocene August ``SOLIN`` and other variables. \n", + "\n", + "\n", + "A few side notes on comparing pre-industrial and mid-Holocene runs: \n", + "- Changes in Earth's orbit alter the length of months or seasons over time, this is referred to as the 'paleo calendar effect' \n", + "- This means that the modern fixed-length definition of months do not apply when the Earth traversed different portions of its orbit \n", + "- Tools exist to adjust monthly CESM output to account for the 'paleo calendar effect' \n", + "- See [PaleoCalAdjust tool](https://github.com/CESM-Development/paleoToolkit/tree/master/PaleoCalAdjust) from [Bartlein & Shafer et al. (2019)](https://doi.org/10.5194/gmd-12-3889-2019) for more information \n", + "- For simplicity, we assume in this exercise that the definition of months is the same for the pre-industrial and mid-Holocene \n", + "\n", + "Now, let's take a look at the differences between the two cases more clearly using NCO. \n", + "\n", + "``` \n", + "module load nco\n", + "cd /glade/derecho/scratch/$USER/archive\n", + "ncdiff b.e21.B1850.f19_g17.piControl.001/atm/hist/b.e21.B1850.f19_g17.midHolocene.001.cam.h0.0001-08.nc b.e21.B1850.f19_g17.piControl.001/atm/hist/b.e21.B1850.f19_g17.piControl.001.cam.h0.0001-08.nc diff_MH-PI_0001-08.nc \n", + "ncview diff_MH-PI_0001-08.nc \n", + "```\n", + "\n", + "Note: Running ncdiff this way will place ``diff_MH-PI_0001-08.nc`` in your archive directory. You may use ``mv`` to move ``diff_MH-PI_0001-08.nc`` to another directory. \n", + "\n", + "**# Questions for reflection:**\n", + "- Which orbital parameters are different at the middle Holocene (6 ka BP)? \n", + "- How does the orbital parameter impact the top-of-atmosphere shortwave radiation (solar insolation) during summertime in the Northern Hemisphere? \n", + "- Do the results look correct? You can compare your results with Figure 3b of [Otto-Bliesner et al., (2017)](https://doi.org/10.5194/gmd-10-3979-2017) \n", + "- What other aspects of climate are different between the mid-Holocene and pre-industrial runs?", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "472131c7-88f9-4863-a2bc-d7364333542d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "815be0bc-515a-474b-a3dd-b7ba02831b9a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/paleo/exercise_3.ipynb b/_sources/notebooks/challenge/paleo/exercise_3.ipynb new file mode 100644 index 000000000..11e3823e2 --- /dev/null +++ b/_sources/notebooks/challenge/paleo/exercise_3.ipynb @@ -0,0 +1,349 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 3: Water isotope tracers in CESM\n" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Run a preindustrial simulation with water isotope tracers

\n", + "\n", + "Download (`git clone`) isotope-enabled CESM1.3 (iCESM1.3; [code available here](https://github.com/NCAR/iCESM1.3_iHESP_hires)), as the version of CESM used in this tutorial does not include water isotope capabilities. \n", + "\n", + "Create, configure, build and run a fully coupled preindustrial case called ``b.e13.B1850.f19_g16.piControl.001`` following [CESM naming conventions](https://www.cesm.ucar.edu/models/cesm2/naming-conventions) including water isotope tracers. \n", + "\n", + "Run for 1 year. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "
\n", + "\n", + "**What is the resolution for B1850?**\n", + "\n", + "- Use resolution ``f19_g16`` for fast throughput \n", + "\n", + "**Which XML variable should you change to tell the model to run for one year?**\n", + "\n", + "- Use ``STOP_OPTION`` and ``STOP_N`` \n", + "\n", + "**How to check if each XML variable is modified correctly?**\n", + "\n", + "- Use ``xmlquery -p`` \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "**# Download iCESM1.3 code** \n", + "\n", + "```\n", + "cd /glade/u/home/$USER/code \n", + "git clone https://github.com/NCAR/iCESM1.3_iHESP_hires iCESM1.3_iHESP_hires \n", + "cd iCESM1.3_iHESP_hires \n", + "./manage_externals/checkout_externals \n", + "```\n", + "\n", + " \n", + "**# Set environment variables** \n", + "\n", + "Set environment variables with the commands:\n", + " \n", + "**For tcsh users** \n", + " \n", + "```\n", + "set CASENAME=b.e13.B1850C5.f19_g16.piControl.001\n", + "set CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "set COMPSET=B1850C5\n", + "set RESOLUTION=f19_g16\n", + "set PROJECT=UESM0013\n", + "```\n", + "\n", + "Note: You should use the project number given for this tutorial.\n", + "\n", + "**For bash users** \n", + " \n", + "```\n", + "export CASENAME=b.e13.B1850C5.f19_g16.piControl.001\n", + "export CASEDIR=/glade/u/home/$USER/cases/$CASENAME\n", + "export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run\n", + "export COMPSET=B1850C5\n", + "export RESOLUTION=f19_g16\n", + "export PROJECT=UESM0013\n", + "```\n", + "\n", + "Note: You should use the project number given for this tutorial.\n", + "\n", + "**# Make a case directory**\n", + "\n", + "If needed create a directory `cases` into your home directory:\n", + " \n", + "```\n", + "mkdir /glade/u/home/$USER/cases/\n", + "```\n", + " \n", + "\n", + "**# Create a new case**\n", + "\n", + "Create a new case with the command ``create_newcase``:\n", + "```\n", + "cd /glade/u/home/$USER/code/iCESM1.3_iHESP_hires/cime/scripts/\n", + "./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --project $PROJECT --run-unsupported \n", + "```\n", + "\n", + "**# Change the job queue**\n", + "\n", + "If needed, change ``job queue``.
\n", + "For instance, to run in the queue ``main``.\n", + "``` \n", + "cd $CASEDIR\n", + "./xmlchange JOB_QUEUE=main\n", + "```\n", + "This step can be redone at anytime in the process before running `case.submit`. \n", + "\n", + "**# Setup**\n", + "\n", + "Invoke ``case.setup`` with the command:\n", + "``` \n", + "cd $CASEDIR\n", + "./case.setup \n", + "``` \n", + "\n", + "You build the namelists with the command:\n", + "```\n", + "./preview_namelists\n", + "```\n", + "This step is optional as the script ``preview_namelists`` is automatically called by ``case.build`` and ``case.submit``. But it is nice to check that your changes made their way into:\n", + "```\n", + "$CASEDIR/CaseDocs/atm_in\n", + "```\n", + "\n", + "\n", + "**# Set run length**\n", + "\n", + "```\n", + "./xmlchange STOP_N=1,STOP_OPTION=nyears\n", + "```\n", + "\n", + "**# Build the run**\n", + "\n", + "```\n", + "qcmd -A $PROJECT -- ./case.build\n", + "```\n", + "\n", + "**# Which namelist variables enable water isotope tracers?**\n", + "\n", + "- Notice that the steps to set up this isotope-enabled preindustrial simulation are very similar to a preindustrial simulation without isotopes (e.g., Paleo Exercise 1) \n", + "- In iCESM1.3, it is assumed you will run with water isotope tracers so each compset include isotope settings by default \n", + "- Use ``./xmlquery`` to explore how ``FLDS_WISO``, ``CAM_CONFIG_OPTS``, and ``OCN_TRACER_MODULES`` differ between this iCESM1.3 case and that of Exercise 1 \n", + "- Also, take a look at namelist settings for each CESM component with variables that contain ``wiso`` in ``$CASEDIR/Buildconf`` \n", + "\n", + "\n", + "**# Submit the run**\n", + "\n", + "```\n", + "./case.submit\n", + "```\n", + "------------\n", + "\n", + "**# Check on your run**\n", + "\n", + "\n", + "After submitting the job, use ``qstat -u $USER`` to check the status of your job. \n", + "\n", + "**# Check your solution**\n", + "\n", + "When the run is completed, look at the history files into the archive directory. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ls \n", + "```\n", + "\n", + "As your run is one-year, there should be 12 monthly files (``h0``) for each model component. \n", + "\n", + "\n", + "Success! Let's plot the results. \n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "06cb01fc", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here to visualize results \n", + "
\n", + "\n", + "**--------------- Option 1 ---------------** \n", + "\n", + "**# Use NCO to calculate the oxygen isotopic composition of precipitation**\n", + "\n", + "The ratio of heavy ($^{18}\\text{O}$) to light ($^{16}\\text{O}$)) isotopes are most commonly expressed relative to a standard in delta (δ) notation: \n", + "\n", + "$$ \\delta^{18}\\text{O} = \\frac{R_{\\text{sample}} - R_{\\text{std}}}{R_{\\text{std}}} \\times 1000‰ $$\n", + "\n", + "where \n", + "- $R_{\\text{sample}}$ = ratio of $^{18}\\text{O}$ to $^{16}\\text{O}$ in sample \n", + "- $R_{\\text{std}}$ = ratio of $^{18}\\text{O}$ to $^{16}\\text{O}$ in a standard \n", + "\n", + "Thus, the $\\delta^{18}\\text{O}$ of a sample which is identical to the standard would be 0‰, positive values indicate a greater proportion of $^{18}\\text{O}$ than the standard, and negative values indicate a lower proportion of $^{18}\\text{O}$ . \n", + "\n", + "In isotope-enabled CESM, the relative abundances of $^{16}\\text{O}$ and $^{18}\\text{O}$ are already adjusted to their naturally occurring global abundances (99.757% and 0.205%, respectively), so we do not include $R_{\\text{std}}$ in the calculation of $\\delta^{18}\\text{O}$. Rather, isotope variables in CESM are expressed in delta (δ) notation as: \n", + "\n", + "\n", + "$$ \\delta^{18}O = (\\frac{\\text{PRECRC_H218Or} + \\text{PRECSC_H218Os} + \\text{PRECRL_H218OR} + \\text{PRECSL_H218OS}}{\\text{PRECRC_H216Or} + \\text{PRECSC_H216Os} + \\text{PRECRL_H216OR} + \\text{PRECSL_H216OS}} - 1) \\times 1000‰ $$\n", + "\n", + "\n", + "- Use ``ncdump /glade/derecho/scratch/$USER/$CASENAME/atm/hist/$CASENAME.cam.h0.0001-01.nc | less`` to check the definition of each isotope variable above \n", + "- For example, search for ``PRECRC_H218Or`` using ``/PRECRC_H218Or + ``) \n", + "\n", + "To calculate the δ18O of precipitation from the simulation using NCO, \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist\n", + "ncap2 -s 'd18Op=((PRECRC_H218Or+PRECSC_H218Os+PRECRL_H218OR+PRECSL_H218OS)/(PRECRC_H216Or+PRECSC_H216Os+PRECRL_H216OR+PRECSL_H216OS) - 1)*1000.' -v $CASENAME.cam.h0.0001-12.nc d18Op.$CASENAME.cam.h0.0001-12.nc \n", + "```\n", + "\n", + "**# Use Ncview to visualize precipitation $\\delta^{18}\\text{O}$**\n", + "\n", + "Earth's orbital configuration influences incoming solar insolation.\n", + "Take a look at the ``d18Op`` variable we calculated for 1 month in the pre-industrial run.\n", + "``` \n", + "module load ncview\n", + "ncview d18Op.$CASENAME.cam.h0.0001-12.nc \n", + "```\n", + "\n", + "**--------------- Option 2 ---------------** \n", + "\n", + "**# Use Python to calculate and plot the oxygen isotopic composition of precipitation**\n", + "\n", + "The following Python code will produce a plot of precipitation δ18O for 1 month. \n", + "\n", + "``` \n", + "import xarray as xr \n", + "import numpy as np \n", + "import matplotlib.pyplot as plt \n", + "import cartopy.crs as ccrs \n", + "from cartopy.util import add_cyclic_point \n", + "\n", + "def calculate_d18Op(ds): \n", + " # Compute precipitation δ18O with iCESM output \n", + " \n", + " # Parameters \n", + " # ds: xarray.Dataset contains necessary variables \n", + " \n", + " # Returns \n", + " # ds: xarray.Dataset with δ18O added \n", + " \n", + " # convective & large-scale rain and snow, respectively \n", + " p16O = ds.PRECRC_H216Or + ds.PRECSC_H216Os + ds.PRECRL_H216OR + ds.PRECSL_H216OS \n", + " p18O = ds.PRECRC_H218Or + ds.PRECSC_H218Os + ds.PRECRL_H218OR + ds.PRECSL_H218OS \n", + " \n", + " # avoid dividing by small number here \n", + " p18O = p18O.where(p16O > 1.E-18, 1.E-18) \n", + " p16O = p16O.where(p16O > 1.E-18, 1.E-18) \n", + " d18O = (p18O / p16O - 1.0) * 1000.0 \n", + " \n", + " ds['p16O'] = p16O \n", + " ds['p18O'] = p18O \n", + " ds['d18O'] = d18O \n", + " return ds \n", + "\n", + "# Read in monthly file \n", + "case = 'b.e13.B1850C5.f19_g16.piControl.001' \n", + "file = '/glade/derecho/scratch/macarew/archive/'+case+'/atm/hist/'+case+'.cam.h0.0001-12.nc' \n", + "ds = xr.open_mfdataset(file, parallel=True, \n", + " data_vars='minimal', \n", + " coords='minimal', \n", + " compat='override') \n", + "\n", + "# Call function to add preciptation d18O to dataset \n", + "ds = calculate_d18Op(ds) \n", + "\n", + "fig, ax = plt.subplots( \n", + " nrows=1, ncols=1, \n", + " figsize=(6, 2), \n", + " subplot_kw={'projection': ccrs.Robinson(central_longitude=210)}, \n", + " constrained_layout=True) \n", + "\n", + "d18O_new, lon_new = add_cyclic_point(ds.d18O[0,:,:], ds.lon) \n", + "\n", + "# Plot model results using contourf \n", + "p0 = ax.contourf(lon_new, ds.lat, d18O_new, \n", + " levels=np.linspace(-30, 0, 16), extend='both', \n", + " transform=ccrs.PlateCarree()) \n", + "\n", + "plt.colorbar(p0, ax=ax) \n", + "ax.set_title('Dec δ18Op of PI') \n", + "ax.coastlines(linewidth=0.5) \n", + "```\n", + "\n", + "\n", + "**--------------- Questions for reflection ---------------** \n", + "- Do you notice any spatial patterns in precipitation $\\delta^{18}\\text{O}$? \n", + "\n", + "
\n", + "
\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/paleo/paleo.ipynb b/_sources/notebooks/challenge/paleo/paleo.ipynb new file mode 100644 index 000000000..f0c87bef9 --- /dev/null +++ b/_sources/notebooks/challenge/paleo/paleo.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Paleo \n", + "Paleoclimatology is the study of ancient climate variability and change, before the availability of instrumental records. \n", + "\n", + "Paleoclimatology relies on a combination of physical, biological, and chemical proxies of past environmental and climate change, such as glacial ice, tree rings, sediments, corals, and cave mineral deposits. \n", + "\n", + "CESM is widely used for paleoclimate studies. \n", + "\n", + "CESM simulations of past climates are a tool to better understand and interpret proxy reconstructions and to evaluate CESM skill in simulating out-of-sample climate states. \n", + "\n", + "Many proxy reconstructions are made using measurements of isotopic ratios in natural archives. \n", + "\n", + "A version of CESM with the capability to simulate hydrogen and oxygen isotope ratios in the water cycle (isotope-enabled CESM) is commonly used in paleoclimate studies to provide more direct signals of comparison with proxies. \n" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Learning Goals" + ] + }, + { + "cell_type": "markdown", + "id": "346cbd7b-3b8e-41f0-b120-b369ab20f6cc", + "metadata": {}, + "source": [ + "- Student will learn how to modify Earth's orbital configuration in CESM for a simple paleoclimate experiment. \n", + "- Student will learn how to validate that the orbital modification is implemented properly. \n", + "- Student will learn how to quickly compare differences in paleo and preindustrial CESM runs using NCO and Ncview. \n", + "- Student will learn how to run a preindustrial isotope-enabled CESM experiment and plot precipitation δ18O. \n" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Exercise 1-2 Details" + ] + }, + { + "cell_type": "markdown", + "id": "346cbd7b-3b8e-41f0-b120-b369ab20f6cc", + "metadata": {}, + "source": [ + "- This exercise uses the same code base as the rest of the tutorial. \n", + "- You will be using the B1850 compset at the f19_g17 resolution. \n", + "- You will run a preindustrial control simulation and a simple mid-Holocene simulation. \n" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Exercise 3 Details" + ] + }, + { + "cell_type": "markdown", + "id": "346cbd7b-3b8e-41f0-b120-b369ab20f6cc", + "metadata": {}, + "source": [ + "- This exercise uses a different code base from the rest of the tutorial (isotope-enabled CESM1.3). \n", + "- You will be using the B1850C5 compset at the f19_g16 resolution. \n", + "- You will run a preindustrial simulation with water isotope tracers. \n", + "\n", + "![Water isotope partitioning](../../../images/challenge/Precip_isotope_Cartoon.jpg)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e961b1bd-a1c8-4e54-bafc-46dcf78454f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/pop/pop.ipynb b/_sources/notebooks/challenge/pop/pop.ipynb new file mode 100644 index 000000000..3f1b58099 --- /dev/null +++ b/_sources/notebooks/challenge/pop/pop.ipynb @@ -0,0 +1,249 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Ocean \n", + "\n", + "The default ocean component of CESM is the Parallel Ocean Program (POP). This will change in CESM3, where the default ocean component will be the Modular Ocean Model version 6 (MOM6). You will have the option to run a case using MOM6 in the last challenge exercise.\n", + "\n", + "It can be helpful for people interested in ocean science to run simulations with only active sea ice and ocean components and atmospheric forcing. This exercise will teach you how to run one of these ice-ocean simulations.\n", + "\n", + "This exercise was created by Gustavo Marques." + ] + }, + { + "cell_type": "markdown", + "id": "45a57a9d-99e1-48c2-a365-b09f3aa40ec0", + "metadata": {}, + "source": [ + "## Learning Goals" + ] + }, + { + "cell_type": "markdown", + "id": "a39c7159-f7ee-4515-920f-68a8d345e392", + "metadata": {}, + "source": [ + "- Student will learn what a G compset is, the types of forcing available to run one, and how to run one.\n", + "- Student will learn how to make a namelist modification that turns off the overflow parameterization and compare results with a control experiment.\n", + "- Student will learn how to make a source code modification that changes zonal wind stress and compare results with a control experiment.\n", + "- Student will learn what a G1850ECO compset is and compare it to the G compset.\n", + "- Student will learn how to run a G compset using MOM6." + ] + }, + { + "cell_type": "markdown", + "id": "6bcc23d6-04c4-49b2-a809-15badc7b5ff9", + "metadata": {}, + "source": [ + "## Exercise Details" + ] + }, + { + "cell_type": "markdown", + "id": "59f7b9fd-7a3d-4b54-b874-61ddc264b102", + "metadata": {}, + "source": [ + "- All exercises except the last one (\"5 - Control case using MOM6\") use the same code base as the rest of the tutorial. \n", + "- You will be using the G compset at the T62_g37 resolution (or TL319_t232 when using MOM6).\n", + "- You will run a control simulation and three experimental simulations. Each simulation will be run for one year. \n", + "- You will then use 'ncview' \\([http://meteora.ucsd.edu/~pierce/ncview_home_page.html](http://meteora.ucsd.edu/~pierce/ncview_home_page.html)\\) to evaluate how the experiments differ from the control simulation." + ] + }, + { + "cell_type": "markdown", + "id": "f1ed4850-1e61-4b03-b036-69ecaa06f23f", + "metadata": {}, + "source": [ + "## Useful POP references" + ] + }, + { + "cell_type": "markdown", + "id": "27190b16-2c11-40a1-94fc-09fe0fbb1a57", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM POP User's Guide](https://www.cesm.ucar.edu/models/pop)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9f4fecc3-e03e-4d35-aecb-7daa16a9acb0", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "\n", + "[CESM POP Discussion Forum](https://bb.cgd.ucar.edu/cesm/forums/pop.136/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "16849059-810c-4af7-8930-8af58fe75c11", + "metadata": {}, + "source": [ + "## Useful MOM6 references" + ] + }, + { + "cell_type": "markdown", + "id": "bef0c8ec-0e3d-4fae-ab91-25f92d96df91", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[MOM6 Examples Wiki](https://github.com/NOAA-GFDL/MOM6-examples/wiki/Home)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "58915900-4d8b-415f-9a47-6bdbf9a8e701", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[MOM6’s documentation](https://mom6.readthedocs.io/en/main/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b580f76f-36cc-487e-acdd-0f1851661ef2", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM MOM6 Discussion Forum](https://bb.cgd.ucar.edu/cesm/forums/mom6.148/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c082b63d-a408-4b01-8fe8-c446d25a1c91", + "metadata": {}, + "source": [ + "## What is a G case?" + ] + }, + { + "cell_type": "markdown", + "id": "9ad378a2-89e1-4afe-ad88-e0c0759b9864", + "metadata": {}, + "source": [ + "The G compset has active and coupled ocean and sea-ice components. The G compset requires boundary forcing from the atmosphere. The G compset is forced with atmospheric data that does not change interactively as the ocean and sea-ice evolve in time. The land and land ice are not active during a G compset experiment and the runoff is specified. " + ] + }, + { + "cell_type": "markdown", + "id": "3ce9e152-c915-4e18-8199-040a26cf68c5", + "metadata": {}, + "source": [ + "![gcase](../../../images/challenge/gcase.png)\n", + "\n", + "*

Figure: G compset definition.

*" + ] + }, + { + "cell_type": "markdown", + "id": "346ef398-2703-4990-9387-d9006e75c5e6", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Component Set Definitions](https://www2.cesm.ucar.edu/models/cesm2/config/compsets.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cecd306b-bc35-48e2-8b47-fec1362616cc", + "metadata": {}, + "source": [ + "## G Compset forcing data" + ] + }, + { + "cell_type": "markdown", + "id": "b6e0b74a-4578-40b3-8af1-920e6bacffc4", + "metadata": {}, + "source": [ + "There are two types of temporal forcing for G compsets:\n", + "- Normal Year Forcing (NYF) is 12 months of atmospheric data (like a climatology) that repeats every year. NYF is the default forcing.\n", + "- Interannual varying forcing (GIAF) is forcing that varies by year over the time period (1948-2017). \n", + "\n", + "There are two datasets that can be used for G compsets:\n", + "- JRA55-do atmospheric data \\([Tsujino et al. 2018](https://doi.org/10.1016/j.ocemod.2018.07.002)\\)\n", + "- Coordinated Ocean-ice Reference Experiments (CORE) version 2 atmospheric data \\([Large and Yeager 2009](http://doi.org/10.1007/s00382-008-0441-3)\\).\n", + "\n", + "In these exercises we will use the CORE NYF." + ] + }, + { + "cell_type": "markdown", + "id": "e77543f2-6f2a-4d29-8919-827a2d7f96e6", + "metadata": {}, + "source": [ + "## Post processing and viewing your output" + ] + }, + { + "cell_type": "markdown", + "id": "221e2616-682c-44e5-835d-0fce3603555d", + "metadata": {}, + "source": [ + "1) You can create an annual average of the first year's data for each simulationg using the `ncra` (netCDF averager) command from the netCDF operators package \\([NCO](https://nco.sourceforge.net/)\\). \n", + "```\n", + "ncra $OUTPUT_DIR/*.pop.h.0001*nc $CASENAME.pop.h.0001.nc\n", + "```\n", + "\n", + "2) Create a file that contains differences between each of the experiments and the control simulation\n", + "```\n", + "ncdiff $CASENAME.pop.h.0001.nc $CONTROLCASE.pop.h.0001.nc $CASENAME_diff.nc\n", + "```\n", + "\n", + "3) Examine variables within each annual mean and the difference files using `ncview`\n", + "```\n", + "ncview $CASENAME_diff.nc\n", + "```\n", + "\n", + "4) You can also look at other monthly-mean outputs or component log files." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/pop/pop_exercise_1.ipynb b/_sources/notebooks/challenge/pop/pop_exercise_1.ipynb new file mode 100644 index 000000000..5e41c6ba1 --- /dev/null +++ b/_sources/notebooks/challenge/pop/pop_exercise_1.ipynb @@ -0,0 +1,170 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 1: Control case" + ] + }, + { + "cell_type": "markdown", + "id": "0bdbbd2b-8255-44f3-8c8c-da725d26f845", + "metadata": {}, + "source": [ + "**NOTE:** Building the control case for the POP challenge exercises is idential to building the control case in the CICE challenge exercises. If you have already completed the CICE challenge exercises you can skip this step." + ] + }, + { + "cell_type": "markdown", + "id": "6457c1d2-0530-435d-ae27-d0f1eeabe583", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Run a control case

\n", + " \n", + "Create a case called **g_control** using the compset ``G`` at ``T62_g37`` resolution. \n", + " \n", + "Set the run length to **1 year**. \n", + "\n", + "Build and run the model. Since this is a control case, we want to build it \"out of the box\" without any modifications. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2e33a95-e93c-4aca-86d7-1a830cc0562c", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**How do I compile?**\n", + "\n", + "You can compile with the command:\n", + " \n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "\n", + "**How do I control the output?**\n", + "\n", + "Check the following links:\n", + "\n", + "* https://www2.cesm.ucar.edu/models/cesm1.2/pop2/doc/faq/#output_tavg_add1\n", + "* https://www2.cesm.ucar.edu/models/cesm1.2/pop2/doc/faq/#output_tavg_add2\n", + "\n", + "**How do I check my solution?**\n", + "\n", + "When your run is completed, go to the archive directory. \n", + "\n", + "(1) Check that your archive directory contains files *pop.h.*, *pop.h.nday1*, etc\n", + "\n", + "\n", + "(2) Compare the contents of the ``h`` and ``h.nday1`` files using ``ncdump``.\n", + "\n", + "```\n", + "ncdump -h gpop.pop.h.0001-01-01-00000.nc\n", + "ncdump -h gpop.pop.h.nday1.0001-01-01-00000.nc\n", + "```\n", + "\n", + "(3) Look at the sizes of the files. \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a new case g_control with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case /glade/u/home/$USER/cases/g_control --compset G --res T62_g37 \n", + "```\n", + "
\n", + "\n", + "Case setup:\n", + "``` \n", + "cd ~/cases/g_control \n", + "./case.setup\n", + "```\n", + "
\n", + "\n", + "Change the run length:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nyears\n", + "```\n", + "
\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "
\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "
\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "g_control. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/g_control/ocn/hist\n", + "\n", + "ls \n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dabace0e-c3f2-4c88-b77d-4b28828c0944", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/pop/pop_exercise_2.ipynb b/_sources/notebooks/challenge/pop/pop_exercise_2.ipynb new file mode 100644 index 000000000..be758ad81 --- /dev/null +++ b/_sources/notebooks/challenge/pop/pop_exercise_2.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 2: Turn off parameterization" + ] + }, + { + "cell_type": "markdown", + "id": "33cdee65-f03f-4c72-adfe-b5ce02416d12", + "metadata": {}, + "source": [ + "Oceanic overflows are dense currents originating in semienclosed basins or continental shelves. They contribute to the formation of abyssal waters and play a crucial role in large-scale ocean circulation. When these dense currents flow down the continental slope, they undergo intense mixing with the surrounding (ambient) ocean waters, causing significant changes in their density and transport (see figure below). However, these mixing processes occur on scales that are smaller than what ocean climate models can accurately capture, leading to poor simulations of deep waters and deep western boundary currents. To improve the representation of overflows some ocean climate models rely on overflow paramterizations, such as the one developed for the POP model (check [this](https://echorock.cgd.ucar.edu/staff/gokhan/OFP_Tech_Note.pdf) report for additional information). \n", + "\n", + "![overflows](../../../images/challenge/overflows.png)\n", + "\n", + "\n", + "*

Figure: Physical processes acting in overflows (from [Legg et al., 2009](https://doi-org.cuucar.idm.oclc.org/10.1175/2008BAMS2667.1))

*" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Turn off overflow parameterization

\n", + " \n", + "Create a case called **g_overflows** by cloning the control experiment case. \n", + " \n", + "Verify that the run length is set to **1 year**. \n", + "\n", + "In user_nl_pop make the following modifications:``overflows_on = .false.`` and ``overflows_interactive = .false.``\n", + "\n", + "Build and run the model for one year. \n", + "\n", + "Compare the simulations using ncview/ncdiff, etc.\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2e33a95-e93c-4aca-86d7-1a830cc0562c", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**How do I compile and run?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "\n", + "You can run with the command:\n", + "```\n", + "./case.submit\n", + "```\n", + " \n", + "**How do I check the lenght of the run?**\n", + "\n", + "Use ```xmlquery``` to search for the variables that control the run length\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Clone a new case g_overflows from your control experiment with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_clone --case /glade/u/home/$USER/cases/g_overflows --clone /glade/u/home/$USER/cases/g_control\n", + "```\n", + "\n", + "Case setup:\n", + "``` \n", + "cd /glade/u/home/$USER/cases/g_overflows\n", + "./case.setup\n", + "```\n", + "\n", + "Verify that the run length is 1 year:\n", + "``` \n", + "./xmlquery STOP_N\n", + "./xmlquery STOP_OPTION\n", + "```\n", + " \n", + "Edit the file user_nl_pop and add the lines:\n", + "```\n", + " overflows_on = .false.\n", + " overflows_interactive = .false.\n", + "```\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "g_overflows. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/g_overflows/ocn/hist\n", + "ls \n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "f19ab341-b76b-462b-9bc9-49d4793ed409", + "metadata": {}, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "31d67bb4-3e04-459e-a6ac-866ee9224776", + "metadata": {}, + "source": [ + "- What variables do you expect to change when you turn off the overflow parameterization?\n", + "- What variables show a difference between this experiment and the control difference? How different are they?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/pop/pop_exercise_3.ipynb b/_sources/notebooks/challenge/pop/pop_exercise_3.ipynb new file mode 100644 index 000000000..ae7c70372 --- /dev/null +++ b/_sources/notebooks/challenge/pop/pop_exercise_3.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 3: Modify wind stress" + ] + }, + { + "cell_type": "markdown", + "id": "33cdee65-f03f-4c72-adfe-b5ce02416d12", + "metadata": {}, + "source": [ + "Wind stress plays a critical role in driving ocean currents and is a key factor in shaping the overall patterns of large-scale ocean circulation and, consequentialy, the climate. Further details on how wind stress affects the ocean circulation are discussed in [this](https://doi-org.cuucar.idm.oclc.org/10.1006/rwos.2001.0110) manuscript." + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Increase zonal wind stress

\n", + " \n", + "Create a case called **g_windstress** by cloning the control experiment case. \n", + " \n", + "Verify that the run length is set to **1 year**. \n", + "\n", + "Modify the subroutine rotate_wind_stress in forcing_coupled.F90 to increase the first (x) component of the wind stress by 25%.\n", + "\n", + "Build and run the model for one year. \n", + "\n", + "Compare the simulations using ncview/ncdiff, etc.\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2e33a95-e93c-4aca-86d7-1a830cc0562c", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**How do I compile and run?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "\n", + "You can run with the command:\n", + "```\n", + "./case.submit\n", + "```\n", + " \n", + "**How do I check the lenght of the run?**\n", + "\n", + "Use ```xmlquery``` to search for the variables that control the run length\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Clone a new case g_windstress from your control experiment with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_clone --case /glade/u/home/$USER/cases/g_windstress --clone /glade/u/home/$USER/cases/g_control\n", + "```\n", + "\n", + "Case setup:\n", + "``` \n", + "cd /glade/u/home/$USER/cases/g_windstress\n", + "./case.setup\n", + "```\n", + "\n", + "Verify that the run length is 1 year:\n", + "``` \n", + "./xmlquery STOP_N\n", + "./xmlquery STOP_OPTION\n", + "```\n", + " \n", + "Copy the forcing_coupled.F90 file from the control case to the ocean SourceMods.\n", + "``` \n", + "cp /glade/u/home/$USER/code/my_cesm_code/components/pop/source/forcing_coupled.F90 /glade/u/home/$USER/cases/g_windstress/SourceMods/src.pop\n", + "``` \n", + " \n", + "Edit the file forcing_coupled.F90 in the rotate_wind_stress routine after ```SMFT(:,:,1,:)``` is defined:\n", + " \n", + "```\n", + " SMFT(:,:,1,:) = SMFT(:,:,1,:) * 1.25\n", + "```\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "g_windstress. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$user/archive/g_windstress/ocn/hist\n", + "ls \n", + "```\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "286e2e7f-ccea-4c5e-acc5-5f9867341102", + "metadata": {}, + "source": [ + "## Test your understanding" + ] + }, + { + "cell_type": "markdown", + "id": "63f2688d-9857-4a49-93bf-2b3117ec0d13", + "metadata": {}, + "source": [ + "- What are the impacts of increased zonal wind stress? \n", + "- Where do you thinkt he impacts would be largest in the ocean?\n", + "- How do you think the changes would compare if you increased meridional wind stress?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/challenge/pop/pop_exercise_4.ipynb b/_sources/notebooks/challenge/pop/pop_exercise_4.ipynb new file mode 100644 index 000000000..ffa3811df --- /dev/null +++ b/_sources/notebooks/challenge/pop/pop_exercise_4.ipynb @@ -0,0 +1,161 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# 4: Turn on the ecosystem" + ] + }, + { + "cell_type": "markdown", + "id": "72423b27-32ee-492a-a023-ffd418e2d6ea", + "metadata": {}, + "source": [ + "You can also explore setting up a similar case but using the ``G1850ECO`` component set. Note how this differs from the previous ``G`` component set we used in Exercise 1. " + ] + }, + { + "cell_type": "markdown", + "id": "8f13d092-c9d8-4e47-93b2-caf3cb8335d6", + "metadata": {}, + "source": [ + "![gcase](../../../images/challenge/gecocase.png)\n", + "\n", + "*

Figure: G1850ECO compset definition.

*" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "
\n", + "Exercise: Run a control case

\n", + " \n", + "Create a case called **g_eco1850** using the compset ``G1850ECO`` at ``T62_g37`` resolution. \n", + " \n", + "Set the run length to **1 year**. \n", + "\n", + "Build and run the model. Since this is a control case, we want to build it \"out of the box\" without any modifications. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2e33a95-e93c-4aca-86d7-1a830cc0562c", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**How do I compile and run?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "\n", + "You can run with the command:\n", + "```\n", + "./case.submit\n", + "```\n", + " \n", + "**How do I check the lenght of the run?**\n", + "\n", + "Use ```xmlquery``` to search for the variables that control the run length\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f639e182-f48a-431c-a594-9c34323417eb", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + " \n", + "Create a new case G1850ECO with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case /glade/u/home/$USER/cases/G1850ECO --compset G1850ECO --res T62_g37\n", + "```\n", + "\n", + "Case setup:\n", + "``` \n", + "cd /glade/u/home/$USER/cases/G1850ECO \n", + "./case.setup\n", + "```\n", + " \n", + "Change the run length:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nyears\n", + "```\n", + "\n", + "If needed, change job queue \n", + "and account number. \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "G1850ECO. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/G1850ECO/ocn/hist\n", + "ls \n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dce7f4af-243c-47fd-b4d6-c37832aa80fd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/additional/additional.ipynb b/_sources/notebooks/diagnostics/additional/additional.ipynb new file mode 100644 index 000000000..c47852dd0 --- /dev/null +++ b/_sources/notebooks/diagnostics/additional/additional.ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Additional Topics" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "This section provides other information about how to use CESM output including:\n", + "- The difference between timeseries and history files\n", + "- The Climate Variabilty and Diagnostics Package (CVDP)\n", + "- Links to different analysis tools and resources used by CESM developers and users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e961b1bd-a1c8-4e54-bafc-46dcf78454f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/additional/adf.ipynb b/_sources/notebooks/diagnostics/additional/adf.ipynb new file mode 100644 index 000000000..8056d9f6d --- /dev/null +++ b/_sources/notebooks/diagnostics/additional/adf.ipynb @@ -0,0 +1,77 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# ADF" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Learning Goals\n", + "\n", + "- Enter learning goals here." + ] + }, + { + "cell_type": "markdown", + "id": "e73ce5d6-d2b1-4f32-b64f-337a1b02e2d0", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "## Subsection 1\n", + "\n", + "Info here" + ] + }, + { + "cell_type": "markdown", + "id": "815e0869-0518-4cf9-9417-cd9b08965ca1", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "## Subsection 2\n", + "\n", + "Info here\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e961b1bd-a1c8-4e54-bafc-46dcf78454f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/additional/analysis_tools.ipynb b/_sources/notebooks/diagnostics/additional/analysis_tools.ipynb new file mode 100644 index 000000000..0e551fc31 --- /dev/null +++ b/_sources/notebooks/diagnostics/additional/analysis_tools.ipynb @@ -0,0 +1,335 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# CESM analysis tools" + ] + }, + { + "cell_type": "markdown", + "id": "55b5588e-6e74-4bd7-a278-877611c4e87b", + "metadata": {}, + "source": [ + "We have provided some information about tools the CESM users and developers use for analysis of model simulations below. This list is not comprehensive and is intended to provide you with information to start your searches." + ] + }, + { + "cell_type": "markdown", + "id": "6a4f8751-c312-49b5-a578-604b7f39099a", + "metadata": {}, + "source": [ + "## Analysis Software" + ] + }, + { + "cell_type": "markdown", + "id": "d31bdb0d-5afe-4b38-b304-34c3179ac6dc", + "metadata": {}, + "source": [ + "Many data analysis and visualization software packages are freely available for use on CISL-managed resources. These packages include some developed and supported by NCAR and CISL. Some of these resources are open source while others require licences.\n", + "\n", + "Some of these packages include:\n", + "- Numerous python packages\n", + "- Interactive Data Language (IDL) \n", + "- MATLAB\n", + "- NCAR Command Language (NCL)" + ] + }, + { + "cell_type": "markdown", + "id": "5bd4569e-601e-47d9-ad24-ae2da7087b7e", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Data Analysis Website](https://arc.ucar.edu/knowledge_base/70550011)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cc1d09f3-dc55-46b2-912e-deee2147e45d", + "metadata": {}, + "source": [ + "## Python" + ] + }, + { + "cell_type": "markdown", + "id": "0275672f-9536-4bb6-bfff-4a2eb9bc3630", + "metadata": {}, + "source": [ + "Python is an open source, general-purpose programming language. \n", + "\n", + "Python is known for:\n", + "- having a wide range of applications and packages available. There is a huge user base and rougly ~1 gazillion online tutorials. \n", + "- active development in packages related to the geosciences.\n", + "\n", + "Python is becoming the dominant language for CESM developers and users, so most of the active development of tools for the CESM project at large are done in this language. We provide more detailed information below about some of the tools available for python users on NCAR computing assets." + ] + }, + { + "cell_type": "markdown", + "id": "8ce79e09-e9e2-4bf0-ad12-4aede3b2d072", + "metadata": {}, + "source": [ + "### Jupyter Hub" + ] + }, + { + "cell_type": "markdown", + "id": "f82c8f41-42a1-40ce-86bc-5138a9940d08", + "metadata": {}, + "source": [ + "The JupyterHub deployment that CISL manages allows \"push-button\" access to NCAR's supercomputing resource cluster of nodes used for data analysis and visualization, machine learning, and deep learning.\n", + "\n", + "JupyterHub gives users the ability to create, save, and share Jupyter Notebooks through the JupyterLab interface and to run interactive, web-based analysis, visualization and compute jobs on derecho and casper.\n", + "\n", + "Information about getting started with JupyterHub on NCAR computing resources, environments, and documentation is avaiable at the website below." + ] + }, + { + "cell_type": "markdown", + "id": "4b1cc783-53e5-45db-8954-385863b1a778", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Jupyter Hub Website](https://arc.ucar.edu/knowledge_base/70549913)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "71c323bc-a8e3-406d-a08b-92030f436863", + "metadata": {}, + "source": [ + "### Earth System Data Science initiative (ESDS)" + ] + }, + { + "cell_type": "markdown", + "id": "2d21da94-244c-42c0-970f-8daec7bacf61", + "metadata": {}, + "source": [ + "ESDS is an NCAR initiative that seeks to foster a collaborative, open, inclusive community for Earth Science data analysis. ESDS promotes deeper collaboration centered on analytics, improving our capacity to deliver impactful, actionable, reproducible science and serve the university community by transforming how geoscientists synthesize and extract information from large, diverse data sets.\n", + "\n", + "More information, including FAQs and a blog with examples can be found at the website below. " + ] + }, + { + "cell_type": "markdown", + "id": "a6813683-9206-492d-b477-2aee1abe4f17", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[ESDS Website](https://ncar.github.io/esds/about/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f4055e68-100a-4ae7-8ee3-47cefcd43d73", + "metadata": {}, + "source": [ + "### Project Pythia" + ] + }, + { + "cell_type": "markdown", + "id": "f25bcd2d-a7d5-46fe-b5fb-05c14eb6a19b", + "metadata": {}, + "source": [ + "If you are new to Python and its application to the geosciences, then starting with Project Pythia is a good first step. Project Pythia is the education working group for Pangeo and is an educational resource for the entire geoscience community. Together these initiatives are helping geoscientists make sense of huge volumes of numerical scientific data using tools that facilitate open, reproducible science, and building an inclusive community of practice around these goals." + ] + }, + { + "cell_type": "markdown", + "id": "552bc788-8a39-4ce9-b7ab-8d8f283614e7", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Project Pythia Website](https://projectpythia.org/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "efe8a781-b9e6-4ad2-a590-75ceab387fb4", + "metadata": {}, + "source": [ + "### GeoCAT" + ] + }, + { + "cell_type": "markdown", + "id": "4583d068-c9c4-44ed-8ca3-67352c4fd414", + "metadata": {}, + "source": [ + "The Geoscience Community Analysis Toolkit (GeoCAT) is a software engineering effort at NCAR. GeoCAT aims to create scalable data analysis and visualization tools for Earth System Science data to serve the geosciences community in the scientific Python ecosystem. GeoCAT tools are built upon the cornerstone technologies in the Pangeo stack such as Xarray, Dask, and Jupyter Notebooks. In addition, some of the functionalities in the GeoCAT stack are inspired/reimplemented from NCL." + ] + }, + { + "cell_type": "markdown", + "id": "207a8b16-9f0b-447f-b027-1a47ba747d52", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[GeoCAT Website](https://geocat.ucar.edu/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "56d3130e-8f95-4a5e-a797-0b33d538141a", + "metadata": {}, + "source": [ + "### MetPy" + ] + }, + { + "cell_type": "markdown", + "id": "76b9dc6d-74d0-4444-96d4-e60db58f8257", + "metadata": {}, + "source": [ + "MetPy is a collection of tools in Python for reading, visualizing, and performing calculations with weather data. The website below has information about getting started as well as examples and a reference guide." + ] + }, + { + "cell_type": "markdown", + "id": "53f2c96c-f36a-4080-99b9-e7e2fb1d899d", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[MetPy Website](https://unidata.github.io/MetPy/latest/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "7787ed12-bce7-4e49-ac3f-2229de327823", + "metadata": {}, + "source": [ + "## NCAR Command Language (NCL)" + ] + }, + { + "cell_type": "markdown", + "id": "c83303a5-24e5-4758-aeed-0cf3672c665e", + "metadata": {}, + "source": [ + "NCL is an open source tool developed at NCAR that is free to download and use. It can be run at the command line in interactive mode or as a batch mode. While once a widely used language for CESM developers and users, NCL is now in a maintenence stage and is no longer in development. Much of the active development is now being done with python tools.\n", + "\n", + "NCL is known for:\n", + "- easy input/output use with netCDF, Grib, Grib2, shapefiles, ascii, and binary files. \n", + "- good graphics that are very flexible.\n", + "- functions tailored to the geosciences community.\n", + "- a central website with 1000+ examples. There are also mini language and processing manuals." + ] + }, + { + "cell_type": "markdown", + "id": "7b185d5f-dcdb-4275-99b4-67bf6e5dcc2b", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[NCL Website](https://www.ncl.ucar.edu/get_started.shtml)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "7e2bcaf7-f5d0-4d20-b2ed-840841a02972", + "metadata": {}, + "source": [ + "## Panopoly" + ] + }, + { + "cell_type": "markdown", + "id": "3f774a9f-c4c0-4411-97df-99afe765259f", + "metadata": {}, + "source": [ + "Panopoly is a graphic user interface (GUI) application that allows the user to quickly view data in a number of file formats. Panopoly is similar to ncview, but it's more powerful. Panopoly works with files in netCDF, HDF, or GRIB format (among others). It also allows the user to perform simple calculations, apply masks, and quickly create spatial or line plots.\n", + "\n", + "The Panopoly website provies more documentation, including How-To's and demonstration videos." + ] + }, + { + "cell_type": "markdown", + "id": "483efa17-9787-4bb4-8348-2d2ebadf1dbd", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Panopoly Website](http://www.giss.nasa.gov/tools/panoply/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "124c346f-9a8a-4589-b74a-e04194a3e473", + "metadata": {}, + "source": [ + "## Image Magick" + ] + }, + { + "cell_type": "markdown", + "id": "38488672-40e0-4383-b00c-e3128cdc5304", + "metadata": {}, + "source": [ + "ImageMagick is a free suite of software that that can be used to display, manipulate, or compare images. It works with a wide range of file types (ps, pdf, png, gif, jpg, etc.). It can also be used to create movies. You can also alter an image at the command line. There are many options available when converting images, and more information can be found at the website below." + ] + }, + { + "cell_type": "markdown", + "id": "23b653c8-95d6-4a28-a2cc-4d6656c3ceec", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Image Magick Website](https://imagemagick.org/index.php)\n", + "\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/additional/cvdp.ipynb b/_sources/notebooks/diagnostics/additional/cvdp.ipynb new file mode 100644 index 000000000..1bc11bca9 --- /dev/null +++ b/_sources/notebooks/diagnostics/additional/cvdp.ipynb @@ -0,0 +1,77 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# CVDP" + ] + }, + + { + "cell_type": "markdown", + "id": "080839b4-514f-4072-88a6-bd514424cf6e", + "metadata": {}, + "source": [ + "![CVDP Image](https://webext.cgd.ucar.edu/Multi-Case/CVDP_repository/cesm-controls_quadquad/nino34.spatialcomp.indmem.djf1.png)\n", + "*

Figure: ENSO spatial composite metric from CVDP output showing different generations of CSM/CCSM/CESM.

*" + ] + }, + + + { + "cell_type": "markdown", + "id": "8f46aef7-947e-498e-90b1-a4ed6b077f6d", + "metadata": {}, + "source": [ + "The Climate Variability Diagnostics Package (CVDP) developed by NSF-NCAR's Climate Analysis Section is an automated analysis tool and data repository \n", + "for assessing modes of climate variability and trends in models and observations. Time series, spatial patterns and power spectra are displayed \n", + "graphically via webpages and saved as NetCDF files for later use. The package can be applied to individual model simulations (style 1) or to \n", + "initial condition Large Ensembles (style 2). Both styles provide quantitative metrics comparing models and observations; style 2 also includes \n", + "ensemble mean (i.e., forced response) and ensemble spread (i.e., internal variability) diagnostics. Several detrending options are provided, \n", + "including linear, quadratic, 30-year high-pass filter and removal of the ensemble mean (in the case of Large Ensembles). All diagnostics and \n", + "metrics are fully documented with references to the peer-reviewed literature.\n", + "\n", + "Examples of CVDP output:\n", + "\n", + "[CMIP6 Historical+SSP585 Comparison](https://webext.cgd.ucar.edu/Multi-Case/CVDP_repository/cmip6.hist_ssp585_quadquad_1900-2100/)\n", + "\n", + "[CESM2-Large Ensemble Comparison](https://webext.cgd.ucar.edu/Multi-Case/CVDP_repository/cesm2-lens_quadquad_1850-2100/)\n", + "\n", + "See the [CVDP Documention page](https://www.cesm.ucar.edu/projects/cvdp/documentation) for instructions on how to run the CVDP.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "def586e4-6553-48b9-b05c-2308dad9181c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/additional/large_ensembles.ipynb b/_sources/notebooks/diagnostics/additional/large_ensembles.ipynb new file mode 100644 index 000000000..6b12beb9b --- /dev/null +++ b/_sources/notebooks/diagnostics/additional/large_ensembles.ipynb @@ -0,0 +1,77 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Large Ensembles" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Learning Goals\n", + "\n", + "- Enter learning goals here." + ] + }, + { + "cell_type": "markdown", + "id": "e73ce5d6-d2b1-4f32-b64f-337a1b02e2d0", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "## Subsection 1\n", + "\n", + "Info here" + ] + }, + { + "cell_type": "markdown", + "id": "815e0869-0518-4cf9-9417-cd9b08965ca1", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "## Subsection 2\n", + "\n", + "Info here\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e961b1bd-a1c8-4e54-bafc-46dcf78454f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/additional/postprocessing.ipynb b/_sources/notebooks/diagnostics/additional/postprocessing.ipynb new file mode 100644 index 000000000..9d3605bf2 --- /dev/null +++ b/_sources/notebooks/diagnostics/additional/postprocessing.ipynb @@ -0,0 +1,65 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Postprocessing data" + ] + }, + { + "cell_type": "markdown", + "id": "5bd5c142-f778-4570-8edc-cc760139f30e", + "metadata": {}, + "source": [ + "A wide range of tools exist for postprocessing and analyzing data with techniques and methods exist. One of the first things you have to decide is how to store your files.\n", + "\n", + "In the diagnostics notebooks we have have provided examples of how to use both history files and timeseries files, described below." + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## History vs. Timeseries files\n", + "\n", + "When you run the CESM model the default output is history files, or files for a single timestep that include all variables for a given component and time frequency. However, most CESM community experiment data will be provided as timeseries files, or files that are a single variable over many timesteps. It is important you understand how to use both types of files, and for you to know that for some tasks (e.g. debugging) you should be using history files instead of timeseries files. However, it is much more efficient to store timeseries files because the overall size is smaller once the files have been processed into timeseries format.\n", + "\n", + "The current recommendation is to use the new [CUPiD diagnostics system](https://github.com/NCAR/CUPiD) to convert CESM history files into time series. You can try it yourself on CESM tutorial simulation data by running through the [CUPiD Notebook](../cupid.ipynb) under the diagnostics section.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e961b1bd-a1c8-4e54-bafc-46dcf78454f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/additional/uxarray.ipynb b/_sources/notebooks/diagnostics/additional/uxarray.ipynb new file mode 100644 index 000000000..b02ecaf3e --- /dev/null +++ b/_sources/notebooks/diagnostics/additional/uxarray.ipynb @@ -0,0 +1,1024 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# UXarray\n", + "\n", + "UXarray is a Python package that was created to support scalable data analysis and visualization functionality on high-resolution unstructured grids. It is built around the UGRID conventions and provides Xarray-styled functionality for working directly with unstructured grids.\n", + "\n", + "UXarray is the product of a collaborative effort between Project Raijin, funded by an NSF EarthCube award between NSF NCAR and The Pennsylvania State University, and the SEATS project, funded by DOE." + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Learning Goals\n", + "\n", + "With this notebook, we aim to:\n", + "\n", + "1. Clarify why UXarray can be useful\n", + "2. Provide self-learning resources about UXarray\n", + "3. How to access UXarray?\n", + "4. Give you a sense of how simple I/O and visualization with UXarray can be" + ] + }, + { + "cell_type": "markdown", + "id": "e73ce5d6-d2b1-4f32-b64f-337a1b02e2d0", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "## 1. Why UXarray?\n", + "\n", + "UXarray can simplify your workflows with unstructured grids because it:\n", + "\n", + "- Enables significant data analysis and visualization functionality to be executed directly on unstructured grids\n", + "\n", + "- Adheres to the UGRID specifications for compatibility across a variety of mesh formats\n", + "\n", + "- Provides a single interface for supporting a variety of unstructured grid formats including UGRID, MPAS, SCRIP, and Exodus\n", + "\n", + "- Inherits from Xarray, providing simplified data using familiar (Xarray-like) data structures and operations\n", + "\n", + "- Brings standardization to unstructured mesh support for climate data analysis and visualization\n", + "\n", + "- Builds on optimized data structures and algorithms for handling large and complex unstructured datasets\n", + "\n", + "- Supports enhanced interoperability and community collaboration" + ] + }, + { + "cell_type": "markdown", + "id": "815e0869-0518-4cf9-9417-cd9b08965ca1", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "## 2. UXarray Resources\n", + "\n", + "The following are some UXarray resources that you can leverage to further learn about UXarray, get started with it, see demonstrations of its analysis and visualization capabilities, and learn how to contribute to it:\n", + "\n", + "### UXarray Documentation Website\n", + "\n", + "The [UXarray documentation website](https://uxarray.readthedocs.io/en/latest/index.html#) is the to-go place for you to access fundamental information about the tool such as:\n", + "\n", + "- [Getting started](https://uxarray.readthedocs.io/en/latest/quickstart.html)\n", + "- [User guide](https://uxarray.readthedocs.io/en/latest/userguide.html)\n", + "- [Gallery](https://uxarray.readthedocs.io/en/latest/gallery.html)\n", + "- [API reference](https://uxarray.readthedocs.io/en/latest/api.html)\n", + "- [Installation](https://uxarray.readthedocs.io/en/latest/getting-started/installation.html)\n", + "- [Contributor's guide](https://uxarray.readthedocs.io/en/latest/contributing.html)\n", + "\n", + "### UXArray's Project Pythia Cookbook\n", + "\n", + "This [cookbook](https://projectpythia.org/unstructured-grid-viz-cookbook/README.html) is a comprehensive showcase of workflows & techniques for **visualizing** Unstructured Grids using UXarray with its several notebooks.\n", + "\n", + "These notebooks can be executed online, without locally setting them up, with the help of the Binder interface provided." + ] + }, + { + "cell_type": "markdown", + "id": "17a9fff2-4b3f-4983-8c68-7e7dc6bec119", + "metadata": {}, + "source": [ + "## 3. How to access UXarray?\n", + "\n", + "In addition to installing UXarray locally by following the instructions in the above [Installation](https://uxarray.readthedocs.io/en/latest/getting-started/installation.html) guide, if you are a user of the NSF NCAR's HPC clusters, you can access UXarray via the **NPL-2024a** (or a newer version) conda environment." + ] + }, + { + "cell_type": "markdown", + "id": "2f77f4fd-4b2d-4502-b953-d1f896e4dc35", + "metadata": {}, + "source": [ + "## 4. Minimal UXarray visualization\n", + "\n", + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel is minimum `NPL-2024a`. This should be the default kernel, but if it is not, click on that button and select `NPL-2024a` or a newer version." + ] + }, + { + "cell_type": "markdown", + "id": "63a76f11-4694-4953-818e-61a974196f05", + "metadata": {}, + "source": [ + "### Data paths" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "216c2e3e-28b8-4ed2-8d64-4be300807ebe", + "metadata": {}, + "outputs": [], + "source": [ + "# Set your username here:\n", + "username = \"PUT_USER_NAME_HERE\"\n", + "\n", + "# Here we point to an imaginary location for a ne30x8 directory\n", + "monthly_output_path = f\"/glade/derecho/scratch/{username}/ne30x8_dir/\"\n", + "\n", + "grid_filename = \"ne30x8_np4_SCRIP.nc\"\n", + "data_filename = \"ne30x8_220105.nc\"" + ] + }, + { + "cell_type": "markdown", + "id": "d22db07b-b5b3-4ae7-88f3-6c0d12e154aa", + "metadata": {}, + "source": [ + "### UXarray Code" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f837dbd0-487c-4dee-a6fb-b2766c2bc1c8", + "metadata": {}, + "outputs": [], + "source": [ + "import uxarray as ux" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7b770106-c7ea-4183-8c0e-360613e6eb6f", + "metadata": {}, + "outputs": [], + "source": [ + "uxds_ne30x8 = ux.open_dataset(base_path + grid_filename, base_path + data_filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8605491b-20b2-4b61-b1aa-5163b1ab5542", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\n", + "Original Grid Type: Scrip\n", + "Grid Dimensions:\n", + " * n_node: 1184802\n", + " * n_edge: 2601516\n", + " * n_face: 710858\n", + " * n_max_face_nodes: 10\n", + " * two: 2\n", + " * n_nodes_per_face: (710858,)\n", + "Grid Coordinates (Spherical):\n", + " * node_lon: (1184802,)\n", + " * node_lat: (1184802,)\n", + " * face_lon: (710858,)\n", + " * face_lat: (710858,)\n", + "Grid Coordinates (Cartesian):\n", + "Grid Connectivity Variables:\n", + " * face_node_connectivity: (710858, 10)\n", + " * edge_node_connectivity: (2601516, 2)\n", + "Grid Descriptor Variables:" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Let's examine the grid:\n", + "uxds_ne30x8.uxgrid" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0c5a8ac5-78a5-4c1c-88ac-b89748e7667c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/glade/u/home/oero/conda-envs/uxarray-dask/lib/python3.12/site-packages/uxarray/grid/geometry.py:95: UserWarning: Converting to a GeoDataFrame with over 1,000,000 faces may take some time.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "application/javascript": [ + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + " var py_version = '3.4.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n", + " var reloading = false;\n", + " var Bokeh = root.Bokeh;\n", + "\n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) {\n", + " if (callback != null)\n", + " callback();\n", + " });\n", + " } finally {\n", + " delete root._bokeh_onload_callbacks;\n", + " }\n", + " console.debug(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + " if (js_modules == null) js_modules = [];\n", + " if (js_exports == null) js_exports = {};\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + "\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " if (!reloading) {\n", + " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " }\n", + "\n", + " function on_load() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", + " run_callbacks()\n", + " }\n", + " }\n", + " window._bokeh_on_load = on_load\n", + "\n", + " function on_error() {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " var skip = [];\n", + " if (window.requirejs) {\n", + " window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n", + " root._bokeh_is_loading = css_urls.length + 0;\n", + " } else {\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", + " }\n", + "\n", + " var existing_stylesheets = []\n", + " var links = document.getElementsByTagName('link')\n", + " for (var i = 0; i < links.length; i++) {\n", + " var link = links[i]\n", + " if (link.href != null) {\n", + "\texisting_stylesheets.push(link.href)\n", + " }\n", + " }\n", + " for (var i = 0; i < css_urls.length; i++) {\n", + " var url = css_urls[i];\n", + " if (existing_stylesheets.indexOf(url) !== -1) {\n", + "\ton_load()\n", + "\tcontinue;\n", + " }\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " } var existing_scripts = []\n", + " var scripts = document.getElementsByTagName('script')\n", + " for (var i = 0; i < scripts.length; i++) {\n", + " var script = scripts[i]\n", + " if (script.src != null) {\n", + "\texisting_scripts.push(script.src)\n", + " }\n", + " }\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " for (var i = 0; i < js_modules.length; i++) {\n", + " var url = js_modules[i];\n", + " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.src = url;\n", + " element.type = \"module\";\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " for (const name in js_exports) {\n", + " var url = js_exports[name];\n", + " if (skip.indexOf(url) >= 0 || root[name] != null) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.type = \"module\";\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " element.textContent = `\n", + " import ${name} from \"${url}\"\n", + " window.${name} = ${name}\n", + " window._bokeh_on_load()\n", + " `\n", + " document.head.appendChild(element);\n", + " }\n", + " if (!js_urls.length && !js_modules.length) {\n", + " on_load()\n", + " }\n", + " };\n", + "\n", + " function inject_raw_css(css) {\n", + " const element = document.createElement(\"style\");\n", + " element.appendChild(document.createTextNode(css));\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.2.min.js\", \"https://cdn.holoviz.org/panel/1.4.4/dist/panel.min.js\"];\n", + " var js_modules = [];\n", + " var js_exports = {};\n", + " var css_urls = [];\n", + " var inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {} // ensure no trailing comma for IE\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + "\ttry {\n", + " inline_js[i].call(root, root.Bokeh);\n", + "\t} catch(e) {\n", + "\t if (!reloading) {\n", + "\t throw e;\n", + "\t }\n", + "\t}\n", + " }\n", + " // Cache old bokeh versions\n", + " if (Bokeh != undefined && !reloading) {\n", + "\tvar NewBokeh = root.Bokeh;\n", + "\tif (Bokeh.versions === undefined) {\n", + "\t Bokeh.versions = new Map();\n", + "\t}\n", + "\tif (NewBokeh.version !== Bokeh.version) {\n", + "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", + "\t}\n", + "\troot.Bokeh = Bokeh;\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " }\n", + " root._bokeh_is_initializing = false\n", + " }\n", + "\n", + " function load_or_wait() {\n", + " // Implement a backoff loop that tries to ensure we do not load multiple\n", + " // versions of Bokeh and its dependencies at the same time.\n", + " // In recent versions we use the root._bokeh_is_initializing flag\n", + " // to determine whether there is an ongoing attempt to initialize\n", + " // bokeh, however for backward compatibility we also try to ensure\n", + " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", + " // before older versions are fully initialized.\n", + " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", + " root._bokeh_is_initializing = false;\n", + " root._bokeh_onload_callbacks = undefined;\n", + " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", + " load_or_wait();\n", + " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", + " setTimeout(load_or_wait, 100);\n", + " } else {\n", + " root._bokeh_is_initializing = true\n", + " root._bokeh_onload_callbacks = []\n", + " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", + " if (!reloading && !bokeh_loaded) {\n", + "\troot.Bokeh = undefined;\n", + " }\n", + " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", + "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + "\trun_inline_js();\n", + " });\n", + " }\n", + " }\n", + " // Give older versions of the autoload script a head-start to ensure\n", + " // they initialize before we start loading newer version.\n", + " setTimeout(load_or_wait, 100)\n", + "}(window));" + ], + "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.4.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n var reloading = false;\n var Bokeh = root.Bokeh;\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.2.min.js\", \"https://cdn.holoviz.org/panel/1.4.4/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n\ttry {\n inline_js[i].call(root, root.Bokeh);\n\t} catch(e) {\n\t if (!reloading) {\n\t throw e;\n\t }\n\t}\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "\n", + "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", + " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", + "}\n", + "\n", + "\n", + " function JupyterCommManager() {\n", + " }\n", + "\n", + " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", + " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " comm_manager.register_target(comm_id, function(comm) {\n", + " comm.on_msg(msg_handler);\n", + " });\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", + " comm.onMsg = msg_handler;\n", + " });\n", + " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", + " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", + " var messages = comm.messages[Symbol.asyncIterator]();\n", + " function processIteratorResult(result) {\n", + " var message = result.value;\n", + " console.log(message)\n", + " var content = {data: message.data, comm_id};\n", + " var buffers = []\n", + " for (var buffer of message.buffers || []) {\n", + " buffers.push(new DataView(buffer))\n", + " }\n", + " var metadata = message.metadata || {};\n", + " var msg = {content, buffers, metadata}\n", + " msg_handler(msg);\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " return messages.next().then(processIteratorResult);\n", + " })\n", + " }\n", + " }\n", + "\n", + " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", + " if (comm_id in window.PyViz.comms) {\n", + " return window.PyViz.comms[comm_id];\n", + " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", + " if (msg_handler) {\n", + " comm.on_msg(msg_handler);\n", + " }\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", + " comm.open();\n", + " if (msg_handler) {\n", + " comm.onMsg = msg_handler;\n", + " }\n", + " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", + " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", + " comm_promise.then((comm) => {\n", + " window.PyViz.comms[comm_id] = comm;\n", + " if (msg_handler) {\n", + " var messages = comm.messages[Symbol.asyncIterator]();\n", + " function processIteratorResult(result) {\n", + " var message = result.value;\n", + " var content = {data: message.data};\n", + " var metadata = message.metadata || {comm_id};\n", + " var msg = {content, metadata}\n", + " msg_handler(msg);\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " }) \n", + " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", + " return comm_promise.then((comm) => {\n", + " comm.send(data, metadata, buffers, disposeOnDone);\n", + " });\n", + " };\n", + " var comm = {\n", + " send: sendClosure\n", + " };\n", + " }\n", + " window.PyViz.comms[comm_id] = comm;\n", + " return comm;\n", + " }\n", + " window.PyViz.comm_manager = new JupyterCommManager();\n", + " \n", + "\n", + "\n", + "var JS_MIME_TYPE = 'application/javascript';\n", + "var HTML_MIME_TYPE = 'text/html';\n", + "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", + "var CLASS_NAME = 'output';\n", + "\n", + "/**\n", + " * Render data to the DOM node\n", + " */\n", + "function render(props, node) {\n", + " var div = document.createElement(\"div\");\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(div);\n", + " node.appendChild(script);\n", + "}\n", + "\n", + "/**\n", + " * Handle when a new output is added\n", + " */\n", + "function handle_add_output(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + " if (id !== undefined) {\n", + " var nchildren = toinsert.length;\n", + " var html_node = toinsert[nchildren-1].children[0];\n", + " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var scripts = [];\n", + " var nodelist = html_node.querySelectorAll(\"script\");\n", + " for (var i in nodelist) {\n", + " if (nodelist.hasOwnProperty(i)) {\n", + " scripts.push(nodelist[i])\n", + " }\n", + " }\n", + "\n", + " scripts.forEach( function (oldScript) {\n", + " var newScript = document.createElement(\"script\");\n", + " var attrs = [];\n", + " var nodemap = oldScript.attributes;\n", + " for (var j in nodemap) {\n", + " if (nodemap.hasOwnProperty(j)) {\n", + " attrs.push(nodemap[j])\n", + " }\n", + " }\n", + " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", + " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", + " oldScript.parentNode.replaceChild(newScript, oldScript);\n", + " });\n", + " if (JS_MIME_TYPE in output.data) {\n", + " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", + " }\n", + " output_area._hv_plot_id = id;\n", + " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", + " window.PyViz.plot_index[id] = Bokeh.index[id];\n", + " } else {\n", + " window.PyViz.plot_index[id] = null;\n", + " }\n", + " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + "function handle_clear_output(event, handle) {\n", + " var id = handle.cell.output_area._hv_plot_id;\n", + " var server_id = handle.cell.output_area._bokeh_server_id;\n", + " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", + " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", + " if (server_id !== null) {\n", + " comm.send({event_type: 'server_delete', 'id': server_id});\n", + " return;\n", + " } else if (comm !== null) {\n", + " comm.send({event_type: 'delete', 'id': id});\n", + " }\n", + " delete PyViz.plot_index[id];\n", + " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", + " var doc = window.Bokeh.index[id].model.document\n", + " doc.clear();\n", + " const i = window.Bokeh.documents.indexOf(doc);\n", + " if (i > -1) {\n", + " window.Bokeh.documents.splice(i, 1);\n", + " }\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle kernel restart event\n", + " */\n", + "function handle_kernel_cleanup(event, handle) {\n", + " delete PyViz.comms[\"hv-extension-comm\"];\n", + " window.PyViz.plot_index = {}\n", + "}\n", + "\n", + "/**\n", + " * Handle update_display_data messages\n", + " */\n", + "function handle_update_output(event, handle) {\n", + " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", + " handle_add_output(event, handle)\n", + "}\n", + "\n", + "function register_renderer(events, OutputArea) {\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[0]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " events.on('output_added.OutputArea', handle_add_output);\n", + " events.on('output_updated.OutputArea', handle_update_output);\n", + " events.on('clear_output.CodeCell', handle_clear_output);\n", + " events.on('delete.Cell', handle_clear_output);\n", + " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", + "\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " safe: true,\n", + " index: 0\n", + " });\n", + "}\n", + "\n", + "if (window.Jupyter !== undefined) {\n", + " try {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " } catch(err) {\n", + " }\n", + "}\n" + ], + "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ] + }, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "p1002" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "\n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": {}, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ], + "text/plain": [ + ":DynamicMap []\n", + " :Image [x,y] (x_y soilw)" + ] + }, + "execution_count": 5, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "p1004" + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "# Visualization\n", + "clim = (uxds_ne30x8['soilw'][0].values.min(), uxds_ne30x8['soilw'][0].values.max()) # colorbar limits\n", + "uxds_ne30x8['soilw'][0].plot.rasterize(method='polygon', dynamic=True, clim=clim)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:uxarray-dask]", + "language": "python", + "name": "conda-env-uxarray-dask-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/cam/advanced_cam.ipynb b/_sources/notebooks/diagnostics/cam/advanced_cam.ipynb new file mode 100644 index 000000000..9838c6ed7 --- /dev/null +++ b/_sources/notebooks/diagnostics/cam/advanced_cam.ipynb @@ -0,0 +1,261 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Advanced Plotting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023b`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023b`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed primarily by Cecile Hannay and Jesse Nusbaumer." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "## Exercise 1: CAM-SE output analysis\n", + "\n", + "Examples of simple analysis and plotting that can be done with CAM-SE output on the native cubed-sphere grid." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "import xarray as xr\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import cartopy.crs as ccrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def make_map(data, lon, lat,):\n", + " \"\"\"This function plots data on a Mollweide projection map.\n", + "\n", + " The data is transformed to the projection using Cartopy's `transform_points` method.\n", + "\n", + " The plot is made by triangulation of the points, producing output very similar to `pcolormesh`,\n", + " but with triangles instead of rectangles used to make the image.\n", + " \"\"\"\n", + " dataproj = ccrs.PlateCarree() # assumes data is lat/lon\n", + " plotproj = ccrs.Mollweide() # output projection \n", + " # set up figure / axes object, set to be global, add coastlines\n", + " fig, ax = plt.subplots(figsize=(6,3), subplot_kw={'projection':plotproj})\n", + " ax.set_global()\n", + " ax.coastlines(linewidth=0.2)\n", + " # this figures out the transformation between (lon,lat) and the specified projection\n", + " tcoords = plotproj.transform_points(dataproj, lon.values, lat.values) # working with the projection\n", + " xi=tcoords[:,0] != np.inf # there can be bad points set to infinity, but we'll ignore them\n", + " assert xi.shape[0] == tcoords.shape[0], f\"Something wrong with shapes should be the same: {xi.shape = }, {tcoords.shape = }\"\n", + " tc=tcoords[xi,:]\n", + " datai=data.values[xi] # convert to numpy array, then subset\n", + " # Use tripcolor --> triangluates the data to make the plot\n", + " # rasterized=True reduces the file size (necessary for high-resolution for reasonable file size)\n", + " # keep output as \"img\" to make specifying colorbar easy\n", + " img = ax.tripcolor(tc[:,0],tc[:,1], datai, shading='gouraud', rasterized=True)\n", + " cbar = fig.colorbar(img, ax=ax, shrink=0.4)\n", + " return fig, ax" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Input data\n", + "\n", + "In the following cell, specify the data source.\n", + "\n", + "`location_of_hfiles` is a path object that points to the directory where data files should be.\n", + "`search_pattern` specifies what pattern to look for inside that directory.\n", + "\n", + "**SIMPLIFICATION** If you want to just provide a path to a file, simply specify it by commenting (with `#`) the lines above \"# WE need lat and lon\", and replace with:\n", + "```\n", + "fil = \"/path/to/your/data/file.nc\"\n", + "ds = xr.open_dataset(fil)\n", + "```\n", + "\n", + "## Parameters\n", + "Specify the name of the variable to be analyzed with `variable_name`.\n", + "\n", + "To change the units of the variable, specify `scale_factor` and provide the new units string as `units`. Otherwise, just set `scale_factor` and `units`:\n", + "\n", + "```\n", + "scale_factor = 1\n", + "units = ds[\"variable_name\"].attrs[\"units\"]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "location_of_hfiles = Path(\"/glade/campaign/cesm/tutorial/tutorial_2023_archive/cam-se/\")\n", + "search_pattern = \"f.cam6_3_112.FMTHIST_v0c.ne30.non-ogw-ubcT-effgw0.7_taubgnd2.5.001.cam.h3.2003-01-01-00000.nc\"\n", + "\n", + "fils = sorted(location_of_hfiles.glob(search_pattern))\n", + "if len(fils) == 1:\n", + " ds = xr.open_dataset(fils[0])\n", + "else:\n", + " print(f\"Just so you konw, there are {len(fils)} files about to be loaded.\")\n", + " ds = xr.open_mfdataset(fils)\n", + "\n", + "# We need lat and lon:\n", + "lat = ds['lat']\n", + "lon = ds['lon']\n", + "\n", + "# Choose what variables to plot,\n", + "# in this example we are going to combine the\n", + "# convective and stratiform precipitation into\n", + "# a single, total precipitation variable\n", + "convective_precip_name = \"PRECC\"\n", + "stratiform_precip_name = \"PRECL\"\n", + "\n", + "# If needed, select scale factor and new units:\n", + "scale_factor = 86400. * 1000. # m/s -> mm/day\n", + "units = \"mm/day\"\n", + "\n", + "cp_data = scale_factor * ds[convective_precip_name]\n", + "st_data = scale_factor * ds[stratiform_precip_name]\n", + "cp_data.attrs['units'] = units\n", + "st_data.attrs['units'] = units\n", + "\n", + "# Sum the two precip variables to get total precip\n", + "data = cp_data + st_data\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# temporal averaging\n", + "# simplest case, just average over time:\n", + "data_avg = data.mean(dim='time')\n", + "data_avg" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#\n", + "# Global average\n", + "#\n", + "data_global_average = data_avg.weighted(ds['area']).mean()\n", + "print(f\"The area-weighted average of the time-mean data is: {data_global_average.item()}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#\n", + "# Regional average using a (logical) rectangle\n", + "#\n", + "west_lon = 110.0\n", + "east_lon = 200.0\n", + "south_lat = -30.0\n", + "north_lat = 30.0\n", + "\n", + "# To reduce to the region, we need to know which indices of ncol dimension are inside the boundary\n", + "\n", + "region_inds = np.argwhere(((lat > south_lat)&(lat < north_lat)&(lon>west_lon)&(lon \n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/advanced_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/_sources/notebooks/diagnostics/cam/basics_cam.ipynb b/_sources/notebooks/diagnostics/cam/basics_cam.ipynb new file mode 100644 index 000000000..a4242a612 --- /dev/null +++ b/_sources/notebooks/diagnostics/cam/basics_cam.ipynb @@ -0,0 +1,972 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "33070195-2d5f-4ee3-b6cb-a658209b1f4d", + "metadata": {}, + "source": [ + "# Basic Plotting\n" + ] + }, + { + "cell_type": "markdown", + "id": "8f2a265a-5258-47df-9da2-86afb69cf660", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023b`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023b`." + ] + }, + { + "cell_type": "markdown", + "id": "4ef5d835-37b7-4a4a-84c1-8053093f1500", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed primarily by Cecile Hannay and Jesse Nusbaumer." + ] + }, + { + "cell_type": "markdown", + "id": "b35face4-1542-4ab0-8f04-8220a00b0086", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "For the atmospheric data, we will look at common variables in the atmospheric diagnostics. This notebook covers 3 basic plotting examples:\n", + "\n", + "Exercise 1: Global lat/lon of surface temperature\n", + "\n", + "Exercise 2: Zonal mean of short wave cloud forcing\n", + "\n", + "Exercise 3: Temperature zonal mean with vertical levels\n", + "\n", + "Some of the plotting in these examples are based on the AMWG Diagnostics Framework (ADF) and some are natively from the `xarray` functionality. `xarray` will be used for the data I/O, analysis, and some plotting, `matplotlib` and `cartopy` will aid in plotting, and `numpy` for calculations" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "72e6f251-c6ff-4478-adab-783ac1795e34", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import cartopy.crs as ccrs\n", + "import cartopy.feature as cfeature\n", + "import cftime\n", + "import matplotlib as mpl\n", + "import matplotlib.path as mpath\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "from matplotlib.gridspec import GridSpec\n", + "from matplotlib.lines import Line2D\n", + "from mpl_toolkits.axes_grid1 import make_axes_locatable" + ] + }, + { + "cell_type": "markdown", + "id": "3d56ba02-c652-4a97-a466-d3633e53aeb1", + "metadata": {}, + "source": [ + "The first step is to grab an atmosphere (CAM) history file from your CESM model run" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "20d4eec8-5332-44a5-bd5c-910048c5d95f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/glade/derecho/scratch/PUT_USER_NAME_HERE/archive/b1850.run_length/atm/hist/b1850.run_length.cam.h0.0003-07.nc'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Set your username here:\n", + "username = \"PUT_USER_NAME_HERE\"\n", + "\n", + "# Here we point to the archive directory from your b1850.run_length simulation\n", + "monthly_output_path = f\"/glade/derecho/scratch/{username}/archive/b1850.run_length/atm/hist\"\n", + "\n", + "# If you were unable to successfully run the b1850.run_length simulation, then feel free to use\n", + "# this provided simulation data instead:\n", + "#monthly_output_path = \"/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.run_length/atm/hist\"\n", + "\n", + "# Name of history file to plot\n", + "file_name = \"b1850.run_length.cam.h0.0003-07.nc\"\n", + "\n", + "files = os.path.join(monthly_output_path, file_name)\n", + "files" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "fa978aa8-bf89-4971-a59b-ae2fafb9e0a5", + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/glade/derecho/scratch/PUT_USER_NAME_HERE/archive/b1850.run_length/atm/hist/b1850.run_length.cam.h0.0003-07.nc'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/file_manager.py:211\u001b[0m, in \u001b[0;36mCachingFileManager._acquire_with_cache_info\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 211\u001b[0m file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cache\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_key\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/lru_cache.py:56\u001b[0m, in \u001b[0;36mLRUCache.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock:\n\u001b[0;32m---> 56\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cache\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cache\u001b[38;5;241m.\u001b[39mmove_to_end(key)\n", + "\u001b[0;31mKeyError\u001b[0m: [, ('/glade/derecho/scratch/PUT_USER_NAME_HERE/archive/b1850.run_length/atm/hist/b1850.run_length.cam.h0.0003-07.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False)), 'da467520-dd8b-4048-a691-3445d0f0f93e']", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfiles\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m ds\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/api.py:566\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(filename_or_obj, engine, chunks, cache, decode_cf, mask_and_scale, decode_times, decode_timedelta, use_cftime, concat_characters, decode_coords, drop_variables, inline_array, chunked_array_type, from_array_kwargs, backend_kwargs, **kwargs)\u001b[0m\n\u001b[1;32m 554\u001b[0m decoders \u001b[38;5;241m=\u001b[39m _resolve_decoders_kwargs(\n\u001b[1;32m 555\u001b[0m decode_cf,\n\u001b[1;32m 556\u001b[0m open_backend_dataset_parameters\u001b[38;5;241m=\u001b[39mbackend\u001b[38;5;241m.\u001b[39mopen_dataset_parameters,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 562\u001b[0m decode_coords\u001b[38;5;241m=\u001b[39mdecode_coords,\n\u001b[1;32m 563\u001b[0m )\n\u001b[1;32m 565\u001b[0m overwrite_encoded_chunks \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moverwrite_encoded_chunks\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 566\u001b[0m backend_ds \u001b[38;5;241m=\u001b[39m \u001b[43mbackend\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 567\u001b[0m \u001b[43m \u001b[49m\u001b[43mfilename_or_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 568\u001b[0m \u001b[43m \u001b[49m\u001b[43mdrop_variables\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdrop_variables\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 569\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mdecoders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 570\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 571\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 572\u001b[0m ds \u001b[38;5;241m=\u001b[39m _dataset_from_backend_dataset(\n\u001b[1;32m 573\u001b[0m backend_ds,\n\u001b[1;32m 574\u001b[0m filename_or_obj,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 584\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m 585\u001b[0m )\n\u001b[1;32m 586\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:590\u001b[0m, in \u001b[0;36mNetCDF4BackendEntrypoint.open_dataset\u001b[0;34m(self, filename_or_obj, mask_and_scale, decode_times, concat_characters, decode_coords, drop_variables, use_cftime, decode_timedelta, group, mode, format, clobber, diskless, persist, lock, autoclose)\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mopen_dataset\u001b[39m( \u001b[38;5;66;03m# type: ignore[override] # allow LSP violation, not supporting **kwargs\u001b[39;00m\n\u001b[1;32m 570\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 571\u001b[0m filename_or_obj: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m|\u001b[39m os\u001b[38;5;241m.\u001b[39mPathLike[Any] \u001b[38;5;241m|\u001b[39m BufferedIOBase \u001b[38;5;241m|\u001b[39m AbstractDataStore,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 587\u001b[0m autoclose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m 588\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m 589\u001b[0m filename_or_obj \u001b[38;5;241m=\u001b[39m _normalize_path(filename_or_obj)\n\u001b[0;32m--> 590\u001b[0m store \u001b[38;5;241m=\u001b[39m \u001b[43mNetCDF4DataStore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 591\u001b[0m \u001b[43m \u001b[49m\u001b[43mfilename_or_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 592\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 593\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 594\u001b[0m \u001b[43m \u001b[49m\u001b[43mgroup\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 595\u001b[0m \u001b[43m \u001b[49m\u001b[43mclobber\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mclobber\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 596\u001b[0m \u001b[43m \u001b[49m\u001b[43mdiskless\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdiskless\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 597\u001b[0m \u001b[43m \u001b[49m\u001b[43mpersist\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpersist\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 598\u001b[0m \u001b[43m \u001b[49m\u001b[43mlock\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlock\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 599\u001b[0m \u001b[43m \u001b[49m\u001b[43mautoclose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mautoclose\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 600\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 602\u001b[0m store_entrypoint \u001b[38;5;241m=\u001b[39m StoreBackendEntrypoint()\n\u001b[1;32m 603\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m close_on_error(store):\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:391\u001b[0m, in \u001b[0;36mNetCDF4DataStore.open\u001b[0;34m(cls, filename, mode, format, group, clobber, diskless, persist, lock, lock_maker, autoclose)\u001b[0m\n\u001b[1;32m 385\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\n\u001b[1;32m 386\u001b[0m clobber\u001b[38;5;241m=\u001b[39mclobber, diskless\u001b[38;5;241m=\u001b[39mdiskless, persist\u001b[38;5;241m=\u001b[39mpersist, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mformat\u001b[39m\n\u001b[1;32m 387\u001b[0m )\n\u001b[1;32m 388\u001b[0m manager \u001b[38;5;241m=\u001b[39m CachingFileManager(\n\u001b[1;32m 389\u001b[0m netCDF4\u001b[38;5;241m.\u001b[39mDataset, filename, mode\u001b[38;5;241m=\u001b[39mmode, kwargs\u001b[38;5;241m=\u001b[39mkwargs\n\u001b[1;32m 390\u001b[0m )\n\u001b[0;32m--> 391\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgroup\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlock\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlock\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mautoclose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mautoclose\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:338\u001b[0m, in \u001b[0;36mNetCDF4DataStore.__init__\u001b[0;34m(self, manager, group, mode, lock, autoclose)\u001b[0m\n\u001b[1;32m 336\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_group \u001b[38;5;241m=\u001b[39m group\n\u001b[1;32m 337\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m=\u001b[39m mode\n\u001b[0;32m--> 338\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mds\u001b[49m\u001b[38;5;241m.\u001b[39mdata_model\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mds\u001b[38;5;241m.\u001b[39mfilepath()\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mis_remote \u001b[38;5;241m=\u001b[39m is_remote_uri(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename)\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:400\u001b[0m, in \u001b[0;36mNetCDF4DataStore.ds\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 398\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mds\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 400\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_acquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:394\u001b[0m, in \u001b[0;36mNetCDF4DataStore._acquire\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_acquire\u001b[39m(\u001b[38;5;28mself\u001b[39m, needs_lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[0;32m--> 394\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_manager\u001b[38;5;241m.\u001b[39macquire_context(needs_lock) \u001b[38;5;28;01mas\u001b[39;00m root:\n\u001b[1;32m 395\u001b[0m ds \u001b[38;5;241m=\u001b[39m _nc4_require_group(root, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_group, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode)\n\u001b[1;32m 396\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/contextlib.py:135\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__enter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwds, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc\n\u001b[1;32m 134\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 135\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgen\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 136\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[1;32m 137\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgenerator didn\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt yield\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/file_manager.py:199\u001b[0m, in \u001b[0;36mCachingFileManager.acquire_context\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 196\u001b[0m \u001b[38;5;129m@contextlib\u001b[39m\u001b[38;5;241m.\u001b[39mcontextmanager\n\u001b[1;32m 197\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21macquire_context\u001b[39m(\u001b[38;5;28mself\u001b[39m, needs_lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[1;32m 198\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Context manager for acquiring a file.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 199\u001b[0m file, cached \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_acquire_with_cache_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43mneeds_lock\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 200\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 201\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m file\n", + "File \u001b[0;32m/glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/file_manager.py:217\u001b[0m, in \u001b[0;36mCachingFileManager._acquire_with_cache_info\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 215\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m 216\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode\n\u001b[0;32m--> 217\u001b[0m file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_opener\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# ensure file doesn't get overridden when opened again\u001b[39;00m\n\u001b[1;32m 220\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "File \u001b[0;32msrc/netCDF4/_netCDF4.pyx:2464\u001b[0m, in \u001b[0;36mnetCDF4._netCDF4.Dataset.__init__\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32msrc/netCDF4/_netCDF4.pyx:2027\u001b[0m, in \u001b[0;36mnetCDF4._netCDF4._ensure_nc_success\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/glade/derecho/scratch/PUT_USER_NAME_HERE/archive/b1850.run_length/atm/hist/b1850.run_length.cam.h0.0003-07.nc'" + ] + } + ], + "source": [ + "ds = xr.open_dataset(files)\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "39d93758-aedb-42ab-810c-257a37dae487", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 1: Make a lat-lon plot of TS\n", + "\n", + "To highlight plotting the variables from the CESM atmosphere (CAM) file, the first example will plot a simple global lat/lon plot of surface temperature `TS`" + ] + }, + { + "cell_type": "markdown", + "id": "1e6b83ad", + "metadata": {}, + "source": [ + "### Grab data from first time stamp\n", + "\n", + "NOTE: This dataset has only one time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "feb6d347-cbcb-407c-bb4d-6d89c69fcf32", + "metadata": {}, + "outputs": [], + "source": [ + "ts_0 = ds.TS.sel({\"time\": ds.TS.time.values[0]}).squeeze()\n", + "ts_0" + ] + }, + { + "cell_type": "markdown", + "id": "cf1a965c", + "metadata": {}, + "source": [ + "The next step is to set up the map. Since we are plotting a global lat/lon, we will use the \"Plate Carree\" projection. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b183aba-6eae-48ad-9545-f3c918fb99ff", + "metadata": {}, + "outputs": [], + "source": [ + "# define the colormap\n", + "cmap = mpl.colormaps[\"jet\"]\n", + "\n", + "# set up the figure with a Plate Carree projection\n", + "fig = plt.figure(figsize=(15, 10))\n", + "\n", + "ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", + "\n", + "# Plot the first timeslice of TS\n", + "img = ax.pcolormesh(ds.lon, ds.lat, ts_0, cmap=cmap, transform=ccrs.PlateCarree())\n", + "\n", + "plt.title(\"Surface Temperature\", fontsize=20)\n", + "\n", + "# Set up colorbar\n", + "plt.colorbar(img, orientation=\"vertical\", fraction=0.0242, pad=0.01)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "ccd1f942-a16d-490b-98e6-5f57e92a1cce", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1bedaea9-73cf-4011-b928-e8c2de752737", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "The colorbar limits are set automatically by `pcolormesh`. How could you change the arguments for the `pcolormesh` function to set the plotting limits?" + ] + }, + { + "cell_type": "markdown", + "id": "e18f7699-44a7-46f9-9503-1d97fb9418f7", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Choose a maximum temperature of 300K and minimum temperature of 225K.\n", + " \n", + "```python\n", + "img = ax.pcolormesh(ds.lon, ds.lat, ts_0, vmax=300, vmin=225, cmap=cmap, transform=ccrs.PlateCarree())\n", + "\n", + "```\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "20dc7be8", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "How could we change the central longitude?" + ] + }, + { + "cell_type": "markdown", + "id": "26a14d27-a027-4774-87bf-63712f1f88b6", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "The default central longitude is 0. Try setting it to 180. Then try other values from 0-360.\n", + "\n", + "```python\n", + "ax = fig.add_subplot(1,1,1, projection=ccrs.PlateCarree(central_longitude=180))\n", + "```\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "c632aed7", + "metadata": {}, + "source": [ + "A second quick example is for `xarray`'s built-in plotting which uses the `matplotlib` and `cartopy` in the background. `xarray` makes creating a basic plot fairly simple." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f48694b-1eae-4b88-87b3-9aec97ed7ffe", + "metadata": {}, + "outputs": [], + "source": [ + "# Xarray native plotting\n", + "\n", + "# Set up figure and axis\n", + "fig, ax = plt.subplots(1, figsize=(20, 10))\n", + "\n", + "# Plot the data straight from the xarray dataset\n", + "ts_0.plot.contourf(cmap=\"jet\", levels=np.arange(220, 321, 5))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c47469f3-3b57-41c9-9bb2-f56a295bf027", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_2.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8d12294c-691b-491f-bf88-be4c267a5c73", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "42b295a0-4675-4d4e-814f-5aac53b90973", + "metadata": {}, + "source": [ + "## Exercise 2: Zonal plot of SWCF\n", + "\n", + "The second example will plot the short wave cloud forcing (`SWCF`) zonally." + ] + }, + { + "cell_type": "markdown", + "id": "765089ca", + "metadata": {}, + "source": [ + "Grab the variable data and mean over the the lon value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "801cf760-f576-4cea-9dd6-0dadfc1788a1", + "metadata": {}, + "outputs": [], + "source": [ + "ds_swcf = ds.SWCF\n", + "\n", + "# Get all the dataset dimensions\n", + "d = ds_swcf.dims\n", + "\n", + "# Grab all dimensions to mean the lon values from\n", + "davgovr = [dim for dim in d if dim not in (\"lev\", \"lat\")]\n", + "\n", + "# Make new dataset of zonal mean values\n", + "ds_swcf_zonal = ds_swcf.mean(dim=davgovr)\n", + "\n", + "# print some values of new zonally-averaged SWCF variable\n", + "ds_swcf_zonal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b92a7bdd-b2dc-4a2c-a6e9-9b75e361492a", + "metadata": {}, + "outputs": [], + "source": [ + "# Create figure and axis\n", + "fig, ax = plt.subplots(1, figsize=(12, 7))\n", + "\n", + "# Set Main title for subplots:\n", + "plt.title(\"Short Wave Cloud Forcing\", fontsize=20)\n", + "\n", + "# Plot value on y-axis and latitude on the x-axis\n", + "ax.plot(ds_swcf_zonal.lat, ds_swcf_zonal, c=\"goldenrod\")\n", + "\n", + "ax.set_xlim(\n", + " [max([ds_swcf_zonal.lat.min(), -90.0]), min([ds_swcf_zonal.lat.max(), 90.0])]\n", + ")\n", + "\n", + "ax.set_xlabel(\"Latitude\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "47ccd4c3-3c40-4b61-9ac1-3df14249eed1", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_3.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "a4cd24f4", + "metadata": {}, + "source": [ + "**Question**\n", + "\n", + "What code could you add to set a legend for the plot line?" + ] + }, + { + "cell_type": "markdown", + "id": "afcc9ee3-0312-4440-b720-a547382a960a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "enter the following lines after the `ax.set_xlabel` command and before the `plt.show()` command. \n", + " \n", + "```python\n", + "label = ds_swcf.time.values[0].strftime() # -> '0001-02-01 00:00:00'\n", + "line = Line2D([0], [0], label=label,\n", + " color=\"blue\")\n", + " \n", + "fig.legend(handles=[line],bbox_to_anchor=(-0.15, 0.15, 1.05, .102),loc=\"right\",\n", + " borderaxespad=0.0,fontsize=16,frameon=False)\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "dbe1163c-0ec0-4f9e-94df-4163078c8803", + "metadata": {}, + "source": [ + "**Question**\n", + "\n", + "What else could you label the line legend, if anything?\n" + ] + }, + { + "cell_type": "markdown", + "id": "a5cc83e2-3385-472f-864a-88307c6195c2", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Try setting the label value to something else like your simulation run name, the season or month, etc.\n", + " \n", + "```\n", + "label = 'Season '\n", + "```\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d7018dc2-c95b-4643-b078-d5033a6f236e", + "metadata": {}, + "source": [ + "**Question**\n", + "\n", + "How can you change the color on the plot and the legend?" + ] + }, + { + "cell_type": "markdown", + "id": "3bfc85e8-831b-4ead-a5e9-aa25ce2194ff", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "To change colors, try a different named color (e.g. \"red\" or \"goldenrod\"). You should make sure both the plot and the legend match or your plot won't make sense.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "55a42e67-2609-4f07-8485-bc8f5035e14a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for a solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_4.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4d50620e-407d-44ef-bce5-e76c076bcbcd", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "49402bdd-648e-4021-af0e-9280067b7d76", + "metadata": {}, + "source": [ + "## Exercise 3: Plot of zonal T\n", + "\n", + "This example will plot the 3D zonal mean of temperature `T` with the pressure as the y-variable and latitude as the x-variable. We are showing you four different ways to make the same plot since each is valuable for plots with pressure on the y-axis and how to format those to get more information from the data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "619d661b-84c9-4a5f-8366-36d8023f082e", + "metadata": {}, + "outputs": [], + "source": [ + "# Remove all dimensions of length one\n", + "ds_t = ds.T.squeeze()\n", + "ds_t" + ] + }, + { + "cell_type": "markdown", + "id": "3eee4a65-9094-41e6-b905-b6623d62bde4", + "metadata": {}, + "source": [ + "### Plot 1: Natively via xarray\n", + "\n", + "This plot uses the xarray native grids for the plot\n", + "\n", + " - y-axis is increasing with height\n", + " - y-axis is not in log pressure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d7c3b5c-96ec-4da6-af39-7c4460827f71", + "metadata": {}, + "outputs": [], + "source": [ + "# Average over all dimensions except `lev` and `lat`.\n", + "d = ds_t.dims\n", + "davgovr = [dim for dim in d if dim not in (\"lev\", \"lat\")]\n", + "\n", + "DS = ds_t.mean(dim=davgovr)\n", + "DS.transpose(\"lat\", \"lev\", ...)\n", + "fig, ax = plt.subplots(1, figsize=(20, 10))\n", + "DS.plot.contourf(ax=ax, y=\"lev\", cmap=\"Spectral_r\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5324e5a3-c6b4-4213-bf11-6184338a63e2", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for a solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_5.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9b8a57a1-0e26-4740-8182-bf4da973c911", + "metadata": {}, + "source": [ + "### Plot 2: Quick ADF style\n", + "\n", + "This plot uses the quick style of the AMWG Diagnostics Framework (ADF) packages.\n", + "\n", + " - y-axis is increasing with height\n", + " - y-axis is not in log pressure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2440adfe-60ab-4feb-832c-496423057404", + "metadata": {}, + "outputs": [], + "source": [ + "# Average over all dimensions except `lev` and `lat`.\n", + "d = ds_t.dims\n", + "davgovr = [dim for dim in d if dim not in (\"lev\", \"lat\")]\n", + "\n", + "DS = ds_t.mean(dim=davgovr)\n", + "\n", + "lev = DS[\"lev\"]\n", + "lat = DS[\"lat\"]\n", + "mlev, mlat = np.meshgrid(lev, lat)\n", + "\n", + "# Generate zonal plot:\n", + "fig, ax = plt.subplots(1, figsize=(15, 7))\n", + "\n", + "# Create zonal plot with vertical levels\n", + "img = ax.contourf(mlat, mlev, DS.transpose(\"lat\", \"lev\"), cmap=\"Spectral_r\")\n", + "\n", + "# Format axis and ticks\n", + "ax.set_xlabel(\"Latitude\")\n", + "fig.colorbar(img, ax=ax, location=\"right\")" + ] + }, + { + "cell_type": "markdown", + "id": "bd0ac9e7-4a8e-498a-be2b-3a7ddd8cca25", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for a solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_6.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "98f31b9b-db5d-4e2a-81f9-df146980dec0", + "metadata": {}, + "source": [ + "**Questions**\n", + "\n", + "- What differences do you see between the ADF quick plot and the xarray native plot? \n", + "- Why might you want to use one or the other?\n", + "- Where, vertically, do high pressures occur and what does this mean for where the ground would be located on this plot?" + ] + }, + { + "cell_type": "markdown", + "id": "96e8b966-f242-4e43-bb51-9deaa77a6bc6", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Notice that the colorbar and axes labels are different between the two plots. Also note that the y-axis is going from lower to higher pressure values, but in the real atmosphere the highest pressures are near the surface (so the plot is inverted relative to the actual height of the layers above the Earth's surface). \n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e866346a-2d31-4df9-955c-b7a2ae00b888", + "metadata": {}, + "source": [ + "### Plot 3: ADF style with reversed y-axis\n", + "\n", + " - y-axis is decreasing with height\n", + " - y-axis is not in log pressure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c08d64d9-40d9-4064-9b06-2b8489d916a0", + "metadata": {}, + "outputs": [], + "source": [ + "# Average over all dimensions except `lev` and `lat`.\n", + "d = ds_t.dims\n", + "davgovr = [dim for dim in d if dim not in (\"lev\", \"lat\")]\n", + "\n", + "DS = ds_t.mean(dim=davgovr)\n", + "\n", + "# print(DS.lev.min(),DS.lev.max())\n", + "\n", + "lev = DS[\"lev\"]\n", + "lat = DS[\"lat\"]\n", + "mlev, mlat = np.meshgrid(lev, lat)\n", + "\n", + "# Generate zonal plot:\n", + "fig, ax = plt.subplots(1, figsize=(15, 7))\n", + "\n", + "# Create zonal plot with vertical levels\n", + "img = ax.contourf(mlat, mlev, DS.transpose(\"lat\", \"lev\"), cmap=\"Spectral_r\")\n", + "\n", + "# Format axis and ticks\n", + "plt.gca().invert_yaxis()\n", + "ax.tick_params(which=\"minor\", length=4, color=\"r\")\n", + "\n", + "# Set up colorbar\n", + "cbar_ax = fig.add_axes([0, 0, 0.1, 0.1])\n", + "posn = ax.get_position()\n", + "\n", + "# Set position and size of colorbar position: [left, bottom, width, height]\n", + "cbar_ax.set_position([posn.x0 + posn.width + 0.005, posn.y0, 0.02, posn.height])\n", + "\n", + "ax.set_xlabel(\"Latitude\")\n", + "fig.colorbar(img, cax=cbar_ax, orientation=\"vertical\")" + ] + }, + { + "cell_type": "markdown", + "id": "ba0aa084-f95e-4951-81b0-3951e8ed0b29", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for a solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_7.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "a0beeca6-4697-4bc8-b42d-e43ccceecbef", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "- What differences do you see on the y-axis between the result from Plot 2 and Plot 3? " + ] + }, + { + "cell_type": "markdown", + "id": "1dd69767-20ac-49ff-9c1f-ade44886de56", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The plots are mirror images of each other because the y-axis has been flipped. Plot 2 has the highest pressures at the top of the y-axis while Plot 3 has the highest pressures at the bottom of the y-axis.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8bd94a75-58cb-4b5d-a806-45b64c26e727", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "- Where, vertically, do high pressures occur and what does this mean for where the ground would be located on these two figures ?" + ] + }, + { + "cell_type": "markdown", + "id": "4b1b7ab1-20ff-4745-bad7-cf50c9b807b8", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The highest pressures in the atmosphere occur at the ground where the most atmospheric mass is pressing downward. This means that Plot 2 is oriented so the location where the ground is is the top of the plot, or up. In Plot 3 the orientation is so that the ground would be at the bottom of the plot, or down. Thus Plot 3 is often more intuitive to read because it's oriented with the way we perceive the atmosphere.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "84fc1ae8-74f3-4c4f-9171-18b5625f2d96", + "metadata": {}, + "source": [ + "### Plot 4: Complex ADF style\n", + "\n", + " - y-axis is decreasing with height\n", + " - y-axis is in log pressure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50564cf7-948e-4b77-9537-707b7358bf71", + "metadata": {}, + "outputs": [], + "source": [ + "# Average over all dimensions except `lev` and `lat`.\n", + "d = ds_t.dims\n", + "davgovr = [dim for dim in d if dim not in (\"lev\", \"lat\")]\n", + "\n", + "DS = ds_t.mean(dim=davgovr)\n", + "\n", + "# print(DS.lev.min(),DS.lev.max())\n", + "\n", + "lev = DS[\"lev\"]\n", + "lat = DS[\"lat\"]\n", + "mlev, mlat = np.meshgrid(lev, lat)\n", + "\n", + "# Generate zonal plot:\n", + "fig, ax = plt.subplots(1, figsize=(15, 7))\n", + "\n", + "# Create zonal plot with vertical levels\n", + "img = ax.contourf(mlat, mlev, DS.transpose(\"lat\", \"lev\"), cmap=\"Spectral_r\")\n", + "\n", + "# Format axis and ticks\n", + "plt.yscale(\"log\")\n", + "plt.gca().invert_yaxis()\n", + "ax.tick_params(which=\"minor\", length=4, color=\"r\")\n", + "\n", + "# Set up colorbar\n", + "cbar_ax = fig.add_axes([0, 0, 0.1, 0.1])\n", + "posn = ax.get_position()\n", + "\n", + "# Set position and size of colorbar position: [left, bottom, width, height]\n", + "cbar_ax.set_position([posn.x0 + posn.width + 0.005, posn.y0, 0.02, posn.height])\n", + "\n", + "ax.set_xlabel(\"Latitude\")\n", + "fig.colorbar(img, cax=cbar_ax, orientation=\"vertical\")" + ] + }, + { + "cell_type": "markdown", + "id": "5a8fb095-89fd-4112-9d4f-de5f4ee9f143", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for a solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cam/basics_plot_8.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4d7c9ee8-9445-489f-9b07-3ab67e45398d", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "- What differences do you see on the y-axis between the result from Plot 3 and Plot 4? " + ] + }, + { + "cell_type": "markdown", + "id": "f931e791-2f0a-423f-b44b-644686657767", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The plots both have the y-axis oriented so that the highest pressures, or ground, is at the bottom of the plot. But the scale of the y-axis has changed so that in Plot 3 it is logarithmic.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6a6af568-90cf-4f8c-a3c8-5dcda30359fd", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "- What does that mean in terms of which part of the atmosphere are emphasized?" + ] + }, + { + "cell_type": "markdown", + "id": "0aa7131d-4337-4da2-8b8d-db9a69432142", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "With the logarithmic y-axis more of the upper atmosphere is shown on the figure. If you wanted to emphasize the boundary layer you might want to change the limits of the figure.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c7c4e8c-4a4a-4f3e-a6d7-4b5e7725a2f7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/cam/cam.ipynb b/_sources/notebooks/diagnostics/cam/cam.ipynb new file mode 100644 index 000000000..06092aaa0 --- /dev/null +++ b/_sources/notebooks/diagnostics/cam/cam.ipynb @@ -0,0 +1,86 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Atmosphere" + ] + }, + { + "cell_type": "markdown", + "id": "30ca3a26-9666-433a-b9d6-852999d9455e", + "metadata": {}, + "source": [ + "## Basic Plotting\n", + "\n", + "### Learning Goals\n", + "\n", + "- Making a lat-lon plot\n", + "- Making a zonal plot\n", + "- Making a lat-height plot\n", + "\n", + "### Exercise 1: lat-lon plot\n", + "Plot global lat/lon of surface temperature\n", + "\n", + "### Exercise 2: Making a zonal plot\n", + "Plot zonal mean of short wave cloud forcing\n", + "\n", + "### Exercise 3: Making a lat-height plot\n", + "Plot temperature zonal mean with vertical levels\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c494a32c-cd81-4a0a-b290-eb0835919532", + "metadata": { + "tags": [] + }, + "source": [ + "_______________\n", + "## Advanced Plotting\n", + "\n", + "### Learning Goals\n", + "\n", + "- analysis of native output \n", + "\n", + "\n", + "### Exercise 1: CAM-SE output analysis\n", + "\n", + "Examples of simple analysis and plotting that can be done with CAM-SE output on the native cubed-sphere grid." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d4d2795-ce87-424c-8b26-719932e22678", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/cice/advanced_cice.ipynb b/_sources/notebooks/diagnostics/cice/advanced_cice.ipynb new file mode 100644 index 000000000..8dbb4b412 --- /dev/null +++ b/_sources/notebooks/diagnostics/cice/advanced_cice.ipynb @@ -0,0 +1,910 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bb50f4e0-22b4-4eff-99ac-01733347aacc", + "metadata": {}, + "source": [ + "# Advanced Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "7eb5562a-1ee6-47e2-9266-f1da2f5cabc8", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023a`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023a`." + ] + }, + { + "cell_type": "markdown", + "id": "7dfb6809-0426-42bf-9d73-0bcb5d5f9ea8", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed primarily by David Clemens-Sewall." + ] + }, + { + "cell_type": "markdown", + "id": "bc842f8d-b0fe-41c2-be03-052eba873e72", + "metadata": {}, + "source": [ + "_______________\n", + "This notebook provides some additional examples of more advanced sea ice fields. Here we introduce the concept of the subgridscale ice thickness distribution (ITD). This means we have a fraction of ice in each grid cell that is binned into thickness categories." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "504d66c5-830c-43a2-a34a-abe8c62da585", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.path as mpath\n", + "from matplotlib.gridspec import GridSpec\n", + "import pop_tools\n", + "import cartopy.crs as ccrs\n", + "import cartopy.feature as cfeature\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "id": "14fbb751-1804-4ff7-ad07-3c292e59e895", + "metadata": {}, + "source": [ + "For these exercises we will need to import multiple variables, below is an example of one way to do so." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3389a570-582d-4520-8fe7-4bdcd3d400e5", + "metadata": {}, + "outputs": [], + "source": [ + "monthly_output_path = \"/glade/campaign/cgd/cesm/CESM2-LE/ice/proc/tseries/month_1\"\n", + "run_name = \"b.e21.BHISTcmip6.f09_g17.LE2-1001.001\"\n", + "\n", + "var_names = ['aice',\n", + " 'aicen',\n", + " 'vsnon',\n", + " 'hs',\n", + " 'fsens',\n", + " 'fsens_ai',\n", + " ]\n", + "\n", + "da_list = []\n", + "\n", + "for var_name in var_names:\n", + " files = os.path.join(monthly_output_path, var_name,\n", + " run_name + \".cice.h.\" + var_name + \".*\")\n", + " ds_in = xr.open_mfdataset(files)\n", + " da_list.append(ds_in[var_name])\n", + " del ds_in\n", + "\n", + "ds = xr.merge(da_list)\n", + "\n", + "del da_list" + ] + }, + { + "cell_type": "markdown", + "id": "fe88ed04-642c-4fe2-87aa-cd4edc1e5b4d", + "metadata": {}, + "source": [ + "The next step is to read in some grid information for the `gx1v7` dipole grid used in POP and CICE. We will read in three main variables: `tarea`, `TLAT`, and `TLON`. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Also, we will print the latitude array `TLAT` to see the metadata." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24f47162-9166-46d4-b026-515b6f892c8f", + "metadata": {}, + "outputs": [], + "source": [ + "# get pop grid grid cell areas\n", + "grid = pop_tools.get_grid('POP_gx1v7')\n", + "\n", + "# convert tarea to m^2\n", + "with xr.set_options(keep_attrs=True):\n", + " grid['TAREA'] = grid['TAREA']/(1e4)\n", + "grid['TAREA'].attrs['units'] = 'm^2'" + ] + }, + { + "cell_type": "markdown", + "id": "785ff8b7-fdd0-4216-a059-038cbfe4e282", + "metadata": {}, + "source": [ + "We will merge in three main variables: `tarea`, `TLAT`, and `TLON`. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Note that this overwrites the dataset object from above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da0d7049-59fc-4bda-90f4-211ed1ae387d", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.merge([ds.drop(['TLAT', 'TLON', 'ULAT', 'ULON']),\n", + " grid[['TLAT', 'TLONG', 'TAREA']].rename_dims({'nlat':'nj','nlon':'ni'})],\n", + " compat='identical', combine_attrs='no_conflicts')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6c35032-3dd2-43b6-988e-14f03e497c28", + "metadata": {}, + "outputs": [], + "source": [ + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "faf06e07-ee8a-4a61-a487-c0a445622e86", + "metadata": {}, + "source": [ + "_______________\n", + "## Example 1: Plot per-category ice area\n", + "\n", + "Compare the dataset in this notebook with `aice` in the basics notebook. Notice that in this case we have an additional category dimension `nc`. `aicen` is the per-category ice area fraction. We demonstrate plotting a per-category variable below. We also plot the full sea ice concentration in the final plot." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffb5f043-03ea-4483-90d2-26409072b9b5", + "metadata": {}, + "outputs": [], + "source": [ + "# make circular boundary for polar stereographic circular plots\n", + "theta = np.linspace(0, 2*np.pi, 100)\n", + "center, radius = [0.5, 0.5], 0.5\n", + "verts = np.vstack([np.sin(theta), np.cos(theta)]).T\n", + "circle = mpath.Path(verts * radius + center)\n", + "\n", + "cmap = plt.cm.get_cmap('Blues_r') \n", + "\n", + "# create figure with subplots\n", + "fig, axs = plt.subplots(3, 2, figsize=(20,30),\n", + " subplot_kw={'projection':ccrs.NorthPolarStereo()})\n", + "axs = np.ravel(axs)\n", + "\n", + "# this creates a subplot for each ITD category\n", + "for i in ds.nc.values:\n", + " ax = axs[i]\n", + " ax.set_boundary(circle, transform=ax.transAxes)\n", + " ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + " ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + " this=ax.pcolormesh(ds['TLONG'],\n", + " ds['TLAT'],\n", + " ds['aicen'].sel({'time':'1850-02-01 00:00:00',\n", + " 'nc':i}).squeeze(),\n", + " cmap=cmap,vmax=1,vmin=0,\n", + " transform=ccrs.PlateCarree())\n", + " plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + " ax.set_title('Area Fraction Category ' + str(i+1))\n", + "\n", + "# gridcell mean aice in the final subplot\n", + "ax = axs[-1]\n", + "ax.set_boundary(circle, transform=ax.transAxes)\n", + "ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + "ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + "this=ax.pcolormesh(ds['TLONG'],\n", + " ds['TLAT'],\n", + " ds['aice'].sel({'time':'1850-02-01 00:00:00'}).squeeze(),\n", + " cmap=cmap,vmax=1,vmin=0,\n", + " transform=ccrs.PlateCarree())\n", + "plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + "ax.set_title('Sea Ice Concentration')" + ] + }, + { + "cell_type": "markdown", + "id": "71b64ff8-2c9a-4f63-9d63-cc9f5047642f", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution to final two panels
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/advanced_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6dded4c6-bb89-49fe-8c9f-ce46c26d5119", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "How do you get the grid cell total sea ice concentration? In which of the thickness categories is the concentration highest? How does that vary spatially? What does this indicate about the relative importance of different ice thicknesses in different Arctic regions?\n", + "\n", + "Note that the default CICE ice thickness categories are:\n", + "- Category 1: 0-0.64 m\n", + "- Category 2: 0.64-1.39 m\n", + "- Category 3: 1.39-2.47 m\n", + "- Category 4: 2.47-4.57 m\n", + "- Category 5: 4.57+ m" + ] + }, + { + "cell_type": "markdown", + "id": "5eab03af-1834-420d-87d3-6aea39398ef1", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "You would calculate the grid cell total sea ice concentration by summing up the concentration in each category. In the central Arctic the concentrations are highest in categories 2 and 3, while on the ice margins the concentrations are highest in category 1. The only location with any substantial thick ice (category 5) is the central Arctic. This indicates that different regions' sea ice are dominated by very different mean sea ice thickness. This will have implications for ice growth/melt and heat fluxes.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0d50b7e3-6a20-432f-9c0e-2222b85604ed", + "metadata": {}, + "source": [ + "_______________\n", + "## Example 2: Plot per-category snow thickness\n", + "\n", + "Internally, the model actually stores the snow **volume** for each category, not the thickness. To get the thickness we need to divide `vsnon` by `aicen` (the per category area)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed4b81e5-c6b5-466d-9784-74bd7bbace8a", + "metadata": {}, + "outputs": [], + "source": [ + "ds['hsn'] = ds['vsnon'] / ds['aicen']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "889b2691-b6b3-4363-b3fa-e4d96e4309aa", + "metadata": {}, + "outputs": [], + "source": [ + "# Max snow depth for colorbars\n", + "hs_max = 0.5 \n", + "\n", + "# make circular boundary for polar stereographic circular plots\n", + "theta = np.linspace(0, 2*np.pi, 100)\n", + "center, radius = [0.5, 0.5], 0.5\n", + "verts = np.vstack([np.sin(theta), np.cos(theta)]).T\n", + "circle = mpath.Path(verts * radius + center)\n", + "\n", + "cmap = plt.cm.get_cmap('Blues_r') \n", + "\n", + "\n", + "fig, axs = plt.subplots(3, 2, figsize=(20,30),\n", + " subplot_kw={'projection':ccrs.NorthPolarStereo()})\n", + "axs = np.ravel(axs)\n", + "\n", + "for i in ds.nc.values:\n", + " ax = axs[i]\n", + " ax.set_boundary(circle, transform=ax.transAxes)\n", + " ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + " ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + " this=ax.pcolormesh(ds['TLONG'],\n", + " ds['TLAT'],\n", + " ds['hsn'].sel({'time':'1850-02-01 00:00:00',\n", + " 'nc':i}).squeeze(),\n", + " cmap=cmap,vmax=hs_max,vmin=0,\n", + " transform=ccrs.PlateCarree())\n", + " plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + " ax.set_title('Snow Depth (m) Category ' + str(i+1))\n", + "\n", + "# gridcell mean snow volume in the final subplot\n", + "ax = axs[-1]\n", + "ax.set_boundary(circle, transform=ax.transAxes)\n", + "ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + "ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + "this=ax.pcolormesh(ds['TLONG'],\n", + " ds['TLAT'],\n", + " ds['hs'].sel({'time':'1850-02-01 00:00:00'}).squeeze(),\n", + " cmap=cmap,vmax=hs_max,vmin=0,\n", + " transform=ccrs.PlateCarree())\n", + "plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + "ax.set_title('Average Snow Depth (m)')" + ] + }, + { + "cell_type": "markdown", + "id": "5d21d343-ee9f-41ef-8672-5f10fe96b6e0", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution to final two panels
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/advanced_plot_2.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d3e1e661-f909-4c25-bf61-96581e697b86", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "In addition to the per-category snow thickness values we plotted the grid cell mean snow thickness. How do these values compare?" + ] + }, + { + "cell_type": "markdown", + "id": "24792b73-508f-4501-976d-3bfef0508050", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The per-category snow thickness can be higher than the grid cell mean (see Category 4 and the grid cell mean). This means the thicker ice tends to have thicker snow, but if the overall concentration of the thick ice categories is small then the mean over the grid call can be lower.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e85aa3e0-6a08-4592-b616-2dc711b28230", + "metadata": {}, + "source": [ + "_______________\n", + "## Example 3: Ice area related tracer\n", + "\n", + "The default CICE outputs are averaged over the entire grid cell, including the open water. Thus if a grid cell happened to be half covered in 1-m-thick ice and half open water then `hi` would be 0.5 m. Some tracers are written out just for the ice-covered area of the grid cell. These are indicated by have `_ai` appended to the variable name.\n", + "\n", + "Below is an example of this for the sensible heat flux." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41e55cf3-f620-41f9-8b10-2f9d38c03fe4", + "metadata": {}, + "outputs": [], + "source": [ + "ds['fsens_diff'] = ds['fsens_ai'] - ds['fsens']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5055a66c-9826-4e9e-8429-bbd43ced1ab5", + "metadata": {}, + "outputs": [], + "source": [ + "# Min and max\n", + "mins = [-60, -60, -30, 0]\n", + "maxs = [60, 60, 30, 1]\n", + "\n", + "# make circular boundary for polar stereographic circular plots\n", + "theta = np.linspace(0, 2*np.pi, 100)\n", + "center, radius = [0.5, 0.5], 0.5\n", + "verts = np.vstack([np.sin(theta), np.cos(theta)]).T\n", + "circle = mpath.Path(verts * radius + center)\n", + "\n", + "cmap = plt.cm.get_cmap('RdBu') \n", + "\n", + "vars_to_plt = ['fsens_ai', 'fsens', 'fsens_diff', 'aice']\n", + "\n", + "fig, axs = plt.subplots(2, 2, figsize=(20,20),\n", + " subplot_kw={'projection':ccrs.NorthPolarStereo()})\n", + "axs = np.ravel(axs)\n", + "\n", + "# set up the plots for sensible heat flux over the sea ice, gridcell mean sensible heat flux,\n", + "# difference, and the gridcell mean ice concentration aice\n", + "\n", + "for i in np.arange(4):\n", + " if i == 3:\n", + " cmap = plt.cm.get_cmap('Blues_r')\n", + " ax = axs[i]\n", + " ax.set_boundary(circle, transform=ax.transAxes)\n", + " ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + " ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + " this=ax.pcolormesh(ds['TLONG'],\n", + " ds['TLAT'],\n", + " ds[vars_to_plt[i]].sel({'time':'1850-02-01 00:00:00'}\n", + " ).squeeze(),\n", + " cmap=cmap,vmax=maxs[i],vmin=mins[i],\n", + " transform=ccrs.PlateCarree())\n", + " plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + " ax.set_title(vars_to_plt[i])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "71e4bcb8-ffa5-4c11-9e9f-de0bb2bc6ae2", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution to final two panels
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/advanced_plot_3.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "af18fd70-9b61-46d7-9512-65da395e6496", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Where are the differences in the fluxes most pronounced and why?" + ] + }, + { + "cell_type": "markdown", + "id": "4ae871ba-9383-4d6d-9c41-1b9c8bedadcf", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The differences are most pronounced near the ice edge where ice concentrations are lowest. This is because these areas have a lot of open water so the grid cell mean flux will be very different than that over just the ice covered portion. In the central Arctic most cells are nearly all ice covered, so the fluxes are not substantially different.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "097273a5-204d-438f-8f68-19d7f4b75e04", + "metadata": {}, + "source": [ + "_______________\n", + "## Example 4: Remapping a sea ice gridded field\n", + "\n", + "The sea ice and ocean grids usually have a transformation where the grid North Pole is moved into land to avoid instability problems with converging meridians (See [Orthogonal Grids - Murray 1996](https://doi.org/10.1006/jcph.1996.0136)). In the CESM we use the POP dipole and tripole grids and will soon be using the MOM6 tripole grids. While matplotlib can actually use the 2D latitude and longitude fields to make plots, it is sometimes necessary to remap or regrid the data onto a standard latitude-longitude grid. This can be done using the ESMF remapping tools [xESMF](https://xesmf.readthedocs.io/en/latest/) for python." + ] + }, + { + "cell_type": "markdown", + "id": "e8d2c0c2-b13b-41f1-9ff4-6324f8018f4b", + "metadata": {}, + "source": [ + "Let's first plot the raw field so the dipole grid can be visualized." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50a62138-19cc-4a3b-8a6e-011bc508dbb8", + "metadata": {}, + "outputs": [], + "source": [ + "aice = ds['aice']\n", + "\n", + "aice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b3429a1-e2b6-419b-bd13-7ef651b5a5a0", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.set_facecolor('0.5') # Fill in model land by making the axis background whatever color you want\n", + "im1 = ax.pcolormesh(ds.coords['ni'],ds.coords['nj'],aice[0],cmap='Blues_r',vmin=0,vmax=1)\n", + "cbar = plt.colorbar(im1)\n", + "cbar.set_label('Sea Ice Concentration',fontsize=18)\n", + "plt.xticks([]);\n", + "plt.yticks([]);" + ] + }, + { + "cell_type": "markdown", + "id": "f83bb11b-dc76-468b-91dc-e751ac0ddbd5", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/advanced_plot_4.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "126ece37-f3be-45f4-90a8-030d9eb25921", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What do you notice about the Northern Hemisphere? What is going on with Greenland? Do you notice anything odd in the Southern Hemisphere?" + ] + }, + { + "cell_type": "markdown", + "id": "e242c44d-3e3d-4704-aaa3-02c70eb77cec", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "See how the Northern Hemisphere looks weird? Greenland is stretched completely across the top edge of the plot. In contrast, the Southern Hemisphere looks normal.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "fa913808-0583-480b-a087-23593d036389", + "metadata": {}, + "source": [ + "Next we will import the `xesmf` library and create a \"destination\" grid. This is just a simple one-degree by one-degree latitude longitude grid." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ca157eb-230d-45c4-8116-654bd9bc2919", + "metadata": {}, + "outputs": [], + "source": [ + "import xesmf as xe" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1392cd38-64bd-4139-a957-ad38e030dc2c", + "metadata": {}, + "outputs": [], + "source": [ + "# Setting up a target grid to only regrid the sea ice data\n", + "lat=np.arange(-90,90,1.0) \n", + "lon=np.arange(0,361,1.0)\n", + "#create a meshgrid (2D fields of lats and lons)\n", + "lon2d,lat2d=np.meshgrid(lon,lat) \n", + "#set up the target grid as an xarray Dataset\n", + "target_grid=xr.Dataset({'lat': (['y', 'x'], lat2d),'lon': (['y', 'x'], lon2d)})\n", + "\n", + "target_grid" + ] + }, + { + "cell_type": "markdown", + "id": "098c750b-9a23-43b6-a879-b3a0a6908b54", + "metadata": {}, + "source": [ + "Now we need to create a Dataset. For some reason the regridder does not accept a DataArray." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9048bc8e-5df6-468e-a38b-763e158d9aad", + "metadata": {}, + "outputs": [], + "source": [ + "# Define the dataset and a variable `aice` with dimensions time, nj, and ni. Also, fill the\n", + "# lat and lon arrays from the POPgrid dataset.\n", + "\n", + "ds_siconc_ocean = xr.Dataset()\n", + "ds_siconc_ocean['aice'] = (('time','nj','ni'),ds['aice'].values)\n", + "ds_siconc_ocean.coords['lat'] = (('nj','ni'),grid['TLAT'].values)\n", + "ds_siconc_ocean.coords['lon'] = (('nj','ni'),grid['TLONG'].values)\n", + "sic_ocean = ds_siconc_ocean['aice']" + ] + }, + { + "cell_type": "markdown", + "id": "e7684c0a-19d4-45cc-95f0-045a9355290b", + "metadata": {}, + "source": [ + "Next we will use xesmf to regrid from the POP gx1v7 grid to the one degree by one degree regular grid." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dbe677b-bdde-464a-8e31-c3f8e651dedd", + "metadata": {}, + "outputs": [], + "source": [ + "#input grid, output grid, method, keyword arguments\n", + "#NOTE: This may throw a \"FutureWarning\", but feel free to ignore it.\n", + "regridder=xe.Regridder(sic_ocean[0,:,:], target_grid, 'nearest_s2d',periodic=True,reuse_weights=False)" + ] + }, + { + "cell_type": "markdown", + "id": "dba1a8bd-ac35-4bcf-b3ae-201575ec4f56", + "metadata": {}, + "source": [ + "Now that we have the mapping or regridder we can translate the Xarray Dataset from gx1v7 to a one-degree regular grid." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f66e319-147a-44d4-8d07-6db65e6295b8", + "metadata": {}, + "outputs": [], + "source": [ + "sic_rg = regridder(sic_ocean)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a523793f-1e06-47b1-b960-98c20125c3ea", + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the first slice of the new dataset.\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.set_facecolor('0.5') # Fill in model land by making the axis background whatever color you want\n", + "im4 = ax.pcolormesh(lon,lat,sic_rg[0,:,:],cmap='Blues_r',vmin=0,vmax=1)\n", + "cbar = plt.colorbar(im4)\n", + "cbar.set_label('Sea Ice Concentration [%]',fontsize=18)\n", + "plt.xticks([]);\n", + "plt.yticks([]);" + ] + }, + { + "cell_type": "markdown", + "id": "ecbf2b91-8b62-4fc1-9783-7818018e9095", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/advanced_plot_5.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e24f8ca8-53b3-4389-bf3b-cbb0a05d5920", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What do you notice about the Northern Hemisphere now?" + ] + }, + { + "cell_type": "markdown", + "id": "f33b34d8-12d3-4029-8978-70e1125f0807", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "See how the Northern Hemisphere looks weird? Greenland is stretched completely across the top edge of the plot. In contrast, the Southern Hemisphere looks normal.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0e470b63-5cb9-4a26-8ed1-e83b78786a79", + "metadata": {}, + "source": [ + "This data could now be differenced against an observational dataset on a one-degree grid. Additionally, if you wanted to plot the model data using `contourf` instead of `pcolormesh` (which is what we used in the rest of these exercises)." + ] + }, + { + "cell_type": "markdown", + "id": "8653d261-e3c2-42f7-8782-e2d94e7f7358", + "metadata": {}, + "source": [ + "Now let's plot the original data with `pcolormesh`, the regridded data with `pcolormesh`, and the regridded data with `contourf` to see how this looks different." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26499fe9-e5dd-4446-a862-4d41c96adeba", + "metadata": {}, + "outputs": [], + "source": [ + "# make circular boundary for polar stereographic circular plots\n", + "theta = np.linspace(0, 2*np.pi, 100)\n", + "center, radius = [0.5, 0.5], 0.5\n", + "verts = np.vstack([np.sin(theta), np.cos(theta)]).T\n", + "circle = mpath.Path(verts * radius + center)\n", + "\n", + "# define the colormap\n", + "cmap = plt.cm.get_cmap('Blues_r') \n", + "\n", + "# create the figure\n", + "fig = plt.figure(figsize=(20,20))\n", + "\n", + "### make first plot - native grid - using pcolormesh\n", + "ax = fig.add_subplot(1,3,1, projection=ccrs.NorthPolarStereo())\n", + "ax.set_boundary(circle, transform=ax.transAxes)\n", + "ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + "\n", + "# sets the latitude / longitude boundaries of the plot\n", + "ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + "\n", + "#Plot the first timeslice of aice\n", + "this=ax.pcolormesh(sic_ocean['lon'],\n", + " sic_ocean['lat'],\n", + " sic_ocean.isel(time=0).squeeze(),\n", + " cmap=cmap,vmax=1,vmin=0,\n", + " transform=ccrs.PlateCarree())\n", + "plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + "plt.title('Native grid and pcolormesh',fontsize=20)\n", + "\n", + "### make second plot - regridded - using pcolormesh\n", + "ax = fig.add_subplot(1,3,2, projection=ccrs.NorthPolarStereo())\n", + "ax.set_boundary(circle, transform=ax.transAxes)\n", + "ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + "\n", + "# sets the latitude / longitude boundaries of the plot\n", + "ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + "\n", + "#Plot the first timeslice of aice\n", + "this=ax.pcolormesh(lon,\n", + " lat,\n", + " sic_rg.isel(time=0).squeeze(),\n", + " cmap=cmap,vmax=1,vmin=0,\n", + " transform=ccrs.PlateCarree())\n", + "plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + "plt.title('Regridded and pcolormesh',fontsize=20)\n", + "\n", + "### make third plot - regridded - using contourf\n", + "ax = fig.add_subplot(1,3,3, projection=ccrs.NorthPolarStereo())\n", + "ax.set_boundary(circle, transform=ax.transAxes)\n", + "ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + "\n", + "# sets the latitude / longitude boundaries of the plot\n", + "ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + "\n", + "#Plot the first timeslice of aice\n", + "this=ax.contourf(lon,\n", + " lat,\n", + " sic_rg.isel(time=0).squeeze(),\n", + " cmap=cmap,levels=[0,0.2,0.4,0.6,0.8,1.0],\n", + " transform=ccrs.PlateCarree())\n", + "plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + "plt.title('Regridded and pcolormesh',fontsize=20)\n" + ] + }, + { + "cell_type": "markdown", + "id": "f48bde78-24ee-43b0-ae54-5beecc91735c", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/advanced_plot_6.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "21e7ca55-a6bf-4b76-aae8-09a09f71818c", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "How does the ice edge compare in the two `pcolormesh` plots? What's different in the regridded `pcolormesh` and `contourf` plots?" + ] + }, + { + "cell_type": "markdown", + "id": "c4d58cad-56b5-455e-8499-8d6385656d3d", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The regridded data is more coarse and so the filled gridcells using `pcolormesh` in the regridded plot (center) are larger than in the native grid (left). The `contourf` differences are most notable at the ice edge near Russia where you can see clear contour lines. You might have more luck trying the contours on a month in the summer instead of winter.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02ca1b60-88e2-4898-b593-280c6025c6c8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023a", + "language": "python", + "name": "npl-2023a" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/cice/basics_cice.ipynb b/_sources/notebooks/diagnostics/cice/basics_cice.ipynb new file mode 100644 index 000000000..7ac0578dc --- /dev/null +++ b/_sources/notebooks/diagnostics/cice/basics_cice.ipynb @@ -0,0 +1,816 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "33070195-2d5f-4ee3-b6cb-a658209b1f4d", + "metadata": {}, + "source": [ + "# Basic Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "f837eedc-2e5c-44a7-b4a4-6be632371012", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023a`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023a`." + ] + }, + { + "cell_type": "markdown", + "id": "4fc43611-93db-4fa6-9396-362101c0fc33", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed primarily by David Bailey and Alice DuVivier." + ] + }, + { + "cell_type": "markdown", + "id": "55f2ff0c-2b84-4c10-bde3-bc23722cb0ab", + "metadata": {}, + "source": [ + "_______________\n", + "These are examples of typical variables and plots that we look at in our sea ice diagnostics package. The most current version of the sea ice diagnostics are in the CESM Postprocessing repository. More information can be found here: [CESM Postprocessing](https://github.com/NCAR/CESM_postprocessing)." + ] + }, + { + "cell_type": "markdown", + "id": "3d56ba02-c652-4a97-a466-d3633e53aeb1", + "metadata": {}, + "source": [ + "The first step is to import the libraries needed to plot the data. Here we will use `xarray` as a tool to read the netCDF file. We will use `numpy` for some basic math calculations. For plotting the data we will need `matplotlib`, `pop_tools`, `geocat` and `cartopy`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e7f10ae-61c8-45f1-9d5c-9be60632b556", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.path as mpath\n", + "from matplotlib.gridspec import GridSpec\n", + "import pop_tools\n", + "import cartopy.crs as ccrs\n", + "import cartopy.feature as cfeature\n", + "import nc_time_axis\n", + "import cftime\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "id": "98894413-8550-49ba-b5ff-c027900b253a", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 1: Plot Sea Ice Concentration on a polar projection." + ] + }, + { + "cell_type": "markdown", + "id": "0a9043ca-ec38-4bc9-84e9-54e375c8f4e6", + "metadata": {}, + "source": [ + "Here you will learn about plotting sea ice area and other variables on a polar projection." + ] + }, + { + "cell_type": "markdown", + "id": "4fa4bed0-8207-4cb6-ae96-2507b56f7aef", + "metadata": {}, + "source": [ + "The first step is to grab sea ice (CICE) history files from your CESM model run" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da58ab48-2fc9-4bd8-8892-2af0782f1e59", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Set your username here:\n", + "username = \"PUT_USER_NAME_HERE\"\n", + "\n", + "# Here we point to the archive directory from your b1850.run_length simulation\n", + "monthly_output_path = f\"/glade/derecho/scratch/{username}/archive/b1850.run_length/ice/hist\"\n", + "\n", + "# If you were unable to successfully run the b1850.run_length simulation, then feel free to use\n", + "# this provided simulation data instead:\n", + "#monthly_output_path = \"/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.run_length/ice/hist\"\n", + "\n", + "# Name of CESM run\n", + "run_name = \"b1850.run_length\"\n", + "\n", + "# Create path to all files, including unix wild card for all dates\n", + "files = os.path.join(monthly_output_path, run_name + \".cice.h.*\")\n", + "\n", + "# read in files as an xarray dataset:\n", + "ds = xr.open_mfdataset(files)\n", + "\n", + "### For this analysis, choose which variable to keep. Start with `aice` and then later try `hi`\n", + "var_in = 'aice' # sea ice concentration\n", + "#var_in = 'hi' # sea ice thickness\n", + "\n", + "var_to_keep = ds[var_in]\n", + "\n", + "print(var_to_keep)" + ] + }, + { + "cell_type": "markdown", + "id": "ded5a0a7-9e8f-4e00-8f5e-383c68cdb201", + "metadata": {}, + "source": [ + "The next step is to read in some grid information for the `gx1v7` dipole grid used in POP and CICE. We will read in three main variables: `tarea`, `TLAT`, and `TLON`. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Also, we will print the longitude array `TLONG` to see the metadata." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19cf3c69-1a1d-467e-8071-e2be50d33150", + "metadata": {}, + "outputs": [], + "source": [ + "# get pop grid grid cell areas\n", + "grid = pop_tools.get_grid('POP_gx1v7')\n", + "\n", + "# convert tarea to m^2\n", + "with xr.set_options(keep_attrs=True):\n", + " grid['TAREA'] = grid['TAREA']/(1e4)\n", + "grid['TAREA'].attrs['units'] = 'm^2'\n", + "\n", + "grid\n", + "\n", + "grid['TLONG']" + ] + }, + { + "cell_type": "markdown", + "id": "b89ce1e7-cad5-4b14-a95b-58de981e73c7", + "metadata": {}, + "source": [ + "We will merge in three main variables: `TAREA`, `TLAT`, and `TLON`. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Note that this overwrites the dataset object from above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e6d86e3-2876-4c79-9cc8-8c02f935deb9", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.merge([var_to_keep.drop(['TLAT', 'TLON', 'ULAT', 'ULON']),\n", + " grid[['TLAT', 'TLONG', 'TAREA']].rename_dims({'nlat':'nj','nlon':'ni'})],\n", + " compat='identical', combine_attrs='no_conflicts')\n", + "grid['TLAT']" + ] + }, + { + "cell_type": "markdown", + "id": "101ce439-4fd7-412b-9f1d-1e7f34060747", + "metadata": {}, + "source": [ + "The next step is to set up the northern hemisphere polar stereographic projection for plotting the sea ice variable. We start with sea ice concentration `aice`. We are using a \"rainbow\" colormap here and cutting off the plot with a circular boundary. Note that we are only plotting the first timeslice of the `aice` array here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28a0da20-6bad-45d7-a61a-43d55ea2acd2", + "metadata": {}, + "outputs": [], + "source": [ + "# make circular boundary for polar stereographic circular plots\n", + "theta = np.linspace(0, 2*np.pi, 100)\n", + "center, radius = [0.5, 0.5], 0.5\n", + "verts = np.vstack([np.sin(theta), np.cos(theta)]).T\n", + "circle = mpath.Path(verts * radius + center)\n", + "\n", + "# define the colormap\n", + "cmap = plt.cm.get_cmap('rainbow') \n", + "\n", + "# set up the figure with a North Polar Stereographic projection\n", + "fig = plt.figure(figsize=(20,20))\n", + "ax = fig.add_subplot(1,2,1, projection=ccrs.NorthPolarStereo())\n", + "ax.set_boundary(circle, transform=ax.transAxes)\n", + "ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')\n", + "\n", + "# sets the latitude / longitude boundaries of the plot\n", + "ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())\n", + "\n", + "#Plot the first timeslice of aice\n", + "this=ax.pcolormesh(ds['TLONG'],\n", + " ds['TLAT'],\n", + " ds[var_in].isel(time=0).squeeze(),\n", + " cmap=cmap,vmax=1,vmin=0,\n", + " transform=ccrs.PlateCarree())\n", + "plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)\n", + "plt.title('Sea Ice Concentration',fontsize=20)" + ] + }, + { + "cell_type": "markdown", + "id": "0ed4273f-6855-40fd-b69f-03d78fcde11f", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/basics_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "24071060-19f0-467c-9835-221ce0456333", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Why is the scale from 0-1 for `aice`?" + ] + }, + { + "cell_type": "markdown", + "id": "5c5c4859-c3de-4160-a2e2-cc6d8293173a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The variable `aice` is actually ice fraction. To convert it to concentration you would need to multipy it by 100. In the rest of these notebooks we use the ice fraction fairly interchangeably with ice concentration. But if you are plotting these you should check your range and see if the maximum value is 1 or 100 because that's important for setting colorbar limits.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "032392b9-ebb9-4fc2-83a7-991d15248f15", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What month did you plot above? How could you plot the September ice concentration? (Remember that the monthly files are written at the last timestep of the month, so the June files are written out on July 1 at 00Z)." + ] + }, + { + "cell_type": "markdown", + "id": "6090f64c-0763-46af-b345-ae4c6d4979e0", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "You can check the date plotted by using the following command.\n", + " \n", + "```python\n", + "ds['aice'].isel(time=0).time\n", + "\n", + "```\n", + "\n", + "You should see that the date is Feb.1 of year 1 at 00Z. Which means it is the January mean sea ice concentration. To plot the September mean sea ice concentration, use the timeslice `time=8`.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "90114326-683d-4c15-9a60-d3a49545cc7a", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What do you think of that rainbow colormap? Try other colormaps like `viridis`, `plasma`, `Blues`. Note that if you add the string `_r` to the colormap name it will reverse the colormap. What is a more intutitive map for plotting sea ice concentration?" + ] + }, + { + "cell_type": "markdown", + "id": "bce3bc22-5c2d-4f6b-85c4-b742ff4e6584", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "We think the reversed Blues colormap is more intuitive.\n", + " \n", + "```python\n", + "cmap = plt.cm.get_cmap('Blues_r') \n", + "\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1d05d033-37b9-439f-8aa9-0d5727612a73", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Can you plot the annual mean over the data? What about computing the September mean over the data and plotting that?" + ] + }, + { + "cell_type": "markdown", + "id": "997afdf3-a145-4ca7-98d0-8e3ca3cdba5e", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Try entering the following data to plot in the `pcolormesh` function.\n", + " \n", + "```python\n", + "ds['aice'].mean(dim='time').squeeze(),\n", + "\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f99f305c-be5a-44de-8c19-72551c10b51e", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "You have plotted the sea ice concentration (`aice`), now try plotting the thickness (`hi`). Note that the units of thickness are in meters, so think about how you should adjust the colorbar range to be sensible? Note that you will have to change the `var_in` at the top of this section." + ] + }, + { + "cell_type": "markdown", + "id": "58760c0a-ed62-40a0-b315-a018741de8cd", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "After selecting `var_in = hi`, run through the following cells. Then check different ranges for `vmax` that might make more sense for the sea ice thickness (e.g. `vmax=5`)\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "5ed91922-b419-4685-84e2-62c49a57a135", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "All of the previous plots were of the Northern Hemisphere. How would you plot the Southern Hemisphere? How might you want to consider the seasonality if you're looking at Antarctic sea ice?" + ] + }, + { + "cell_type": "markdown", + "id": "32e34c3e-b7b4-4da1-b297-f34cfe0a6a72", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Use the following to plot the Southern Hemisphere\n", + " \n", + "```\n", + "ax = fig.add_subplot(1,2,1, projection=ccrs.SouthPolarStereo())\n", + "\n", + "ax.set_extent([0.005, 360, -90, -55], crs=ccrs.PlateCarree())\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "42b295a0-4675-4d4e-814f-5aac53b90973", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 2: Plot a time series of total sea ice area." + ] + }, + { + "cell_type": "markdown", + "id": "c0dd3647-5e9e-4d57-8cfb-4e0f073a269c", + "metadata": {}, + "source": [ + "The next few steps read in sea ice concentration or (`aice`) from one of the CESM2 large ensemble historical runs. Note this operation points to multiple files on the campaign file system, so we are using the `xarray` function `open_mfdataset` for a multifile dataset. We will also print the `aice` dataset to get an idea of the metadata and dimensions. Note that we could use the output from the tutorial simulations. However, those runs are very short and thus are not a very interesting timeseries. Instead we will use one of the CESM2 Large Ensemble historical simulations, as described in [Rodgers et al. 2021](https://doi.org/10.5194/esd-12-1393-2021)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3f591cc-dd67-4a3f-abe7-bfc740743db1", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# First remove the old 'ds' variable:\n", + "del ds\n", + "\n", + "### Here we point to the CESM2-LE datasets on campaign disk\n", + "\n", + "monthly_output_path = \"/glade/campaign/cgd/cesm/CESM2-LE/ice/proc/tseries/month_1\"\n", + "run_name = \"b.e21.BHISTcmip6.f09_g17.LE2-1001.001\"\n", + "\n", + "\n", + "\n", + "### For this we will use the sea ice concentration (aice) and ice thickness (hi)\n", + "\n", + "var_names = ['aice',\n", + " 'hi',\n", + " ]\n", + "\n", + "### This piece of code opens the files and combines them into a single xarray dataset\n", + "\n", + "da_list = []\n", + "\n", + "for var_name in var_names:\n", + " files = os.path.join(monthly_output_path, var_name,\n", + " run_name + \".cice.h.\" + var_name + \".*\")\n", + " ds_in = xr.open_mfdataset(files)\n", + " da_list.append(ds_in[var_name])\n", + " del ds_in\n", + "\n", + "ds = xr.merge(da_list)\n", + "\n", + "del da_list\n", + "\n", + "aice = ds['aice']\n", + "\n", + "print(aice)" + ] + }, + { + "cell_type": "markdown", + "id": "d38f2b64-72e7-4021-810b-8124062985b8", + "metadata": {}, + "source": [ + "The next step is to read in some grid information for the `gx1v7` dipole grid used in POP and CICE. We will read in three main variables: `TAREA`, `TLAT`, and `TLON`. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Also, we will print the area array `TAREA` to see the metadata." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "560ec8fb-7200-460e-a240-538dc223509d", + "metadata": {}, + "outputs": [], + "source": [ + "# get pop grid grid cell areas\n", + "grid = pop_tools.get_grid('POP_gx1v7')\n", + "\n", + "# convert tarea to m^2\n", + "with xr.set_options(keep_attrs=True):\n", + " grid['TAREA'] = grid['TAREA']/(1e4)\n", + "grid['TAREA'].attrs['units'] = 'm^2'\n", + "\n", + "grid\n", + "\n", + "grid['TAREA']" + ] + }, + { + "cell_type": "markdown", + "id": "2bb581ad-11b2-4682-be94-98c9eeedd11d", + "metadata": {}, + "source": [ + "We will merge in three main variables: `TAREA`, `TLAT`, and `TLON`. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Note that this overwrites the dataset object from above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ddcac5a-2e22-470a-8243-a3219d0488be", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.merge([aice.drop(['TLAT', 'TLON', 'ULAT', 'ULON']),\n", + " grid[['TLAT', 'TLONG', 'TAREA']].rename_dims({'nlat':'nj','nlon':'ni'})],\n", + " compat='identical', combine_attrs='no_conflicts')\n", + "grid['TLAT']" + ] + }, + { + "cell_type": "markdown", + "id": "9aa682c3-d6ed-4188-885f-d34268deac50", + "metadata": {}, + "source": [ + "The next step is to compute the ice area in each grid cell by multiplying the grid cell areas by the ice area fraction. Then we subset to just grid cells in the Northern hemisphere (using `where`). Finally, we sum over all of the grid cells. We can do these operations in a single line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab1c8910-677e-4345-8f06-ec3f7a4a9f07", + "metadata": {}, + "outputs": [], + "source": [ + "ds_area = (ds.TAREA*ds.aice).where(ds.TLAT>0).sum(dim=['nj','ni'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d177fa4-70c3-4f58-8b2f-4b9193ee3cbe", + "metadata": {}, + "outputs": [], + "source": [ + "ds_area.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "8d7a8183-ab18-4fbc-a542-43d01a53f75f", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/basics_plot_2.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9efb6f20-f442-42b6-a838-c0af66a98ba6", + "metadata": {}, + "source": [ + "This plot looks very noisy! Why do you think this is? Hint: you have plotted how many years of monthly mean data? Let's try just plotting September instead.\n", + "\n", + "**Question:** Why do we use month 10 (`ds_area.time.dt.month.isin([10])`) to reference September data?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90d62f0a-e43b-4bad-a759-0133bc2860aa", + "metadata": {}, + "outputs": [], + "source": [ + "ds_area.sel(time=ds_area.time.dt.month.isin([10])).plot()" + ] + }, + { + "cell_type": "markdown", + "id": "83148fbe-aa53-41fe-b8fd-aeb7c2a5dc0c", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/basics_plot_3.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "5ea1c8b6-19b9-441d-ae08-82db58ddb90a", + "metadata": {}, + "source": [ + "Now let's plot the observational data on top. The NSIDC Sea Ice Index will be the values we want. These are computed from satellite observations. More information can be found here: [Sea Ice Index](https://nsidc.org/data/seaice_index)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de2232e9-2705-4894-b98a-a93082ae7f79", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "##### Add the data values manually from the datafile.\n", + "##### Create an xarray object with the NSIDC values and the years from 1979 to 2022.\n", + "\n", + "seaice_index = [4.58,4.87,4.44,4.43,4.7,4.11,4.23,4.72,5.64,5.36,4.86,4.55,4.51,5.43,4.58,5.13,4.43,5.62,\\\n", + " 4.89,4.3,4.29,4.35,4.59,4.03,4.05,4.39,4.07,4.01,2.82,3.26,3.76,3.34,3.21,2.41,3.78,3.74,\\\n", + " 3.42,2.91,3.35,3.35,3.17,2.83,3.47,3.47]\n", + "\n", + "# Convert to m^2\n", + "seaice_index = np.array(seaice_index)\n", + "seaice_index *= 1e12\n", + "\n", + "nsidc_time = [cftime.datetime(y, 10, 15) for y in range(1979,2023)]\n", + "\n", + "nsidc_index = xr.DataArray(data=seaice_index,coords={\"time\":nsidc_time})\n", + "\n", + "nsidc_index\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00fc5097-af7d-4cf2-94ab-bb4e0a63960c", + "metadata": {}, + "outputs": [], + "source": [ + "ds_area.sel(time=ds_area.time.dt.month.isin([10])).plot()\n", + "nsidc_index.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "6193d89f-ce8a-48df-aaf1-cb291f360dcc", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/cice/basics_plot_4.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "eea0e9cc-1769-45ad-9461-c9d3d8c51264", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Why do you think the observed (orange) does not perfectly correspond to the model? " + ] + }, + { + "cell_type": "markdown", + "id": "f07628e0-6c6a-4f7d-89f2-e2f115e586a9", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The model is one of 100 ensemble realizations of the 20th century and evolves independently, meaning each simulation has different weather and that weather will almost certainly be different from the observations. It will not, and should not, exactly match the observations because the climate system is chaotic.\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "412e002b-6a7f-4604-93fa-dfa7718ab2e3", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What do you think you'll see if you plot the March total area timeseries?" + ] + }, + { + "cell_type": "markdown", + "id": "ed26c32a-79e4-4842-8ca7-ca4ec6f68b2a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "March total area.\n", + "```\n", + "ds_area.sel(time=ds_area.time.dt.month.isin([4])).plot()\n", + "```\n", + "This should be higher mean and have a negative, but smaller, trend than the September trend. \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c4f36db3-ca0f-4f6b-9b60-9e618222d0b8", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Try computing total ice volume and plotting it." + ] + }, + { + "cell_type": "markdown", + "id": "9e96388f-b421-4a3c-b719-c83908e36f30", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "To calculate ice volume, use the variable `hi` in place of `aice`. Note that volume is units of $m^3$. So, you might want to scale the volume by $1.0e-13$.\n", + " \n", + "```\n", + "ds_vol = (ds.TAREA*ds.hi).where(ds.TLAT>0).sum(dim=['nj','ni'])\n", + "``` \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "2ce5c6f9-4272-4a8c-9b7b-3e6a31a5a708", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What does the Southern Hemisphere sea ice area and volume look like?" + ] + }, + { + "cell_type": "markdown", + "id": "7e921a48-2488-45f9-a7a4-ec860e7e21ec", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "To calculate the Southern Hemisphere total area or volume, set the following values so that you only include points where the latitude is *less than* zero.\n", + "```\n", + "ds_area = (ds.TAREA*ds.aice).where(ds.TLAT<0).sum(dim=['nj','ni'])\n", + "``` \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25cf9352-2ee8-4b2b-ae7f-d7edc764977a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023a", + "language": "python", + "name": "npl-2023a" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/cice/cice.ipynb b/_sources/notebooks/diagnostics/cice/cice.ipynb new file mode 100644 index 000000000..f793a813b --- /dev/null +++ b/_sources/notebooks/diagnostics/cice/cice.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Sea Ice" + ] + }, + { + "cell_type": "markdown", + "id": "30ca3a26-9666-433a-b9d6-852999d9455e", + "metadata": {}, + "source": [ + "## Basic Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "### Learning Goals\n", + "\n", + "- Making polar projection plots\n", + "- Understanding sea ice variables such as concentration and thickness\n", + "- Masking and area averaging\n", + "- Computing total sea ice area or volume" + ] + }, + { + "cell_type": "markdown", + "id": "e73ce5d6-d2b1-4f32-b64f-337a1b02e2d0", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 1: Making polar projection plots of sea ice concentration.\n", + "\n", + "Here we will use some custom python tools to produce a polar projection plot of sea ice concentration. Some things to try include changing the colormap, plotting sea ice thickness instead of concentration, and changing hemispheres." + ] + }, + { + "cell_type": "markdown", + "id": "815e0869-0518-4cf9-9417-cd9b08965ca1", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 2: Compute total sea ice area and plot versus time.\n", + "\n", + "Here will we learn how to compute the total sea ice area for the northern hemisphere. Then plot this versus time. Some exercises will be plotting the monthly mean sea ice area, plotting just September or March mean sea ice area, or computing sea ice volume and then plotting it.\n" + ] + }, + { + "cell_type": "markdown", + "id": "27dafcc2-beec-4d75-920f-a60f46fff27b", + "metadata": {}, + "source": [ + "_______________\n", + "## Advanced Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "c494a32c-cd81-4a0a-b290-eb0835919532", + "metadata": { + "tags": [] + }, + "source": [ + "### Learning Goals\n", + "\n", + "- Using sea ice thickness distribution (ITD) category information\n", + "- Using sea ice tracers\n", + "- Remapping sea ice fields." + ] + }, + { + "cell_type": "markdown", + "id": "850641b7-2a63-4a20-8a26-d18a400c6160", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 1: Plot per-category ice area\n", + "\n", + "Here you will plot a field that uses the subgridscale ice thickness distribution (ITD) categories." + ] + }, + { + "cell_type": "markdown", + "id": "9fc458d8-6ea2-461f-b4d3-6808accfca41", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 2: Plot per-category snow thickness\n", + "\n", + "Here is another example of an ITD related field, the snow thickness. Actual snow thickness is derived from the snow volume (per unit area)." + ] + }, + { + "cell_type": "markdown", + "id": "4a75149d-ef7b-4b89-91b5-4daec351d95c", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 3: Plot ice area related tracer\n", + "\n", + "In this exercise you will learn about a variable related to the ice covered area of a grid cell instead of the grid cell mean.\n" + ] + }, + { + "cell_type": "markdown", + "id": "82beac53-81f6-494f-ba15-b1718e14421b", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 4: Remapping or regridding sea ice fields\n", + "\n", + "The ocean and sea ice grids are different in that the North Pole is moved into land. In this exercise\n", + "you will learn how to \"remap\" or \"regrid\" a sea ice field onto a standard one degree by one degree grid." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5184b86-b584-451c-b37a-15d6f27be115", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/clm_ctsm/basics_clm.ipynb b/_sources/notebooks/diagnostics/clm_ctsm/basics_clm.ipynb new file mode 100644 index 000000000..1fb30077d --- /dev/null +++ b/_sources/notebooks/diagnostics/clm_ctsm/basics_clm.ipynb @@ -0,0 +1,926 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic Plotting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023a`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023a`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed primarily by Will Wieder and Peter Lawrence." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_______________\n", + "## Global Visualizations\n", + "\n", + "These are examples of typical variables and plots that we look at in our land model diagnostics package. You can see examples of output from the [land model dagnostics package here](https://www2.cesm.ucar.edu/experiments/cesm2.0/land/diagnostics/clm_diag_PCKG.html). The most current version of the land model diagnostics are in the CESM Postprocessing. More information here: [CESM Postprocessing](https://github.com/NCAR/CESM_postprocessing).\n", + "\n", + "\n", + "## Notebook Objectives\n", + "1. Become familiar with Jupyter Notebooks\n", + "2. Begin getting acquainted with python packages and their utilities\n", + "3. Plot a map and timeseries of global results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "****\n", + "History files from CESM are saved in netcdf format (denoted with the `.nc` file extension), a file format commonly used for storing large, multi-dimensional scientific variables.\n", + "Netcdf files are platform independent and self-describing; each file includes metadata that describes the data, including: **variables**, **dimensions**, and **attributes**.\n", + "\n", + "The figure below provides a generic example of the data structure in a netcdf file. The dataset illustrated has two variables (temperature and pressure) that have three dimensions. Coordinate data (e.g., latitude, longitude, time) that describe the data are also included. \n", + "\n", + "*Note that each simulation file has multiple variables. Within each `h0` file, most of the variables have three dimensions (lat x lon x time), while a few soil variables (e.g., moisture, temperature) have 4 dimensions (lat x lon x time x depth).*\n", + "\n", + "![Netcdf](https://xarray.pydata.org/en/stable/_images/dataset-diagram.png)\n", + "****\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*We'll start by loading some packages*\n", + "\n", + "The first step is to import the libraries needed to plot the data. Here we will use `xarray` as a tool to read the netCDF file. We will use `numpy` for some basic math calculations. For plotting the data we will need `matplotlib` and `cartopy`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# python packages\n", + "import os\n", + "import xarray as xr\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# resources for plotting\n", + "import matplotlib.pyplot as plt\n", + "import cartopy\n", + "import cartopy.crs as ccrs\n", + "import cftime\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "NOTE: This example largely uses features of xarray and \n", + " matplotlib packages. We won't go into the basics \n", + " of python or features included in these packages, but there are lots of \n", + " resources to help get you started. Some of these are listed below. \n", + "\n", + "
\n", + "\n", + "- [NCAR python tutorial](https://ncar.github.io/python-tutorial/tutorials/yourfirst.html), which introduces python, the conda package manager, and more on github.\n", + "- [NCAR ESDS tutorial series](https://ncar.github.io/esds/blog/tag/python-tutorial-series/), features several recorded tutorials on a wide variety of topics.\n", + "- [Project Pythia](https://projectpythia.org/) links to lots of great resources!\n", + "- [GeoCAT examples](https://geocat-examples.readthedocs.io/en/latest/), with some nice plotting examples\n", + "\n", + "***" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Reading and formatting data\n", + "\n", + "**Note**: the drop-down solutions, below, assume you used b1850.run_length output for plotting for this section" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.1 Point to the data\n", + "The first step is to grab land (CTSM) history files from your CESM model run\n", + "\n", + "For this example we will use:\n", + "- reflected solar radiation (FSR), \n", + "- incident solar radiation (FSDS), and\n", + "- exposed leaf area index (ELAI)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set your username here:\n", + "username = \"PUT_USER_NAME_HERE\"\n", + "\n", + "# Here we point to the archive directory from your b1850.run_length simulation\n", + "monthly_output_path = f\"/glade/derecho/scratch/{username}/archive/b1850.run_length/lnd/hist\"\n", + "\n", + "# If you were unable to successfully run the b1850.run_length simulation, then feel free to use\n", + "# this provided simulation data instead:\n", + "#monthly_output_path = \"/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.run_length/lnd/hist\"\n", + "\n", + "# Name of CESM run\n", + "run_name = \"b1850.run_length\"\n", + "\n", + "# Create path to all files, including unix wild card for all dates\n", + "files = os.path.join(monthly_output_path, run_name + \".clm2.h0.*\")\n", + "\n", + "# read in files as an xarray dataset:\n", + "ds = xr.open_mfdataset(files)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "NOTE: These are the raw history files that CTSM writes out. \n", + "\n", + "By default, they include grid cell averaged monthly means for different state and flux variables.\n", + "\n", + "
\n", + " TIP: If you want to look at other variables, the fields variable in the cell below is where you can modify what we're reading off of the CLM history files.\n", + "
\n", + "\n", + "#### Printing information about the dataset is helpful for understanding your data. \n", + "- *What dimensions do your data have?*\n", + "- *What are the coordinate variables?*\n", + "- *What variables are we looking at?*\n", + "- *Is there other helpful information, or are there attributes in the dataset we should be aware of?*\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Print information about the dataset\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also print information about the variables in your dataset. The example below prints information about one of the data variables we read in. You can modify this cell to look at some of the other variables in the dataset.\n", + "\n", + "*What are the units, long name, and dimensions of your data?*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.FSDS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.2 Simple Calculations\n", + "To begin with we'll look at albedo that's simulated by the model. \n", + "\n", + "Albedo can be calculated in several different ways, but the calculations use solar radiation terms that are handled within CTSM.\n", + "\n", + "Here we'll look at 'all sky albedo', which is the ratio of reflected to incoming solar radiation (**FSR/FSDS**).\n", + "Other intereresting variables might include latent heat flux or gross primary productivity. \n", + "\n", + "We will add this as a new variable in the dataset and add appropriate metadata.\n", + "\n", + "*When doing calculations, it is important to avoid dividing by zero. Use the `.where` function for this purpose*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds['ASA'] = ds.FSR/ds.FSDS.where(ds.FSDS>0)\n", + "ds['ASA'].attrs['units'] = 'unitless'\n", + "ds['ASA'].attrs['long_name'] = 'All sky albedo'\n", + "ds['ASA']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Plotting\n", + "### 2.1 Easy plots using Xarray\n", + "To get a first look at the data, we can plot a month of data from the simulation, selecting the month using the `.isel` function.\n", + "\n", + "
\n", + " NOTE: The plotting function only works with 1D or 2D data. Our data are 3D (time, lat, lon), so we need to specify a specific value for the other variables. Below, we select a specific time using the isel, leaving the lat and lon dimensions to plot on the x and y axes.\n", + "
\n", + "\n", + "- We will plot all sky albedo (variable = `ASA`). Note that we select the variable by specifying our dataset, `ds`, and the variable. \n", + "- The plot is for the first year of data (`time=slice(0,12)`)\n", + "- This plotting function will plot `ASA` for each simulation in our dataset\n", + "\n", + "*More plotting examples are on the [xarray web site](https://docs.xarray.dev/en/latest/user-guide/plotting.html)*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.ASA.isel(time=slice(0,12)).plot(x='lon',y='lat',col=\"time\", col_wrap=6) ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Question:** \n", + "\n", + "Why don't you see the whole globe in some months?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2 Calculating differences\n", + "\n", + "We can calculate the differences between the beginning and end of the simulation to see the differences in albedo over the simulation period. The below code:\n", + "- Calculates a monthly climatology for the first and last full year of the simulation\n", + "- Defines the difference as a new variable, `dsDiff`\n", + "\n", + "We'll first plot maps of the difference in all sky albedo for each month" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dsIni = ds.isel(time=slice(0,12)).groupby('time.month').mean()\n", + "dsFin = ds.isel(time=slice(-16,-4)).groupby('time.month').mean()\n", + "dsDiff = dsFin-dsIni\n", + "dsDiff.ASA.plot(x='lon',y='lat',col=\"month\", col_wrap=6, robust=True) ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_2.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Questions:** \n", + "- How is albedo different at the end of the simulation, relative to the begining of simulation?\n", + "- Where are the differences the largest? \n", + "- Are the differences consistent throughout the year?\n", + "- **What's causing these albedo changes** in different regions?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Are the differences coming from incoming or reflected radiation? \n", + "To find out, we can plot each variable. First we will plot incoming radiation (the denominator in all-sky albedo)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dsDiff.FSDS.plot(x='lon',y='lat',col=\"month\", col_wrap=6, vmax=30.0,vmin=-30.0) ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_3.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Questions:**\n", + "- Do you see any dfferences? \n", + "- Try plotting reflected radiation (the numerator, FSR). What differences do you see? \n", + "\n", + "*Note that you might want to change the minimun (`vmin`) and maximum (`vmax`) colorbar values for the plot when you switch between variables*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Is exposed leaf area index (ELAI) contributing to the differences in albedo?\n", + "Plot the differences in ELAI below. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dsDiff.ELAI.plot(x='lon',y='lat',col=\"month\", col_wrap=6, robust=True) ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_4.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Questions:** \n", + "- What regions are LAI differences the greatest?\n", + "- What times of year is this true?\n", + "- Are the regions and times of largest differences the same as the differences in albedo? " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.3 Calculating Time Series\n", + "\n", + "**Note**: the drop-down solutions, below, assume you used CESM2 Large Ensemble output for plotting for this section\n", + "\n", + "\n", + "As above, the plotting function we use here requires data to be 1D or 2D. Therefore, to plot a time series we either need to select a single point or average over an area.\n", + "\n", + "#### 2.3.1 Time series at a single point\n", + "This example uses `.sel`, which functions similarly to the `.isel` function above, to select a single point in the Amazon. \n", + "\n", + "*What's the difference between `.sel` and `.isel`?*\n", + "- *`.sel` selects a value of a variable (e.g., latitude of -5)*\n", + "- *`.isel` selects an indexed point of a variable (e.g., the 6th point in the data vector)*\n", + "\n", + "In the below examples, we'll also use subplots to see multiple variables in several panels\n", + "\n", + "Also, the next few steps read in land model data from one of the CESM2 large ensemble historical runs. Note this operation points to multiple files on the campaign file system, so we are using the `xarray` function `open_mfdataset` for a multifile dataset. We will also print the dataset to get an idea of the metadata and dimensions. Note that we could use the output from the tutorial simulation. However, those runs are very short and thus are not a very interesting timeseries. Instead we can use one of the CESM2 Large Ensemble historical simulations (see [Rodgers et al. 2021](https://doi.org/10.5194/esd-12-1393-2021))." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#First remove the old datasets\n", + "del ds\n", + "del dsDiff\n", + "\n", + "### Here we point to the CESM2-LE datasets on campaign disk and \n", + "### Look at results from a single ensemble member\n", + "\n", + "monthly_output_path = \"/glade/campaign/cgd/cesm/CESM2-LE/lnd/proc/tseries/month_1\"\n", + "run_name = \"b.e21.BHISTcmip6.f09_g17.LE2-1001.001\"\n", + "\n", + "var_names = ['FSR','FSDS','ELAI']\n", + "\n", + "### This piece of code opens the files and combines them into a single xarray dataset\n", + "\n", + "da_list = []\n", + "\n", + "for var_name in var_names:\n", + " files = os.path.join(monthly_output_path, var_name,\n", + " run_name + \".clm2.h0.\" + var_name + \".*\")\n", + " ds_in = xr.open_mfdataset(files)\n", + " # keep history file attributes: This only needs to be done once\n", + " if var_name == 'FSR':\n", + " da_list.append(ds_in)\n", + " else: \n", + " da_list.append(ds_in[var_name])\n", + " del ds_in\n", + "\n", + "''' quick fix to adjust time vector for monthly data'''\n", + "def fix_time(ds): \n", + " nmonths = len(ds.time)\n", + " yr0 = ds['time.year'][0].values\n", + " ds['time'] =xr.cftime_range(str(yr0),periods=nmonths,freq='MS') \n", + "\n", + " return ds\n", + "\n", + "ds = fix_time(xr.merge(da_list))\n", + "\n", + "print('-- Your dataset is been opened --')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Print information about the dataset\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Calculate Albedo and add to dataset\n", + "ds['ASA'] = ds.FSR/ds.FSDS.where(ds.FSDS>0)\n", + "ds['ASA'].attrs['units'] = 'unitless'\n", + "ds['ASA'].attrs['long_name'] = 'All sky albedo'\n", + "ds['ASA']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "point = ds.sel(lon=300, lat=-5, method='nearest')\n", + "point.ASA.plot(x='time') ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_5.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similar to the maps above, there are variations in albedo in the simulation at this location. Let's add other variables to explore why we see differences at this location. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,6))\n", + "'''this first plot is the same as the one above'''\n", + "plt.subplot(221)\n", + "point.ASA.plot()\n", + "plt.xlabel(None)\n", + "\n", + "'''now we'll look for potential sources of the difference'''\n", + "plt.subplot(222)\n", + "point.ELAI.plot() \n", + "plt.xlabel(None)\n", + "\n", + "plt.subplot(223)\n", + "point.FSDS.plot() \n", + "plt.title(None)\n", + "\n", + "plt.subplot(224)\n", + "point.FSR.plot() \n", + "plt.title(None) ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_6.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Questions:** \n", + "- What variables show differences?\n", + "- What variables are similar?\n", + "- How do the differences and similarities help to explain the differences in albedo?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.3.2 Global time series\n", + "There are many reasons why we may want to calculate globally integrated time series for particular variables.\n", + "This requires weighting the values from each grid cell by the total land area of individual grid cells. The example below does this for our dataset. \n", + "\n", + "#### First calculate the land weights:\n", + "- land area `la` that is the product of land fraction (fraction of land area in each grid cell) and the total area of the grid cell (which changes by latitude). Units are the same as area.\n", + "- land weights `lw`, the fractional weight that each grid makes to the global total, is calculated as the land area of each grid cell divided by the global sum of the land area.\n", + "\n", + "The land weights are shown in the plot below. Note that these are larger near the equator, and smaller at the poles and along the coastline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "la = (ds.landfrac*ds.area).isel(time=0).drop(['time']) \n", + "la = la * 1e6 #converts from land area from km2 to m2 \n", + "la.attrs['units'] = 'm^2'\n", + "lw = la/la.sum()\n", + "lw.plot() ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_7.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Next, calculate and plot a global weighted sum\n", + "
\n", + "\n", + "NOTE: You will likely want to calculate global weighted sum for a variety of different variables. For variables that have area-based units (e.g. GPP, gC/m^2/s), you need to use the land area variable when calculating a global sum. Remember to pay attention to the units and apply any necessary conversions! Keep in mind that grid cell area is reported in km^2. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dsGlobalWgt = (ds * lw).sum(['lat','lon'])\n", + "\n", + "plt.figure(figsize=(12,5))\n", + "plotVars = ['ASA','FSDS','ELAI','FSR']\n", + "for i in range(len(plotVars)):\n", + " # First add metadata for plotting\n", + " dsGlobalWgt[plotVars[i]].attrs['long_name'] = ds[plotVars[i]].attrs['long_name']\n", + " dsGlobalWgt[plotVars[i]].attrs['units'] = ds[plotVars[i]].attrs['units']\n", + "\n", + " # then make plots\n", + " plt.subplot(2,2,(i+1))\n", + " dsGlobalWgt[plotVars[i]].plot()\n", + " \n", + " if i == 0:\n", + " plt.title('Weighted global sum',loc='left', fontsize='large', fontweight='bold')\n", + " \n", + " if i<2:\n", + " plt.xlabel(None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_8.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "### 2.4 Calculate an annual weighted mean and create customized plots\n", + "Annual averages require a different kind of weighting: the number of days per month.\n", + "This example creates python functions that allow you to easily calculate annual averages and create customized plots. \n", + "\n", + "
\n", + "\n", + "Python functions: In python, creating a function allows us to use the same calculation numerous times instead of writing the same code repeatedly.\n", + "
\n", + "\n", + "\n", + "#### 2.4.1 Calculate monthly weights\n", + "The below code creates a function `weighted_annual_mean` to calculate monthly weights. Use this function any time you want to calculate weighted annual means." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create a function that will calculate an annual mean weighted by days per month\n", + "def weighted_annual_mean(array):\n", + " mon_day = xr.DataArray(np.array([31,28,31,30,31,30,31,31,30,31,30,31]), dims=['month'])\n", + " mon_wgt = mon_day/mon_day.sum()\n", + " return (array.rolling(time=12, center=False) # rolling\n", + " .construct(\"month\") # construct the array\n", + " .isel(time=slice(11, None, 12)) # slice so that the first element is [1..12], second is [13..24]\n", + " .dot(mon_wgt, dims=[\"month\"]))\n", + "\n", + "# generate annual means\n", + "for i in range(len(plotVars)):\n", + " temp = weighted_annual_mean(\n", + " ds[plotVars[i]].chunk({\"time\": 12}))\n", + " \n", + " if i ==0:\n", + " dsAnn = temp.to_dataset(name=plotVars[i])\n", + " else:\n", + " dsAnn[plotVars[i]] = temp\n", + "\n", + "# Make a simple plot\n", + "dsAnn.isel(time=0).ELAI.plot(x='lon',y='lat',robust=True) ;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_9.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dsAnn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.4.2 Customized maps\n", + "Creating a function isn't necessary to plot maps, but this function, which uses python's `cartopy`, allows you to make several pretty maps in one figure.\n", + "\n", + "Additional examples and information are available on the [cartopy website](https://scitools.org.uk/cartopy/docs/v0.15/index.html)\n", + "\n", + "There are two code blocks below. The first block of code defines the function. The second code block creates the plot. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import cartopy.feature as cfeature\n", + "from cartopy.util import add_cyclic_point\n", + "import copy\n", + "\n", + "# Generate a function for making panel plots of maps\n", + "## many of these features are not required, but provide additional control over plotting\n", + "def map_function(da, cb=0, cmap='viridis', panel=None, ax=None, \n", + " title=None, vmax=None, vmin=None, units=None,nbins=200):\n", + " '''a function to make one subplot'''\n", + " wrap_data, wrap_lon = add_cyclic_point(da.values, coord=da.lon)\n", + "\n", + " if ax is None: ax = plt.gca()\n", + "\n", + " # define the colormap, including the number of bins\n", + " cmap = copy.copy(plt.get_cmap(cmap,nbins))\n", + " im = ax.pcolormesh(wrap_lon,da.lat,wrap_data,\n", + " transform=ccrs.PlateCarree(),\n", + " vmax=vmax,vmin=vmin,cmap=cmap)\n", + "\n", + " # set the bounds of your plot\n", + " ax.set_extent([-180,180,-56,85], crs=ccrs.PlateCarree())\n", + "\n", + " # add title & panel labels\n", + " ax.set_title(title,loc='left', fontsize='large', fontweight='bold')\n", + " ax.annotate(panel, xy=(0.05, 0.90), xycoords=ax.transAxes,\n", + " ha='center', va='center',fontsize=16) \n", + "\n", + " # add plotting features\n", + " ax.coastlines()\n", + " ocean = ax.add_feature(\n", + " cfeature.NaturalEarthFeature('physical','ocean','110m', facecolor='white'))\n", + " \n", + " # control colorbars on each plot & their location\n", + " if cb == 1:\n", + " cbar = fig.colorbar(im, ax=ax,pad=0.02, fraction = 0.03, orientation='horizontal')\n", + " cbar.set_label(units,size=12,fontweight='bold')\n", + " if cb == 2:\n", + " cbar = fig.colorbar(im, ax=ax,pad=0.02, fraction = 0.05, orientation='vertical') \n", + " cbar.set_label(units,size=12)#,weight='bold')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Now make the plot!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "i = 0\n", + "fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(13,6), constrained_layout=True,\n", + " subplot_kw=dict(projection=ccrs.Robinson()))\n", + "for index, ax in np.ndenumerate(axes):\n", + " if i == 0:\n", + " plotData = dsAnn.ELAI.isel(time=slice(-10,None)).mean('time')\n", + " map_function(plotData, ax=ax,cb=2,\n", + " panel='(a)', nbins=10,\n", + " vmax=5,vmin=0,\n", + " units='Final Annual ELAI')\n", + " if i == 1:\n", + " plotData = (dsAnn.ELAI.isel(time=slice(-10,None)).mean('time')- \\\n", + " dsAnn.ELAI.isel(time=slice(0,10)).mean('time'))\n", + " map_function(plotData, ax=ax,cb=2,panel='(b)',\n", + " units='Annual ELAI Change, Final-Initial',\n", + " cmap='bwr',nbins=7,\n", + " vmax=0.75,vmin=-0.75) \n", + " \n", + " i = i+1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/clm_ctsm/basics_plot_10.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extra credit challenge\n", + "If you have extra time & energy, try running through this notebook with other variables. Interesting options could include: \n", + "- Latent heat flux (the sum of `FCTR`+`FCEV`+`FGEV`) or \n", + "- Gross Primary Production (`GPP`) \n", + "\n", + "
\n", + "\n", + "HINT: pay attention to units for these challenges. \n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023a", + "language": "python", + "name": "npl-2023a" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/_sources/notebooks/diagnostics/clm_ctsm/clm_ctsm.ipynb b/_sources/notebooks/diagnostics/clm_ctsm/clm_ctsm.ipynb new file mode 100644 index 000000000..4774ffe0d --- /dev/null +++ b/_sources/notebooks/diagnostics/clm_ctsm/clm_ctsm.ipynb @@ -0,0 +1,63 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Land" + ] + }, + { + "cell_type": "markdown", + "id": "6a0eda7f-8348-4a1e-8ada-86d9a70c3af6", + "metadata": {}, + "source": [ + "This notebook is an introduction to analyzing CLM land model results from a global simulation. It uses results from the case you ran in the 1a Tutorial. We've prestaged model results from this simulation and another simulation using a different model configuration in a shared directory. This way, you can get started on analyzing simulations results before your simulations finish running and compare differences caused by model structure. " + ] + }, + { + "cell_type": "markdown", + "id": "b6f4905b-cd2a-454e-89cf-ccc585c90247", + "metadata": { + "tags": [] + }, + "source": [ + "## Learning Goals\n", + "\n", + "- Read in global CLM data\n", + "- Make basic spatial plots\n", + "- Make basic timeseries plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e961b1bd-a1c8-4e54-bafc-46dcf78454f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/cupid.ipynb b/_sources/notebooks/diagnostics/cupid.ipynb new file mode 100644 index 000000000..5012a59c3 --- /dev/null +++ b/_sources/notebooks/diagnostics/cupid.ipynb @@ -0,0 +1,411 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6cbe06f3-0299-4db3-a02e-d4b27ffbd27e", + "metadata": {}, + "source": [ + "# CUPiD" + ] + }, + { + "cell_type": "markdown", + "id": "3c0aaa4a-ebf0-4c3c-a045-ee58d183ce45", + "metadata": {}, + "source": [ + "The CESM Unified Postprocessing and Diagnostics (CUPiD) package is a new python-based system for running post-processing routines and diagnostics across all CESM components with a common user and developer interface.\n", + "This notebook is a chance to try out CUPiD and run its' time series generation tool on your own model simulation. \n", + "\n", + "Note that the underlying python code is very similar to the routines shown in the component-specific diagnostics, which is why we recommend trying those notebooks first. Additional info, including the source code, can be found on [Github here](https://github.com/NCAR/CUPiD)." + ] + }, + { + "cell_type": "markdown", + "id": "d5f923bd-6d73-4e60-ac49-8295c96e585c", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `Bash`. This should be the default kernel, but if it is not, click on that button and select `Bash`." + ] + }, + { + "cell_type": "markdown", + "id": "4ac4bcb0-3b7c-488b-85d5-9c3c3802ab4e", + "metadata": {}, + "source": [ + "CUPiD is currently a command line tool. This means that instead of running python code directly, this notebook will run unix commands CUPiD provides in order to generate the relevant diagnostics. To start, we need to clone CUPiD from Github:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9bdbabd9-4479-440f-9f82-c97f57da3e90", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "#Delete old CUPiD directory if one exists:\n", + "if [ -d \"CUPiD\" ]; then\n", + " rm -rf CUPiD\n", + "fi\n", + "\n", + "#Clone CUPiD source code from Github repo:\n", + "git clone --recurse-submodules https://github.com/NCAR/CUPiD.git\n", + "cd CUPiD #Need to enter CUPiD directory for remaining commands" + ] + }, + { + "cell_type": "markdown", + "id": "efc83e39-b35d-4dd5-9411-7737ac648375", + "metadata": {}, + "source": [ + "We'll also need to grab some external libraries, which is done the same way as CESM via `checkout_externals`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13f43abf-a7cd-40fb-a55b-e68781282162", + "metadata": {}, + "outputs": [], + "source": [ + "./manage_externals/checkout_externals" + ] + }, + { + "cell_type": "markdown", + "id": "e30ceb39-d434-4520-a29b-e23343f633e0", + "metadata": {}, + "source": [ + "This downloads two additional diagnostics packages that CUPiD will use. One is the [AMWG Diagnostics Framework (ADF)](https://github.com/NCAR/ADF), which is a command-line tool that can be used to generate CAM diagnostics, and [mom6-tools](https://github.com/NCAR/mom6-tools.git), which is a python package that can be used to analyze MOM6, which is the ocean model that will be used in CESM3 (but for this tutorial we'll ignore)." + ] + }, + { + "cell_type": "markdown", + "id": "5b3c7314-4a6d-40a8-92b0-d3953335a0a6", + "metadata": {}, + "source": [ + "Next we need to setup the proper python environment using conda/mamba, and activate the `cupid-dev` environment:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d105bb3b-84bf-4e87-a6ab-8c2e8b40b57a", + "metadata": {}, + "outputs": [], + "source": [ + "#Load conda to your environment:\n", + "module load conda\n", + "\n", + "#Install 'cupid-dev' environment if it doesn't already exist:\n", + "if ! { conda env list | grep 'cupid-dev'; } >/dev/null 2>&1; then\n", + " mamba env create -f environments/dev-environment.yml\n", + "fi\n", + "\n", + "#Install 'cupid-analysis' environment if ti doesn't already exist:\n", + "if ! { conda env list | grep 'cupid-analysis'; } >/dev/null 2>&1; then\n", + " mamba env create -f environments/cupid-analysis.yml\n", + "fi\n", + "\n", + "#Activate CUPiD conda environemnt:\n", + "conda activate cupid-dev\n", + "#NOTE: You may see a red \": 1\" message below, but it can be ignored.\n", + "\n", + "#Check that cupid-run can be accessed appropriately:\n", + "which cupid-run\n", + "if [ $? -ne 0 ]; then\n", + " #If not then use pip to install:\n", + " pip install -e .\n", + "fi" + ] + }, + { + "cell_type": "markdown", + "id": "aa3bd9bc-fd0c-44d5-b80a-14a509d7ffb4", + "metadata": {}, + "source": [ + "CUPiD is controlled via a config YAML file. Here we create a new directory and write the relevant config file for our tutorial simulation. Please note that if your tutorial simulations didn't finish then you can use the provided simulations instead: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f515b255-d9a0-4dc6-87d3-95c34a2e2f0a", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "cd examples #Go to the examples directory\n", + "if ! [ -d \"cesm_tutorial\" ]; then #Check if CESM tutorial directory already exists.\n", + " mkdir cesm_tutorial #If not, then make a new directory to hold our config file\n", + "fi \n", + "cd cesm_tutorial #Go to newly made CESM tutorial example directory\n", + "cat << EOF > config.yml\n", + "################## SETUP ##################\n", + "\n", + "#NOTE: CUPiD ocean diagnostics are currently only designed for upcoming MOM6\n", + "# ocean model, so for this tutorial we will only do example atmosphere,\n", + "# land, and sea ice diagnostics.\n", + "\n", + "################\n", + "# Data Sources #\n", + "################\n", + "data_sources:\n", + " # sname is any string used as a nickname for this configuration. It will be\n", + " ### used as the name of the folder your computed notebooks are put in\n", + " sname: cesm_tutorial_quick_run\n", + "\n", + " # run_dir is the path to the folder you want\n", + " ### all the files associated with this configuration\n", + " ### to be created in\n", + " run_dir: .\n", + "\n", + " # nb_path_root is the path to the folder that cupid will\n", + " ### look for your template notebooks in. It doesn't have to\n", + " ### be inside run_dir, or be specific to this project, as\n", + " ### long as the notebooks are there\n", + " nb_path_root: ../nblibrary\n", + "\n", + "######################\n", + "# Computation Config #\n", + "######################\n", + "\n", + "computation_config:\n", + "\n", + " # default_kernel_name is the name of the environment that\n", + " ### the notebooks in this configuration will be run in by default.\n", + " ### It must already be installed on your machine. You can also\n", + " ### specify a different environment than the default for any\n", + " ### notebook in NOTEBOOK CONFIG\n", + "\n", + " default_kernel_name: cupid-analysis\n", + "\n", + "############# NOTEBOOK CONFIG #############\n", + "\n", + "############################\n", + "# Notebooks and Parameters #\n", + "############################\n", + "\n", + "# All parameters under global_params get passed to all the notebooks\n", + "\n", + "global_params:\n", + " CESM_output_dir: /glade/derecho/scratch/${USER}/archive\n", + " #Uncomment code here if you need a complete CESM tutorial simulation:\n", + " #CESM_output_dir: /glade/campaign/cesm/tutorial/tutorial_2023_archive\n", + " lc_kwargs:\n", + " threads_per_worker: 1\n", + "\n", + "timeseries:\n", + " # This section of the config file controls the time series generator, which\n", + " # takes standard CESM history (time-slice) files and converts them into single\n", + " # variable time series files.\n", + " \n", + " num_procs: 8\n", + " ts_done: [False]\n", + " overwrite_ts: [False]\n", + " ts_output_dir: /glade/derecho/scratch/${USER}/archive\n", + " case_name: 'b1850.run_length'\n", + "\n", + " #Variables can either be provided as a list (e.g. ['X', 'Y', 'Z']) or,\n", + " #if you want to convert everything on the file, by using the ['process_all']\n", + " #keyword. For the example below we'll only convert a single variable\n", + " #from each component.\n", + "\n", + " atm:\n", + " vars: ['TREFHT']\n", + " derive_vars: []\n", + " hist_str: 'h0'\n", + " start_years: [1]\n", + " end_years: [3]\n", + " level: 'lev'\n", + "\n", + " lnd:\n", + " vars: ['ALTMAX']\n", + " derive_vars: []\n", + " hist_str: 'h0'\n", + " start_years: [1]\n", + " end_years: [3]\n", + " level: 'lev'\n", + "\n", + " ocn:\n", + " vars: [] # Not doing ocean analyses\n", + " derive_vars: []\n", + " hist_str: 'h'\n", + " start_years: [1]\n", + " end_years: [3]\n", + " level: 'lev'\n", + "\n", + " ice:\n", + " vars: ['hi']\n", + " derive_vars: []\n", + " hist_str: 'h'\n", + " start_years: [1]\n", + " end_years: [3]\n", + " level: 'lev'\n", + "\n", + " glc:\n", + " vars: ['usurf']\n", + " derive_vars: []\n", + " hist_str: 'initial_hist'\n", + " start_years: [1]\n", + " end_years: [3]\n", + " level: 'lev'\n", + "\n", + "#IGNORE EVERYTHING BELOW THIS LINE!\n", + "\n", + "########### JUPYTER BOOK CONFIG ###########\n", + "\n", + "##################################\n", + "# Jupyter Book Table of Contents #\n", + "##################################\n", + "book_toc:\n", + "\n", + " # See https://jupyterbook.org/en/stable/structure/configure.html for\n", + " # complete documentation of Jupyter book construction options\n", + "\n", + " format: jb-book\n", + "\n", + " # All filenames are notebook filename without the .ipynb, similar to above\n", + "\n", + " root: infrastructure/index # root is the notebook that will be the homepage for the book\n", + " parts:\n", + "\n", + " # Parts group notebooks into different sections in the Jupyter book\n", + " # table of contents, so you can organize different parts of your project.\n", + "\n", + "# - caption: Atmosphere\n", + "\n", + " # Each chapter is the name of one of the notebooks that you executed\n", + " # in compute_notebooks above, also without .ipynb\n", + "# chapters:\n", + "# - file: atm/adf_quick_run\n", + "\n", + "# - caption: Land\n", + "# chapters:\n", + "# - file: lnd/land_comparison\n", + "\n", + "# - caption: Sea Ice\n", + "# chapters:\n", + "# - file: ice/seaice\n", + "\n", + "#####################################\n", + "# Keys for Jupyter Book _config.yml #\n", + "#####################################\n", + "book_config_keys:\n", + "\n", + " title: CESM Tutorial - CUPiD # Title of your jupyter book\n", + "\n", + " # Other keys can be added here, see https://jupyterbook.org/en/stable/customize/config.html\n", + " ### for many more options \n", + "EOF" + ] + }, + { + "cell_type": "markdown", + "id": "97f47be7-8f20-4b98-844c-5d067056df42", + "metadata": {}, + "source": [ + "Now we are ready to run CUPiD!" + ] + }, + { + "cell_type": "markdown", + "id": "27ed4c0c-f6ee-48a2-b264-2a2e58744f82", + "metadata": {}, + "source": [ + "## Generating time series" + ] + }, + { + "cell_type": "markdown", + "id": "22ab4b4f-e69c-40ea-a9f4-1455218a858c", + "metadata": {}, + "source": [ + "One of CUPiD's currently-working functions is to help convert CESM history files into single-variable time series files, which are required for various different diagnostic systems, as well for submitting to CMIP. Here we can create some time series files from the tutorial simulation using the config file we just created above and the `-ts` flag." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c593d967-45e6-4e64-b3cc-32c8c50ed139", + "metadata": {}, + "outputs": [], + "source": [ + "module load nco #Currently the NetCDF Operators are needed by CUPiD in order to run the time series generator\n", + "cupid-run -ts" + ] + }, + { + "cell_type": "markdown", + "id": "63d02026-9dc3-492d-a14d-5b05d854833f", + "metadata": {}, + "source": [ + "Now let's check if the time series files were generated successfully, by examining the directory we are writing the time series files to. In the below command replace \"COMP\" with your components of choice (atm, lnd, ocn, ice, or glc):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad3447d0-ca93-415f-82a1-eb1ce615ecfc", + "metadata": {}, + "outputs": [], + "source": [ + "ts_data_path=\"/glade/derecho/scratch/${USER}/archive/COMP/proc/tseries\"\n", + "ls $ts_data_path" + ] + }, + { + "cell_type": "markdown", + "id": "fc3f7715-965b-4750-9352-594f3beadf32", + "metadata": {}, + "source": [ + "Do you see a NetCDF file there? How does the naming convention compare to\n", + "standard CESM history output? Now let's check inside the file:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0663047-18bf-4380-8739-ef31810b53ca", + "metadata": {}, + "outputs": [], + "source": [ + "ncdump -h $ts_data_path/*.nc" + ] + }, + { + "cell_type": "markdown", + "id": "76706875-8830-4043-863c-bf952d7735d7", + "metadata": {}, + "source": [ + "How do these results compare to a standard CESM history file? What is the same?\n", + "What is different?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1b5db8c-4890-46b3-8b5c-c095e75bcd18", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/diagnostics.ipynb b/_sources/notebooks/diagnostics/diagnostics.ipynb new file mode 100644 index 000000000..3b9511709 --- /dev/null +++ b/_sources/notebooks/diagnostics/diagnostics.ipynb @@ -0,0 +1,366 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Diagnostics" + ] + }, + { + "cell_type": "markdown", + "id": "9fdd8253-f6b6-4969-b862-b7a8545ee46e", + "metadata": {}, + "source": [ + "_______________\n", + "These activities have been tested and updated by Jesse Nusbaumer and Alice DuVivier" + ] + }, + { + "cell_type": "markdown", + "id": "a7a70c8a-be92-4a7a-8d67-1b3941013b4f", + "metadata": { + "tags": [] + }, + "source": [ + "_______________\n", + "Once the CESM model has been run and the output data has been transfered to the short term archive directory the real job of understanding how the simulation ran and what it means from a scientific perspective begins. \n", + "\n", + "By this point you have run a number of simulations and have looked at model output using `ncview`. In this lab you will go beyond `ncview` by using Python plotting and analysis methods in Jupyterhub to produce additional diagnostic results. There is also a complete CESM diagnostics system currently under active development called [CUPiD](https://github.com/NCAR/CUPiD) that you will get to try out as well, although please note that it is still in its very early stages. Finally, please note that there are many other [CESM analysis tools](https://ncar.github.io/CESM-Tutorial/notebooks/diagnostics/additional/analysis_tools.html) and projects available as well, but not all will be covered here.\n", + "\n", + "To start running the Jupyter Notebooks provided for this tutorial, follow the steps below." + ] + }, + { + "cell_type": "markdown", + "id": "90a99498-75c0-46ce-8aa2-9c33ce5d7aed", + "metadata": {}, + "source": [ + "## Step 1. Download CESM Tutorial notebooks with Git Clone" + ] + }, + { + "cell_type": "markdown", + "id": "08427f89-a2c6-40d9-af61-45815753cd92", + "metadata": {}, + "source": [ + "
\n", + "We will use the main branch of the tutorial materials for use in this tutorial.

\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f28bf659-f7cb-46e9-8594-c6da04977d68", + "metadata": {}, + "source": [ + "First we will change into the home directory and then we will use the `git clone` command to download the CESM Tutorial diagnostics notebooks.\n", + "\n", + "
\n", + "Change the current directory to the home directory:
\n", + "\n", + "```\n", + "cd \n", + "```\n", + "
\n", + " \n", + "Download the cesm code to your code workspace directory as `CESM-Tutorial`:
\n", + "```\n", + "git clone https://github.com/NCAR/CESM-Tutorial.git CESM-Tutorial\n", + "```\n", + "\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c582acd5-84df-4cf1-8d26-90bfd9aa6ebc", + "metadata": {}, + "source": [ + "## Step 2. Login to JupyterHub" + ] + }, + { + "cell_type": "markdown", + "id": "187dcf75-3527-44ac-9ecd-86f47a3d524e", + "metadata": {}, + "source": [ + "Go to the JupyterHub website ([https://jupyterhub.hpc.ucar.edu/](https://jupyterhub.hpc.ucar.edu/)) and click on the \"Production\" button." + ] + }, + { + "cell_type": "markdown", + "id": "823cbbdc-649f-47dd-8977-a525554e15cf", + "metadata": {}, + "source": [ + "![JupyterHub](../../images/diagnostics/login/Diagnostics_1.png)" + ] + }, + { + "cell_type": "markdown", + "id": "98b5aeea-43d8-4112-a1c5-ab6ebb00dc39", + "metadata": {}, + "source": [ + "This will take you to a page where you enter your username and password. Enter your username as you would for Derecho, but your password will be the following: \n", + "\n", + "**Derecho password,Duo Pin**\n", + "\n", + "Where \"Duo Pin\" is the six numbers you can find in your Duo app under the \"UCAR\" Account listing. **Please note that the comma ( , ) must also be there separating the password from the Duo Pin.**" + ] + }, + { + "cell_type": "markdown", + "id": "de2094b5-9ac8-428d-aec7-d9f16baea936", + "metadata": {}, + "source": [ + "![JupyterHub Login](../../images/diagnostics/login/Diagnostics_2.png)" + ] + }, + { + "cell_type": "markdown", + "id": "d226699a-6342-4887-a190-72b495d8dcc5", + "metadata": {}, + "source": [ + "![JupyterHub Login](../../images/diagnostics/login/Diagnostics_duo_pcode.png)" + ] + }, + { + "cell_type": "markdown", + "id": "8c34bbd4-c129-4481-9df9-b5839b582a21", + "metadata": {}, + "source": [ + "After you do this and click \"Sign In\" you will be taken to a Server landing page where you will need to start your sever on Jupyterhub." + ] + }, + { + "cell_type": "markdown", + "id": "99ec89f3-d470-469e-a7b0-a2bc4497678e", + "metadata": {}, + "source": [ + "![JupyterHub Server](../../images/diagnostics/login/Diagnostics_3.png)" + ] + }, + { + "cell_type": "markdown", + "id": "bc60d1e8-44bd-4cac-b0e1-53eac15eea26", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "bb66a956-7f58-4613-b1a6-7597549e25a4", + "metadata": {}, + "source": [ + " Select the \"Casper PBS Batch\" option in the drop down menu." + ] + }, + { + "cell_type": "markdown", + "id": "9c758769-6b83-4dc1-a03a-2958102a2d52", + "metadata": {}, + "source": [ + "![JupyterHub Casper PBS](../../images/diagnostics/login/Diagnostics_4.png)" + ] + }, + { + "cell_type": "markdown", + "id": "6d9f61c8-9f91-4f9b-b3f9-fb474534d73d", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "17233631-43b6-4dc1-8904-a4adaff7c47b", + "metadata": {}, + "source": [ + "After selecting \"Casper PBS Batch\" you need to make other choices to select the right resources. You should use the queue and project account keys specified below. You may also want to request `03:00:00` for your Wall Time so that your server is active for the entire hands-on activity session. Do not change any other selection for this tutorial. If you are doing further analysis of model experiments you may need to change these settings and can find more information in the [CISL Documentation about JupyterHub](https://arc.ucar.edu/knowledge_base/70549913).\n" + ] + }, + { + "cell_type": "markdown", + "id": "1a3a65c2-65ce-4927-87b2-d9472ce676ed", + "metadata": {}, + "source": [ + "
\n", + "For this tutorial you should use the Queue `casper` and Project Account `UESM0013`.

\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b2b9d327-8f9e-486e-9ae3-94a17c3008c9", + "metadata": {}, + "source": [ + "![JupyterHub Selections](../../images/diagnostics/login/Diagnostics_5.png)" + ] + }, + { + "cell_type": "markdown", + "id": "4a3ffff9-689d-4329-9ebe-0d93c1ba9e8a", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "3fe7c826-800e-4718-9440-a224b97dec44", + "metadata": {}, + "source": [ + "You may have to wait a moment or two for your server to start up." + ] + }, + { + "cell_type": "markdown", + "id": "088f619d-9152-45c4-aa0c-73bfd0e33ec8", + "metadata": {}, + "source": [ + "![JupyterHub Casper PBS](../../images/diagnostics/login/Diagnostics_6.png)" + ] + }, + { + "cell_type": "markdown", + "id": "a08772d2-643c-40fa-9503-f1490c29de80", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "a66777ce-4356-4b95-b513-b33a604cbfdc", + "metadata": {}, + "source": [ + "Your JupyterHub session is now active and ready to run." + ] + }, + { + "cell_type": "markdown", + "id": "850d57a4-eab0-4da2-9f26-d1e36d1d6204", + "metadata": {}, + "source": [ + "## Step 3. Open a Diagnostics Notebook" + ] + }, + { + "cell_type": "markdown", + "id": "70792221-dc94-41ee-a9e2-e632b9eef1c1", + "metadata": {}, + "source": [ + "When your JupyterHub session opens you should be in your home directory on the NCAR HPC. In Step 1 you cloned the \"CESM-Tutorial\" repository, which has the notebooks you will run in this activity. " + ] + }, + { + "cell_type": "markdown", + "id": "b06d1cdb-4f85-4958-9bfe-9af1901c6539", + "metadata": {}, + "source": [ + "![JupyterHub Main Page](../../images/diagnostics/login/Diagnostics_7.png)" + ] + }, + { + "cell_type": "markdown", + "id": "8749817d-6a92-4c33-84f2-f09507c3fea9", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "995b7014-2dd2-4f05-bc63-a22affe3ff9c", + "metadata": {}, + "source": [ + "To get to the Diagnostics notebooks, double click the following sequence of folders:\n", + "1) CESM-Tutorial\n", + "2) notebooks\n", + "3) diagnostics\n", + "4) Click on the folder for the model component that you are interested in running (e.g. cam) \n", + "5) Click on the `basics.ipynb` notebook (see arrow on left, below)\n", + "\n", + "The final path in your browser url line for the following example should be:\n", + "`$USER/CESM-Tutorial/notebooks/diagnostics/cam/basics.ipynb`" + ] + }, + { + "cell_type": "markdown", + "id": "e4cb4eb8-eb39-4a5b-a94a-538e09ab637a", + "metadata": {}, + "source": [ + "![JupyterHub Open Notebook](../../images/diagnostics/login/Diagnostics_8.png)" + ] + }, + { + "cell_type": "markdown", + "id": "1077e225-5d39-4e54-8288-5ef69bd9b90b", + "metadata": {}, + "source": [ + "## Step 4. Check Your Notebook Kernel" + ] + }, + { + "cell_type": "markdown", + "id": "aef068ce-e240-4e9f-b008-5270534b6295", + "metadata": {}, + "source": [ + "Check your kernel (see arrow in upper right corner, above). It should be either `NPL 2023a` or `NPL 2023b`. You should use the specified kernel for any diagnostics you do during the tutorial as it is a default environment available on NCAR HPC and the notebooks here have been tested so that they work with that particular kernel for the analysis environment. We have set the default kernels and specifiy what they should be in each component notebook. However, if you need to change it click on the kernel button and select the correct kernel. " + ] + }, + { + "cell_type": "markdown", + "id": "784c789a-db86-4c80-8c92-d69dbeab7b48", + "metadata": {}, + "source": [ + "## Step 5. Run Jupyter Notebook Cells" + ] + }, + { + "cell_type": "markdown", + "id": "69174e22-0a81-47d6-b122-5b514154b31d", + "metadata": {}, + "source": [ + "To run a Jupyter cell\n", + "- Type your command into the cell\n", + "- To execute the command:\n", + " - Press **shift+return**\n", + "
\n", + " OR\n", + "
\n", + " - Select the cell then click the 'play' button at the top of the window (see red arrow, above)" + ] + }, + { + "cell_type": "markdown", + "id": "beaa3bc1-0ed5-4c73-901a-6fea974076e2", + "metadata": {}, + "source": [ + "All figures will be rendered in the Jupyter Notebook, so there is no need to open any other window for this portion of the lab activities." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae3f94f8-c116-468f-b15f-66b090a6b39f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/mom/basics_mom.ipynb b/_sources/notebooks/diagnostics/mom/basics_mom.ipynb new file mode 100644 index 000000000..15ad332bc --- /dev/null +++ b/_sources/notebooks/diagnostics/mom/basics_mom.ipynb @@ -0,0 +1,773 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "989fe00b-ac80-497c-a432-36d0ae227636", + "metadata": {}, + "source": [ + "# Basic Plotting with MOM6" + ] + }, + { + "cell_type": "markdown", + "id": "e97a3589-e319-4477-9123-f2f7e4189dc9", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023a`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023a`." + ] + }, + { + "cell_type": "markdown", + "id": "ed83e6c7-6801-4b43-af1c-32f6e3577f30", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed by Gustavo Marques.\n" + ] + }, + { + "cell_type": "markdown", + "id": "cb535d76-8352-4736-b74f-4577b32a3aa9", + "metadata": { + "tags": [] + }, + "source": [ + "_______________\n", + "## Setting up the notebook\n", + "Here we load modules needed for our analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe59e1e9-a503-4c89-803e-01dee0fadd75", + "metadata": {}, + "outputs": [], + "source": [ + "# loading modules\n", + "\n", + "# %load_ext watermark # this is so that in the end we can check which module versions we used\n", + "%load_ext autoreload\n", + "\n", + "import warnings \n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "import datetime\n", + "import glob\n", + "import os\n", + "import warnings\n", + "import dask\n", + "import dask_jobqueue\n", + "import distributed\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "from matplotlib import ticker, cm\n", + "from cartopy import crs as ccrs, feature as cfeature\n", + "import cartopy" + ] + }, + { + "cell_type": "markdown", + "id": "657b093a-e719-4f68-92a4-907a3ecf89bb", + "metadata": {}, + "source": [ + "### Setting up the Dask cluster\n", + "Remember to: \n", + "- change the project number if doing this outside the tutorial\n", + "- potentially change the walltime depending on what you want to do\n", + "- check the memory if you are loading a different dataset with different needs\n", + "- check the number of cores if you are loading a different dataset with different needs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ca107e9-941f-4398-8df5-d6587064492f", + "metadata": {}, + "outputs": [], + "source": [ + "# Set your username here:\n", + "username = \"PUT_USER_NAME_HERE\"\n", + "\n", + "if \"client\" in locals():\n", + " client.close()\n", + " del client\n", + "if \"cluster\" in locals():\n", + " cluster.close()\n", + "\n", + "cluster = dask_jobqueue.PBSCluster(\n", + " cores=2, # The number of cores you want\n", + " memory=\"8GB\", # Amount of memory\n", + " processes=1, # How many processes\n", + " queue=\"casper\", # The type of queue to utilize (/glade/u/apps/dav/opt/usr/bin/execcasper)\n", + " log_directory=f\"/glade/derecho/scratch/{username}/dask/\", # Use your local directory\n", + " resource_spec=\"select=1:ncpus=1:mem=8GB\", # Specify resources\n", + " project=\"UESM0013\", # Input your project ID here\n", + " walltime=\"02:00:00\", # Amount of wall time\n", + ")\n", + "# cluster.adapt(maximum_jobs=24, minimum_jobs=2) # If you want to force everything to be quicker, increase the number of minimum jobs, \n", + "# # but sometimes then it will take a while until you get them assigned, so it's a trade-off\n", + "cluster.scale(12) # I changed this because currently dask is flaky, this might have to be adjusted during the tutorial\n", + "client = distributed.Client(cluster)\n", + "client" + ] + }, + { + "cell_type": "markdown", + "id": "26f69caa-1b31-4f87-88a9-21298bdc30f3", + "metadata": {}, + "source": [ + "### MOM6 diag_table and history files\n", + "\n", + "The diagnostics in MOM6 are controlled by the ```diag_table```. To understand how the ```diag_table``` works, please click on [this](https://mom6.readthedocs.io/en/main/api/generated/pages/Diagnostics.html) link. If you have done the gmom_jra.run_length simulation, you can use a text editor to inspect the default ```diag_table``` for this simulation. It's located at:\n", + "\n", + "
\n", + " \n", + "/glade/u/home/$USER/cases/gmom_jra.run_length/CaseDocs/diag_table\n", + "\n", + "
\n", + "\n", + "Below is a list of history files for the out-of-the-box MOM6 simulations, including a brief explanation of their purposes. The ```mom6.h.sfc``` files contain daily means, while all other history files contain monthly means. \n", + "\n", + "* CASENAME.mom6.h.rho2.YYYY-MM.nc - selected 3D variables remapped to a sigma2 vertical coordinate. This is useful, for example, for computing MOC in density-space; \n", + " \n", + "* CASENAME.mom6.h.native.YYYY-MM.nc - miscellaneous of 2D and 3D variables on the native vertical grid;\n", + " \n", + "* CASENAME.mom6.h.z.YYYY-MM.nc - selected 3D variables remapped to the World Ocean Atlas (WOA) 2009 vertical grid. This is useful for computing T & S biases against the WOA climatology;\n", + " \n", + "* CASENAME.mom6.h.sfc.YYYY-MM.nc - surface 2D variables;\n", + " \n", + "* CASENAME.mom6.h.ocean_geometry.nc - horizontal grid information. \n", + "\n", + "The following history files include temperature, salinity, velocities, and transports along pre-defined transects. Please refer to the figure below to view the location of some of these transects (the figure is outdated and misses some transects). \n", + " \n", + "* CASENAME.mom6.h.Agulhas_Section.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Barents_Opening.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Bering_Strait.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Davis_Strait.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Denmark_Strait.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Drake_Passage.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.English_Channel.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Fram_Strait.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Florida_Bahamas.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Florida_Bahamas_extended.YYYY-MM.nc.????\n", + "* CASENAME.mom6.h.Florida_Cuba.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Gibraltar_Strait.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Iceland_Norway.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Indonesian_Throughflow.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Mozambique_Channel.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Pacific_undercurrent.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Taiwan_Luzon.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Windward_Passage.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Robeson_Channel.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Yucatan_Channel.YYYY-MM.nc.???? \n", + "* CASENAME.mom6.h.Bosporus_Strait.YYYY-MM.nc.????\n" + ] + }, + { + "cell_type": "markdown", + "id": "40e13628-f2e5-4914-9702-5b8f4fb2c341", + "metadata": {}, + "source": [ + "![pre-defined sections](../../../images/diagnostics/mom/transport_sections_mom6.png)\n", + "\n", + "*

Figure: Pre-defined sections for transport diagnostics.

*" + ] + }, + { + "cell_type": "markdown", + "id": "884e8473-6d10-46e9-9a43-2175ae8631a0", + "metadata": {}, + "source": [ + "### Load the data \n", + "\n", + "**Note**: the drop-down solutions, below, assume you used gmom_jra.run_length output for plotting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a789cc-95ed-44f6-a566-215e6ed0668d", + "metadata": {}, + "outputs": [], + "source": [ + "# Set your casename here:\n", + "casename = 'gmom_jra.run_length'\n", + "\n", + "# Here we point to the archive directory from your b1850.run_length simulation\n", + "pth = f\"/glade/derecho/scratch/{username}/archive/{casename}/ocn/hist/\"\n", + "\n", + "# If you were unable to successfully run the b1850.run_length simulation, then feel free to use\n", + "# this provided simulation data instead:\n", + "#pth = f'/glade/campaign/cesm/tutorial/tutorial_2024_archive/{casename}/ocn/hist/'\n", + "\n", + "# Print path to screen\n", + "pth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a0dd260-76ab-4de7-931d-1cc343d82384", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "# how quick this is depends among other things on the availability of workers on casper\n", + "# you can check progress by clicking on the link for the cluster above which will show you the dask dashboard \n", + "full_pth = pth + casename + '.mom6.h.native.000?-??.nc' #also might want to use just some years not all \n", + "ds_mom = xr.open_mfdataset(full_pth, parallel=True)\n", + "ds_mom = ds_mom.sortby(ds_mom.time)\n", + "tlist = np.asarray([time.replace(year=time.year+1957) for time in ds_mom.time.values]) # this makes sure the time axis is useful\n", + "ds_mom['time'] = tlist\n", + "ds_mom[\"time\"] = ds_mom.indexes[\"time\"].to_datetimeindex()\n", + "ds_mom #print some meta-data to screen" + ] + }, + { + "cell_type": "markdown", + "id": "ec0ade1b-407c-4bae-b4a7-62fdee617961", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 1\n", + "Means of global Surface Heat Flux and Sea Surface Temperature" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5d20c79-d1d1-4c62-8300-fade14d8e588", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%%time\n", + "fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)\n", + "\n", + "ds_mom.hfds.mean('time').plot(robust=True, ax=ax[0])\n", + "ax[0].set_title(r'Surface Heat Flux [W/m$^2$]')\n", + "\n", + "ds_mom.thetao.sel(zl=0, method='nearest').mean('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))\n", + "ax[1].set_title(r'Sea Surface Temperature [$^{\\circ}$C]')\n", + "#plt.savefig('basics_plot_1.png', bbox_inches='tight') # uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "9b3d3721-a43b-4bde-9d15-7392173cc52b", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/mom/basics_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0ff3c68f-99b3-4e51-afb9-d987bd918d22", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Can you plot sea surface height (SSH) instead of surface heat flux (SHF)?" + ] + }, + { + "cell_type": "markdown", + "id": "e307984c-ce16-4c4e-bda3-ba6d940f36a8", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "```\n", + "ds_mom.SSH.mean('time').plot(robust=True, ax=ax[0])\n", + "ax[0].set_title(r'Sea Surface Height (cm)')\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b4652dc4-1383-4023-ad2e-ca28b2510687", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Can you plot standard deviations instead of means?" + ] + }, + { + "cell_type": "markdown", + "id": "36d0ea5a-ee50-4ca7-9d2b-8c9c3fff8c3f", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Replace the `.mean` function with `.std` in the plotting call.\n", + " \n", + "```\n", + "ds_mom.SHF.std('time').plot(robust=True, ax=ax[0])\n", + "\n", + "ds_mom.thetao.sel(zl=0, method='nearest').std('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "829160aa-36f6-46b1-8cad-860bd3735dba", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 2\n", + "\n", + "Let's create some better-looking plots! Did you notice the ```x``` and ```y``` axes of the previous plots? They represent the \"nominal\" longitude (```xh```) and latitude (```yh```) of tracer points for labeling the output axes rather than the \"true\" longitudes and latitudes. MOM6 output is on a curvilinear grid, which means that the grid is not regularly spaced. The true coordinate values are not stored in the mom6.h.native files. Instead, all the horizontal grid information is saved in the ```mom6.h.ocean_geometry.nc``` file. Let's load this file and check its variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4449a0a-dafa-4d86-8d94-762eafe01d4c", + "metadata": {}, + "outputs": [], + "source": [ + "geo_pth = pth + casename + '.mom6.h.ocean_geometry.nc' #also might want to use just some years not all \n", + "hgrid = xr.open_dataset(geo_pth).rename({'lath':'yh','lonh':'xh','latq':'yq','lonq':'xq'}) # rename dimensions to match those in ds_mom\n", + "hgrid" + ] + }, + { + "cell_type": "markdown", + "id": "837770b1-c7ec-4ef2-9726-8feadd3d956c", + "metadata": {}, + "source": [ + "Variables ```geolat``` and ```geolon``` are the 2D variables that we need to use, let's have a look at them." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8847b2d5-9290-422c-8772-40b0764937c5", + "metadata": {}, + "outputs": [], + "source": [ + "# learn what geolat and geolon look like \n", + "fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)\n", + "\n", + "hgrid.geolat.plot(ax=ax[0], levels=np.arange(-90,95,5))\n", + "ax[0].set_title('geolat')\n", + "hgrid.geolon.plot(ax=ax[1], levels=np.arange(-290,90,10))\n", + "ax[1].set_title('geolon')\n", + "#plt.savefig('basics_plot_2.png', bbox_inches='tight') # uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "88135e00-bfc9-4b81-88e6-712679ec3b29", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/mom/basics_plot_2.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e1517969-1f19-4909-bf9a-f1b10e917700", + "metadata": {}, + "source": [ + "**Question**\n", + "\n", + "Can you see the irregularity in ```geolat```? What does the discontinuity in ```geolon``` mean? " + ] + }, + { + "cell_type": "markdown", + "id": "b93cd75a-97ce-4d82-85d4-5b0c223d2ee9", + "metadata": {}, + "source": [ + "### 1. Make global maps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "527f3cbe-1724-49ba-a539-f333af917d0d", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "\n", + "# initiate the figure\n", + "fig = plt.figure(dpi=150, figsize=(12,3))\n", + "\n", + "# add the first subplot\n", + "ax_shf = plt.subplot(1, 2, 1, projection=ccrs.Robinson(central_longitude=300.0))\n", + "\n", + "pc = ax_shf.contourf(hgrid.geolon, hgrid.geolat, ds_mom.hfds.mean('time'),\n", + " transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(-120,130,10))\n", + "\n", + "ax_shf.set_global() \n", + "\n", + "land = ax_shf.add_feature(\n", + " cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',\n", + " linewidth=0.5,\n", + " edgecolor='black',\n", + " facecolor='darkgray'))\n", + "\n", + "shf_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_shf);\n", + "shf_cbar.set_label(r'[W/m$^{2}$]')\n", + "\n", + "ax_shf.set_title('Surface Heat Flux')\n", + "\n", + "# add the second subplot\n", + "ax_sst = plt.subplot(1, 2, 2, projection=ccrs.Robinson(central_longitude=300.0))\n", + "\n", + "pc = ax_sst.contourf(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0).mean('time'),\n", + " transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(0,32,1))\n", + "\n", + "ax_sst.set_global() \n", + "\n", + "land = ax_sst.add_feature(\n", + " cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',\n", + " linewidth=0.5,\n", + " edgecolor='black',\n", + " facecolor='darkgray'))\n", + "\n", + "sst_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_sst);\n", + "sst_cbar.set_label(r'[$^{\\circ}$C]')\n", + "ax_sst.set_title('Sea Surface Temperature')\n", + "\n", + "#plt.savefig('basics_plot_3.png', bbox_inches='tight') # uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "97823b3e-49d7-4c8e-97e7-b957f93b533a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/mom/basics_plot_3.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9a562d62-1efb-45e0-ab7b-5408c893ddbb", + "metadata": {}, + "source": [ + "### 2. Make regional map over continental US" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a419e0b-bb58-4740-9877-35a358acbd0b", + "metadata": {}, + "outputs": [], + "source": [ + "# define the extent of the map\n", + "lonW = -140\n", + "lonE = -40\n", + "latS = 15\n", + "latN = 65\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1dacb156-9942-43a3-9b57-1bd4fe6491aa", + "metadata": {}, + "outputs": [], + "source": [ + "# what does sea surface temperature around the US look like? (i.e. where would you like to go swimming..)\n", + "fig = plt.figure(figsize=(11, 8.5))\n", + "ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", + "ax.set_title('')\n", + "gl = ax.gridlines(\n", + " draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'\n", + ")\n", + "ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())\n", + "ax.coastlines(resolution=res, color='black')\n", + "ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')\n", + "ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');\n", + "tdat = ax.pcolormesh(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0, time=10), cmap='RdYlBu_r')\n", + "plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1)\n", + "#plt.savefig('basics_plot_4.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "72f9a1c9-7bf1-4dd7-b193-dcb5baf8bf77", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/mom/basics_plot_4.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cbda596b-5483-4221-b228-f87fbb0278cd", + "metadata": {}, + "source": [ + "### 3. Make regional map over the Pacific\n", + "\n", + "There's an awful lot of not-ocean over the continental US. Let's look at the Pacific instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39a879e8-1dc0-4c9f-afae-c98a33fa7778", + "metadata": {}, + "outputs": [], + "source": [ + "# define the extent of the map\n", + "lonW = -180\n", + "lonE = -60\n", + "latS = -30\n", + "latN = 30\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcce69d0-c184-4f2f-9b20-775c05489bdd", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(11, 8.5))\n", + "ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", + "ax.set_title('SST')\n", + "gl = ax.gridlines(\n", + " draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'\n", + ")\n", + "ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())\n", + "ax.coastlines(resolution=res, color='black')\n", + "ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')\n", + "ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');\n", + "tdat = ax.pcolormesh(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0, time=10), cmap='RdYlBu_r', vmin=15, vmax=31)\n", + "cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))\n", + "cbar.set_label(r'[$^{\\circ}$C]')\n", + "#plt.savefig('basics_plot_5.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "843c70eb-926e-4e86-92f9-3fd98aab069a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/mom/basics_plot_5.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6fd00b8a-9894-4745-a4ca-21e9d9ade96a", + "metadata": {}, + "source": [ + "### 4. Plotting contours\n", + "\n", + "The figures above use `pcolormesh` to plot, but we can also use `contourf` to make filled contours." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71d64e38-7de2-4db4-9759-5e850b0a3aca", + "metadata": {}, + "outputs": [], + "source": [ + "# define the extent of the map\n", + "lonW = -180\n", + "lonE = -60\n", + "latS = -30\n", + "latN = 30\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc6fd1db-1e65-4a23-984d-00e7406317cc", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(11, 8.5))\n", + "ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", + "ax.set_title('SST')\n", + "gl = ax.gridlines(\n", + " draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'\n", + ")\n", + "ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())\n", + "ax.coastlines(resolution=res, color='black')\n", + "ax.stock_img() # something else than the boarders for a change\n", + "tdat = ax.contourf(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0, time=10), cmap='RdYlBu_r', levels=np.arange(10,31,1))\n", + "cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))\n", + "cbar.set_label(r'[$^{\\circ}$C]')\n", + "#plt.savefig('basics_plot_6.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "aa52cb62-eec6-4390-8a12-76d34723d704", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/mom/basics_plot_6.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c8b0288e-e6b4-4ef1-8624-b31e4eebff57", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Try looking at the Equatorial Atlantic Ocean or other region that interests you (Gulf of Mexico, Gulf of Maine, California Coast)." + ] + }, + { + "cell_type": "markdown", + "id": "c9d29a3b-d7c7-4d4c-aeaf-7eeedf48caa3", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Before plotting the region, you'll need to modify the latitude/longitude bounds. Here are the bounds for the Equatorial Atlantic Ocean: \n", + "```\n", + "# define the extent of the map\n", + "lonW = -60\n", + "lonE = 20\n", + "latS = -30\n", + "latN = 30\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'\n", + "```\n", + "\n", + "You can play with these to look at other regions of interest to you.\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9f98a8bf-9012-4edd-8288-149579c13252", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Try plotting other variables like sea surface height (SSH) or 50m temperature." + ] + }, + { + "cell_type": "markdown", + "id": "12ba7997-bf17-48cb-8eec-5ea7c467b319", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "See hints in exercise 1. \n", + " \n", + "
\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023a", + "language": "python", + "name": "npl-2023a" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/pop/advanced_pop.ipynb b/_sources/notebooks/diagnostics/pop/advanced_pop.ipynb new file mode 100644 index 000000000..638b54e51 --- /dev/null +++ b/_sources/notebooks/diagnostics/pop/advanced_pop.ipynb @@ -0,0 +1,334 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2634ab1d-3022-4b34-b573-cb74e0f31088", + "metadata": {}, + "source": [ + "# Advanced Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "1522591e-1007-41e1-8599-8be707db5d84", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023b`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023b`." + ] + }, + { + "cell_type": "markdown", + "id": "ff1b63b8-a5e8-445b-891e-7819f775dfd8", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed primarily by Mauricio Rocha and Gustavo Marques." + ] + }, + { + "cell_type": "markdown", + "id": "677407b7-4f55-45c7-9193-123791b854da", + "metadata": {}, + "source": [ + "_______________\n", + "## Setting up the notebook\n", + "Here we load modules needed for our analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36365adf-9a62-4b34-ba16-73c6d89a8d32", + "metadata": {}, + "outputs": [], + "source": [ + "# loading modules\n", + "\n", + "# %load_ext watermark # this is so that in the end we can check which module versions we used\n", + "%load_ext autoreload\n", + "\n", + "import warnings \n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "import cartopy.crs as ccrs\n", + "import cartopy.feature\n", + "import matplotlib.pyplot as plt\n", + "import xarray as xr\n", + "import numpy as np \n", + "import pop_tools\n", + "import glob" + ] + }, + { + "cell_type": "markdown", + "id": "40c71af7-bb2d-47ec-8c5a-8a2724fab5c1", + "metadata": {}, + "source": [ + "### Get the data " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e1f41c1-1b64-429a-acd7-ffa4f5c50234", + "metadata": {}, + "outputs": [], + "source": [ + "# Set your username here:\n", + "username = \"PUT_USER_NAME_HERE\"\n", + "casename = 'b1850.run_length'\n", + "\n", + "# Here we point to the archive directory from your b1850.run_length simulation\n", + "pth = f\"/glade/derecho/scratch/{username}/archive/{casename}/ocn/hist/\"\n", + "\n", + "# If you were unable to successfully run the b1850.run_length simulation, then feel free to use\n", + "# this provided simulation data instead:\n", + "#pth = f'/glade/campaign/cesm/tutorial/tutorial_2024_archive/{casename}/ocn/hist/'\n", + "\n", + "# Print path to screen\n", + "pth\n", + "flist = glob.glob(pth + casename + '.pop.h.00??-??.nc') \n", + "ds = xr.open_mfdataset(flist, compat='override', coords='minimal')" + ] + }, + { + "cell_type": "markdown", + "id": "8a27f988-20f9-457d-8947-371f6f2df74c", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 1" + ] + }, + { + "cell_type": "markdown", + "id": "655e97da-85b0-45ac-acda-f139e524f319", + "metadata": {}, + "source": [ + "Maximum mixed-layer depth for the winter months in the northern hemisphere (January, February, and March) and in the southern hemisphere (July, August, and September)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4a1832c-10f8-4ebe-b33d-4c28a22657fc", + "metadata": {}, + "outputs": [], + "source": [ + "# POP grid\n", + "pop_grid = pop_tools.get_grid('POP_gx1v7')\n", + "ds['TLONG'] = pop_grid.TLONG; ds['TLAT'] = pop_grid.TLAT\n", + "ds['ULONG'] = pop_grid.ULONG; ds['ULAT'] = pop_grid.ULAT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b5ee9b5-e146-4655-af65-91e10d80d189", + "metadata": {}, + "outputs": [], + "source": [ + "# July, August, and Septemper (JAS)\n", + "def is_jas(month):\n", + " return (month >= 7) & (month <= 9)\n", + "JAS = ds['XMXL'].sel(time=is_jas(ds['XMXL']['time.month'])).mean('time')\n", + "\n", + "# January, February, and March (JFM)\n", + "def is_jfm(month):\n", + " return (month >= 1) & (month <= 3)\n", + "JFM = ds['XMXL'].sel(time=is_jfm(ds['XMXL']['time.month'])).mean('time')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc5802e9-6cf5-4209-bbe3-a4c6461d932e", + "metadata": {}, + "outputs": [], + "source": [ + "# Find the latitude value closest to the equator\n", + "def find_nearest(array, value):\n", + " array = np.asarray(array)\n", + " idx = (np.abs(array - value)).argmin()\n", + " return array[idx]\n", + "eq=find_nearest(JAS['TLAT']['TLAT'][:,0], value=0)\n", + "print(eq)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a6d3ee5-8bba-4158-a209-b2b2e5105cd1", + "metadata": {}, + "outputs": [], + "source": [ + "# Find the index of this latitude\n", + "idx=np.where(JAS['TLAT']['TLAT'][:,0] == eq)[0]\n", + "print(idx)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1626984-8646-41b6-a5df-943562d8ccfa", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a new array\n", + "winter=JFM.copy()\n", + "\n", + "# Since the variable winter already contains the data for the Northern Hemisphere, we will now add the data for the Southern Hemisphere\n", + "winter.loc[0:187,:]=JAS.loc[0:187,:]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b7d3bc83-0643-4cf6-9367-678f2e7823d5", + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8,6));\n", + "ax = plt.axes(projection=ccrs.Robinson());\n", + "orig_map=plt.cm.get_cmap('turbo')\n", + "scale_color=orig_map.reversed()\n", + "cf=(winter*0.01).plot.pcolormesh(ax=ax, # Multiply by 0.01 to transform centimeters to meters\n", + " vmax=800,vmin=0,\n", + " transform=ccrs.PlateCarree(),\n", + " x='TLONG',\n", + " y='TLAT',\n", + " cmap=scale_color,\n", + " add_colorbar=False,\n", + " ) \n", + "ax.coastlines()\n", + "ax.add_feature(cartopy.feature.LAND)\n", + "ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,\n", + " linewidth=2, color='gray', alpha=0.5, linestyle='-')\n", + "cbar = plt.colorbar(cf, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(0,800,100), label='XMXL [m]')\n", + "plt.title('Maximum Mixed-Layer Depth for the Winter', fontsize=14)\n", + "#plt.savefig('advanced_plot_1.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "0b35d911-bd15-4825-8a6f-12c583f9c05e", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/advanced_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "db016402-9b77-4145-b92e-a4503c03dcc3", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 2" + ] + }, + { + "cell_type": "markdown", + "id": "d326ce71-ed14-47b1-9095-a55f45e969cd", + "metadata": {}, + "source": [ + "Calculate the heat storage (HS) per area from the temperature tendency for the upper 2000m.\n", + "Equation: $$\\rm{HF = \\uprho_\\uptheta~C_p~\\int_{z_2}^{z_1}\\uptheta_{(z)}'~dz},$$\n", + "where:\n", + "* HF is heat storage ($\\rm{W~m^{-2}}$),\n", + "* $\\uprho_\\uptheta$ is the sea water density ($\\rm{kg~m^{-3}}$),\n", + "* $\\rm{C_p}$ is the sea water specific heat ($\\rm{J~kg^{-1}~^{\\circ}C^{-1}}$),\n", + "* $\\rm{dz}$ is the cell thickness (m),\n", + "* and $\\uptheta$' is the temperature tendency ($\\rm{^{\\circ}C^{-1}~s^{-1}}$). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "354537e8-6e2f-4cbd-87a3-c807545828ed", + "metadata": {}, + "outputs": [], + "source": [ + "ds_HS=ds['TEND_TEMP'].sel(z_t=slice(0,200000))*ds['dz'].sel(z_t=slice(0,200000))*0.01 # Select the depth and multiply by dz. Unit: oC.s-1.m \n", + "ds_HS=ds_HS.sum('z_t') # Sum in depth\n", + "ds_HS=ds_HS*1026 # Multiply it by the sea water density. Unit: oC.s-1.kg.m-2\n", + "ds_HS=ds_HS*3996 # Multiply it by the sea water heat specific. Unit: W.m-2 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "258d8431-27bb-4ce1-9afa-a7f9221e2d1c", + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8,6))\n", + "ax = plt.axes(projection=ccrs.Robinson())\n", + "orig_map=plt.cm.get_cmap('RdBu')\n", + "scale_color=orig_map.reversed()\n", + "cf=ds_HS.mean('time').plot.pcolormesh(ax=ax,\n", + " transform=ccrs.PlateCarree(),\n", + " vmin=-50,\n", + " vmax=50,\n", + " x='TLONG',\n", + " y='TLAT',\n", + " cmap=scale_color,\n", + " add_colorbar=False,\n", + " ) \n", + "ax.coastlines()\n", + "ax.add_feature(cartopy.feature.LAND)\n", + "ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,\n", + " linewidth=2, color='gray', alpha=0.5, linestyle='-')\n", + "cbar = plt.colorbar(cf, ax=ax, shrink=0.5, pad=0.1, label='HS [W m$^{-2}$]')\n", + "plt.title('Heat Storage per area for the upper 2000 m', fontsize=14)\n", + "#plt.savefig('advanced_plot_2.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "a5eebe10-e058-4475-a69e-18a8faafaf7f", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/advanced_plot_2.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023b", + "language": "python", + "name": "npl-2023b" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/pop/basics_pop.ipynb b/_sources/notebooks/diagnostics/pop/basics_pop.ipynb new file mode 100644 index 000000000..3e2c4c583 --- /dev/null +++ b/_sources/notebooks/diagnostics/pop/basics_pop.ipynb @@ -0,0 +1,1246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "989fe00b-ac80-497c-a432-36d0ae227636", + "metadata": {}, + "source": [ + "# Basic Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "e97a3589-e319-4477-9123-f2f7e4189dc9", + "metadata": {}, + "source": [ + "**BEFORE BEGINNING THIS EXERCISE** - Check that your kernel (upper right corner, above) is `NPL 2023a`. This should be the default kernel, but if it is not, click on that button and select `NPL 2023a`." + ] + }, + { + "cell_type": "markdown", + "id": "ed83e6c7-6801-4b43-af1c-32f6e3577f30", + "metadata": {}, + "source": [ + "_______________\n", + "This activity was developed primarily by Anna-Lena Deppenmeier and Gustavo Marques.\n" + ] + }, + { + "cell_type": "markdown", + "id": "cb535d76-8352-4736-b74f-4577b32a3aa9", + "metadata": { + "tags": [] + }, + "source": [ + "_______________\n", + "## Setting up the notebook\n", + "Here we load modules needed for our analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe59e1e9-a503-4c89-803e-01dee0fadd75", + "metadata": {}, + "outputs": [], + "source": [ + "# loading modules\n", + "\n", + "# %load_ext watermark # this is so that in the end we can check which module versions we used\n", + "%load_ext autoreload\n", + "\n", + "import warnings \n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "import datetime\n", + "import glob\n", + "import os\n", + "import warnings\n", + "import dask\n", + "import dask_jobqueue\n", + "import distributed\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import xarray as xr\n", + "import xgcm\n", + "from matplotlib import ticker, cm\n", + "import pop_tools\n", + "from cartopy import crs as ccrs, feature as cfeature\n", + "import cartopy" + ] + }, + { + "cell_type": "markdown", + "id": "7bb804be-f371-40a6-915d-803d3cc67151", + "metadata": {}, + "source": [ + "### Define some functions\n", + "These functions will be used more than once to read data and add a cyclic point. These could go in a package if you like." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cc3a601-4a26-4a26-9761-f5ba830e353d", + "metadata": {}, + "outputs": [], + "source": [ + "# define function to get you the data you want relatively quickly \n", + "\n", + "def read_dat(files, variables, pop=False):\n", + " def preprocess(ds):\n", + " return ds[variables].reset_coords(drop=True) # reset coords means they are reset as variables\n", + "\n", + " ds = xr.open_mfdataset(files, parallel=True, preprocess=preprocess,\n", + " chunks={'time':1, 'nlon': -1, 'nlat':-1},\n", + " combine='by_coords')\n", + " if pop==True:\n", + " file0 = xr.open_dataset(files[0])\n", + " ds.update(file0[['ULONG', 'ULAT', 'TLONG', 'TLAT']])\n", + " file0.close()\n", + "\n", + " ds\n", + " return ds\n", + "\n", + "# define function to be able to plot POP output properly on cartopy projections\n", + "def pop_add_cyclic(ds):\n", + " \n", + " nj = ds.TLAT.shape[0]\n", + " ni = ds.TLONG.shape[1]\n", + "\n", + " xL = int(ni/2 - 1)\n", + " xR = int(xL + ni)\n", + "\n", + " tlon = ds.TLONG.data\n", + " tlat = ds.TLAT.data\n", + " \n", + " tlon = np.where(np.greater_equal(tlon, min(tlon[:,0])), tlon-360., tlon) \n", + " lon = np.concatenate((tlon, tlon + 360.), 1)\n", + " lon = lon[:, xL:xR]\n", + "\n", + " if ni == 320:\n", + " lon[367:-3, 0] = lon[367:-3, 0] + 360. \n", + " lon = lon - 360.\n", + " \n", + " lon = np.hstack((lon, lon[:, 0:1] + 360.))\n", + " if ni == 320:\n", + " lon[367:, -1] = lon[367:, -1] - 360.\n", + "\n", + " #-- trick cartopy into doing the right thing:\n", + " # it gets confused when the cyclic coords are identical\n", + " lon[:, 0] = lon[:, 0] - 1e-8\n", + "\n", + " #-- periodicity\n", + " lat = np.concatenate((tlat, tlat), 1)\n", + " lat = lat[:, xL:xR]\n", + " lat = np.hstack((lat, lat[:,0:1]))\n", + "\n", + " TLAT = xr.DataArray(lat, dims=('nlat', 'nlon'))\n", + " TLONG = xr.DataArray(lon, dims=('nlat', 'nlon'))\n", + " \n", + " dso = xr.Dataset({'TLAT': TLAT, 'TLONG': TLONG})\n", + "\n", + " # copy vars\n", + " varlist = [v for v in ds.data_vars if v not in ['TLAT', 'TLONG']]\n", + " for v in varlist:\n", + " v_dims = ds[v].dims\n", + " if not ('nlat' in v_dims and 'nlon' in v_dims):\n", + " dso[v] = ds[v]\n", + " else:\n", + " # determine and sort other dimensions\n", + " other_dims = set(v_dims) - {'nlat', 'nlon'}\n", + " other_dims = tuple([d for d in v_dims if d in other_dims])\n", + " lon_dim = ds[v].dims.index('nlon')\n", + " field = ds[v].data\n", + " field = np.concatenate((field, field), lon_dim)\n", + " field = field[..., :, xL:xR]\n", + " field = np.concatenate((field, field[..., :, 0:1]), lon_dim) \n", + " dso[v] = xr.DataArray(field, dims=other_dims+('nlat', 'nlon'), \n", + " attrs=ds[v].attrs)\n", + "\n", + "\n", + " # copy coords\n", + " for v, da in ds.coords.items():\n", + " if not ('nlat' in da.dims and 'nlon' in da.dims):\n", + " dso = dso.assign_coords(**{v: da})\n", + " \n", + " \n", + " return dso" + ] + }, + { + "cell_type": "markdown", + "id": "657b093a-e719-4f68-92a4-907a3ecf89bb", + "metadata": {}, + "source": [ + "### Setting up the Dask cluster\n", + "Remember to: \n", + "- change the project number if doing this outside the tutorial\n", + "- potentially change the walltime depending on what you want to do\n", + "- check the memory if you are loading a different dataset with different needs\n", + "- check the number of cores if you are loading a different dataset with different needs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ca107e9-941f-4398-8df5-d6587064492f", + "metadata": {}, + "outputs": [], + "source": [ + "# Set your username here:\n", + "username = \"PUT_USER_NAME_HERE\"\n", + "\n", + "if \"client\" in locals():\n", + " client.close()\n", + " del client\n", + "if \"cluster\" in locals():\n", + " cluster.close()\n", + "\n", + "cluster = dask_jobqueue.PBSCluster(\n", + " cores=2, # The number of cores you want\n", + " memory=\"8GB\", # Amount of memory\n", + " processes=1, # How many processes\n", + " queue=\"casper\", # The type of queue to utilize (/glade/u/apps/dav/opt/usr/bin/execcasper)\n", + " log_directory=f\"/glade/derecho/scratch/{username}/dask/\", # Use your local directory\n", + " resource_spec=\"select=1:ncpus=1:mem=8GB\", # Specify resources\n", + " project=\"UESM0013\", # Input your project ID here\n", + " walltime=\"02:00:00\", # Amount of wall time\n", + ")\n", + "# cluster.adapt(maximum_jobs=24, minimum_jobs=2) # If you want to force everything to be quicker, increase the number of minimum jobs, \n", + "# # but sometimes then it will take a while until you get them assigned, so it's a trade-off\n", + "cluster.scale(12) # I changed this because currently dask is flaky, this might have to be adjusted during the tutorial\n", + "client = distributed.Client(cluster)\n", + "client" + ] + }, + { + "cell_type": "markdown", + "id": "884e8473-6d10-46e9-9a43-2175ae8631a0", + "metadata": {}, + "source": [ + "### Get the data \n", + "\n", + "**Note**: the drop-down solutions, below, assume you used b1850.run_length output for plotting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a789cc-95ed-44f6-a566-215e6ed0668d", + "metadata": {}, + "outputs": [], + "source": [ + "# Set your casename here:\n", + "casename = 'b1850.run_length'\n", + "\n", + "# Here we point to the archive directory from your b1850.run_length simulation\n", + "pth = f\"/glade/derecho/scratch/{username}/archive/{casename}/ocn/hist/\"\n", + "\n", + "# If you were unable to successfully run the b1850.run_length simulation, then feel free to use\n", + "# this provided simulation data instead:\n", + "#pth = f'/glade/campaign/cesm/tutorial/tutorial_2024_archive/{casename}/ocn/hist/'\n", + "\n", + "# Print path to screen\n", + "pth" + ] + }, + { + "cell_type": "markdown", + "id": "ad58f537-556f-406b-a223-a2474ae87361", + "metadata": {}, + "source": [ + "##### Details on files \n", + "- b1850.run_length.pop.h.0001-01.nc : one timestep year ???? and month -?? for a number of 2D and 3D variables and constants\n", + "- b1850.run_length.pop.h.nday1.0001-01-01.nc : daily timestep output for one month for SST, SST variance, SSS and (max) mixed layer depth\n", + "- b1850.run_length.pop.h.once.nc : (background) mixing values\n", + "- b1850.run_length.pop.hv.nc: viscosities" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a0dd260-76ab-4de7-931d-1cc343d82384", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "# how quick this is depends among other things on the availability of workers on casper\n", + "# you can check progress by clicking on the link for the cluster above which will show you the dask dashboard \n", + "flist = glob.glob(pth + casename + '.pop.h.00??-??.nc') #also might want to use just some years not all \n", + "ds_pop = read_dat(flist, ['TEMP', 'SHF'], pop=True)\n", + "ds_pop = ds_pop.sortby(ds_pop.time)\n", + "tlist = np.asarray([time.replace(year=time.year+1957) for time in ds_pop.time.values]) # this makes sure the time axis is useful\n", + "ds_pop['time'] = tlist\n", + "ds_pop[\"time\"] = ds_pop.indexes[\"time\"].to_datetimeindex()\n", + "ds_pop #print some meta-data to screen" + ] + }, + { + "cell_type": "markdown", + "id": "ec0ade1b-407c-4bae-b4a7-62fdee617961", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 1\n", + "Means of global Surface Heat Flux and Sea Surface Temperature" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5d20c79-d1d1-4c62-8300-fade14d8e588", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%%time\n", + "fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)\n", + "\n", + "ds_pop.SHF.mean('time').plot(robust=True, ax=ax[0])\n", + "ax[0].set_title(r'Surface Heat Flux [W/m$^2$]')\n", + "\n", + "ds_pop.TEMP.sel(z_t=0, method='nearest').mean('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))\n", + "ax[1].set_title(r'Sea Surface Temperature [$^{\\circ}$C]')\n", + "#plt.savefig('basics_plot_1.png', bbox_inches='tight') # uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "9b3d3721-a43b-4bde-9d15-7392173cc52b", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_1.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f8da7c30-27d9-4b43-b05e-afeeb94a2422", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Can you plot 50m ocean temperature instead of surface heat flux (SHF)?" + ] + }, + { + "cell_type": "markdown", + "id": "df7c4390-a6d0-4247-9ebc-10998086182d", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "First, try using Xarray's ```sel``` function to select temperature values at the POP z-axis (z_t) index closest to 50m (note that the values in z_t are in centimeters):\n", + " \n", + "```\n", + "ds_pop.TEMP.sel(z_t=5000, method='nearest').mean('time').plot(robust=True, ax=ax[0], levels=np.arange(0,32,1))\n", + "```\n", + "\n", + "What was the depth selected? \n", + " \n", + "```\n", + "ds_pop.TEMP.sel(z_t=5000, method='nearest').mean('time').z_t.values\n", + "```\n", + " \n", + "There is not a layer with the midpoint at 50m. There are layers with the midpoint at 45m and 55m. \n", + "\n", + "```\n", + "(ds_pop.z_t)/100\n", + "```\n", + "\n", + "To estimate the temperature at 50m, we can use Xarray's ```interp``` to interpolate the values along the z-axis. By default, this function uses a linear interpolation method:\n", + " \n", + "```\n", + "ds_pop.TEMP.interp(z_t=5000).mean('time').plot(robust=True, ax=ax[0], levels=np.arange(0,32,1))\n", + "``` \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0ff3c68f-99b3-4e51-afb9-d987bd918d22", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Can you plot sea surface height (SSH) instead of surface heat flux (SHF)?" + ] + }, + { + "cell_type": "markdown", + "id": "e307984c-ce16-4c4e-bda3-ba6d940f36a8", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "We didn't initially load SSH as a variable we kept, so you will need to do that above.\n", + " \n", + "```\n", + "ds_pop = read_dat(flist, ['TEMP', 'SHF','SSH'], pop=True)\n", + "```\n", + "\n", + "Always be aware of which variables might be in a file.\n", + " \n", + "Once you've loaded SSH in the dataset, then plot it instead of SHF as follows:\n", + "\n", + "```\n", + "ds_pop.SSH.mean('time').plot(robust=True, ax=ax[0])\n", + "ax[0].set_title(r'Sea Surface Height (cm)')\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b4652dc4-1383-4023-ad2e-ca28b2510687", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Can you plot standard deviations instead of means?" + ] + }, + { + "cell_type": "markdown", + "id": "36d0ea5a-ee50-4ca7-9d2b-8c9c3fff8c3f", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Replace the `.mean` function with `.std` in the plotting call.\n", + " \n", + "```\n", + "ds_pop.SHF.std('time').plot(robust=True, ax=ax[0])\n", + "\n", + "ds_pop.TEMP.sel(z_t=0, method='nearest').std('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "829160aa-36f6-46b1-8cad-860bd3735dba", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 2\n", + "\n", + "Let's make some nicer plots! Have you noticed the x and y axes of the plots above? They are indices rather than longitudes and latitudes. POP output is on a curvilinear grid which means that the grid is not regularly (evenly) spaced. ```TLAT``` and ```TLONG``` are 2D variables depending on these indices, let's have a look at how to make maps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8847b2d5-9290-422c-8772-40b0764937c5", + "metadata": {}, + "outputs": [], + "source": [ + "# learn what TLAT and TLONG look like \n", + "fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)\n", + "\n", + "ds_pop.TLAT.plot(ax=ax[0], levels=np.arange(-90,95,5))\n", + "ax[0].set_title('TLAT')\n", + "ds_pop.TLONG.plot(ax=ax[1], levels=np.arange(0,370,10))\n", + "ax[1].set_title('TLONG')" + ] + }, + { + "cell_type": "markdown", + "id": "88135e00-bfc9-4b81-88e6-712679ec3b29", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_2.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e1517969-1f19-4909-bf9a-f1b10e917700", + "metadata": {}, + "source": [ + "**Question**\n", + "\n", + "Can you see the irregularity in TLAT? What does the discontinuity in TLONG mean? " + ] + }, + { + "cell_type": "markdown", + "id": "b93cd75a-97ce-4d82-85d4-5b0c223d2ee9", + "metadata": {}, + "source": [ + "### 1. Make global maps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "76c3a229-16cb-4001-833f-5f6ae18317c6", + "metadata": {}, + "outputs": [], + "source": [ + "# Add cyclic point\n", + "ds_pop_cyc = pop_add_cyclic(ds_pop)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "527f3cbe-1724-49ba-a539-f333af917d0d", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "\n", + "# initiate the figure\n", + "fig = plt.figure(dpi=150, figsize=(12,3))\n", + "\n", + "# add the first subplot\n", + "ax_shf = plt.subplot(1, 2, 1, projection=ccrs.Robinson(central_longitude=300.0))\n", + "\n", + "pc = ax_shf.contourf(ds_pop_cyc.TLONG, ds_pop_cyc.TLAT, ds_pop_cyc.SHF.mean('time'),\n", + " transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(-120,130,10))\n", + "\n", + "ax_shf.set_global() \n", + "\n", + "land = ax_shf.add_feature(\n", + " cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',\n", + " linewidth=0.5,\n", + " edgecolor='black',\n", + " facecolor='darkgray'))\n", + "\n", + "shf_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_shf);\n", + "shf_cbar.set_label(r'[W/m$^{2}$]')\n", + "\n", + "ax_shf.set_title('Surface Heat Flux')\n", + "\n", + "# add the second subplot\n", + "ax_sst = plt.subplot(1, 2, 2, projection=ccrs.Robinson(central_longitude=300.0))\n", + "\n", + "pc = ax_sst.contourf(ds_pop_cyc.TLONG, ds_pop_cyc.TLAT, ds_pop_cyc.TEMP.isel(z_t=0).mean('time'),\n", + " transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(0,32,1))\n", + "\n", + "ax_sst.set_global() \n", + "\n", + "land = ax_sst.add_feature(\n", + " cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',\n", + " linewidth=0.5,\n", + " edgecolor='black',\n", + " facecolor='darkgray'))\n", + "\n", + "sst_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_sst);\n", + "sst_cbar.set_label(r'[$^{\\circ}$C]')\n", + "ax_sst.set_title('Sea Surface Temperature')\n", + "\n", + "#plt.savefig('basics_plot_3.png', bbox_inches='tight') # uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "97823b3e-49d7-4c8e-97e7-b957f93b533a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_3.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9a562d62-1efb-45e0-ab7b-5408c893ddbb", + "metadata": {}, + "source": [ + "### 2. Make regional map over continental US" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a419e0b-bb58-4740-9877-35a358acbd0b", + "metadata": {}, + "outputs": [], + "source": [ + "# define the extent of the map\n", + "lonW = -140\n", + "lonE = -40\n", + "latS = 15\n", + "latN = 65\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1dacb156-9942-43a3-9b57-1bd4fe6491aa", + "metadata": {}, + "outputs": [], + "source": [ + "# what does sea surface temperature around the US look like? (i.e. where would you like to go swimming..)\n", + "fig = plt.figure(figsize=(11, 8.5))\n", + "ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", + "ax.set_title('')\n", + "gl = ax.gridlines(\n", + " draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'\n", + ")\n", + "ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())\n", + "ax.coastlines(resolution=res, color='black')\n", + "ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')\n", + "ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');\n", + "tdat = ax.pcolormesh(ds_pop.TLONG, ds_pop.TLAT, ds_pop.TEMP.isel(z_t=0, time=10), cmap='RdYlBu_r')\n", + "plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1)\n", + "#plt.savefig('basics_plot_4.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "72f9a1c9-7bf1-4dd7-b193-dcb5baf8bf77", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_4.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cbda596b-5483-4221-b228-f87fbb0278cd", + "metadata": {}, + "source": [ + "### 3. Make regional map over the Pacific\n", + "\n", + "There's an awful lot of not-ocean over the continental US. Let's look at the Pacific instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39a879e8-1dc0-4c9f-afae-c98a33fa7778", + "metadata": {}, + "outputs": [], + "source": [ + "# define the extent of the map\n", + "lonW = -180\n", + "lonE = -60\n", + "latS = -30\n", + "latN = 30\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcce69d0-c184-4f2f-9b20-775c05489bdd", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(11, 8.5))\n", + "ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", + "ax.set_title('SST')\n", + "gl = ax.gridlines(\n", + " draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'\n", + ")\n", + "ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())\n", + "ax.coastlines(resolution=res, color='black')\n", + "ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')\n", + "ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');\n", + "tdat = ax.pcolormesh(ds_pop.TLONG, ds_pop.TLAT, ds_pop.TEMP.isel(z_t=0, time=10), cmap='RdYlBu_r', vmin=15, vmax=31)\n", + "cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))\n", + "cbar.set_label(r'[$^{\\circ}$C]')\n", + "#plt.savefig('basics_plot_5.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "843c70eb-926e-4e86-92f9-3fd98aab069a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_5.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6fd00b8a-9894-4745-a4ca-21e9d9ade96a", + "metadata": {}, + "source": [ + "### 4. Plotting contours\n", + "\n", + "The figures above use `pcolormesh` to plot, but if you want to make filled contours using `contourf` you will need to make your dataset cyclical." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efe1c49f-f602-4dfb-bc10-12da1dc9300b", + "metadata": {}, + "outputs": [], + "source": [ + "#ds_pop_cyc = pop_add_cyclic(ds_pop)# uncomment this if you have not run this line before" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71d64e38-7de2-4db4-9759-5e850b0a3aca", + "metadata": {}, + "outputs": [], + "source": [ + "# define the extent of the map\n", + "lonW = -180\n", + "lonE = -60\n", + "latS = -30\n", + "latN = 30\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc6fd1db-1e65-4a23-984d-00e7406317cc", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(11, 8.5))\n", + "ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", + "ax.set_title('SST')\n", + "gl = ax.gridlines(\n", + " draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'\n", + ")\n", + "ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())\n", + "ax.coastlines(resolution=res, color='black')\n", + "ax.stock_img() # something else than the boarders for a change\n", + "tdat = ax.contourf(ds_pop_cyc.TLONG, ds_pop_cyc.TLAT, ds_pop_cyc.TEMP.isel(z_t=0, time=10), cmap='RdYlBu_r', levels=np.arange(10,31,1))\n", + "cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))\n", + "cbar.set_label(r'[$^{\\circ}$C]')\n", + "#plt.savefig('basics_plot_6.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "aa52cb62-eec6-4390-8a12-76d34723d704", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_6.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c8b0288e-e6b4-4ef1-8624-b31e4eebff57", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Try looking at the Equatorial Atlantic Ocean or other region that interests you (Gulf of Mexico, Gulf of Maine, California Coast)." + ] + }, + { + "cell_type": "markdown", + "id": "c9d29a3b-d7c7-4d4c-aeaf-7eeedf48caa3", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Before plotting the region, you'll need to modify the latitude/longitude bounds. Here are the bounds for the Equatorial Atlantic Ocean: \n", + "```\n", + "# define the extent of the map\n", + "lonW = -60\n", + "lonE = 20\n", + "latS = -30\n", + "latN = 30\n", + "cLat = (latN + latS) / 2\n", + "cLon = (lonW + lonE) / 2\n", + "res = '110m'\n", + "```\n", + "\n", + "You can play with these to look at other regions of interest to you.\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9f98a8bf-9012-4edd-8288-149579c13252", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Try plotting other variables like sea surface height (SSH) or 50m temperature." + ] + }, + { + "cell_type": "markdown", + "id": "12ba7997-bf17-48cb-8eec-5ea7c467b319", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "See hints in exercise 1. \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f5e01632-7866-4aa3-bdca-c292c5d66389", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 3\n" + ] + }, + { + "cell_type": "markdown", + "id": "8088c31c-46a0-44f9-b5c1-f435a0a712aa", + "metadata": {}, + "source": [ + "So far we've just looked at 2D ocean properties, primarily at the surface. But the ocean is deep and you might want to look at how a variable changes with depth. Here we'll plot a cross section of an ocean variable with depth and how it changes with time.\n", + "\n", + "The difficulty here is that you can't easily select your lat and lon location, you need to find the nlon and nlat index first. As you could see from the ```TLAT``` and ```TLONG``` plots above, they don't behave regularly, so this is a bit of a challenge. Let's start with the equator (which is a bit easier than high up north)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3968b3c-835c-4473-a915-57d751596efd", + "metadata": {}, + "outputs": [], + "source": [ + "ds_pop.TLAT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45ef4912-1b64-4dad-bc2d-e7ae0a92fda2", + "metadata": {}, + "outputs": [], + "source": [ + "# find the latitude that is the smallest, i.e. closest to the equator:\n", + "abs(ds_pop.TLAT).argmin(dim='nlat')" + ] + }, + { + "cell_type": "markdown", + "id": "53e0a032-1b39-4f76-88a1-e67b15bc4d7c", + "metadata": {}, + "source": [ + "**This shows you that the equator is not the same everywhere** \n", + "but it is within one index and so might be just on the south or north of the equator, you can choose either. (there is no latitude where lat=0, can you imagine why?)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f3fb6625-488b-4681-a336-485eee29523d", + "metadata": {}, + "outputs": [], + "source": [ + "# so let's say \n", + "ind_eq = 180" + ] + }, + { + "cell_type": "markdown", + "id": "f0953a2a-ee77-4c2d-b5d4-e9dcd21c72c4", + "metadata": {}, + "source": [ + "Let's now find some location we might be interested in, say 140$^{\\circ}$W" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "402d8417-55d7-4cd4-af1a-728f0352a0b6", + "metadata": {}, + "outputs": [], + "source": [ + "ds_pop.TLONG.isel(nlat=ind_eq).plot()" + ] + }, + { + "cell_type": "markdown", + "id": "574c504b-5c2b-49d4-8118-5a9cb6ddf57a", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_7.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "442fc568-4af4-49c3-98f0-83f4c32e3ef9", + "metadata": {}, + "outputs": [], + "source": [ + "# the longitude goes from 0-360, so if we want 140W which is -140 we would need to select 220\n", + "ind_140w = abs(ds_pop.TLONG.isel(nlat=ind_eq)-220).argmin()" + ] + }, + { + "cell_type": "markdown", + "id": "2d30bf12-3bbb-4be5-a138-30dc2692f30d", + "metadata": {}, + "source": [ + "### 1. First Plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "949a410b-c188-4bfa-ba3b-2be1b8839069", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(2, 1, figsize=(9,4.5))\n", + "\n", + "ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).plot(y='z_t', ax=ax[0], \n", + " ylim=(250e2,0), levels=np.arange(10,32,2), cmap='RdYlBu_r')\n", + "\n", + "ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).plot(y='z_t', ax=ax[1], \n", + " ylim=(5000e2,0), levels=np.arange(0,10.2,0.2), cmap='Blues')\n", + "\n", + "#plt.savefig('basics_plot_8.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "a0aaf85d-6350-410d-b158-e1c276ad6889", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_8.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "417f27d7-c58a-4c8f-980a-a531b0079aa9", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What is the vertical dimension? Which side of the plot is the ocean surface vs. the ocean floor?" + ] + }, + { + "cell_type": "markdown", + "id": "4c2090a8-349a-4587-ba1d-525b20ec71ca", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "These plots have the surface of the ocean at the top of the plot. So it's oriented physically with how we percieve the world. You should be aware of how the y axis changes when plotting figures like this to make them more easily interpretable.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d53404ea-6116-49a1-8173-71c57540f934", + "metadata": {}, + "source": [ + "### 2. Nicer axes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74211b70-e318-46b7-855c-4f7333e5fa97", + "metadata": {}, + "outputs": [], + "source": [ + "fig, (ax_upper, ax_lower) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 3]}, \n", + " figsize=(10,6), sharex=True)\n", + "\n", + "dat_upper = ax_upper.contourf(ds_pop.time, ds_pop.z_t/100, ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).T, \n", + " levels=np.arange(10,32,1), cmap='RdYlBu_r', extend='both')\n", + "ax_upper.set_ylim(300,0)\n", + "plt.colorbar(dat_upper, ax=ax_upper)\n", + "\n", + "dat_lower = ax_lower.contourf(ds_pop.time, ds_pop.z_t/100, ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).T, \n", + " levels=np.arange(0,10.5,0.5), cmap='Blues', \n", + " extend='both')\n", + "ax_lower.set_ylim(4000,300)\n", + "plt.colorbar(dat_lower, ax=ax_lower, shrink=0.7)\n", + "#plt.savefig('basics_plot_9.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "efe789d3-a585-4fb6-bd6e-0de87c9c86a1", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_9.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "15f7e5e0-a9f5-4f73-a334-8c9f39557fab", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "What happened to the vertical axis? Why does this make the plot easier to read?" + ] + }, + { + "cell_type": "markdown", + "id": "6a712296-7198-4a1e-82cc-37d679342bbd", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "The ocean is deep and there is often different rates of change in a variable over the the upper ocean compared to the deep ocean. So using different scales and plotting them separately can be useful for analysis. \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e6feb3cc-5731-42b4-8bdf-4b57f083c3e6", + "metadata": {}, + "source": [ + "_______________\n", + "## Exercise 4" + ] + }, + { + "cell_type": "markdown", + "id": "7ea55dc5-b495-49d1-9c48-d4cd54f2c792", + "metadata": {}, + "source": [ + "The previous exercise showed how to plot a vertical cross section of the ocean over time. But it can also be valuable to plot a profile of a variable with depth at a particular point either at one time, averaged over time, or a profile averaged over a set of points again at one time or averaged over time. \n", + "\n", + "Here we will plot an average profile of temperature with depth. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff0ca0b5-e110-4875-9860-05f841aabfb5", + "metadata": {}, + "outputs": [], + "source": [ + "ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64360723-834c-4d44-82b7-2f813c61c53c", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "# let's load these calculated quantities so that we don't have to calculate them time and time again \n", + "t_0n140w_mean = ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).mean('time').load()\n", + "t_0n140w_std = ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).std('time').load()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b2438a1-8422-466c-809c-c7053c907473", + "metadata": {}, + "outputs": [], + "source": [ + "# plot the mean profile\n", + "t_0n140w_mean.plot(y='z_t', ylim=(300e2,0), label='mean')\n", + "plt.xlim(10,28)\n", + "plt.title('T at 0$^{\\circ}$N, 140$^{\\circ}$W')\n", + "\n", + "# let's add some error bars --> standard deviation \n", + "\n", + "plt.fill_betweenx(ds_pop.z_t, t_0n140w_mean-t_0n140w_std, t_0n140w_mean+t_0n140w_std, color='black', alpha=0.2, edgecolor=None, label='std')\n", + "\n", + "plt.legend()\n", + "#plt.savefig('basics_plot_10.png', bbox_inches='tight')# uncomment this to save your figure" + ] + }, + { + "cell_type": "markdown", + "id": "bddc4521-24ea-488d-9606-928c56429cc2", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "![plot example](../../../images/diagnostics/pop/basics_plot_10.png)\n", + "\n", + "*

Figure: Plotting solution.

*\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c6d5cf0f-bd2d-4ed9-9f87-305190c2b324", + "metadata": {}, + "source": [ + "**Question:**\n", + "\n", + "Why is there grey shading on the plot above? i.e. How many ensembles have we included? What else could be causing a spread in the output?" + ] + }, + { + "cell_type": "markdown", + "id": "5b8e9dd0-c17c-45b5-aeda-73e0da8b0c28", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + " Click here for hints \n", + "\n", + "Here we take an average of the profiles in one location over time. But you could average over ensembles or over a region at one time, and both would also provide information about the variability in this quantity over depth. \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bb05d3e-2324-4705-a387-71715a454cd1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "NPL 2023a", + "language": "python", + "name": "npl-2023a" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/diagnostics/pop/pop.ipynb b/_sources/notebooks/diagnostics/pop/pop.ipynb new file mode 100644 index 000000000..b029792f8 --- /dev/null +++ b/_sources/notebooks/diagnostics/pop/pop.ipynb @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Ocean" + ] + }, + { + "cell_type": "markdown", + "id": "18a0c6f1-355a-4f2a-99ac-1fead4de8626", + "metadata": {}, + "source": [ + "## Basic Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "ce7f7f35-19aa-406c-9330-e973dbb576d0", + "metadata": { + "tags": [] + }, + "source": [ + "### Learning Goals\n", + "\n", + "- How to load and plot POP ocean model output\n", + "- How to deal with the curvilinear grid\n", + "- How to select a point for making profiles\n", + "- How to define useful functions" + ] + }, + { + "cell_type": "markdown", + "id": "ae93c512-ccde-43cf-9d73-822cddde7ef2", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 1: Making map plots\n", + "\n", + "Here we will produce a map plot of surface heat flux and sea surface temperature. Some things to try include plotting standard deviations instead of means, plotting another surface variable, or plotting temperature at a particular depth." + ] + }, + { + "cell_type": "markdown", + "id": "a0b48b29-16d6-4474-9d81-152f9849acd3", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 2: Making global and regional maps\n", + "\n", + "Here will we learn how to use the TLAT and TLONG coordinates in POP to plot nicer global or regional maps. Some things to try include plotting different regions or different variables.\n" + ] + }, + { + "cell_type": "markdown", + "id": "589f85ae-bbe7-4e57-8b4b-1eec5d1e326c", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 3: Making timeseries\n", + "\n", + "Here will we learn how to make a timeseries of temperature at a single point throughout the column.\n" + ] + }, + { + "cell_type": "markdown", + "id": "5676b088-c81c-4a4c-8fc7-bce6f09dd32d", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 4: Making a profile\n", + "\n", + "Here we learn how to plot a temperature profile at a single point on the ocean grid." + ] + }, + { + "cell_type": "markdown", + "id": "782bebb4-f00e-4362-8738-736ab39a311d", + "metadata": {}, + "source": [ + "## Advanced Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "c9434bfe-c2c3-4e6a-ba83-de538a6f29ed", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 1: Plot winter time maximum mixed-layer depth\n", + "\n", + "Here we learn how to select winter months and plot the maximum mixed-layer depth for both hemispheres on a single map. " + ] + }, + { + "cell_type": "markdown", + "id": "714dba27-4bcf-40db-9779-9fe0c3dde5f3", + "metadata": {}, + "source": [ + "_______________\n", + "\n", + "### Exercise 2: Compute and plot ocean heat storage per area for the upper 2000m\n", + "\n", + "Here we learn how to calculate the heat storage per area from the temperature trend and plot the results on a global map." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/cesm_expts/clim_data_gateway.ipynb b/_sources/notebooks/intro/cesm_expts/clim_data_gateway.ipynb new file mode 100644 index 000000000..3dbe209c5 --- /dev/null +++ b/_sources/notebooks/intro/cesm_expts/clim_data_gateway.ipynb @@ -0,0 +1,65 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Climate Data Gateway" + ] + }, + { + "cell_type": "markdown", + "id": "9d8e3ee1-e605-4894-afd2-b0a83420711a", + "metadata": {}, + "source": [ + "Publicly released CESM data is available via the Climate Data Gateway. Timeseries data in both CESM standard format and CMIP format are available. Registration is quick and easy, and NCAR accounts are not required for access." + ] + }, + { + "cell_type": "markdown", + "id": "4afe3049-6271-4659-b23d-b4627dc31e93", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Climate Data Gateway webpage](https://www.earthsystemgrid.org/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e33a15df-834d-4108-a342-905d66bce697", + "metadata": {}, + "source": [ + "![CDG](../../../images/intro/clim_data_gateway.png)\n", + "\n", + "*

Figure: Climate Data Gateway Homepage.

*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eeccd871-4162-4b13-a29d-cc9529557043", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/cesm_expts/clim_data_guide.ipynb b/_sources/notebooks/intro/cesm_expts/clim_data_guide.ipynb new file mode 100644 index 000000000..e606d33f1 --- /dev/null +++ b/_sources/notebooks/intro/cesm_expts/clim_data_guide.ipynb @@ -0,0 +1,65 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Climate Data Guide" + ] + }, + { + "cell_type": "markdown", + "id": "43c2831e-6726-4718-8460-2a042109003b", + "metadata": {}, + "source": [ + "The Climate Data Guide describes observations used for Earth System Model evaluation. To date 150+ data sets have been profiled. Expert-user guidance by 45+ scientists is provided to users, including pros and cons of each dataset. There are also comparisons of common variables (e.g. precipitation, sea surface temperature, sea ice concentration, etc.)." + ] + }, + { + "cell_type": "markdown", + "id": "422d7b55-49d9-4059-90ff-eec47665f874", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Climate Data Guide webpage](http://climatedataguide.ucar.edu/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "16c243bf-a625-417d-929b-67a8171b2fab", + "metadata": {}, + "source": [ + "![CDG](../../../images/intro/clim_data_guide.png)\n", + "\n", + "*

Figure: Climate Data Guide Homepage.

*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7d1fc1d-4dc0-4718-92c9-30f38db2bb77", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/cesm_webpage.ipynb b/_sources/notebooks/intro/cesm_webpage.ipynb new file mode 100644 index 000000000..b004a7fb1 --- /dev/null +++ b/_sources/notebooks/intro/cesm_webpage.ipynb @@ -0,0 +1,81 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0086605a-f330-41bd-a79b-13339e0e5d58", + "metadata": { + "tags": [] + }, + "source": [ + "# CESM Webpage" + ] + }, + { + "cell_type": "markdown", + "id": "9546d840-c247-4952-a8f2-52a377e5e180", + "metadata": {}, + "source": [ + "The **CESM Web Page** is the first point of reference for all things CESM. Here we can explore the larger CESM project, delve deeper into individual working groups, models, research activities, model releases, supporting model data, tools, events and much much more.\n" + ] + }, + { + "cell_type": "markdown", + "id": "71155f04-3f3a-4aa2-9caa-96815767ef1c", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM project webpage](http://www.cesm.ucar.edu)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "59650279-f141-4093-b06d-b788d46ae33c", + "metadata": {}, + "source": [ + "**Some points to pay attention to:** \n", + "- CESM **``Project``** Information\n", + "- **``Working Groups``** Information\n", + "- **``Community Projects``** Information\n", + " - CESM2 Large Ensemble\n", + " - CESM2 Stratospheric Aerosol Injection (ARISE-SAI)\n", + "- What **``Version``** of the model should you use?\n", + "- **``Individual Model``** Pages https://www.cesm.ucar.edu/models/ \n", + "- **``Supported Model``** Releases – 2.1.X vs 2.2.X\n", + "- **``Experiments``**, expand a case for details, diagnostics plots for many experiments\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8bd790d-2ad5-445d-aaff-4bc8d5b23a29", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/community_experiments.ipynb b/_sources/notebooks/intro/community_experiments.ipynb new file mode 100644 index 000000000..7d661a29a --- /dev/null +++ b/_sources/notebooks/intro/community_experiments.ipynb @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Community Experiments" + ] + }, + { + "cell_type": "markdown", + "id": "59bb8a3f-74a5-4c7f-aaa7-15d22fe59b4a", + "metadata": {}, + "source": [ + "Information about community experiments performed with CESM version 2 and previous verisons of the model (CSM1, CCSM2, CCSM3, CESM1) are documented on an experiments webpage. " + ] + }, + { + "cell_type": "markdown", + "id": "c6540e1c-d489-401b-b227-2da4f69c50ec", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM experiments webpage](https://www.cesm.ucar.edu/experiments)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "387a41d7-3e1f-4272-9ba6-7940dc3c9f7f", + "metadata": {}, + "source": [ + "Explore this webpage and then click on the CESM2 Experiments, Data, and Diagnostic Output link for experiments from the most recent model version." + ] + }, + { + "cell_type": "markdown", + "id": "501487a2-94b7-4947-a273-208b0106c0fd", + "metadata": {}, + "source": [ + "![CESM Experiments](../../images/intro/CESM_exp_1.png)\n", + "\n", + "*

Figure: CESM experiments webpage.

*" + ] + }, + { + "cell_type": "markdown", + "id": "26b40b47-8dfc-4477-99f2-f54f859ea47c", + "metadata": {}, + "source": [ + "This page provides a searchable list of all the CESM2 experiments available to the public. \n", + "To interpret the casenames, it is helpful to remember CESM naming conventions that provide information about the experiment at a glance. Knowing the CESM case naming conventions will help you navigate CESM community experiments. Information about the CESM naming is available at:" + ] + }, + { + "cell_type": "markdown", + "id": "09e4bfeb-04af-427e-9636-f62f001b567e", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM case naming conventions](https://www.cesm.ucar.edu/models/cesm2/naming-conventions)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "ab79cd61-d4c9-4e40-92f2-9253756b2eda", + "metadata": {}, + "source": [ + "Click on the experiment that corresponds to the CESM2 CMIP6 preindustrial control experiment:\n", + "b.e21.B1850.f09_g17.MIP6-piControl.001" + ] + }, + { + "cell_type": "markdown", + "id": "50f1a8e8-90d0-44e7-8fcf-5dd2f0b09d3f", + "metadata": {}, + "source": [ + "![CESM Experiments](../../images/intro/CESM_exp_2.png)\n", + "\n", + "*

Figure: CESM2 CMIP6 PI control experiment.

*" + ] + }, + { + "cell_type": "markdown", + "id": "42e2aada-04d8-40ba-8ae2-3d501782dadb", + "metadata": {}, + "source": [ + "Information about this experiment drops down below the experiment name. There are three main sections of information:\n", + "\n", + "- The title of the experiment with active components listed.\n", + "- Links to the data and/or the NCAR HPC directory with data. (#1, green arrow)\n", + "- Links to the diagnostic component package output and the Climate Variability Diagnostics Package. (#2, blue arrow)\n", + "- Details about the run, including the resolution, compset, etc. (#3, red arrow)" + ] + }, + { + "cell_type": "markdown", + "id": "0d1ff550-d4c7-45be-a6d0-b1ea789d0d67", + "metadata": {}, + "source": [ + "![CESM Experiments](../../images/intro/CESM_exp_3.png)\n", + "\n", + "*

Figure: CESM2 CMIP6 PI control experiment.

*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "084b0a01-829d-4996-bea5-f0e56e2c6d04", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/components.ipynb b/_sources/notebooks/intro/components.ipynb new file mode 100644 index 000000000..8abe5e901 --- /dev/null +++ b/_sources/notebooks/intro/components.ipynb @@ -0,0 +1,87 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0086605a-f330-41bd-a79b-13339e0e5d58", + "metadata": { + "tags": [] + }, + "source": [ + "# What is CESM ? \n", + "\n", + "CESM is a coupled Earth system model for simulating Earth’s climate system and connected component systems. The model is composed of **separate models** that simultaneously simulate the Earth’s atmosphere, ocean, land, river run-off, land-ice, and sea-ice. The model components that are coupled through the Common Infrastructure for Modeling the Earth known as **[CIME](https://esmci.github.io/cime/versions/master/html/index.html)**. \n" + ] + }, + { + "cell_type": "markdown", + "id": "bac52cc8-695c-49b9-9018-69503ad75f2f", + "metadata": {}, + "source": [ + "![Discuss Image](../../images/intro/CESM2.png)\n", + "*

Figure: CESM2 Structure

*" + ] + }, + { + "cell_type": "markdown", + "id": "cd1f097c-1b20-4905-9af1-1b7c3901cb79", + "metadata": {}, + "source": [ + "## Model Components\n", + "\n", + "Each model component has a page on the CESM website containing descriptions and documentation for active or prognostic models. \n", + "\n", + "You can explore each of the component models and CIME from the links below." + ] + }, + { + "cell_type": "markdown", + "id": "16519007-3902-4d9e-bdb4-380208c14e33", + "metadata": {}, + "source": [ + "
\n", + "Component Links:\n", + " \n", + "- ``Atmosphere`` \n", + "- ``Land`` \n", + "- ``Land Ice`` \n", + "- ``Ocean`` \n", + "- ``River Runoff`` \n", + "- ``Sea Ice`` \n", + "- ``Wave`` \n", + "- ``CIME`` \n", + " \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e00f9ea-6161-4090-ba36-7f4022e9e467", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/coupling.ipynb b/_sources/notebooks/intro/coupling.ipynb new file mode 100644 index 000000000..dabf2fed7 --- /dev/null +++ b/_sources/notebooks/intro/coupling.ipynb @@ -0,0 +1,135 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "163311c4-af4e-4ac5-bfa1-20fc25016f28", + "metadata": { + "tags": [] + }, + "source": [ + "# CIME (Advanced)\n" + ] + }, + { + "cell_type": "markdown", + "id": "b247f4d7-ca36-4b62-bc4d-007c42ed9892", + "metadata": {}, + "source": [ + "The Combined Model Components form the coupled CESM through a shared common set of tools and infrastructure and coupling framework. Here we describe the Common Infrastructure for Modeling the Earth otherwise known as [CIME](https://esmci.github.io/cime/versions/master/html/index.html), as well as the current CESM2 and future coupling frameworks.\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5ddb5ae-4b5f-4f55-8242-5b8e86c831c8", + "metadata": {}, + "source": [ + "## Common Infrastructure for Modeling the Earth (CIME)" + ] + }, + { + "cell_type": "markdown", + "id": "9dca3b1b-e249-4e6c-b34c-46efc6cdc144", + "metadata": {}, + "source": [ + "The Common Infrastructure for Modeling the Earth is a python-based framework that is shared between CESM2 and other modeling center efforts to ensure efficient \n", + "coordination of model development. The schema below shows some of the science benefits and organizations that are using the CIME infrastructure. \n", + "

\n" + ] + }, + { + "cell_type": "markdown", + "id": "d973f124-8754-4bf6-a089-2509ea267671", + "metadata": {}, + "source": [ + "![CESM directories and namelists](../../images/intro/CESM2_CIME_Infrastructure.png)\n", + "*

Figure: Overview of the CESM2 Common Infrastructure for Modeling the Earth (CIME)

*\n" + ] + }, + { + "cell_type": "markdown", + "id": "4c689c94-e8c6-40a6-a2a0-0fa873d1f111", + "metadata": {}, + "source": [ + "## Model Coupling Toolkit (MCT)" + ] + }, + { + "cell_type": "markdown", + "id": "03cb0afa-459e-44f2-948b-452195c8589d", + "metadata": {}, + "source": [ + "The CESM2 coupling is performed through the Model Coupling Toolkit (MCT). Additionally, the MCT coupling framework allows data and stub components to \n", + "replace active or prognostic components providing flexible activation/deactivation of feedbacks. \n", + "The schematic below shows all of the components and their connections.\n", + "

\n" + ] + }, + { + "cell_type": "markdown", + "id": "9bc59881-d61d-49a0-8178-f5ffba630a41", + "metadata": {}, + "source": [ + "![CESM directories and namelists](../../images/intro/CESM2_MCT_Coupling.png)\n", + "*

Figure: Overview of the CESM2 Components and Model Coupling Toolkit (MCT)

*\n" + ] + }, + { + "cell_type": "markdown", + "id": "9c213a95-b901-4db3-b263-4bf2d3e54196", + "metadata": {}, + "source": [ + "## Earth System Modeling Framework (ESMF) Coupling" + ] + }, + { + "cell_type": "markdown", + "id": "70a62a59-021b-4798-9e77-7ff786f54e7e", + "metadata": {}, + "source": [ + "Coupling development beyond CESM2 will be changing to the Earth System Modeling Framework (ESMF) National Unified Operational Prediction Capability (NUOPC) framework. More details on NUOPC can be found at \n", + " https://earthsystemmodeling.org/nuopc/ . The schema below shows the new CESM configuration and coupling with NUOPC.\n", + "

" + ] + }, + { + "cell_type": "markdown", + "id": "d9569358-6f6b-4fcc-9909-11e295957bca", + "metadata": {}, + "source": [ + "\n", + "![CESM directories and namelists](../../images/intro/CESM_NUOPC_Coupling.png)\n", + "*

Figure: Overview of the new CESM Components and National Unified Operational Prediction Capability (NUOPC) framework

*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40abbd6b-70cb-427b-a468-9311191be2a7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/getting_help.ipynb b/_sources/notebooks/intro/getting_help.ipynb new file mode 100644 index 000000000..4c99fcfa7 --- /dev/null +++ b/_sources/notebooks/intro/getting_help.ipynb @@ -0,0 +1,88 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Getting Help\n" + ] + }, + { + "cell_type": "markdown", + "id": "de6ee277-ec79-4c5f-9cbf-d2901dd20ba3", + "metadata": {}, + "source": [ + "As you gain experience using and running CESM, you may want additional sources of information to help with problem solving, designing modeling experiments, runtime issues, etc." + ] + }, + { + "cell_type": "markdown", + "id": "aa8da793-cfa0-472f-980e-6ec0c5478791", + "metadata": {}, + "source": [ + "## DiscussCESM Forums" + ] + }, + { + "cell_type": "markdown", + "id": "3dfb2ac3-aeb3-421a-a8ea-636ffe0a61b4", + "metadata": {}, + "source": [ + "The DiscussCESM or Bulletin Board forum is an excellent location to post questions or to search through previously posted and answered questions in regard to problems encounter while using CESM.\n", + "\n", + "Register as a forums user by entering your valid information in the registration form. You can subscribe to forums of interest -- especially the “Announcements” and “Known Problems” -- and this way we can communicate updates to you.\n" + ] + }, + { + "cell_type": "markdown", + "id": "153bdbd3-d587-4125-8f90-a69496f5f264", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[DiscussCESM Forum](https://bb.cgd.ucar.edu/cesm/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f5f4bfa4-9482-4e29-8a9b-b4082ae8f452", + "metadata": {}, + "source": [ + "![Discuss Image](../../images/intro/CESM2_Discuss.png)\n", + "*

Figure: CESM2 Discuss Bulletin Board

*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1dedd34e-f4c7-452d-b31e-b80acc32609a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/getting_involved.ipynb b/_sources/notebooks/intro/getting_involved.ipynb new file mode 100644 index 000000000..a0a4a6ffb --- /dev/null +++ b/_sources/notebooks/intro/getting_involved.ipynb @@ -0,0 +1,151 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Getting Involved\n" + ] + }, + { + "cell_type": "markdown", + "id": "3d14afe8-0247-4446-a1d4-1a2859156d90", + "metadata": {}, + "source": [ + "## CESM Events" + ] + }, + { + "cell_type": "markdown", + "id": "ae8ef153-ef12-4306-97d7-9d1ce6cda746", + "metadata": {}, + "source": [ + "CESM has a long history of open, Community Events. A schedule of CESM Events is maintained on the CESM Website. CESM events include Community and Working Group Meetings, Tutorials, Seminars, and other related events. The first Community workshop was held in 1996 and continues annually today, and there are winter working-group specific meetings.\n" + ] + }, + { + "cell_type": "markdown", + "id": "d0a9d7fd-4003-4b94-8e42-2342a148909b", + "metadata": {}, + "source": [ + "
\n", + " \n", + "[CESM Events](https://www.cesm.ucar.edu/events)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9347c979-52dc-44f8-9d7f-57a74b722db4", + "metadata": {}, + "source": [ + "![CESM Events Image](../../images/basics/CESM2_Events.png)\n", + "*

Figure: CESM2 Events Page

*" + ] + }, + { + "cell_type": "markdown", + "id": "e231cf65-e68f-4767-a5f1-0a59ad02922c", + "metadata": {}, + "source": [ + "**We hope to see you at a future CESM workshop!**" + ] + }, + { + "cell_type": "markdown", + "id": "2fc2e42c-dcfa-45aa-a16b-c1846590f2f9", + "metadata": {}, + "source": [ + "## CESM Email Lists" + ] + }, + { + "cell_type": "markdown", + "id": "a459419f-4e90-4aac-a7f4-13ce597afd1c", + "metadata": {}, + "source": [ + "There are a number of email lists for the CESM community that you can join to receive updates for the whole CESM community or for particular working groups." + ] + }, + { + "cell_type": "markdown", + "id": "002db32d-d135-446c-9c01-c6807467ae32", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM Email lists](https://www.cesm.ucar.edu/about/faqs)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "47c38994-bf8c-4cf3-8112-9e6b871398de", + "metadata": {}, + "source": [ + "## CESM Github Alerts" + ] + }, + { + "cell_type": "markdown", + "id": "df28fe76-4efe-491c-8784-3c4f0fb2fd04", + "metadata": {}, + "source": [ + "If you create a github account and opt-in, you can watch CESM related repositories." + ] + }, + { + "cell_type": "markdown", + "id": "909d4342-cfab-40ea-90bc-bf9c713939c5", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM Github](https://github.com/ESCOMP/CESM)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "30eb47fb-19c2-4b0a-a0c6-ae412f018ef3", + "metadata": {}, + "source": [ + "![Discuss Image](../../images/intro/CESM_github.png)\n", + "*

Figure: CESM2 Github Page

*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1dedd34e-f4c7-452d-b31e-b80acc32609a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/intro_overview.ipynb b/_sources/notebooks/intro/intro_overview.ipynb new file mode 100644 index 000000000..5e4cc18d5 --- /dev/null +++ b/_sources/notebooks/intro/intro_overview.ipynb @@ -0,0 +1,87 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Introduction" + ] + }, + { + "cell_type": "markdown", + "id": "f0015117-d84f-471e-9bc5-ba87dc050baf", + "metadata": {}, + "source": [ + "Welcome to the world of the **Community Earth System Model (CESM)**. This introduction will discuss the structure of the CESM model, provide information about how to become more involved in the CESM community, and how to get help if required.\n" + ] + }, + { + "cell_type": "markdown", + "id": "8a108581-ab10-4779-b8a7-da44ccaf4495", + "metadata": {}, + "source": [ + "## Visualizing this documentation" + ] + }, + { + "cell_type": "markdown", + "id": "864d5c25-d84a-437a-b86f-65a5211db5e8", + "metadata": {}, + "source": [ + "Depending on your computer settings, you may see this documentation with a **white** or **black background**. To toggle between these settings click the sun or moon in the upper right of the page (see red arrow below). \n", + "\n", + "We have developed the documentation with the **white background** and recommend you use these settings. If you choose to use the dark background it is possible some of the visualizations will be more difficult to read." + ] + }, + { + "cell_type": "markdown", + "id": "1a9457c9-8717-4882-b6b2-311ce7ff899c", + "metadata": {}, + "source": [ + "![Light/Dark mode](../../images/intro/light_dark_mode.png)\n", + "\n", + "*

Figure: How to change between light/dark mode.

*" + ] + }, + { + "cell_type": "markdown", + "id": "7f68efa6-c770-4448-aa2a-13882b8fd5f4", + "metadata": {}, + "source": [ + "## Advanced Knowledge\n", + "\n", + "Some of the pages of this tutorial are marked as **Advanced**. Feel free to skip these as needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "acd1bd32-84b7-4d4e-9688-605a832766e6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/intro/project.ipynb b/_sources/notebooks/intro/project.ipynb new file mode 100644 index 000000000..b0ce1776a --- /dev/null +++ b/_sources/notebooks/intro/project.ipynb @@ -0,0 +1,129 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0086605a-f330-41bd-a79b-13339e0e5d58", + "metadata": { + "tags": [] + }, + "source": [ + "# CESM Working Groups" + ] + }, + { + "cell_type": "markdown", + "id": "cab53fe1-0293-48ad-b0e3-4b9869bc55fb", + "metadata": {}, + "source": [ + "The CESM project has a strong commitment to Community involvment in governance and development of the CESM. The CESM modeling effort is coordinated through **Working Groups** that are responsible for the science and development of individual CESM components or organized to coordinate other across CESM efforts. \n", + "\n", + "Each team takes responsibility for developing and continually improving its component of the CESM consistent with the CESM goal of a fully-coupled model and with the CESM design criteria. There are currently 12 Working Groups." + ] + }, + { + "cell_type": "markdown", + "id": "aa2d188a-e632-43f5-9f52-ea91411d2014", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Atmosphere Model Working Group (AMWG)](https://www.cesm.ucar.edu/working-groups/atmosphere)\n", + " \n", + "[Biogeochemistry Working Group (BGCWG)](https://www.cesm.ucar.edu/working-groups/biogeo)\n", + " \n", + "[Chemistry Climate Working Group (CCWG)](https://https://www.cesm.ucar.edu/working-groups/chemistry)\n", + " \n", + "[Climate Variability and Change Working Group (CVCWG)](https://www.cesm.ucar.edu/working-groups/climate)\n", + " \n", + "[Earth System Prediction Working Group (ESPWG)](https://www.cesm.ucar.edu/working-groups/earth-system)\n", + " \n", + "[Land Ice Working Group (LIWG)](https://www.cesm.ucar.edu/working-groups/land-ice)\n", + " \n", + "[Land Model Working Group (LMWG)](https://www.cesm.ucar.edu/working-groups/land)\n", + " \n", + "[Ocean Model Working Group (OMWG)](https://www.cesm.ucar.edu/working-groups/ocean)\n", + " \n", + "[Paleoclimate Working Group (PWG)](https://www.cesm.ucar.edu/working-groups/paleo)\n", + " \n", + "[Polar Climate Working Group (PCWG)](https://www.cesm.ucar.edu/working-groups/polar)\n", + " \n", + "[Software Engineering Working Group (SEWG)](https://www.cesm.ucar.edu/working-groups/software)\n", + " \n", + "[Whole Atmosphere Model Working Group (WAWG)](https://www.cesm.ucar.edu/working-groups/whole-atmosphere)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e0c8268d-cff5-4ae0-8f65-e5b7017d32fd", + "metadata": {}, + "source": [ + "Each Working Group is coordinated by Co-Chairs. The Working Groups decide their own development priorities and work schedules, consistent with the overall goals of CESM, and are subject to oversight by the CESM Scientific Steering \n", + "Committee (SSC)." + ] + }, + { + "cell_type": "markdown", + "id": "426af3d0-3705-4b5c-a265-3d60fac884d5", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Working Group Co-Chairs and Terms](https://www.cesm.ucar.edu/working-groups/co-chairs)\n", + " \n", + "[Scientific Steering Committee (SSC)](https://www.cesm.ucar.edu/management/ssc)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "09ca207c-608c-4933-b640-e8155e100b10", + "metadata": {}, + "source": [ + "**We welcome and strongly encourage anyone interested to join the relevant CESM working groups to participate more fully in the CESM project and model development.** \n", + "\n", + "**Check the webpage [\"Getting Involved\"](https://ncar.github.io/CESM-Tutorial/notebooks/intro/getting_involved.html) for more information.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8bd790d-2ad5-445d-aaff-4bc8d5b23a29", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "603ca3b9-3c17-4697-9bb3-02526745b130", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml.ipynb b/_sources/notebooks/modifications/xml.ipynb new file mode 100644 index 000000000..ae6bd61bb --- /dev/null +++ b/_sources/notebooks/modifications/xml.ipynb @@ -0,0 +1,53 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Simple XML Modifications" + ] + }, + { + "cell_type": "markdown", + "id": "09b1ddf9-0892-4a46-bfa6-11fa05eac358", + "metadata": {}, + "source": [ + "We use XML files to control case settings. This is what we cover in this chapter:\n", + "- The section *Overview* describes what XML files are and the primary files used in CESM.\n", + "- You will then learn how to query and change XML variables.\n", + "- Next, we describe some of the main XML variables used to control run length or run type. \n", + "- The section *Exercise Overview* offers opportunities to practice the concepts learned in this chapter." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb5bff3c-1583-4653-8286-f45e4cc86b5f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/copying_cases.ipynb b/_sources/notebooks/modifications/xml/copying_cases.ipynb new file mode 100644 index 000000000..6659aa2e0 --- /dev/null +++ b/_sources/notebooks/modifications/xml/copying_cases.ipynb @@ -0,0 +1,35 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Copying Cases \n", + "\n", + "This is a placeholder for this lesson." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/exercises.ipynb b/_sources/notebooks/modifications/xml/exercises.ipynb new file mode 100644 index 000000000..9aa2008d9 --- /dev/null +++ b/_sources/notebooks/modifications/xml/exercises.ipynb @@ -0,0 +1,53 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bfc54be9-aad8-420b-83c1-874ecd9cdc1b", + "metadata": {}, + "source": [ + "# Exercise Overview" + ] + }, + { + "cell_type": "markdown", + "id": "eb20fd6b-c748-428f-a8dc-565b2c43dfe4", + "metadata": {}, + "source": [ + "We will do three exercises to help us better understand xml modifications.\n", + "\n", + "- In Exercise 1, we will practice runtime variable modifications.\n", + "- In Exercise 2, we will create a branch run and modify the ocean coupling frequency. \n", + "- In Exercise 3, we will create a hybrid run and modify the atmosphere physics timestep. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b57bbfc-2712-460c-9da6-9545fe3e9869", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/exercises/xml_length_exercise.ipynb b/_sources/notebooks/modifications/xml/exercises/xml_length_exercise.ipynb new file mode 100644 index 000000000..cde7e5732 --- /dev/null +++ b/_sources/notebooks/modifications/xml/exercises/xml_length_exercise.ipynb @@ -0,0 +1,251 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "55295ae2-df19-4226-9f54-2c052e4afadc", + "metadata": {}, + "source": [ + "# Exercise 1: Modify run length " + ] + }, + { + "cell_type": "markdown", + "id": "9b8d7632-491e-4851-b6dc-b28e6620c761", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Exercise: Modify the `env_run.xml` file

\n", + "**Part I**: \n", + "Create a new fully coupled **startup** case named \"b1850.run_length\" from the 1850 climate conditions with a resolution of f19_g17. Increase the amount of standard output produced by the model for debugging. Run for 1 month.

\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "bed2b80a-b00e-46c5-b39c-4d3fd7363c55", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Hint!\n", + " \n", + "\n", + "1. Which variable controls the amount of standard output for debugging? We can use partial query to find out:\n", + " \n", + "```\n", + " ./xmlquery -p DBUG\n", + "```\n", + "\n", + "2. Use `xmlchange` to modify `env_run.xml` \n", + "\n", + "3. Make sure to update the walltime to match the run length.\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "448ee61e-bbe3-4149-9029-58abf1247f3f", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution to Part I\n", + " \n", + "\n", + " \n", + "From the `SRCROOT` (`/glade/u/home/$USER/code/my_cesm_code`) directory, create your case:\n", + " \n", + "```\n", + " cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts\n", + " ./create_newcase --case /glade/u/home/$USER/cases/b1850.run_length --res f19_g17 --compset B1850\n", + "```\n", + "
\n", + " \n", + "In your case directory, change debugging levels and set runtime variables:\n", + "\n", + "```\n", + " cd /glade/u/home/$USER/cases/b1850.run_length\n", + " ./xmlchange INFO_DBUG=2,STOP_N=1,STOP_OPTION=nmonths\n", + " ./xmlchange --subgroup case.run JOB_WALLCLOCK_TIME=2:00:00\n", + "```\n", + "
\n", + " \n", + "Remember to manually update your README.case file to document your changes.\n", + "\n", + "\n", + "Carry on to setup, build and submit the run:\n", + " \n", + "```\n", + " ./case.setup \n", + " qcmd -- ./case.build\n", + " ./case.submit\n", + "```\n", + "\n", + "Remember that `qcmd` is used on derecho only.\n", + "\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "74917252-811a-4818-a62b-d63b3040e73d", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Exercise: Modify the `env_run.xml` file

\n", + " \n", + "**Part II**:\n", + "*Do part II only **after** Part I has finished running*. \n", + "Change the debug level back to 1. Expand Part I to produce a total of 38 months of model run. Remember that you have already run for 1 month. \n", + "- You can only do part II **after** Part I has finished running\n", + "- You should submit this at the end of the day so that it will (hopefully) run overnight and be available the following day. You can continue with Exercise 2-3 and submit the run later.\n", + "- **VERY, VERY IMPORTANT: Don't use the ``tutorial`` for this run as it is an overnight run. You should submit that run in the ``main`` queue**\n", + "\n", + "**To submit in the ``main`` queue, you need to add:**\n", + "```\n", + " ./xmlchange JOB_QUEUE=main\n", + "```\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "00c9a0fd-0cf5-4129-9f2f-d3583cc7c8ef", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Hint!\n", + " \n", + "\n", + "1. Which variable controls the amount of standard output for debugging? We can use partial query to find out:\n", + " \n", + "```\n", + " ./xmlquery -p DBUG\n", + "```\n", + "\n", + " \n", + "2. Use `xmlchange` to modify `env_run.xml` \n", + "\n", + "3. Make sure to update the walltime to match the run length.\n", + " \n", + "4. For Part II, how to tell the model that this run continues from the previously finished run of 1 month?\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f72d36bf-b3a6-4862-9479-169cbc2b01e7", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution to Part II\n", + " \n", + "\n", + "
\n", + "1. To continue the run, set `CONTINUE_RUN` to `TRUE`\n", + " \n", + "```\n", + " cd /glade/u/home/$USER/cases/b1850.run_length\n", + " ./xmlchange CONTINUE_RUN=TRUE\n", + "```\n", + "\n", + "
\n", + "2. Keep `STOP_OPTION` as \"nmonths” \n", + " \n", + " \n", + "
\n", + "3. Set `STOP_N` to “37”\n", + " \n", + "```\n", + " ./xmlchange STOP_N=37\n", + "```\n", + "\n", + "
\n", + "4. Set INFO_DBUG to 1\n", + " \n", + "```\n", + " ./xmlchange INFO_DBUG=1\n", + "```\n", + "\n", + "\n", + "
\n", + "5. Change queue\n", + " \n", + "```\n", + " ./xmlchange JOB_QUEUE=main\n", + "```\n", + "\n", + "
\n", + "6. Change wallclock time to use the maximum of the allowed wallclock on derecho:\n", + " \n", + "```\n", + " ./xmlchange --subgroup case.run JOB_WALLCLOCK_TIME=12:00:00\n", + " ./xmlchange --subgroup case.st_archive JOB_WALLCLOCK_TIME=6:00:00\n", + "```\n", + "\n", + "
\n", + "7. Submit (./case.submit) from your b1850.run_length case directory:\n", + "\n", + "```\n", + " ./case.submit\n", + "```\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a8dfc72-6b1a-4d20-8730-dd8515a2758c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/exercises/xml_runtype_exercise.ipynb b/_sources/notebooks/modifications/xml/exercises/xml_runtype_exercise.ipynb new file mode 100644 index 000000000..d8d71363f --- /dev/null +++ b/_sources/notebooks/modifications/xml/exercises/xml_runtype_exercise.ipynb @@ -0,0 +1,169 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d8c91f63-5ac2-46e2-8051-a0ee087f62a5", + "metadata": {}, + "source": [ + "# Exercise 2: Modify run type " + ] + }, + { + "cell_type": "markdown", + "id": "7ca45013-1ec6-43e6-94e8-3006ac7f9be1", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Exercise: Modify the `env_run.xml` file

\n", + " \n", + "Branch from the end of another run to create a new case named \"b1850.branch\". \n", + "\n", + "We will branch from a run ``b1850.initial`` at year 2. The restart files for this run are located in: \n", + "```\n", + "/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000\n", + "```\n", + "\n", + "Double the ocean coupling frequency (`OCN_NCPL`). Include an initial file as output data. Run for 1 month, then restart for 1 month. \n", + " \n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c289a358-fb18-4bb2-b087-33ea5d666aa6", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Hint!\n", + " \n", + "\n", + "1. For a branch run, we need to set several variables related to the reference case in `env_run.xml`. To find variables applied to reference case (Branch and Hybrid runs), use ./xmlquery -p REF.\n", + " \n", + "2. Ocean coupling frequency needs to be changed in `env_run.xml`, controlled by the variable `OCN_NCPL`. What is the default value of `OCN_NCPL`? Use `xmlquery` to find out! You may also take a look at the variable description in `env_run.xml` to learn more about the variable.\n", + " \n", + "3. Make sure to update the walltime to match the run length.\n", + " \n", + "4. Don't forget to put restart files into the run directory `$RUNDIR`.\n", + " \n", + "5. To include an initial file as output, we will need to modify the variable `inithist` in the atmospehre namelist `user_nl_cam`. We will learn more about this in the next chapter namelist modification. \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "a7917422-93d0-473d-9950-68a39c35c41e", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution\n", + " \n", + "\n", + "
\n", + "1. Create your new case with the command:\n", + " \n", + "```\n", + " cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + " ./create_newcase --case /glade/u/home/$USER/cases/b1850.branch --res f19_g17 --compset B1850\n", + "```\n", + "
\n", + "\n", + "
\n", + "2. In your case directory, change the run type to branch, and change the associated RUN_* variables:\n", + "\n", + "```\n", + " cd /glade/u/home/$USER/cases/b1850.branch\n", + " ./xmlchange RUN_TYPE=branch\n", + " ./xmlchange RUN_REFCASE=b1850.initial,RUN_REFDATE=0002-01-01,GET_REFCASE=FALSE\n", + "```\n", + "\n", + "
\n", + "3. Set run time variables: \n", + " \n", + "```\n", + " ./xmlchange STOP_OPTION=nmonths,STOP_N=1,RESUBMIT=1,JOB_WALLCLOCK_TIME=02:00:00\n", + "``` \n", + "\n", + "
\n", + "4. Double ocean coupling frequency in `env_run.xml`:\n", + " \n", + "```\n", + " ./xmlchange OCN_NCPL=48\n", + "```\n", + "\n", + "
\n", + "5. Set up the case, put the initial and restart files in the `$RUNDIR`:\n", + " \n", + "```\n", + " ./case.setup\n", + " cp /glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000/* /glade/derecho/scratch/$USER/b1850.branch/run/\n", + "```\n", + " \n", + "
\n", + "\n", + "6. Run ./preview_namelists:\n", + "\n", + "```\n", + " ./preview_namelists\n", + "```\n", + " \n", + "
\n", + "7. Carry on to build and submit the run:\n", + " \n", + "```\n", + " qcmd -- ./case.build\n", + " ./case.submit\n", + "```\n", + "
\n", + "\n", + "Remember that `qcmd` is used on derecho only.\n", + " \n", + "After the job completes, go to the short term archive space and explore.\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30e887f9-f5fb-4cce-8f3b-9fdc7386f199", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/exercises/xml_timestep_exercise.ipynb b/_sources/notebooks/modifications/xml/exercises/xml_timestep_exercise.ipynb new file mode 100644 index 000000000..e27b8b56d --- /dev/null +++ b/_sources/notebooks/modifications/xml/exercises/xml_timestep_exercise.ipynb @@ -0,0 +1,143 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bd28c148-b907-489d-9892-068ed48b11d9", + "metadata": {}, + "source": [ + "# Exercise 3: Change physics timestep" + ] + }, + { + "cell_type": "markdown", + "id": "dddd8ba3-aa00-451c-938f-35b3927a016f", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Exercise: Change physics timestep in CAM and CLM

\n", + "\n", + "**Hybrid** start a fully coupled run under pre-Industrial conditions with a resolution of f19_g17. \n", + "\n", + "Use restart and initial files from the run ``b1850.initial`` at year 2. The restart files for this run are located in: \n", + "```\n", + "/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000\n", + "```\n", + "\n", + "Change the physics timestep in the atmosphere and land to 1200 seconds (default is 1800). Run 5 days.\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f2dacddc-4f8f-4fb5-9664-65ab2618f97f", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Hint!\n", + " \n", + "\n", + "The atmosphere physics timestep is determined by the base period of coupling `NCPL_BASE_PERIOD` and the coupling frequency `ATM_NCPL`. \n", + "Find out their default values using xmlquery.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cb35e292-fcbb-45a6-9a28-f02a80df83a6", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution\n", + " \n", + "\n", + "
\n", + "1. From the script directory, create your case:\n", + " \n", + "```\n", + " cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + " ./create_newcase --case /glade/u/home/$USER/cases/b1850.timestep --res f19_g17 --compset B1850\n", + "```\n", + " \n", + "
\n", + "2. In your case directory, change run type and runtime variables:\n", + " \n", + "```\n", + " cd /glade/u/home/$USER/cases/b1850.timestep\n", + " ./xmlchange RUN_TYPE=hybrid\n", + " ./xmlchange RUN_REFCASE=b1850.initial,RUN_REFDATE=0002-01-01,GET_REFCASE=FALSE,JOB_WALLCLOCK_TIME=2:00:00\n", + "```\n", + " \n", + "
\n", + "3. Change the physics timestep for CAM: \n", + " \n", + "```\n", + " ./xmlchange ATM_NCPL=72\n", + "```\n", + "(Why `ATM_NCPL` = 72? Do the math).\n", + "\n", + "
\n", + "4. Set up the case and position your initial and restart files in the `$RUNDIR`:\n", + " \n", + "```\n", + " ./case.setup\n", + " cp /glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000/* /glade/derecho/scratch/$USER/b1850.timestep/run/\n", + "```\n", + " \n", + "
\n", + "5. Continue to build and submit: \n", + " \n", + "```\n", + " qcmd -- ./case.build\n", + " ./case.submit\n", + "```\n", + " \n", + "Remember that `qcmd` is used on derecho only.\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd58b568-cd97-4a59-bd26-a6c13f3b0ba3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/model_control_files.ipynb b/_sources/notebooks/modifications/xml/model_control_files.ipynb new file mode 100644 index 000000000..d33d45622 --- /dev/null +++ b/_sources/notebooks/modifications/xml/model_control_files.ipynb @@ -0,0 +1,435 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# How to Modify XML Files (*.xml)\n", + "\n", + "Now let's learn how to edit and search for variables in an `*.xml` file\n", + "\n", + "We will use **`xmlchange`** to modify xml variables and use **`xmlquery`** to search xml variables. Note that you _can_ change XML files manually, but using the `xmlchange` script prevents XML errors and ensures there is a record of your changes in the `CaseStatus` file.\n", + "\n", + "For the examples below, you can follow along by going to your `CASEROOT` directory b1850.basics that you completed in the Basics section." + ] + }, + { + "cell_type": "markdown", + "id": "0f82a5d4-62f5-462f-b162-bf4854a5e8d0", + "metadata": {}, + "source": [ + "***\n" + ] + }, + { + "cell_type": "markdown", + "id": "37497e69-075a-4099-a65d-e1c5cf91086e", + "metadata": {}, + "source": [ + "## 1. Editing with **`xmlchange`**" + ] + }, + { + "cell_type": "markdown", + "id": "c1f5f422-194f-4bc9-85a1-5610a266b6c6", + "metadata": {}, + "source": [ + "When modifying an `*.xml` file, we highly recommend using the **`xmlchange`** tool. This is done using the syntax `./xmlchange VARIABLE=VALUE` in your case directory. " + ] + }, + { + "cell_type": "markdown", + "id": "057cc9f0-14fc-46f7-b3a5-9eca551dbe16", + "metadata": {}, + "source": [ + "The xml files can also be edited manually with your favorate text editor (vi, emacs, etc.), but users should take care not to introduce any formatting errors that could lead to incomplete environment variable settings. You can use your text editor to take a look at the xml files -- you will find descriptions of each variable, which can be very helpful in understanding what they control. " + ] + }, + { + "cell_type": "markdown", + "id": "2c4a7c72-2021-445f-80e4-84539d782e6f", + "metadata": {}, + "source": [ + "Here is an example for using `xmlchange`. If you want to change the length of your run to one month, edit `env_run.xml` via the `xmlchange` tool by typing on the command line: \n", + "\n", + "```\n", + "./xmlchange STOP_OPTION=nmonths,STOP_N=1\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "3221a454-5c83-40c0-ab4e-744a63fa9971", + "metadata": {}, + "source": [ + "
\n", + " \n", + " \n", + " \n", + " Tips!\n", + " \n", + " \n", + "When using xmlchange to modify multiple environment variables, use comma (and no space!) in between variables.
\n", + "You can always find help by typing ``./xmlchange --help``\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "2e2dbbae-0375-49d1-9655-49b2eb5df884", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + "Click here for example output of \"./xmlchange --help\" >
\n", + "\n", + "```\n", + "./xmlchange --help\n", + "```\n", + " \n", + "
\n", + " \n", + "Output:
\n", + "\n", + "```\n", + "usage: xmlchange [-h] [-d] [-v] [-s] [--caseroot CASEROOT] [--append]\n", + " [--subgroup SUBGROUP] [--id ID] [--val VAL] [--file FILE]\n", + " [--delimiter DELIMITER] [--dryrun] [--noecho] [-f]\n", + " [-loglevel LOGLEVEL]\n", + " [listofsettings]\n", + "\n", + "Allows changing variables in env_*xml files via a command-line interface.\n", + "\n", + "This provides two main benefits over editing the xml files by hand:\n", + " - Settings are checked immediately for validity\n", + " - Settings are echoed to the CaseStatus file, providing a \"paper trail\" of\n", + " changes made by the user.\n", + "\n", + "Examples:\n", + "\n", + " To set a single variable:\n", + " ./xmlchange REST_N=4\n", + "\n", + " To set multiple variables at once:\n", + " ./xmlchange REST_OPTION=ndays,REST_N=4\n", + "\n", + " Alternative syntax (no longer recommended, but supported for backwards\n", + " compatibility; only works for a single variable at a time):\n", + " ./xmlchange --id REST_N --val 4\n", + "\n", + " Several xml variables that have settings for each component have somewhat special treatment.\n", + " The variables that this currently applies to are:\n", + " NTASKS, NTHRDS, ROOTPE, PIO_TYPENAME, PIO_STRIDE, PIO_NUMTASKS\n", + " For example, to set the number of tasks for all components to 16, use:\n", + " ./xmlchange NTASKS=16\n", + " To set just the number of tasks for the atm component, use:\n", + " ./xmlchange NTASKS_ATM=16\n", + "\n", + " The CIME case xml variables are grouped together in xml elements .\n", + " This is done to associate together xml variables with common features.\n", + " Most variables are only associated with one group. However, in env_batch.xml,\n", + " there are also xml variables that are associated with each potential batch job.\n", + " For these variables, the '--subgroup' option may be used to specify a particular\n", + " group for which the variable's value will be adjusted.\n", + " \n", + "...\n", + "\n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "c1ce0178-094a-4f2d-9a8a-d9764b427a0a", + "metadata": {}, + "source": [ + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "bfcc9eca-86f5-4ad0-a481-3f8b481e5a6c", + "metadata": {}, + "source": [ + "
\n", + "Evaluate your understanding\n", + "\n", + "If you want to manually resubmit an initial case that previously had a `CONTINUE_RUN` value of `FALSE`, how do you change it to `TRUE`?\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "bab2a8f3-4cee-4bba-a8fe-570ac306871d", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "\n", + "Click here for the solution
\n", + "\n", + "Use xmlchange to modify the variable value with the command:\n", + "``` \n", + " ./xmlchange CONTINUE_RUN=TRUE \n", + "```\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "b4cdce13-52a4-4dcc-bd19-93db33339402", + "metadata": {}, + "source": [ + "
\n", + "\n", + "***" + ] + }, + { + "cell_type": "markdown", + "id": "9dcd9f04-8a62-40bb-8901-c709edab0764", + "metadata": {}, + "source": [ + "## 2. Searching xml variables with **`xmlquery`**" + ] + }, + { + "cell_type": "markdown", + "id": "85e1421c-8386-4d7b-aa51-a0d0240d3a8b", + "metadata": {}, + "source": [ + "We recommend using the **`xmlquery`** tool in your case directory to query xml variables." + ] + }, + { + "cell_type": "markdown", + "id": "01d3cdf9-7eb5-4dc4-9745-1efb571f0efb", + "metadata": {}, + "source": [ + "For example, to find out the run type of your job, search for xml variable `RUN_TYPE`: \n", + "\n", + "```\n", + "./xmlquery RUN_TYPE\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "67864bd6-d229-4b28-b976-6e18883b042b", + "metadata": {}, + "source": [ + "
\n", + " \n", + " \n", + " \n", + " Tips!\n", + " \n", + "\n", + "You can always find help by typing `./xmlquery --help` \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b01a2599-923a-4a78-ae97-42904f679e52", + "metadata": {}, + "source": [ + "This will return the default `RUN_TYPE` value:\n", + ">RUN_TYPE: hybrid" + ] + }, + { + "cell_type": "markdown", + "id": "e83f2c2d-5a57-447a-add3-f0d37ec74bb3", + "metadata": {}, + "source": [ + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9adc30a9-549b-4a68-a25a-743fab747aa6", + "metadata": {}, + "source": [ + "
\n", + "Evaluate your understanding\n", + "\n", + "Let's check if the variables in the previous exercise are properly modified.\n", + " \n", + "Query for the value of `STOP_N`, `STOP_OPTION`, and `CONTINUE_RUN`.\n", + "\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "2a664275-f370-4438-af52-7ed9c8526517", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution\n", + " \n", + " \n", + "Use `xmlquery` to search the variables with the command:\n", + "
\n", + "```\n", + " ./xmlquery STOP_N,STOP_OPTION,CONTINUE_RUN \n", + "```\n", + " \n", + "
\n", + "If you see: \n", + "\n", + "```\n", + ">STOP_N: 1 \n", + ">STOP_OPTION: nmonths \n", + ">CONTINUE_RUN: TRUE \n", + "```\n", + "
\n", + " Great! You have successfully queried these variables. \n", + "
\n", + "\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "ba5e3006-7d70-4e3f-bdf9-351f766bd7ca", + "metadata": {}, + "source": [ + "
\n", + "\n", + "***\n" + ] + }, + { + "cell_type": "markdown", + "id": "55f9f962-c8ae-4685-ae6d-9d4a75f1d5b5", + "metadata": {}, + "source": [ + "## 3. Use the subgroup functionality of **`xmlchange`**" + ] + }, + { + "cell_type": "markdown", + "id": "a3e50d72-dac9-42be-95a7-71e1d8759ea1", + "metadata": {}, + "source": [ + "Now let's first try to find out the wallclock time of your job, search for xml variable `JOB_WALLCLOCK_TIME`: \n", + "\n", + "```\n", + "./xmlquery JOB_WALLCLOCK_TIME\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "f190bd81-be55-481a-820a-522d7f77fb08", + "metadata": {}, + "source": [ + "
\n", + " \n", + " \n", + " \n", + " Tips!\n", + " \n", + " \n", + "If you are unsure about the full name of the xml variable, you can query variables with a partial match, using `--partial-match` or `-p`. \n", + " \n", + "For example: `./xmlquery -p WALLCLOCK`\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1279be11-3868-4aac-9132-042d7efd515b", + "metadata": {}, + "source": [ + "
\n", + "You will find that the query of wallclock time returns multiple instances:" + ] + }, + { + "cell_type": "markdown", + "id": "fea58693-2073-42e9-a219-568119f870f0", + "metadata": {}, + "source": [ + ">Results in group case.run
\n", + ">JOB_WALLCLOCK_TIME: 00:30:00\n", + "\n", + ">Results in group case.st_archive
\n", + ">JOB_WALLCLOCK_TIME: 00:30:00" + ] + }, + { + "cell_type": "markdown", + "id": "84969b59-8664-4104-a292-76c5e6d36d7f", + "metadata": {}, + "source": [ + "The variable `JOB-WALLCLOCK_TIME` has two instances in two different subgroups: `case.run` and `case.st_archive`.
\n", + "\n", + "Then, how do we specify which instance we want to modify?\n", + "\n", + "For variables that have multiple instances, we can use the **\"subgroups\"** functionality in `xmlchange`.\n", + "For example, if we want to change the default `JOB_WALLCLOCK_TIME` from 30 minutes to 1 hour for the short term archiver subgroup, type in the following command:\n", + "\n", + "```\n", + "./xmlchange --subgroup case.st_archive JOB_WALLCLOCK_TIME=01:00:00\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "be11b2ed-b3a5-49ea-a350-bc4fa7f2e609", + "metadata": {}, + "source": [ + "Try it yourself! Type in the command above and use `xmlquery` to check if your modifications are correctly applied. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1ed48db-f145-4e5c-a656-8249053833f7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/modify_run_type.ipynb b/_sources/notebooks/modifications/xml/modify_run_type.ipynb new file mode 100644 index 000000000..90d3f43e5 --- /dev/null +++ b/_sources/notebooks/modifications/xml/modify_run_type.ipynb @@ -0,0 +1,57 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Modifying the Type of Run \n", + "\n", + "CESM has three types of initial runs:\n", + "- startup\n", + "- branch\n", + "- hybrid\n" + ] + }, + { + "cell_type": "markdown", + "id": "fb99d6cf-09ee-45da-9af8-4d404709378a", + "metadata": {}, + "source": [ + "\n", + "The xml variable `$RUN_TYPE` determines the initialization type. \n", + "\n", + "Note that the `RUN_TYPE` setting is ***only important for the initial run*** of a production run when the `$CONTINUE_RUN` variable is set to `FALSE`. After the initial run, the `$CONTINUE_RUN` variable is set to `TRUE`, and the model restarts exactly using input files in a case, date, and bit-for-bit continuous fashion. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9447be66-ca1f-4b05-b93c-4f1a0bb303ad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/modify_run_type/hybrid_branch_restart.ipynb b/_sources/notebooks/modifications/xml/modify_run_type/hybrid_branch_restart.ipynb new file mode 100644 index 000000000..6a1914580 --- /dev/null +++ b/_sources/notebooks/modifications/xml/modify_run_type/hybrid_branch_restart.ipynb @@ -0,0 +1,311 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Hybrid, Branch and Startup \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ffbef19-73bc-43d9-806b-2b522129f838", + "metadata": {}, + "source": [ + "The CESM model can be initialized in one of three ways: startup, hybrid and branch. These are set with the variable **`$RUN_TYPE`** in `env_run.xml`. \n", + "\n", + "
\n", + "\n", + "***\n" + ] + }, + { + "cell_type": "markdown", + "id": "5f390f8b-76ec-4a3a-8273-a1f2828b4ac2", + "metadata": {}, + "source": [ + "## 1. The three run types\n", + "\n", + "\n", + "#### - STARTUP\n", + "\n", + "- In a startup run (the default), all model components are initialized from the basic **default initial conditions**. The coupler does not need an initial file. \n", + "\n", + "\n", + "\n", + "#### - BRANCH\n", + "\n", + "- In a branch run, all components are initialized using **a consistent set of restart files from a previous run** (determined by the [`$RUN_REFCASE`](./run_variables.ipynb) and [`$RUN_REFDATE`](./run_variables.ipynb) variables in env_run.xml). \n", + "- The case name is generally changed for a branch run, although it does not have to be. \n", + "- In a branch run, setting [`$RUN_STARTDATE`](./run_variables.ipynb) is ignored because the model components obtain the start date from their restart datasets. Therefore, **the start date cannot be changed for a branch run**. This is the same mechanism that is used for performing a restart run (where `$CONTINUE_RUN` is set to TRUE in the env_run.xml file).\n", + "- Branch runs are typically used when sensitivity or parameter studies are required, or when settings for history file output streams need to be modified while still maintaining **bit-for-bit reproducibility**.\n", + "\n", + "\n", + "\n", + "\n", + "#### - HYBRID\n", + "\n", + "- A hybrid run indicates that CESM is initialized more like a startup, but uses initialization datasets from a previous case. This is somewhat analogous to a branch run with relaxed restart constraints. \n", + "- A hybrid run allows users to bring together combinations of initial/restart files from a previous case (specified by [`$RUN_REFCASE`](./run_variables.ipynb)) at a given model output date (specified by [`$RUN_REFDATE`](./run_variables.ipynb)). Unlike a branch run, the starting date of a hybrid run (specified by [`$RUN_STARTDATE`](./run_variables.ipynb)) can be modified relative to the reference case. \n", + "- In a hybrid run, the model does not continue in a bit-for-bit fashion with respect to the reference case. The resulting climate, however, should be continuous provided that no model source code or namelists are changed in the hybrid run. \n", + "- The atmosphere is initialized from initial condition files generated by a user-specified CESM simulation. The land, runoff, ocean and ice are initialized from restart files generated by a user-specified CESM simulation. No coupler file is needed\n", + "\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "62696cba-7150-4f3c-866e-d6ac374a96b8", + "metadata": {}, + "source": [ + "It is important to remember that the **`$RUN_TYPE` variable is only relevant when a run is initialized**. Let's again take a look at the [exercises](../run_length/changing_run_length.ipynb) we did in the chapter of [Changing run length](../run_length/changing_run_length.ipynb):\n" + ] + }, + { + "cell_type": "markdown", + "id": "823344b5-44a0-4f0d-a501-6b9ba8f9608e", + "metadata": {}, + "source": [ + "
" + ] + }, + { + "cell_type": "markdown", + "id": "5e0f253a-2f0e-40c3-b97a-661b15608aa2", + "metadata": { + "tags": [] + }, + "source": [ + "
\n", + "Evaluate your understanding\n", + "\n", + "The tutorial version of the CESM model on derecho simulates ~10 model years per wallclock day. The maximum wallclock request is 12 hours.\n", + "If you want to run the model for 100 years, what values should be set for `STOP_OPTION`, `STOP_N` and `RESUBMIT`? \n", + "\n", + "We worked out that for a total of 100 years, we will need 20 submissions. We can set:\n", + "\n", + "```\n", + "STOP_OPTION = 'nyears', STOP_N = 5, RESUBMIT = 19\n", + "```\n", + "
\n", + " \n", + "Now, **if you want this run to be a hybrid run, what variables should you modify, and at which stage?**\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "44222574-7e88-431d-911d-6c96a9bfde2e", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Hint!\n", + " \n", + " \n", + "The `$RUN_TYPE` variable is only important at the initial run when `CONTINUE_RUN` is set to `FALSE`. \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1e2de2d0-90eb-4c6c-b5df-636dfc79d623", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution\n", + " \n", + "\n", + "Set `RUN_TYPE='hybrid'` in env_run.xml before submitting the initial run. \n", + "\n", + "Bonus question:
\n", + " \n", + "What happens if you set `run_type='branch'` after the 2nd resubmission when the `CONTINUE_RUN=TRUE`?
\n", + " \n", + "Answer: Nothing changes, because `RUN_TYPE` is only relevant for an initial run when `CONTINUE_RUN` is set to `FALSE`! \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "7ef2ad7b-8e69-40cc-97df-165d0060ae45", + "metadata": {}, + "source": [ + "
\n", + "\n", + "One more!\n" + ] + }, + { + "cell_type": "markdown", + "id": "e38db72e-ab1a-4600-b5c5-bdec1586e645", + "metadata": {}, + "source": [ + "
\n", + "Evaluate your understanding\n", + "\n", + "\n", + "In the exercise above, if you have set `RUN_TYPE='hybrid'` and `RESUBMIT=19` before the initial run, what are the value of `CONTINUE_RUN`, `RESUBMIT`, and `RUN_TYPE` at the time of:\n", + "- the initial submission of 5 years\n", + "- the next submission of 5 years\n", + "- the 3rd run (2nd resubmission) of 5 years?\n", + " \n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "78e21916-454a-48ce-a423-be0cefbe6dae", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution \n", + " \n", + " \n", + "- **the initial submission of 5 years**: \n", + " \n", + " ``` \n", + " CONTINUE_RUN=FALSE, RESUBMIT=19, RUN_TYPE='hybrid' \n", + " ```\n", + " because when the run is first initialized, `CONTINUE_RUN=FALSE`
\n", + "
\n", + " \n", + "- **the next submission of 5 years**: \n", + " ```\n", + " CONTINUE_RUN=TRUE, RESUBMIT=18, RUN_TYPE='hybrid'\n", + " ```\n", + " because `RESUBMIT>0`, `CONTINUE_RUN` will automatically switch to `TRUE` after the initial run, but `RUN_TYPE` won't change.
\n", + "
\n", + " \n", + "- **the 3rd run (2nd resubmission) of 5 years**: \n", + " ```\n", + " CONTINUE_RUN=TRUE, RESUBMIT=17, RUN_TYPE='hybrid' \n", + " ```\n", + " `CONTINUE_RUN` stays to be `TRUE`, `RESUBMIT` decreases by 1, `RUN_TYPE` won't change.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9ff63e65-0ae0-4d37-828f-cae55f5c1a7a", + "metadata": {}, + "source": [ + "
\n", + "\n", + "***\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "fca3acd9-afcf-4d36-a287-4b5220f366d7", + "metadata": {}, + "source": [ + "## 2. When to use branch vs. hybrid?" + ] + }, + { + "cell_type": "markdown", + "id": "28612407-0b64-4a29-a1eb-9495203ea223", + "metadata": {}, + "source": [ + "Branch and hybrid runs are useful if you have an experiment which only slightly differs from your control, but you want to make a slight modification, add history output, or start your simulation from a CESM spun-up initial state and maintaining an exact restart (which mimics what the model would do if it had kept running in the original setup).\n", + "\n", + "- **Use a hybrid run**: for most applications where you do NOT need bit for bit restart. You CAN specify a new start date for your model run.\n", + "\n", + "- **Use a branch run**: only for applications which require exact restart. It is typically used when sensitivity or parameter studies are required, or when settings for history file output streams need to be modified while still maintaining bit-for-bit reproducibility. You CANNOT specify a new start date for your model run. It will be assigned by the reference case ([`$RUN_REFDATE`](./run_variables.ipynb)). " + ] + }, + { + "cell_type": "markdown", + "id": "253bec5a-bd70-45a1-a63e-1a935a6caaba", + "metadata": {}, + "source": [ + "
\n", + "\n", + "***\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1cee2835-49f8-4e36-92dc-7ccca26d1354", + "metadata": {}, + "source": [ + "## 3. Restart files for branch and hybrid runs" + ] + }, + { + "cell_type": "markdown", + "id": "656226b3-9959-4e47-b047-725c3ea64969", + "metadata": {}, + "source": [ + "For runs that are initialized as hybrid or branch runs, we will need restart/initial files from previous model runs (as specified by the variables, [`$RUN_REFCASE`](./run_variables.ipynb) and [`$RUN_REFDATE`](./run_variables.ipynb)). See the Chapter [Run variables related to run type](./run_variables.ipynb) for details. \n", + "\n", + "\n", + "Let's take a look back at the [Chapter on restart files](../run_length/restarting.ipynb) to refresh our memory!\n" + ] + }, + { + "cell_type": "markdown", + "id": "1dfd05c3-12d5-4980-b945-9fe7bcae452b", + "metadata": {}, + "source": [ + "It is important to note that these required files must be prestaged by the user to the case run directory (`$RUNDIR`) before the model run starts. This is normally done by just copying the contents of the relevant `$RUN_REFCASE/rest/$RUN_REFDATE.00000` directory.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71ae1b6e-8bf1-4b17-a00f-86f06f4577ff", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/modify_run_type/run_variables.ipynb b/_sources/notebooks/modifications/xml/modify_run_type/run_variables.ipynb new file mode 100644 index 000000000..3ca13720a --- /dev/null +++ b/_sources/notebooks/modifications/xml/modify_run_type/run_variables.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Variables Related to Run Type\n", + "\n", + "A summary of the xml variables pertaining to run type in `env_run.xml`. \n", + "\n", + "
\n", + "\n", + "***\n" + ] + }, + { + "cell_type": "markdown", + "id": "a0652973-f463-4459-bcd1-0027c3cc2c9e", + "metadata": {}, + "source": [ + "- **`RUN_TYPE`** ==> Determines the model run initialization type. Only important for the initial run of a production run when the `$CONTINUE_RUN` variable is set to `FALSE`. Valid values are: 'startup', 'hybrid', 'branch'. \n", + "\n", + "- **`RUN_STARTDATE`** ==> Run start date (yyyy-mm-dd). Only used for startup or hybrid runs. \n", + "\n", + "- **`RUN_REFCASE`** ==> For hybrid or branch runs, name of the reference case you are starting from. \n", + "\n", + "- **`RUN_REFDATE`** ==> For hybrid or branch runs, date stamp (yyyy-mm-dd) of reference case you are starting from. \n", + "\n", + "- **`GET_REFCASE`** ==> Flag for automatically prestaging the refcase restart dataset. If `TRUE`, then the refcase data is prestaged into the executable directory. If `FALSE`, the user need to manually put the restart files into the `$RUNDIR`. " + ] + }, + { + "cell_type": "markdown", + "id": "26abab24-5108-4006-8f31-bf696f837aa4", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/other_xml_variables.ipynb b/_sources/notebooks/modifications/xml/other_xml_variables.ipynb new file mode 100644 index 000000000..0e27b5636 --- /dev/null +++ b/_sources/notebooks/modifications/xml/other_xml_variables.ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8f61eb16-f182-4b94-9959-5fb517a5bc7e", + "metadata": {}, + "source": [ + "# Other Useful XML Variables " + ] + }, + { + "cell_type": "markdown", + "id": "b616dc75-7fd6-46db-8e96-27278c7ec731", + "metadata": {}, + "source": [ + "Here are some more xml variables in `env_run.xml` that you may encounter:\n", + "\n", + "- `INFO_DBUG` ==> sets the level of stdout (standard out) print statements. This variable is useful for debugging. If debugging, a higher value may be set. \n", + "- `DOUT_S` ==> turns on short-term archiving. `DOUT_S` is set to `TRUE` by default. \n", + "- `HIST_OPTION` ==> sets driver snapshot history file frequency. \n", + "- `CCSM_CO2_PPMV` ==> CO2 value to be propogated to the ocean component POP and the land component CLM, when `OCN_CO2_TYPE` and `CLM_CO2_TYPE` are set to `'constant'`. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d74f86e-c1dc-45a3-845f-2d0200fbedbd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/overview.ipynb b/_sources/notebooks/modifications/xml/overview.ipynb new file mode 100644 index 000000000..e4b65095b --- /dev/null +++ b/_sources/notebooks/modifications/xml/overview.ipynb @@ -0,0 +1,132 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": { + "tags": [] + }, + "source": [ + "# Overview \n", + "\n", + "What is an XML file, and how do we use it in CESM?" + ] + }, + { + "cell_type": "markdown", + "id": "55a68c69-196d-42c3-ae01-ad55f10daa6d", + "metadata": {}, + "source": [ + "***" + ] + }, + { + "cell_type": "markdown", + "id": "0637e559-0f3c-46b3-bc80-f7fe1081387a", + "metadata": {}, + "source": [ + "## 1. What is an XML file?\n", + "\n", + "XML (Extensible Markup Language) is a markup language that defines a syntax for encoding documents that both humans and machines could read. It is used to describe data in a structured way and defines how the document should be stored and transported." + ] + }, + { + "cell_type": "markdown", + "id": "027b5e63-e318-411e-b854-9109fc0491ce", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Additional information on XML files](https://www.howtogeek.com/357092/what-is-an-xml-file-and-how-do-i-open-one/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "fa35fe32-ea6a-4e3e-9a9a-070697bca22f", + "metadata": {}, + "source": [ + "\n", + "***" + ] + }, + { + "cell_type": "markdown", + "id": "57f433ea-3424-447f-b6e7-68673a40d24d", + "metadata": {}, + "source": [ + "## 2. CESM XML files and CESM environment variables" + ] + }, + { + "cell_type": "markdown", + "id": "0c67affb-108e-4005-8329-ccd19ef87eda", + "metadata": {}, + "source": [ + "CESM cases are customized, built and run largely through setting what CESM calls **\"environment variables\"**. These actually appear to the user as variables defined in xml files. \n", + "\n", + "\n", + "These files appear in the case directory (`$CASEROOT`) once a case is created and are named something like **`env_*.xml`**. We control how we compile and run the model with these files." + ] + }, + { + "cell_type": "markdown", + "id": "e58d2ab9-957f-4078-a7eb-5b7091c28616", + "metadata": {}, + "source": [ + "## XML file locations\n", + "\n", + "![CESM xml files](../../../images/modifications/CESM2_xml_files.png)\n", + "*

Figure: Overview of the XML file locations

*\n", + "For the current tutorial on derecho, the paths are:\n", + "- `$CASEROOT` = `/glade/u/home/$USER/cases/$CASE`" + ] + }, + { + "cell_type": "markdown", + "id": "cce5ecd7-e613-47bd-8c4b-1e547b2a75ae", + "metadata": {}, + "source": [ + "There are multiple **`env_*.xml`** files in the `$CASEROOT` directory:\n", + "\n", + "- `env_archive.xml`: specifies rules for short term archive script `case.st_archive`\n", + "- `env_batch.xml`: specifies batch specific settings used in `case.submit` script\n", + "- `env_build.xml`: specifies build information used in the `case.build` script\n", + "- `env_case.xml`: set by create_newcase and **cannot** be modified\n", + "- `env_mach_pes.xml`: specifies PE layout on NCAR HPC for components and used by `case.run` script \n", + "- `env_mach_specific.xml`: specifies machine specific information used in `case.build` script\n", + "- `env_run.xml`: sets run time information (such as length of run, number of submissions, …)\n" + ] + }, + { + "cell_type": "markdown", + "id": "58df9e9f-ef86-4a65-91c2-4b829b33a86e", + "metadata": {}, + "source": [ + "In this section, we will learn and practice **modifying CESM run length and run type using `env_run.xml`**!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/physics_timestep.ipynb b/_sources/notebooks/modifications/xml/physics_timestep.ipynb new file mode 100644 index 000000000..3262199d0 --- /dev/null +++ b/_sources/notebooks/modifications/xml/physics_timestep.ipynb @@ -0,0 +1,69 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Physics Timestep\n", + "\n", + "**Where and When to Change Time Steps**:\n", + "\n", + "When the model crashes due to large, temporary instabilities, one method to overcome the problem is to change the time step.\n", + "This is typically done in either the atmosphere or ocean components. \n", + "\n", + "- For atmosphere and land component (CAM/CLM): change `ATM_NCPL` in `env_run.xml`.
\n", + "- For ocean (POP): change `dt_count` in POP namelist. \n", + "\n", + "
\n", + "\n", + "***\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "dc35cf0e-f3be-4a26-b2f0-0b716ca440f1", + "metadata": {}, + "source": [ + "- **For the atmosphere component (CAM)**, the physics time step is set by `ATM_NCPL` and `NCPL_BASE_PERIOD`in `env_run.xml`. `NCPL_BASE_PERIOD` specifies base period associated with coupling frequency, the default value is \"day\". The `ATM_NCPL` variable specifies the number of coupling intervals per `NCPL_BASE_PERIOD` between the atmosphere/land and the coupled system. Based on these two variables, the scripts will automatically compute the time step for the atmosphere and land and populate the namelist files accordingly. For example, if `NCPL_BASE_PERIOD` is set to \"day\", and `ATM_NCPL` is 48, then the timestep is 1800 seconds. \n", + "\n", + "- **For the land component (CLM)**, the physics ime step is the same as the CAM time step; this is automatically set with the CAM time step via `ATM_NCPL`. You cannot set this separately.\n", + "\n", + "- **For the ocean component (POP2)**, the physics time step is changed in the `user_nl_pop` file and is based on `$OCN_NCPL` (found in `env_run.xml`), `dt_count` , and `dt_option`. The default `dt_option` is `“steps_per_day”`.\n", + "\n", + "- **For the sea ice component (CICE)**, the physics time step is set by the coupling interval variable `$ICE_NCPL` found in env_run.xml. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d227999f-f3c0-4ae7-adbc-558cc7a6f287", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/run_length.ipynb b/_sources/notebooks/modifications/xml/run_length.ipynb new file mode 100644 index 000000000..d727e50fc --- /dev/null +++ b/_sources/notebooks/modifications/xml/run_length.ipynb @@ -0,0 +1,46 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Controlling Run Length \n", + "\n", + "The length of your model run is controlled by several run time variables in the **`env_run.xml`** file. \n", + "These variables may be modified at the initialization of the model run and during the course of the model run. \n", + "\n", + "These variables comprise coupler namelist settings for the model stop time, model restart frequency, coupler history frequency and a flag to determine if the run should be flagged as a continuation run." + ] + }, + { + "cell_type": "markdown", + "id": "b69bbda8-c906-420f-a782-7da8f223c8bc", + "metadata": {}, + "source": [ + "We will learn about customizing runtime settings to control starting, stopping, restarting and continuing a model run, and practice how to specify the run length of your long simulations. \n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/run_length/changing_run_length.ipynb b/_sources/notebooks/modifications/xml/run_length/changing_run_length.ipynb new file mode 100644 index 000000000..06378c500 --- /dev/null +++ b/_sources/notebooks/modifications/xml/run_length/changing_run_length.ipynb @@ -0,0 +1,232 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Changing Run Length\n", + "\n", + "How to set run length for long simulations using variables `$STOP_OPTION`, `$STOP_N` and `$RESUBMIT`?" + ] + }, + { + "cell_type": "markdown", + "id": "555d7d60-109c-45ed-94e2-441bf3a7a93a", + "metadata": {}, + "source": [ + "## 1. Number of submissions and run length" + ] + }, + { + "cell_type": "markdown", + "id": "2730b8e5-def6-4ae3-bde0-bb6f0d0f5e02", + "metadata": {}, + "source": [ + "Recall that we can use [STOP_N and STOP_OPTION](../starting_and_stopping.ipynb) to control the run length of each batch job submission. " + ] + }, + { + "cell_type": "markdown", + "id": "9641f6ad-7a95-4cf1-8178-26a33ca1ecfb", + "metadata": {}, + "source": [ + "A typical long model simulation (say you want to run the model for 100 years) is comprised of many job submissions. This is because we have limited batch wallclock time for each job submission. For example, on derecho, the regular queue wallclock limit is 12 hours. " + ] + }, + { + "cell_type": "markdown", + "id": "dbf6d5d2-ad44-4ff9-8d8b-b18ee368cb6f", + "metadata": {}, + "source": [ + "We can specify **the number of times to resubmit the run using the `$RESUBMIT`** variable in **`env_run.xml`** to complete the long run. " + ] + }, + { + "cell_type": "markdown", + "id": "3db7b888-74cf-40dd-9931-e9e312029cf8", + "metadata": {}, + "source": [ + "
" + ] + }, + { + "cell_type": "markdown", + "id": "58076e6d-4ca6-442d-bd7a-6695e00e6b3d", + "metadata": {}, + "source": [ + "
\n", + "Evaluate your understanding\n", + "\n", + "The tutorial version of the CESM model on derecho simulates ~10 model years per wallclock day. The maximum wallclock request is 12 hours.\n", + "If you want to run the model for 100 years, what values should be set for `STOP_OPTION`, `STOP_N` and `RESUBMIT`?\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "2bbcde94-569d-40cd-bece-f98e511a5c3b", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Hint!\n", + " \n", + " \n", + "- How to set `STOP_N` and `STOP_OPTION` for **each submission**, given the wallclock limit?\n", + " \n", + "- How many times to resubmit the job to reach the 100 years?\n", + " \n", + "- The number of total submission = the initial submission + the number of resubmission.\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "caa0ef50-df17-4841-beaa-485c4b5be2c8", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution \n", + " \n", + "Assume we want to use the full 12 hours for each job submission.\n", + " \n", + "The model runs 10 years / wallclock day, which means that 12 hours would give us 5 years per job submission. \n", + " \n", + "For a total of 100 years, we will need 20 submissions. \n", + "\n", + "``` \n", + "STOP_OPTION='nyears', STOP_N=5, RESUBMIT=19\n", + "``` \n", + "so that initial run of 5 years + (19 resubmits x 5 years per job) = 100 years. \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6149a7df-1f01-477a-b06a-f7d9196c1060", + "metadata": {}, + "source": [ + "***\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0bfe03b7-bd83-4c43-a586-3692bc728dbb", + "metadata": {}, + "source": [ + "## 2. RESUBMIT and CONTINUE_RUN" + ] + }, + { + "cell_type": "markdown", + "id": "ba756e82-bbb4-46e5-a603-ff17507f3f8b", + "metadata": {}, + "source": [ + "In the exercise above, the first submission is the initial run, where `CONTINUE_RUN` is by default set to `FALSE`. When you want to continue the run after running the first 5 years, you will need to tell the model to continue by setting `CONTINUE_RUN=TRUE`. " + ] + }, + { + "cell_type": "markdown", + "id": "9af5ecdc-778b-49aa-8847-002f10194841", + "metadata": {}, + "source": [ + "If you have set **`RESUBMIT>0`, your script will automatically change `CONTINUE_RUN=TRUE`** after completion of the first submission for all subsequent submissions into the queue. \n" + ] + }, + { + "cell_type": "markdown", + "id": "fd397d89-a0d5-4a1d-859a-d2cf574af152", + "metadata": {}, + "source": [ + "
\n", + "Evaluate your understanding\n", + "\n", + "In the previous exercise, if we have set `RESUBMIT`=19 before the initial run, what are the value of `CONTINUE_RUN` and `RESUBMIT` at the time of:\n", + "- the initial submission of 5 years\n", + "- the next submission of 5 years\n", + "- the 3rd run (2nd resubmission) of 5 years?\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "fb184cde-0045-4b17-8530-5eb0d1ade77b", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution \n", + " \n", + " \n", + "- **the initial submission of 5 years**: \n", + " ```\n", + " CONTINUE_RUN=FALSE, RESUBMIT=19 \n", + " ```\n", + " because when the run is first initialized, `CONTINUE_RUN=FALSE`.\n", + "
\n", + "- **the next submission of 5 years**: \n", + " ```\n", + " CONTINUE_RUN=TRUE, RESUBMIT=18 \n", + " ```\n", + " because `RESUBMIT>0`, `CONTINUE_RUN` will automatically switch to `TRUE` after completing the initial run.\n", + "
\n", + " \n", + "- **the 3rd run (2nd resubmission) of 5 years**: \n", + " ```\n", + " CONTINUE_RUN=TRUE, RESUBMIT=17\n", + " ```\n", + " because `CONTINUE_RUN` stays to be `TRUE`, `RESUBMIT` decreases by 1.\n", + " \n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "610c09ea-94e9-41ef-95b9-bfc537d81da1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/run_length/number_of_submissions.ipynb b/_sources/notebooks/modifications/xml/run_length/number_of_submissions.ipynb new file mode 100644 index 000000000..4387df7be --- /dev/null +++ b/_sources/notebooks/modifications/xml/run_length/number_of_submissions.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Controlling the Number of Submissions \n", + "\n", + "and continue_run" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e59cdc0f-21dc-430d-bdb9-1f9c9f2d7bcb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/run_length/restarting.ipynb b/_sources/notebooks/modifications/xml/run_length/restarting.ipynb new file mode 100644 index 000000000..80ea1367e --- /dev/null +++ b/_sources/notebooks/modifications/xml/run_length/restarting.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Restarting a Run\n", + "\n", + "How to continue a run.\n", + "\n", + "***" + ] + }, + { + "cell_type": "markdown", + "id": "6dfbe426-d5b3-47fd-a4bd-faf6fb107f5f", + "metadata": {}, + "source": [ + "## 1. Restart files" + ] + }, + { + "cell_type": "markdown", + "id": "8746a209-be0f-4c0d-ad1c-168da2a7e4b6", + "metadata": {}, + "source": [ + "Restart files are written by each model component at intervals dictated by the driver via the setting of the `env_run.xml` variables, **`$REST_OPTION`** and **`$REST_N`**. The default values for these two variables are set to be the same as `$STOP_OPTION` and `$STOP_N`. In most cases, we do not modify these two variables.\n" + ] + }, + { + "cell_type": "markdown", + "id": "b514409e-4215-4627-a783-28fafc852211", + "metadata": {}, + "source": [ + "\n", + "Restart files allow the model to stop and then start again with **bit-for-bit exact** capability (i.e. the model output is exactly the same as if it had never been stopped). The driver coordinates the writing of restart files as well as the time evolution of the model. All components receive restart and stop information from the driver and write restarts or stop as specified by the driver.\n" + ] + }, + { + "cell_type": "markdown", + "id": "bfc93f04-70d4-4cb1-8e90-a9878cdca329", + "metadata": {}, + "source": [ + "Whenever a component writes a restart file, it also writes a restart pointer file of the form, **`rpointer.$component`** (i.e. `rpointer.atm`). The restart pointer file contains the restart filename that was just written by the component. Upon a restart, each component reads its restart pointer file to determine the filename(s) to read in order to continue the model run. As examples, the following pointer files will be created for a component set using full active model components.\n", + "\n", + "- rpointer.atm\n", + "- rpointer.drv\n", + "- rpointer.ice\n", + "- rpointer.lnd\n", + "- rpointer.rof\n", + "- rpointer.cism\n", + "- rpointer.ocn.ovf\n", + "- rpointer.ocn.restart\n" + ] + }, + { + "cell_type": "markdown", + "id": "93d66937-95c1-44cc-bbd3-39a798efc378", + "metadata": {}, + "source": [ + "
\n", + " \n", + " \n", + " \n", + " Tips!\n", + " \n", + " \n", + "1. Try using xmlquery to check the values of `REST_OPTION` and `REST_N`.\n", + "What do you find?
\n", + "2. Take a look at the restart files and restart pointer files in your archive directory (`$DOUT_S_ROOT/rest/yyyy-mm-dd-ssss/`) or run directory (`$RUNDIR`). What do they look like?\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "aca8e554-0df7-4de2-9059-9e1b2e33a590", + "metadata": {}, + "source": [ + "***\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6d6522b2-c30c-4b92-b2f4-c89ce0158dcf", + "metadata": {}, + "source": [ + "## 2. Continue a run" + ] + }, + { + "cell_type": "markdown", + "id": "1c0eb950-6238-4f37-a875-19950279ab4a", + "metadata": {}, + "source": [ + "\n", + "Recall that the flag variable `$CONTINUE_RUN` controls whether a model run is **initialized (FALSE)** or **continues a run (TRUE)**." + ] + }, + { + "cell_type": "markdown", + "id": "a3ff7ec3-941e-447f-b027-3f45fb3b8bb1", + "metadata": {}, + "source": [ + "In the case of our 1-month test run, we submited our initial job with `CONTINUE_RUN = FALSE` (because it was just initialized) and your `RUN_TYPE` (to startup, branch or hybrid). If the run has been finished and everything looks good, and we want to continue the run for another month, what do we do?\n", + "\n", + "We will need to use `xmlchange` to change `CONTINUE_RUN = TRUE` and submit the run again to carry on running the model. The model will use the restart files to continue our run with a bit-for-bit match, as if it had never been stopped. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "a1b40ec3-fdd5-45ea-aa09-74620e62b35c", + "metadata": {}, + "source": [ + "
" + ] + }, + { + "cell_type": "markdown", + "id": "65d2fb52-18b5-43ae-87b5-866ec0c730ef", + "metadata": {}, + "source": [ + "
\n", + "Evaluate your understanding\n", + "\n", + "If we do not modify `CONTINUE_RUN=TRUE` and leave it as `FALSE`, what would happen after we submit the run again?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "12239227-29af-4738-851b-b1eae99932e4", + "metadata": {}, + "source": [ + "
\n", + " \n", + "
\n", + " \n", + " \n", + " Click here for the solution \n", + " \n", + "\n", + "The model will run the previous month once again instead of carrying on to the next month!\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "43a8d53a-d66d-4c4a-a9fd-2313f4c23dfd", + "metadata": {}, + "source": [ + "The `$CONTINUE_RUN` flag will be automatically set to `TRUE` when the variable `RESUBMIT>0`. Learn more in the chapter [Changing Run Length](./changing_run_length.ipynb)." + ] + }, + { + "cell_type": "markdown", + "id": "707b12c1-e970-4097-99c3-f6fe3b1914c8", + "metadata": {}, + "source": [ + "
\n", + "\n", + "***\n" + ] + }, + { + "cell_type": "markdown", + "id": "2a816fcb-9242-4d6b-98b4-b4e62fab08eb", + "metadata": {}, + "source": [ + "## 3. Backing up to a previous restart" + ] + }, + { + "cell_type": "markdown", + "id": "c2e232e3-37ae-42e7-bdf2-953ef4cc86cb", + "metadata": {}, + "source": [ + "If a run encounters problems and crashes, it is extremely useful to back up to a previous restart. \n", + "\n", + "You will need to find the latest restart files in the `$DOUT_S_ROOT/rest/yyyy-mm-dd-ssss/` directory that was created and copy the contents of that directory into your run directory (`$RUNDIR`). You can then continue the run and these restarts will be used. \n", + "\n", + "It is important to make sure the new `rpointer.*` files overwrite the previous `rpointer.*` files that were in `$RUNDIR`, or the job may not restart in the correct place.\n", + "\n", + "Occasionally, when a run has problems restarting, it is because the rpointer files are out of sync with the restart files. The rpointer files are text files and can easily be edited to match the correct dates of the restart and history files. All the restart files should have the same date." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32d9c126-14c2-41d1-8bce-a895fdf407dd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/run_length/starting_and_stopping.ipynb b/_sources/notebooks/modifications/xml/run_length/starting_and_stopping.ipynb new file mode 100644 index 000000000..8b78f684a --- /dev/null +++ b/_sources/notebooks/modifications/xml/run_length/starting_and_stopping.ipynb @@ -0,0 +1,133 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Starting and Stopping \n", + "\n", + "To start a model run, we will need to submit `$CASE.run` to the batch queue. In addition, we will also need to specify how long we want to run the model in `env_run.xml`. \n", + "\n", + "\n", + "We will learn how to modify the runtime variables in `env_run.xml` to initialize, stop and restart a CESM model run." + ] + }, + { + "cell_type": "markdown", + "id": "ec38ef4d-2a68-44e8-a731-c55e1a2d940a", + "metadata": {}, + "source": [ + "
\n", + "\n", + "***\n" + ] + }, + { + "cell_type": "markdown", + "id": "344c4fb8-da46-44c1-8a64-6808e7b3a814", + "metadata": {}, + "source": [ + "## 1. \"Initial run\" and \"continue run\"\n", + "\n", + "When a CESM model run is first initialized, it is called an **initial run**. \n", + "\n", + "The variable **`$CONTINUE_RUN`** is a flag indicating if the current model run is an **initial run** or a **continue run**. \n", + "- For an intial run, `CONTINUE_RUN` must be set to *`FALSE`*, \n", + "- If the model continues a run, `CONTINUE_RUN` is set to *`TRUE`*. \n", + "\n", + "Your initial CESM run can be initialized in one of three run types: startup, branch,or hybrid. We will get into more details about the **run types** in the Chapter [Modifying Run Types](../modify_run_type/hybrid_branch_restart.ipynb). \n", + "\n", + "For now, we need to know that **setting run types is only important for an initial run when `CONTINUE_RUN` is set to `FALSE`**. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "37195fbd-8a4f-45f8-81b6-7042bcbf5f08", + "metadata": {}, + "source": [ + "
\n", + "\n", + "****\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "fa6734b1-bb5e-4fc3-96b7-df867adbbf04", + "metadata": {}, + "source": [ + "## 2. Set runtime limits with **`STOP_OPTION`** and **`STOP_N`**" + ] + }, + { + "cell_type": "markdown", + "id": "68eef81e-bd50-43e1-9961-15d0712d17d3", + "metadata": {}, + "source": [ + "Run length options can be set using **`$STOP_OPTION`** and **`$STOP_N`** variables in env_run.xml. \n", + "\n", + "- `STOP_OPTION` : sets the run length time interval type, i.e. nmonths, ndays, nyears.\n", + "- `STOP_N` : sets the number of intervals (set by `STOP_OPTION`) to run the model during each submission within the specified wallclock time. " + ] + }, + { + "cell_type": "markdown", + "id": "da97a05c-ef45-4473-8f05-032aed8dfcf9", + "metadata": {}, + "source": [ + "
\n", + "For example, if you want to run a simulation for 6 months during the job submssion, you will need to set:\n", + "\n", + "```\n", + "./xmlchange STOP_N=6\n", + "./xmlchange STOP_OPTION='nmonths'\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "c5947ac5-c8d6-4abb-9ea7-bce711f48ddd", + "metadata": {}, + "source": [ + "
\n", + "\n", + "`STOP_N` and `STOP_OPTION` control the length of the run **per job submission**. They should be set based on the job queue limit and model throughput. You can find more information on this topic in the chapter [Using timing files](./timing_files.ipynb).\n", + "\n", + "
\n", + "\n", + "A typical simulation is comprised of many job submissions. This is because you can only stay in the computer queue for a limited time. We will learn more about completing long simulations in the chapter [Changing run length](./changing_run_length.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c99fbe29-f232-4534-8476-d12bbbc41ffe", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/modifications/xml/run_length/timing_files.ipynb b/_sources/notebooks/modifications/xml/run_length/timing_files.ipynb new file mode 100644 index 000000000..6608d8f37 --- /dev/null +++ b/_sources/notebooks/modifications/xml/run_length/timing_files.ipynb @@ -0,0 +1,95 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Using Timing Files \n", + "\n", + "Model timing files contain a summary of various timing information for the run. It is helpful to check the timings after the run to verify that the model is running efficiently. \n", + "\n", + "
\n", + "\n", + "***" + ] + }, + { + "cell_type": "markdown", + "id": "78615f64-047d-421d-9436-925533cf6827", + "metadata": {}, + "source": [ + "## 1. What are timing files and where are they located?\n", + "\n", + "A summary timing output file is produced after every CESM run. This file is placed in `$CASEROOT/timing/cesm_timing.$CASE.$date`, where $date is a datestamp set by CESM at runtime, and contains a summary of various timing information.\n", + "\n", + "The first section in the timing output, \"TIMING PROFILE\", summarizes general timing information for the run. The total run time and cost is given in several metrics including pe-hrs per simulated year (**cost**), simulated years per wall day (**thoughput**), seconds, and seconds per model day. This provides general summary information quickly in several units for analysis and comparison with other runs. The total run time for each component is also provided, as is the time for initialization of the model. These times are the aggregate over the total run and do not take into account any temporal or processor load imbalances.\n", + "\n", + "
\n", + "\n", + "***\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "40e1c00d-ab11-427c-aa03-c6e0f366dceb", + "metadata": { + "tags": [] + }, + "source": [ + "## 2. Use timing files to determine runtime variables\n", + "\n", + "Here is an example of cost information shown in a timing file:\n", + "\n", + "```\n", + "Overall Metrics: \n", + "Model Cost: 327.14 pe-hrs/simulated_year (scale= 0.50)\n", + "Model Throughput: 4.70 simulated_years/day\n", + "```\n", + "\n", + "The model throughput is the estimated number of model years that you can run in a wallclock day. Based on this, you can maximize `$CASE.run` queue limit and change `STOP_OPTION` and `STOP_N` in `env_run.xml`.\n", + "\n", + "For example, say a model’s throughput is 4.7 simulated_years/day. On derecho, the maximum runtime limit is 12 hours. 4.7 model years/24 hours * 12 hours = 2.34 years. On the massively parallel computers, there is always some variability in how long it will take a job to run. On some machines, you may need to leave as much as 20% buffer time in your run to guarantee that jobs finish reliably before the time limit. For that reason we will set our model to run only 2 model year/job. \n", + "\n", + "Continuing to assume that the run is on derecho, we can set:\n", + "\n", + "```\n", + "./xmlchange STOP_OPTION='nyears'\n", + "./xmlchange STOP_N=2\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c03243b7-4aca-40d2-bdab-02312b58e016", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/documentation.ipynb b/_sources/notebooks/namelist/documentation.ipynb new file mode 100644 index 000000000..2dd739a60 --- /dev/null +++ b/_sources/notebooks/namelist/documentation.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Namelist Variables Documentation\n", + "\n", + "\n", + "
\n", + "\n", + "Complete documentation about the namelist variables can be found on the [CESM webpage.](https://www2.cesm.ucar.edu/models/cesm2/settings/current/)\n", + "\n", + "
\n", + "\n", + "For instance, if you want to change the **_output frequency_** in CAM, go to the website and type the word ``frequency`` in the search box as illustrated in *Figure 1*. " + ] + }, + { + "cell_type": "markdown", + "id": "017b45ad-dcff-42b2-8623-06033b8e11d8", + "metadata": {}, + "source": [ + "___\n", + "![Search namelist variables](../../images/namelist/namelist_var_search.png)\n", + "\n", + "*

Figure 1: Search for a namelist variable.

*\n", + "___" + ] + }, + { + "cell_type": "markdown", + "id": "42e1dd6f-c704-4f69-965a-a015d3d0baed", + "metadata": {}, + "source": [ + "This will return the attributes of the namelist variable ``nhtfrq``, as illustrated in *Figure 2*. ``nhtfrq`` is the variable you need in order to change the output frequency of a history file. \n", + "\n", + "___\n", + "![Attribute of a namelist variable](../../images/namelist/nhtfrq.png)\n", + "\n", + "*

Figure 2: Attribute of a namelist variable. Here the variable: ``nhtfrq``

*" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/exercises/exercise_cam_output.ipynb b/_sources/notebooks/namelist/exercises/exercise_cam_output.ipynb new file mode 100644 index 000000000..b47420587 --- /dev/null +++ b/_sources/notebooks/namelist/exercises/exercise_cam_output.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Modify CAM output" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Customize your CAM history files

\n", + " \n", + "Create a case called `b1850_high_freq` using the compset ``B1850`` at ``f19_g17`` resolution. \n", + " \n", + "In addition to the monthly history file ``h0``, tell the model to output the following:\n", + "- a ``h1`` file with **_instantaneous_** values of T, Q, U and V every **_24 hours_**.\n", + "- a ``h2`` file with **_time-average_** values of T, Q, U and V every **_3 hours_**.\n", + "\n", + "Set your namelist so that you output: \n", + "- a **_single_** ``h1`` file with all the daily output for the month. \n", + "- **_multiple_** ``h2`` files, one for every day of the month.\n", + "\n", + "Your goal is to produce:\n", + "- one ``h1`` file with 31 timesteps and \n", + "- thirty-one ``h2`` files with 8 timesteps each.\n", + "\n", + "Set the run length to **_1 month_** and make a 1-month run.\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "\n", + " Click here for hints \n", + " \n", + "**# How do I compile?**\n", + "\n", + "You can compile with the command:\n", + "```\n", + "qcmd -- ./case.build\n", + "```\n", + "\n", + "**# How do I control the output?**\n", + "\n", + "Use namelist variables: ``nhtfrq``, ``mfilt``, ``fincl``. \n", + "\n", + "Look at the online documentation for these variables.\n", + "\n", + "**# How do I check my solution?**\n", + "\n", + "When your run is completed, go to the archive directory and navigate to the subdirectory `atm/hist`\n", + "\n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/b1850_high_freq\n", + "cd atm/hist\n", + "```\n", + "\n", + "(1) Check that your archive directory contains the files:\n", + "\n", + "- ``h0`` files\n", + "```\n", + "b1850_high_freq.cam.h0.0001-01.nc\n", + "```\n", + "- ``h1`` files\n", + "```\n", + "b1850_high_freq.cam.h1.0001-01-01-00000.nc\n", + "b1850_high_freq.cam.h1.0001-02-01-00000.nc\n", + "```\n", + "- ``h2`` files\n", + "```\n", + "b1850_high_freq.cam.h2.0001-01-01-00000.nc\n", + "…\n", + "b1850_high_freq.cam.h2.0001-01-31-00000.nc\n", + "b1850_high_freq.cam.h2.0001-02-01-00000.nc\n", + "```\n", + "\n", + "(2) Compare the contents of the ``h1`` and ``h2`` files using ``ncdump``.\n", + "\n", + "```\n", + "ncdump -h b1850_high_freq.cam.h1.0001-01-01-00000.nc\n", + "ncdump -h b1850_high_freq.cam.h2.0001-01-01-00000.nc\n", + "```\n", + "\n", + "(3) Check the number of timesteps in the ``h1`` and the ``h2`` files.\n", + "Look at the sizes of the files. \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "91dedb20-dad8-40ef-ba50-66adcbafa60c", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "**# Create a new case**\n", + "\n", + "Create a new case `b1850_high_freq` with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case ~/cases/b1850_high_freq --compset B1850 --res f19_g17 \n", + "```\n", + "\n", + "**# Setup**\n", + " \n", + "Invoke case.setup with the command:\n", + " \n", + "``` \n", + "cd ~/cases/b1850_high_freq \n", + "./case.setup\n", + "```\n", + "\n", + "**# Customize namelists**\n", + " \n", + "Edit the file `user_nl_cam` and add the lines:\n", + "```\n", + " nhtfrq = 0, -24, -3\n", + " mfilt = 1, 31, 8 \n", + " fincl2 = 'T:I','Q:I','U:I','V:I'\n", + " fincl3 = 'T','Q','U','V'\n", + "```\n", + " \n", + "**# Set run length**\n", + " \n", + "Change the `run length`:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nmonths\n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change `job queue` and `account number`.
\n", + "For instance, to run in the queue `tutorial` and the project number ``UESM0013`` (You should use the project number given for this tutorial), use the command:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "**# Build and submit**\n", + " \n", + "Build the model and submit your job:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "\n", + "____\n", + " \n", + "**# Look at your solution**\n", + "\n", + "When the run is completed, look into the archive directory for: \n", + "`b1850_high_freq`. \n", + " \n", + "(1) Check that your archive directory on derecho (The path will be different on other machines): \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist\n", + "ls \n", + "```\n", + "\n", + "(2) Compare the contents of the ``h1`` and ``h2`` files using ``ncdump``.\n", + "Look at the variables attributes. What is the difference between the 2 files ? \n", + "\n", + "The file with the instantaneous output ``h1`` have no cell_methods attribute while the average output ``h2`` has a attribute: \n", + "```\n", + "cell_methods = \"time: mean\"\n", + "```\n", + "\n", + "For instance for the field Q.\n", + "\n", + "In the instantaneous file ``b1850_high_freq.cam.h1.0001-01-01-00000.nc``\n", + "```\n", + "float Q(time, lev, lat, lon) ;\n", + " Q:mdims = 1 ;\n", + " Q:units = \"kg/kg\" ;\n", + " Q:mixing_ratio = \"wet\" ;\n", + " Q:long_name = \"Specific humidity\" ;\n", + "```\n", + "In the time-averaged file ``b1850_high_freq.cam.h2.0001-01-01-00000.nc``\n", + "```\n", + "float Q(time, lev, lat, lon) ;\n", + " Q:mdims = 1 ;\n", + " Q:units = \"kg/kg\" ;\n", + " Q:mixing_ratio = \"wet\" ;\n", + " Q:long_name = \"Specific humidity\" ;\n", + " Q:cell_methods = \"time: mean\" ;\n", + "```\n", + "(3) Check the number of timesteps in the h1 and the h2 files. \n", + "\n", + "- ``h1`` contains 31 time samples. \n", + "In the netcdf file, \n", + "```\n", + "time = UNLIMITED ; // (31 currently)\n", + "```\n", + "- ``h2`` contains 8 time samples \n", + "In the netcdf file, \n", + "```\n", + "time = UNLIMITED ; // (8 currently)\n", + "```\n", + "- Check the size of the files\n", + "```\n", + "du –ks –h /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist/*\n", + "```\n", + "```\n", + "234M b1850_high_freq.cam.h0.0001-01.nc\n", + "\n", + "210M b1850_high_freq.cam.h1.0001-01-01-00000.nc\n", + "7.0M b1850_high_freq.cam.h1.0001-02-01-00000.nc\n", + "\n", + "55M b1850_high_freq.cam.h2.0001-01-01-00000.nc\n", + "55M b1850_high_freq.cam.h2.0001-01-02-00000.nc\n", + "...\n", + "55M b1850_high_freq.cam.h2.0001-01-31-00000.nc\n", + "7.0M b1850_high_freq.cam.h2.0001-02-01-00000.nc\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "815be0bc-515a-474b-a3dd-b7ba02831b9a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/exercises/exercise_tuning_parameter.ipynb b/_sources/notebooks/namelist/exercises/exercise_tuning_parameter.ipynb new file mode 100644 index 000000000..2c65d1be5 --- /dev/null +++ b/_sources/notebooks/namelist/exercises/exercise_tuning_parameter.ipynb @@ -0,0 +1,204 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Change a tuning parameter in CAM" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Modify a parameter, dcs

\n", + " \n", + "\n", + "In the tuning lecture, we talked about the parameter dcs:\n", + "http://www.cesm.ucar.edu/events/tutorials/2019/files/Specialized-hannay.pdf\n", + "\n", + "Create a case called `b1850_dcs` using the compset ``B1850`` at ``f19_g17`` resolution. \n", + "\n", + "Locate where to change the parameter **Dcs** and change from the default value:
\n", + "dcs = 200.D-6
\n", + "to
\n", + "dcs = 500.D-6
\n", + "\n", + "Make a **_1-month_** run.\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "65b2cbda-2d54-48ee-898b-4c391f16ca79", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + " \n", + " Click here for hints\n", + " \n", + "\n", + "- The trick is locating where to change `dcs` \n", + " \n", + "- Compare this run to the first run you did today: `b1850_high_freq`.\n", + "- You can use `ncdiff` and `ncview` to look at the difference between the 2 runs. For instance:\n", + "```\n", + "ncdiff /glade/derecho/scratch/$USER/archive/b1850_dcs/atm/hist/b1850_dcs.cam.h0.0001-01.nc /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist/b1850_high_freq.cam.h0.0001-01.nc diff.nc\n", + "\n", + "ncview diff.nc\n", + "```\n", + "- Analyze how this does this affect the `LWCF` ?\n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "7dd602b7-372d-4f36-b6d1-df8e22ba1646", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + "\n", + "**# Create a new case**\n", + " \n", + "Create a new case `b1850_dcs`with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case ~/cases/b1850_dcs --compset B1850 --res f19_g17 \n", + "```\n", + "\n", + "**# Setup**\n", + "\n", + "Invoke case.setup with the command:\n", + "``` \n", + "cd ~/cases/b1850_dcs\n", + "./case.setup\n", + "```\n", + "\n", + "**# Customize namelists**\n", + " \n", + "Locate the variable to modify dcs. (Locating variables requires a learning curve. A good place to start is to look at the `Variable namelist documentation`. \n", + " \n", + "The variable is: `micro_mg_dcs`.
\n", + "By default this variable is set to:\n", + "`micro_mg_dcs = 200 microns`\n", + "You want to set it to:\n", + "`micro_mg_dcs = 500 microns`\n", + "\n", + " \n", + "Edit the file `user_nl_cam` and add the lines:\n", + "```\n", + "micro_mg_dcs = 500.D-6 \n", + "```\n", + "\n", + "**# Set run length**\n", + " \n", + "Change the `run length`:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nmonths\n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change `job queue` and `account number`.
\n", + "For instance, to run in the queue `tutorial` and the project number `UESM0013`, use the command:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "\n", + "**# Build and submit**\n", + " \n", + "Build the model and submit your job:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "\n", + "____\n", + " \n", + "**# Look at your solution**\n", + " \n", + "- When the run is completed, compare this run to the first run: \n", + "`b1850_high_freq`. \n", + " \n", + "- Create a file with the difference in `LWCF` between `b1850_dcs` and `b1850_high_freq`.\n", + " \n", + "- You can use `ncdiff` and `ncview` to look at the difference between the 2 runs. \n", + "\n", + "- For instance, use `ncdiff` to create a file with the difference between the 2 runs:\n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/b1850_dcs \n", + "ncdiff /glade/derecho/scratch/$USER/archive/b1850_dcs/atm/hist/b1850_dcs.cam.h0.0001-01.nc /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist/b1850_high_freq.cam.h0.0001-01.nc diff.nc\n", + "``` \n", + "\n", + "- Use `ncview` to look at the file you created.\n", + "```\n", + "ncview diff.nc\n", + "```\n", + "\n", + "**#How does this affect the LWCF ?** \n", + "\n", + "Dcs = Threshold diameter to convert cloud ice particles to snow\n", + "\n", + "*

\n", + " ![dcs representation](../../../images/namelist/dcs.png) \n", + " Figure: Representation of Dcs.

*\n", + " \n", + "We increased Dcs from 200 microns to 500 microns. We should have more ice cloud and the LWCF should be larger. \n", + "\n", + " \n", + "The field `LWCF` difference looks like \n", + "*

\n", + " ![ncview diff LWCF](../../../images/namelist/ncview_diff_dcs.png) \n", + " Figure: Difference of LWCF for micro_mg_dcs = 200.D-6->500.D-6

*\n", + " \n", + "We can see that the change in Dcs affects the tropics where LWCF is large. However, 1-month run is too short to look at robust statistics. \n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "850528d8-e923-4a97-b49a-171ad511026f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/exercises_overview.ipynb b/_sources/notebooks/namelist/exercises_overview.ipynb new file mode 100644 index 000000000..05998a25b --- /dev/null +++ b/_sources/notebooks/namelist/exercises_overview.ipynb @@ -0,0 +1,53 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Exercise Overview \n", + "\n", + "## Learning Goals\n", + "\n", + "- Student will practice performing namelist changes. \n", + "- Student will edit `user_nl_*` files, run the model and check the results.\n", + "\n", + "\n", + "## Exercise overview:\n", + "\n", + "Do at least one exercise:\n", + "- Output high frequency data in CAM.\n", + "- Change a tuning parameter in CAM.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84583445-5875-44e3-91a1-14fe6db10093", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/namelist.ipynb b/_sources/notebooks/namelist/namelist.ipynb new file mode 100644 index 000000000..2a891d5cd --- /dev/null +++ b/_sources/notebooks/namelist/namelist.ipynb @@ -0,0 +1,53 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Namelist Modifications" + ] + }, + { + "cell_type": "markdown", + "id": "285a23b4-2906-4422-a8a8-987546de6f0c", + "metadata": {}, + "source": [ + "There are several ways in which the model can be modified using namelist settings. This is what we cover in this chapter:\n", + "- The section **_Overview_** describes the steps to modify the namelists and provides a visual representation of the directories and files that need to be modified.\n", + "- The section **_Documentation_** explains how to find information about the namelist variables on the CESM webpage.\n", + "- The section **_Customizing output_** describes how to customize the output history files, such as changing the output frequency or adding variables to a file.\n", + "- The section **_Exercises_** offers opportunities to practice the concepts learned in this chapter. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7cf2d79-da13-416d-8345-385bc1977b79", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/output.ipynb b/_sources/notebooks/namelist/output.ipynb new file mode 100644 index 000000000..cbf82331f --- /dev/null +++ b/_sources/notebooks/namelist/output.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Customizing Output\n" + ] + }, + { + "cell_type": "markdown", + "id": "34b38707-9fbb-4e2a-bb99-5d3ddac76dc0", + "metadata": {}, + "source": [ + "If you don't add anything to the namelist, CESM will generate its **``default output``**. This is what was done in previous chapters of this tutorial. Typically, the model outputs monthly means (and in some cases, higher frequency outputs) of a default set of variables. Depending on your needs, you may want to output variables at a different frequency, or add more variables, etc ... \n", + "\n", + "In this chapter **``Customizing output``**, we will cover how to output at a different frequency, add history files, or add variables to the history files.\n", + "\n", + "In the sections below, we provide the basics of customizing the output for the different components (atm, lnd, ice, and pop). The **``Customize CAM output``** is the most **_comprehensive_**, so we recommend **_at least reviewing that section_**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd23aec3-cb79-432b-96e1-dcad3c071a90", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4115c790-a2b3-41c1-8291-db1a9de90ef3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/output/output_cam.ipynb b/_sources/notebooks/namelist/output/output_cam.ipynb new file mode 100644 index 000000000..c18eb1536 --- /dev/null +++ b/_sources/notebooks/namelist/output/output_cam.ipynb @@ -0,0 +1,253 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Customize CAM output\n", + "\n", + "In this section, we will cover:\n", + "- how to change the **output frequency**\n", + "- how to control the **number of time samples** written to a history file\n", + "- how to output **extra variables**\n", + "- how to output **extra history files**\n", + "\n", + "This can be achieved with 3 namelist variables:\n", + "- **``nhtfrq``**: sets the output frequency\n", + "- **``mfilt``**: maximum number of time samples written to a history file\n", + "- **``fincl``**: add variables to the history file\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "3245bdc2-3932-4582-aec1-30991cabd916", + "metadata": {}, + "source": [ + "## Customizing CAM output frequency: **``nhtfrq``**\n", + "The default history file from CAM is a monthly average. \n", + "We can change the **output frequency** with the namelist variable **``nhtfrq``**\n", + "- If **``nhtfrq=0``**, the file will be a **monthly** average\n", + "- If **``nhtfrq>0``**, frequency is input as number of **timesteps**.\n", + "- If **``nhtfrq<0``**, frequency is input as number of **hours**.\n", + "\n", + "For instance to change the history file from monthly average to daily average, we set the namelist variable:\n", + "\n", + "```\n", + " nhtfrq = -24 \n", + "```\n", + "\n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "The default history file in CAM is a monthly average. How do you modify the output to output 3-hourly data ? \n", + "\n", + "
\n", + "\n", + "
\n", + " \n", + "
\n", + "Click here for the solution
\n", + "Add the following line to user_nl_cam:
\n", + "\n", + "```\n", + " nhtfrq = -3\n", + "```\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "42e1dd6f-c704-4f69-965a-a015d3d0baed", + "metadata": {}, + "source": [ + "## Customizing CAM history files: **``mfilt``**\n", + "To control the **number of time samples** in the history file, we use the variable **``mfilt``**.
\n", + "This variable specifies the maximum number of time samples written to a history file.\n", + "\n", + "For example, if we want to have 10 time samples on each history file, we can set the namelist variable as follows:\n", + "```\n", + " mfilt = 10\n", + "```\n", + "\n", + "\n", + "To output daily data for a 1-year run in a single file, we can use the following values:\n", + "```\n", + " nhtfrq = -24 \n", + " mfilt = 365\n", + "```\n", + "If we want to output daily data with only 1 time sample per file, we can set the variables as follows:\n", + "```\n", + " nhtfrq = -24\n", + " mfilt = 1\n", + "```\n", + "\n", + "Note: we cannot change mfilt for monthly frequency. For monthly frequency, we always have: \n", + "```mfilt = 1``` \n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "What is the setting to generate 3 hourly data for a month-long simulation that will create a file every day? \n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "Click here for the solution
\n", + "\n", + "Modify the length of the run in `env_run.xml` with the command:\n", + "``` \n", + " ./xmlchange STOP_OPTION=nmonths,STOP_N=1\n", + "```\n", + "\n", + "Add the following line to `user_nl_cam` to output 3 hourly data and to create one file per day:\n", + "``` \n", + " nhtfrq = -3\n", + " mfilt = 8\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "b35a3197-e561-4a00-909d-9f3d80808676", + "metadata": {}, + "source": [ + "\n", + "## Add extra variables and history files: **``fincl``**\n", + "\n", + "You can output up to 10 history files: **``h0``**, **``h1``**, …, **``h9``**. \n", + "- The **``h0``** file contains the default variables or fields. (These are the variables you get by default without doing any modification to the namelist or code).\n", + "\n", + "- For the files **``h1``** to **``h9``**, the user must specify the variables to output. \n", + "\n", + "To control the list of fields in the history files, use the namelist variable **``fincl``**\n", + "- **``fincl1``** controls the fields in **``h0``** \n", + "- **``fincl2``** controls the fields in **``h1``** \n", + "- ...\n", + "- **``fincl10``** controls the fields in **``h9``** \n", + "\n", + "For example, to add the field `PRECT` to the `h0` file, use the line:\n", + "```\n", + " fincl1 = 'PRECT' \n", + "```\n", + "\n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "What is the namelist setting to add:\n", + "- a hourly history `h1` with the variables U, V, T \n", + "- and a daily history `h2` with the variable PRECT \n", + "- and output 10 time samples in `h1` and `h2` ? \n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "Click here for the solution
\n", + "\n", + "Add the following lines to `user_nl_cam`:\n", + "``` \n", + " nhtfrq = 0, -1, -24 \n", + " mfilt = 1, 10, 10 \n", + " fincl2 = 'U', 'V', 'T' \n", + " fincl3 = 'PRECT'\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "55e82e97-06da-48a1-8b71-29324759a2c3", + "metadata": {}, + "source": [ + "\n", + "## Averaging flag for the **``fincl``** variables \n", + "\n", + "Using a `:` following a field gives the averaging flag for the output field. \n", + "\n", + "Valid flags are: \n", + "- **``A``** ==> Average\n", + "- **``B``** ==> GMT 00:00:00 average\n", + "- **``I``** ==> Instantaneous\n", + "- **``M``** ==> Minimum\n", + "- **``X``** ==> Maximum\n", + "- **``L``** ==> Local-time\n", + "- **``S``** ==> Standard deviation\n", + "\n", + "For instance, the line:\n", + "```\n", + " fincl1 = 'PRECT:M' \n", + "```\n", + "is used to add the minimum of ``PRECT`` to the file ``h0``\n", + "\n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "What happens if we set in `user_nl_cam`:\n", + "``` \n", + " fincl2 = 'T:I','Q:I','U:I','V:I'\n", + " nhtfrq = 0, -3 \n", + " mfilt = 1, 8\n", + "```\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "Click here for the solution
\n", + "\n", + "In addition to the monthly history file `h0`, \n", + "- we will also output the file `h1` with instantaneous values of T, Q, U, and V. \n", + "- These variables will be output every 3 hours, resulting in 8 time samples in each `h1` file. \n", + "- A new file will be created every day.\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8da564c-942e-4bf1-9522-26061784161a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/output/output_cice.ipynb b/_sources/notebooks/namelist/output/output_cice.ipynb new file mode 100644 index 000000000..209f9ac1b --- /dev/null +++ b/_sources/notebooks/namelist/output/output_cice.ipynb @@ -0,0 +1,57 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Customize CICE output\n", + "\n", + "The CICE output can changed with the namelist variables\n", + "\n", + "- **``histfreq``**: Frequency of output written to history files ('1', 'm', 'd', 'y', …)\n", + "- **``histfreq_n``**: Frequency history data is written to history files\n", + "- **``hist_avg``**: if false => instantaneous values, if true => time-averages\n", + "\n", + "\n", + "Here is how to set ``user_nl_cice`` to output an extra history file with daily values (leaving the primary history file as monthly): \n", + "```\n", + " histfreq = 'm','d','x','x','x'\n", + " histfreq_n = 1,1,1,1,1 \n", + "```\n", + "\n", + "See: http://www.cesm.ucar.edu/models/cesm2/settings/current/cice_nml.html\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd6df83b-1a5d-4878-96b5-715e12c4c0a9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/output/output_clm.ipynb b/_sources/notebooks/namelist/output/output_clm.ipynb new file mode 100644 index 000000000..b630fbc2b --- /dev/null +++ b/_sources/notebooks/namelist/output/output_clm.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": { + "tags": [] + }, + "source": [ + "# Customize CLM output\n", + "\n", + "In this section, we will cover:\n", + "- how to change the **output frequency**\n", + "- how to control the **number of time samples** written to a history file\n", + "- how to output **extra variables**\n", + "- how to output **extra history files**\n", + "\n", + "This can be achieved with 3 namelist variables:\n", + "- **``hist_nhtfrq:``**: output frequency of the history file \n", + "- **``hist_mfilt``**: number of samples on each history file\n", + "- **``hist_fincl``**: adding variables and auxiliary history files" + ] + }, + { + "cell_type": "markdown", + "id": "3245bdc2-3932-4582-aec1-30991cabd916", + "metadata": {}, + "source": [ + "## Customizing CLM output frequency: **``hist_nhtfrq``**\n", + "We can change the output frequency with the namelist variable **``hist_nhtfrq``**\n", + "- If **``hist_nhtfrq=0``**, the file will be a **monthly** average\n", + "- If **``hist_nhtfrq>0``**, frequency is input as number of **timesteps**.\n", + "- If **``hist_nhtfrq<0``**, frequency is input as number of **hours**.\n", + "\n", + "For instance, \n", + "\n", + "```\n", + " hist_nhtfrq = -24\n", + "```\n", + "means **daily output**\n", + "\n", + "```\n", + " hist_nhtfrq = 24\n", + "```\n", + "means output every **24 timesteps**\n", + "\n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "How do you modify the CLM output to output 3-hourly data ? \n", + "\n", + "
\n", + "\n", + "
\n", + " \n", + "
\n", + "Click here for the solution
\n", + "\n", + "Add the following line to user_nl_clm:
\n", + "```\n", + " hist_nhtfrq = -3\n", + "```\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b35a3197-e561-4a00-909d-9f3d80808676", + "metadata": {}, + "source": [ + "\n", + "## Add extra variables and history files: **``hist_fincl``**\n", + "\n", + "You can output up to 10 history files:**``h0``**, **``h1``**, …, **``h9``**. \n", + "\n", + "To control the list of fields in the history files, use the namelist variable **``hist_fincl``**\n", + "- **``hist_fincl1``** controls the fields in **``h0``** \n", + "- **``hist_fincl2``** controls the fields in **``h1``** \n", + "- ...\n", + "- **``hist_fincl10``** controls the fields in **``h9``** \n", + "\n", + "For example, to add the field 'TG' to the ``h0`` file, use the line:\n", + "```\n", + " hist_fincl1 = 'TG' \n", + "```\n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "What is the namelist setting to add a monthly history h1 with the variables 'TG', 'TV' and a daily history h2 with the variables 'TG', 'TV'. Output 10 time samples in h1 and h2 ? \n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "Click here for the solution
\n", + "\n", + "Modify env_run.xml with the command:\n", + "``` \n", + " ./xmlchange STOP_N=nmonths, STOP_OPTION=1\n", + "```\n", + "\n", + "Add the following lines to user_nl_cam:\n", + "``` \n", + " hist_nhtfrq = 0, 0, -24 \n", + " hist_mfilt = 1, 10, 10 \n", + " hist_fincl2 = 'TG', 'TV' \n", + " hist_fincl3 = 'TG', 'TV' \n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "42e1dd6f-c704-4f69-965a-a015d3d0baed", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## Customizing CLM history files: **``hist_mfilt``**\n", + "To control the number of time samples in the history file, we use the variable **``hist_mfilt``**.
\n", + "This variable specifies is the maximum number of time samples written to a history file.\n", + "\n", + "For example, if we want to have **10 time samples** on each history file, we can set the namelist variable as follows:\n", + "```\n", + " hist_mfilt = 10\n", + "```\n", + "\n", + "\n", + "To output **daily** data in a single file for a 1-year run, we can use the following values:\n", + "```\n", + " hist_nhtfrq = -24 \n", + " hist_mfilt = 365\n", + "```\n", + "If we want to output **daily** data with only **1 time sample** per file, we can set the variables as follows:\n", + "```\n", + " hist_nhtfrq = -24\n", + " hist_mfilt = 1\n", + "```\n", + "\n", + "NB: we cannot change mfilt for monthly frequency. \u000b", + "\tFor monthly frequency, we always have: \n", + "```hist_mfilt = 1``` \n", + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "What is the setting to generate CLM 3-hourly data for a month-long simulation that will create a file every day?\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "Click here for the solution
\n", + "\n", + "Modify env_run.xml with the command:\n", + "```\n", + " ./xmlchange STOP_N=nmonths, STOP_OPTION=1\n", + "```\n", + "\n", + "Add the following line to user_nl_cam:\n", + "``` \n", + " hist_nhtfrq = -3\n", + " hist_mfilt = 8\n", + "```\n", + "\n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "55e82e97-06da-48a1-8b71-29324759a2c3", + "metadata": {}, + "source": [ + "\n", + "## Averaging flag for the **``fincl``** variables \n", + "\n", + "Using a \":\" following a field gives the averaging flag for the output field. \n", + "\n", + "Valid flags are: \n", + "- **``A``** ==> Average\n", + "- **``I``** ==> Instantaneous\n", + "- **``M``** ==> Minimum\n", + "- **``X``** ==> Maximum\n", + "- **``SUM``** ==> Sum\n", + "\n", + "For instance, the line:\n", + "```\n", + " hist_fincl1 = 'TLAI:M' \n", + "```\n", + "is used to add the minimum of ``TLAI`` to the file ``h0``\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "2bbd917e-8123-4bb1-a9cb-3c37d80c1fd2", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Evaluate your understanding\n", + "\n", + "What happens if we set in user_nl_clm:\n", + "```\n", + " hist_fincl2 = 'TG', 'TV' \n", + " hist_fincl3 = 'TG', 'TV' \n", + " hist_fincl4 = 'TG', 'TV'\n", + " hist_fincl5 = 'TG', 'TV' \n", + " hist_nhtfrq = 0, -24, -6, -1, 1 \n", + "```\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "Click here for the solution
\n", + "\n", + "In addition to the monthly history file h0, we output 4 extra history files with daily, six-hourly, hourly, and every time-step values of TG and TV (leaving the primary history ``h0`` files as monthly). \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02582628-9da7-4271-b330-e11c2e3ceb0f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/output/output_pop.ipynb b/_sources/notebooks/namelist/output/output_pop.ipynb new file mode 100644 index 000000000..f2f18b954 --- /dev/null +++ b/_sources/notebooks/namelist/output/output_pop.ipynb @@ -0,0 +1,65 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Customize POP output\n", + "\n", + "POP output is controlled by POP's tavg_nml namelist, which variables such as\n", + "\n", + "- **``tavg_freq``**: frequency at which the model fields are written\n", + "- **``tavg_freq_opt``**: units of time for 'tavg_freq’ ('nmonth’, 'nhour’, 'once’,…)\n", + "- **``tavg_file_freq``**:frequency at which the model files are written\n", + "- **``tavg_file_freq_opt``**: units of time for 'tavg_file_freq’ ('nmonth’, 'nhour’, …)\n", + "\n", + "These are arrays, with a value for each output stream.\n", + "A convenient way to change the first stream to be daily averages bundled into monthly\n", + "files is to add the following lines to ``user_nl_pop``: \n", + "```\n", + "tavg_freq_opt(1) = 'nday' \n", + "tavg_freq(1) = 1 \n", + "tavg_file_freq_opt(1) = 'nmonth' \n", + "tavg_file_freq(1) = 1 \n", + "```\n", + "\n", + "See: https://www.cesm.ucar.edu/models/cesm2/settings/current/pop2_nml.html\n", + "\n", + "\n", + "CAUTION: Note that changing tavg_nml variables via ``user_nl_pop`` is non-standard.\n", + "While the above is convenient, attempting more complicated changes can lead to unexpected model behavior.\n", + "For full flexibility, use the **workaround** explained in ``user_nl_pop``.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6857dadc-8cbd-4a2e-af21-14b0be4600ee", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/namelist/overview.ipynb b/_sources/notebooks/namelist/overview.ipynb new file mode 100644 index 000000000..392f4e40f --- /dev/null +++ b/_sources/notebooks/namelist/overview.ipynb @@ -0,0 +1,104 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f5e23fcc-d36b-4ca2-a596-9fb3c88c82e8", + "metadata": { + "tags": [] + }, + "source": [ + "# Overview \n", + "\n", + "There are a number of ways that the model can be modified via namelist settings. These values control the way the code is run. \n", + "\n", + "The **namelist variables** include settings to control over output, tune the model for various quantities, and many other options. For instance, the output frequency in the different components can be controlled via the namelists. \n", + "\n", + "
\n", + "\n", + "The **steps** to modify the **namelists** are:\n", + "\n", + "In ``$CASEROOT`` \n", + "- edit the ``user_nl_xxx`` files.\n", + "- generate the namelists by running ``./preview_namelists``. \n", + " \n", + " \n", + "This results in the creation of component namelists, the ``*_in`` files (i.e. `atm_in`, `lnd_in`, and so on). \n", + "\n", + "The ``*_in`` files are located in ``$CASEROOT/CaseDocs/`` and in ``$RUNDIR``.\n", + " \n", + "
\n", + "\n", + "\n", + "An overview of the CESM directories and the location of the namelist files is showed in *Figure 1*\n" + ] + }, + { + "cell_type": "markdown", + "id": "301171cd-e6da-4574-ab96-02d82d5fc95f", + "metadata": {}, + "source": [ + "___\n", + "![CESM directories and namelists](../../images/namelist/CESM_directories_and_namelists.png)\n", + "

Figure 1: Overview of the CESM directories and the namelist files.

\n", + "\n", + "___" + ] + }, + { + "cell_type": "markdown", + "id": "f0a5cc0d-f3cf-4508-9751-ff6866fa3f20", + "metadata": {}, + "source": [ + "\n", + "The ``*_in`` files **should not be directly edited**. Any manual changes of the ``*_in`` files will be overwritten when you compile or submit the run. \n", + "\n", + "Note that step ``./preview_namelists`` is **optional** as the script *preview_namelists* is also called when you build the model. \n", + "\n", + "Note that you cannot change the namelist variables: \n", + "- after the run is submitted \n", + "- or when `CONTINUE_RUN=TRUE`. \n" + ] + }, + { + "cell_type": "markdown", + "id": "c55ea30e-7dc5-4694-82d6-90952257c06a", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Complete documentation about the namelist variables can be found on the [CESM webpage.](https://www2.cesm.ucar.edu/models/cesm2/settings/current/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e30b4f4-1e35-4f70-af22-a81489b56018", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/prereqs/exercises.ipynb b/_sources/notebooks/prereqs/exercises.ipynb new file mode 100644 index 000000000..9d071b53d --- /dev/null +++ b/_sources/notebooks/prereqs/exercises.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "082bb7b7-5657-4601-8615-4dd2058a4625", + "metadata": { + "tags": [] + }, + "source": [ + "# Exercise Overview\n", + "\n", + "This exercise will introduce you to the derecho computing system. Specifically, in this exercise we will:\n", + "\n", + "- Step 1. Login to the derecho supercomputer.\n", + "- Step 2. Examine the derecho glade file system.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d9ff1113-8a6d-42b5-8ca7-d3bef493d7fb", + "metadata": {}, + "source": [ + "## Step 1: derecho Login" + ] + }, + { + "cell_type": "markdown", + "id": "f4a25131-701e-4d13-aad7-461d1302b84b", + "metadata": {}, + "source": [ + "From your tutorial terminal window prompt get online.
\n", + "\n", + "
\n", + "Login to derecho:

\n", + "\n", + "```\n", + "ssh –XY username@derecho.hpc.ucar.edu\n", + "```\n", + "\n", + "
\n", + "\n", + "Where `username` is replaced with your tutorial username. Your derecho login will be used through out the tutorial. If you have difficulty getting this to work please ask for help. \n", + "- If you are in the in-person tutorial at NCAR, there will be helpers available.\n", + "- If you are doing this outside of the tutorial then you can contact the user support from the NCAR Computational and Information Systems Laboratory (CISL)." + ] + }, + { + "cell_type": "markdown", + "id": "74512322-32da-400c-8aea-ff65658233db", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL User Support](https://ithelp.ucar.edu/plugins/servlet/desk/site/rc)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6250a6b0-e65e-43c1-b36d-ebec14345076", + "metadata": {}, + "source": [ + "## Step 2: Look Around derecho File Systems" + ] + }, + { + "cell_type": "markdown", + "id": "ff5b81e1-292a-4bc4-8415-57098366cf80", + "metadata": {}, + "source": [ + "Now that you are on the derecho login nodes you can start to explore the file system. The following simple exercises will start that process.\n", + "\n", + "
\n", + "Show your current directory:
\n", + "\n", + "```\n", + "pwd\n", + "```\n", + "
\n", + "\n", + "List all the directories on the glade file system:
\n", + "\n", + "```\n", + "ls /glade\n", + "```\n", + "
\n", + " \n", + "List the contents of the Input Data directory:
\n", + "\n", + "```\n", + "ls /glade/campaign/cesm/cesmdata/cseg/inputdata/\n", + "```\n", + "\n", + "
\n", + "\n", + "\n" + ] + }, + { + "cell_type": "raw", + "id": "b32ec2e7-06f8-4f26-905f-6d495c4cf299", + "metadata": {}, + "source": [ + "Feel free to look around more of the NCAR HPC system. In the Resources chapter, you will find a section about the [NCAR Supercomputer](https://ncar.github.io/CESM-Tutorial/notebooks/resources/ncar_hpc.html) with links that may be particularly relevant to you." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d338e513-cb0b-45fd-b65a-1e7a66d95971", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/prereqs/prereqs_overview.ipynb b/_sources/notebooks/prereqs/prereqs_overview.ipynb new file mode 100644 index 000000000..2b43ba3bf --- /dev/null +++ b/_sources/notebooks/prereqs/prereqs_overview.ipynb @@ -0,0 +1,198 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Prerequisites for Success\n" + ] + }, + { + "cell_type": "markdown", + "id": "4651282a-0c4f-449a-bf36-74af04e7281e", + "metadata": {}, + "source": [ + "NOTE: Although the materials and notebooks in this tutorial are published as a Jupyter Book, **you will need to use a terminal window to actually run the commands presented in this tutorial.**\n", + "\n", + "To successfully complete this tutorial you will:\n", + "- Utilize a **terminal** window\n", + "- Issue commands at the **command line** using **UNIX**\n", + "- Need to be able to access and run on the **NCAR HPC systems** (HPC = High Performance Computing)\n", + "- Use **JupyterHub** for some basic diagnostic plotting\n", + "\n", + "The links below provide more information about these topics. **If you are not familiar with any of the four topics above, we strongly recommend that you read through the following sections.**" + ] + }, + { + "cell_type": "markdown", + "id": "24e22d53-7b0b-4fb8-82ad-360e75e64ac0", + "metadata": {}, + "source": [ + "___\n", + "## Terminal windows" + ] + }, + { + "cell_type": "markdown", + "id": "14f5fe74-cc59-4ccc-af62-e31650e1372c", + "metadata": {}, + "source": [ + "For most of these tutorial exercises, we assume that you will use the online documentation in tandem with an open terminal window. The commands described in these materials will be entered at the command line in your terminal window.\n", + "\n", + "If you are unfamiliar with opening terminal windows, please review the information at the link below. " + ] + }, + { + "cell_type": "markdown", + "id": "01790d14-4535-4e0a-a7da-38ac467717de", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Terminals](https://ncar.github.io/CESM-Tutorial/notebooks/resources/terminals.html#terminal-windows)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "37406e6f-57c2-4493-86a9-52bc2d5eb3f8", + "metadata": {}, + "source": [ + "___\n", + "## UNIX" + ] + }, + { + "cell_type": "markdown", + "id": "6572f442-e01a-4809-a90d-c251ff79f8af", + "metadata": {}, + "source": [ + "The commands described in these materials will be entered in a UNIX environment. If you are unfamiliar with navigating a UNIX environment, we suggest you use the link below to learn more about UNIX. " + ] + }, + { + "cell_type": "markdown", + "id": "e664eb92-e98d-4c3d-afbe-ea517b71439b", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[UNIX](https://ncar.github.io/CESM-Tutorial/notebooks/resources/unix.html#unix)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "16324ba6-5c27-41c2-8e62-dc2ccc817527", + "metadata": {}, + "source": [ + "___\n", + "## Login to NCAR High Performance Computing (HPC)" + ] + }, + { + "cell_type": "markdown", + "id": "3b3e13f6-45e2-4dc8-bd2a-b550ddb11270", + "metadata": {}, + "source": [ + "When logging into the NCAR HPC machines, we recommend using X11 forwarding. X11 forwarding is an SSH protocol that allows users to run graphical applications on a remote server and interact with them using their local display and I/O devices. It is frequently used by CESM developers for securely interacting with NCAR HPC remote machines.\n", + "\n", + "To enable X11 forwarding when logging into the NCAR HPC, simply add the `-XY` option to your `SSH` command. " + ] + }, + { + "cell_type": "markdown", + "id": "ddb0d0fb-1fd9-4814-bb20-af81d2baae5a", + "metadata": {}, + "source": [ + "```\n", + "ssh -XY username@derecho.hpc.ucar.edu \n", + "```\n", + "OR \n", + "```\n", + "ssh -XY username@casper.hpc.ucar.edu\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "510846c7-4018-420e-a899-96e1b9e92902", + "metadata": {}, + "source": [ + "More information about logging into the NCAR HPC follows below.\n", + "\n", + "
\n", + "\n", + "[NCAR High Performance Computing (HPC)](https://ncar.github.io/CESM-Tutorial/notebooks/resources/ncar_hpc.html)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "3c9cc169-489e-427a-865a-539468cb060d", + "metadata": {}, + "source": [ + "____\n", + "## Using JupyterHub" + ] + }, + { + "cell_type": "markdown", + "id": "4a799266-780e-4281-8955-e20e522cdb4d", + "metadata": {}, + "source": [ + "The diagnostics section of this tutorial will use JupyterHub to run Jupyter Notebooks. You will need to login to the NCAR JupyterHub system to run the notebooks successfully.\n", + "\n", + "NOTE: To run a Jupyter cell\n", + "- Type your command into the cell\n", + "- To execute the command:\n", + " - Press **shift+return**\n", + "
\n", + " OR\n", + "
\n", + " - Select the cell then click the 'play' button at the top of the window\n", + "\n", + "To learn more about JupyterHub, please follow the link below." + ] + }, + { + "cell_type": "markdown", + "id": "7db0afc5-0462-45db-ac81-1ee18c34c716", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation about JupyterHub](https://arc.ucar.edu/knowledge_base/70549913)\n", + " \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "088d2dc6-ae4f-4023-93d4-494aeaf8ba44", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/fortran.ipynb b/_sources/notebooks/resources/fortran.ipynb new file mode 100644 index 000000000..ac5770092 --- /dev/null +++ b/_sources/notebooks/resources/fortran.ipynb @@ -0,0 +1,74 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Fortran" + ] + }, + { + "cell_type": "markdown", + "id": "386d6593-bcbf-4c9a-8e64-9c0ee687de47", + "metadata": {}, + "source": [ + "The CESM model is primarily written in Fortran. If you plan to modify the CESM code in any way, we strongly recommend you be able to navigate the Fortran code." + ] + }, + { + "cell_type": "markdown", + "id": "db9ec999-e1b8-43dc-b72c-77223226e1af", + "metadata": {}, + "source": [ + "The 2-unit module listed below, from The COMET Program, introduces users to scientific programming structures and methods and the history, basic syntax and functionality of Fortran. " + ] + }, + { + "cell_type": "markdown", + "id": "d65da730-a8df-47ad-9e9d-68f283637fef", + "metadata": {}, + "source": [ + "Recommendations for Module Use:\n", + "\n", + "- Users who have little to no programming experience should take both units in full.\n", + "- Users that do have some programming experience, such as a web-based language like HTML, but have limited experience in scientific programming, such as a C-based languages, should start with unit 1 and may find they can complete it quickly. While unit 2, covering Fortran and CESM Fortran examples, should be taken in full.\n", + "- Users that have significant scientific programming experience (C-based languages, for example) can safely start in unit 2, which covers Fortran and CESM Fortran examples.\n", + "- Users that have significant programming experience in Fortran can likely begin at the \"Fortran and CESM\" subsection (near bottom of table of contents) in unit 2." + ] + }, + { + "cell_type": "markdown", + "id": "6924d6f2-f210-4704-8084-415c81a2122a", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Fortran COMET module](https://www.meted.ucar.edu/ucar/fortran)\n", + "\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/github.ipynb b/_sources/notebooks/resources/github.ipynb new file mode 100644 index 000000000..860bf0e73 --- /dev/null +++ b/_sources/notebooks/resources/github.ipynb @@ -0,0 +1,162 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Github" + ] + }, + { + "cell_type": "markdown", + "id": "ecbb8df1-076e-43a9-a409-73fea1a4475d", + "metadata": {}, + "source": [ + "The CESM project is managed through the GitHub online software development platform. The CESM Project is hosted under the Earth System Community Modeling Portal (ESCOMP) which is managed by the University Corporation for Atmospheric Research (UCAR). The ESCOMP portal and the CESM project are publicly available and do not require a Github account for read and download access. You can find information, track conversations, create issues, and learn lots about what's going on with CESM development through the CESM GitHub repository and the associated wiki.\n", + "\n", + "**Note: In the tutorial, where git commands are needed we explicitly detail what commands to use. You will not need to use Github for other activities in this Tutorial. We do however suggest that in your own time you become familar with Github, register as a Github user, and then become an active member of the CESM user and development community. When you make a free account in GitHub to access numerous repositories for different software code development at NCAR and beyond. Github, ESCOMP, and the CESM project are vast and you can get lost in this material for hours, days, weeks or even years. Don't go too far off the path in this tutorial as we are expecting that you will focus on learning other derecho and CESM code download tasks.**" + ] + }, + { + "cell_type": "markdown", + "id": "ee473b49-9e16-44b2-a432-235d453094f9", + "metadata": {}, + "source": [ + "## What are Git and GitHub?" + ] + }, + { + "cell_type": "markdown", + "id": "4332ee98-964a-4123-8cd1-56a64af8aa58", + "metadata": {}, + "source": [ + "Git is an open-source version control software to track your changes in the source code. \n", + "\n", + "GitHub is an online software development platform. GitHub provides a centralized online service to host the source code and version control using Git. GitHub is used for storing, tracking, and collaborating on software projects. It makes it easy for developers to share code files and collaborate with fellow developers on open-source projects. GitHub also serves as a social networking site where developers can openly network, collaborate, and pitch their work. GitHub allows software developers to create remote, publicly available repositories on the cloud for free. A repository, or \"repo\" for short, is a coding project’s files and the revision history for each file. " + ] + }, + { + "cell_type": "markdown", + "id": "230ba41c-1c66-482b-b57d-3e14cf326dd2", + "metadata": {}, + "source": [ + "![Github Image](../../images/resources/CESM2_github_main.png)\n", + "*

Figure: Top Level Github Header

*" + ] + }, + { + "cell_type": "markdown", + "id": "2db5b08a-8c5f-4a92-8691-fb9581340d82", + "metadata": {}, + "source": [ + "Learning all the tricks and features of Git and GitHub takes some time to figure out. Below are some links to GitHub tutorials that can help you become more familiar with this powerful tool." + ] + }, + { + "cell_type": "markdown", + "id": "6a271fd9-ef98-4883-bcbd-4d8e83d43a8d", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[GitHub tutorial from software carpentry](https://swcarpentry.github.io/git-novice/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "babdf239-9e83-4f00-b2a6-033f4e1f53b3", + "metadata": {}, + "source": [ + "## ESCOMP" + ] + }, + { + "cell_type": "markdown", + "id": "fcde532b-ea6e-49e2-ab45-52ed8b0f486e", + "metadata": {}, + "source": [ + "The ESCOMP github organization is managed by UCAR and NCAR to organize and manage large, community-oriented earth system modeling projects of broad interest. As shown below there are many projects beyond CESM managed under the ESCOMP organization. The component models (see CAM and CTSM in figure below) that make up CESM are also hosted under the ESCOMP organization." + ] + }, + { + "cell_type": "markdown", + "id": "852d2da7-1b6d-4a7f-b4b1-9d07222de7d9", + "metadata": {}, + "source": [ + "![ESCOMP Image](../../images/resources/CESM2_github_ESCOMP.png)\n", + "*

Figure: ESCOMP Github Header

*" + ] + }, + { + "cell_type": "markdown", + "id": "1306dc86-1d29-48f0-9138-9587b7ff7051", + "metadata": {}, + "source": [ + "## CESM and GitHub" + ] + }, + { + "cell_type": "markdown", + "id": "c37b8978-46bd-47ec-bf45-f403fb53b4de", + "metadata": {}, + "source": [ + "The CESM Project has been hosted on Github since CESM2.0 under the ESCOMP organization. The CESM Project contains all development and release code for all subsequent versions of CESM. The CESM GitHub repository has the tools for managing the exeternal components that make up a CESM model tag. Additionally, the documentation at this repository provides information about software requirements to run CESM, developer guidelines, and a Quikstart guide to accessing CESM through GitHub." + ] + }, + { + "cell_type": "markdown", + "id": "c4e62e1f-7ae6-4420-8bfc-445559d188d3", + "metadata": {}, + "source": [ + "![CESM Project Image](../../images/resources/CESM2_github_CESM.png)\n", + "*

Figure: CESM Project Github Header

*\n" + ] + }, + { + "cell_type": "markdown", + "id": "56c7b16d-5875-463c-88a8-36206fe5ec6a", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CESM GitHub repository](https://github.com/ESCOMP/CESM)\n", + " \n", + "[CESM and GitHub Quickstart guide](https://escomp.github.io/CESM/versions/master/html/index.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdb5e70e-85ca-4e84-9381-4b1b8ab63692", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/ncar_hpc.ipynb b/_sources/notebooks/resources/ncar_hpc.ipynb new file mode 100644 index 000000000..d0adfd4ef --- /dev/null +++ b/_sources/notebooks/resources/ncar_hpc.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "da307274-8069-4cc8-b333-cb156373cda3", + "metadata": {}, + "source": [ + "# NCAR Supercomputer\n", + "\n", + "Once you have an account and the necessary software, you can log in and run jobs on the NCAR supercomputer. The NCAR supercomputer is also referenced to the NCAR High Performance Computing (HPC). " + ] + }, + { + "cell_type": "markdown", + "id": "28823b60-6956-417c-a48c-3b88668b0968", + "metadata": {}, + "source": [ + "___\n", + "## Logging in on an NCAR system" + ] + }, + { + "cell_type": "markdown", + "id": "3b3e13f6-45e2-4dc8-bd2a-b550ddb11270", + "metadata": {}, + "source": [ + "To log in, start your terminal or Secure Shell client and run an `ssh` command as shown here:\n" + ] + }, + { + "cell_type": "markdown", + "id": "ddb0d0fb-1fd9-4814-bb20-af81d2baae5a", + "metadata": {}, + "source": [ + "```\n", + "ssh -XY username@derecho.hpc.ucar.edu \n", + "```\n", + "OR \n", + "```\n", + "ssh -XY username@casper.hpc.ucar.edu\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "311d9679-8944-49c0-936e-8e8ddcc3ba37", + "metadata": {}, + "source": [ + "\n", + "When you log in to the NCAR HPC machines, we recommend you use `X11` forwarding. `X11` forwarding is an SSH protocol that enables users to run graphical applications on a remote server and interact with them using their local display and I/O devices. It is frequently used by CESM developers for securely interacting with NCAR HPC remote machines.\n", + "\n", + "You can do this by adding the `-XY` option when logging into the machines with `SSH`. More information about logging into the NCAR HPC follows below." + ] + }, + { + "cell_type": "markdown", + "id": "510846c7-4018-420e-a899-96e1b9e92902", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation on Using X11](https://arc.ucar.edu/knowledge_base/72581213#QuickstartonDerecho-LogginginonanNCARsystem)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e731c34f-4386-4869-bdb7-a6e479f07a63", + "metadata": {}, + "source": [ + "___\n", + "## Running on derecho" + ] + }, + { + "cell_type": "markdown", + "id": "202de099-dc2d-47d2-99fb-b6f1b87d654c", + "metadata": {}, + "source": [ + "This tutorial material is designed for use with the derecho HPC system. All of your CESM experiment builds and jobs will be run on derecho.\n", + "\n", + "Please see the link below for more information about the derecho system, including a quick start guide with information about logging into derecho from a terminal, setting up your environment, submitting jobs, etc. " + ] + }, + { + "cell_type": "markdown", + "id": "235c1c69-da82-4cff-95bf-02c1bb2db897", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation on Using derecho HPC](https://arc.ucar.edu/knowledge_base/74317833)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c7e2b935-85ea-47f1-b8f0-654d54714484", + "metadata": {}, + "source": [ + "#### Porting" + ] + }, + { + "cell_type": "markdown", + "id": "a47bc7ae-4bd8-4e55-87e8-27019a689099", + "metadata": {}, + "source": [ + "This tutorial assumes that you are using NCAR HPC assets. In order to run the CESM on a **_different_** computing platform, you will first need to port the CESM code to that environment/machine. We provide information about how to port the model code in the [porting section](https://ncar.github.io/CESM-Tutorial/notebooks/resources/porting.html)." + ] + }, + { + "cell_type": "markdown", + "id": "8a831d36-6629-4cd6-a247-2a8293aa2561", + "metadata": {}, + "source": [ + "___\n", + "## Using Casper" + ] + }, + { + "cell_type": "markdown", + "id": "2f8ad62c-89c5-49c3-9751-219303bce4c7", + "metadata": {}, + "source": [ + "The Casper cluster is a system of specialized data analysis and visualization resources. Casper is not used for building or running CESM, but it is used for CESM data analysis. We will use Casper for the diagnostics section of the lab activities. To utilize the **_additional_** analysis tools described in the [analysis tools section](https://ncar.github.io/CESM-Tutorial/notebooks/diagnostics/additional/analysis_tools.html) you will also want to use Casper." + ] + }, + { + "cell_type": "markdown", + "id": "aee2a810-f356-4c55-a19a-c0a32dfd504b", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation on Using Casper Cluster](https://arc.ucar.edu/knowledge_base/70549550)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "603c963b-4d65-4cd6-94a3-ea5ae932578e", + "metadata": {}, + "source": [ + "___\n", + "## Using JupyterHub" + ] + }, + { + "cell_type": "markdown", + "id": "a9423bae-be8c-4848-916c-926f86645da6", + "metadata": {}, + "source": [ + "The diagnostics section of this tutorial will use JupyterHub to run Jupyter Notebooks. You will need to login to the NCAR JupyterHub system to run the notebooks successfully.\n", + "\n", + "NOTE: To run a Jupyter cell\n", + "- Type your command into the cell\n", + "- To execute the command:\n", + " - Press **shift+return**\n", + "
\n", + " OR\n", + "
\n", + " - Select the cell then click the 'play' button at the top of the window\n", + "\n", + "To learn more about JupyterHub, please follow the link below." + ] + }, + { + "cell_type": "markdown", + "id": "6ae8710f-8dd2-4ed6-893f-d2de5b863b94", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation about JupyterHub](https://arc.ucar.edu/knowledge_base/70549913)\n", + " \n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/ncar_hpc_login.ipynb b/_sources/notebooks/resources/ncar_hpc_login.ipynb new file mode 100644 index 000000000..2e4e93dab --- /dev/null +++ b/_sources/notebooks/resources/ncar_hpc_login.ipynb @@ -0,0 +1,358 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1e8e7890-9733-47bf-9ff6-91613f4738f1", + "metadata": {}, + "source": [ + "# NCAR Supercomputer\n", + "\n", + "Once you have an account and the necessary software, you can log in and run jobs on the NCAR supercomputer. The NCAR supercomputer is also referenced to the NCAR High Performance Computing (HPC). " + ] + }, + { + "cell_type": "markdown", + "id": "28823b60-6956-417c-a48c-3b88668b0968", + "metadata": {}, + "source": [ + "___\n", + "## Logging in on an NCAR system¶" + ] + }, + { + "cell_type": "markdown", + "id": "3b3e13f6-45e2-4dc8-bd2a-b550ddb11270", + "metadata": {}, + "source": [ + "To log in, start your terminal or Secure Shell client and run an `ssh` command as shown here:\n" + ] + }, + { + "cell_type": "markdown", + "id": "ddb0d0fb-1fd9-4814-bb20-af81d2baae5a", + "metadata": {}, + "source": [ + "```\n", + "ssh -XY username@derecho.hpc.ucar.edu \n", + "```\n", + "OR \n", + "```\n", + "ssh -XY username@casper.hpc.ucar.edu\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "311d9679-8944-49c0-936e-8e8ddcc3ba37", + "metadata": {}, + "source": [ + "\n", + "When you log in to the NCAR HPC machines, we recommend you use `X11` forwarding. `X11` forwarding is an SSH protocol that enables users to run graphical applications on a remote server and interact with them using their local display and I/O devices. It is frequently used by CESM developers for securely interacting with NCAR HPC remote machines.\n", + "\n", + "You can do this by adding the `-XY` option when logging into the machines with `SSH`. More information about logging into the NCAR HPC follows below." + ] + }, + { + "cell_type": "markdown", + "id": "510846c7-4018-420e-a899-96e1b9e92902", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation on Using X11](https://arc.ucar.edu/knowledge_base/72581213#QuickstartonDerecho-LogginginonanNCARsystem)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e731c34f-4386-4869-bdb7-a6e479f07a63", + "metadata": {}, + "source": [ + "___\n", + "## Running on derecho" + ] + }, + { + "cell_type": "markdown", + "id": "202de099-dc2d-47d2-99fb-b6f1b87d654c", + "metadata": {}, + "source": [ + "This tutorial material is designed for use with the derecho HPC system. All of your CESM experiment builds and jobs will be run on derecho.\n", + "\n", + "Please see the link below for more information about the derecho system, including a quick start guide with information about logging into derecho from a terminal, setting up your environment, submitting jobs, etc. " + ] + }, + { + "cell_type": "markdown", + "id": "235c1c69-da82-4cff-95bf-02c1bb2db897", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation on Using derecho HPC](https://arc.ucar.edu/knowledge_base/74317833)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c7e2b935-85ea-47f1-b8f0-654d54714484", + "metadata": {}, + "source": [ + "#### Porting" + ] + }, + { + "cell_type": "markdown", + "id": "a47bc7ae-4bd8-4e55-87e8-27019a689099", + "metadata": {}, + "source": [ + "This tutorial assumes that you are using NCAR HPC assets. In order to run the CESM on a **_different_** computing platform, you will first need to port the CESM code to that environment/machine. We provide information about how to port the model code in the [porting section](https://ncar.github.io/CESM-Tutorial/notebooks/resources/porting.html)." + ] + }, + { + "cell_type": "markdown", + "id": "8a831d36-6629-4cd6-a247-2a8293aa2561", + "metadata": {}, + "source": [ + "___\n", + "## Using Casper" + ] + }, + { + "cell_type": "markdown", + "id": "2f8ad62c-89c5-49c3-9751-219303bce4c7", + "metadata": {}, + "source": [ + "The Casper cluster is a system of specialized data analysis and visualization resources. Casper is not used for building or running CESM, but it is used for CESM data analysis. We will use Casper for the diagnostics section of the lab activities. To utilize the **_additional_** analysis tools described in the [analysis tools section](https://ncar.github.io/CESM-Tutorial/notebooks/diagnostics/additional/analysis_tools.html) you will also want to use Casper." + ] + }, + { + "cell_type": "markdown", + "id": "aee2a810-f356-4c55-a19a-c0a32dfd504b", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation on Using Casper Cluster](https://arc.ucar.edu/knowledge_base/70549550)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "603c963b-4d65-4cd6-94a3-ea5ae932578e", + "metadata": {}, + "source": [ + "___\n", + "## Using JupyterHub" + ] + }, + { + "cell_type": "markdown", + "id": "a9423bae-be8c-4848-916c-926f86645da6", + "metadata": {}, + "source": [ + "The diagnostics section of this tutorial will use JupyterHub to run Jupyter Notebooks. You will need to login to the NCAR JupyterHub system to run the notebooks successfully.\n", + "\n", + "NOTE: To run a Jupyter cell\n", + "- Type your command into the cell\n", + "- To execute the command:\n", + " - Press **shift+return**\n", + "
\n", + " OR\n", + "
\n", + " - Select the cell then click the 'play' button at the top of the window\n", + "\n", + "To learn more about JupyterHub, please follow the link below." + ] + }, + { + "cell_type": "markdown", + "id": "6ae8710f-8dd2-4ed6-893f-d2de5b863b94", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL Documentation about JupyterHub](https://arc.ucar.edu/knowledge_base/70549913)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "144caca2-989b-40a5-b6c0-c8a0b7a470da", + "metadata": {}, + "source": [ + "___\n", + "## Modules on NCAR HPC" + ] + }, + { + "cell_type": "markdown", + "id": "52805170-9397-48b3-8bdf-a2c76fb45583", + "metadata": {}, + "source": [ + "NCAR maintains a number of different programs on the HPC systems that can be added to your user environment by executing the ``module load`` command. " + ] + }, + { + "cell_type": "markdown", + "id": "a551ace3-3b1a-4130-8084-3034842e0259", + "metadata": {}, + "source": [ + "We will use a few modules throughout this tutorial to visualize data, so you need to be able to check which modules you have loaded and to load necessary modules." + ] + }, + { + "cell_type": "markdown", + "id": "f6edec76-66ba-42f0-b3b2-00a4d90f15fd", + "metadata": {}, + "source": [ + "We provide basic instructions below on how to check and load Modules, but to learn more about Modules on NCAR HPC, please follow the link below." + ] + }, + { + "cell_type": "markdown", + "id": "b2aef333-82a9-4f3d-8afa-2f5c3df4ef4c", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL documentation on modules](https://arc.ucar.edu/knowledge_base/72581272)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "33d4014c-bc0f-4ab0-aaf3-cf6cf7572f22", + "metadata": {}, + "source": [ + "### Checking what modules are loaded in your environment\n", + "\n", + "To check what modules you have loaded in your environment, use the following at the command line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fe867e0-f0df-4d87-a9d6-169294ec222c", + "metadata": {}, + "outputs": [], + "source": [ + "module list" + ] + }, + { + "cell_type": "markdown", + "id": "2a5ec941-4f4a-4a99-a3a0-6e514c448805", + "metadata": {}, + "source": [ + "### Checking what modules are available\n", + "\n", + "You can see which modules are available on the HPC resources by using the following at the command line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b974222c-a270-4075-b9b9-7be7b4550942", + "metadata": {}, + "outputs": [], + "source": [ + "module avail" + ] + }, + { + "cell_type": "markdown", + "id": "0d2cfc8e-2085-4b72-b917-9e98a1586e13", + "metadata": {}, + "source": [ + "The command returns a list to the terminal window of the modules available to load to your environment." + ] + }, + { + "cell_type": "markdown", + "id": "ec74810f-c422-468d-b30e-ddb9c41d878f", + "metadata": {}, + "source": [ + "![Modules](../../images/prereqs/modules.png)\n", + "\n", + "*

Figure: Some modules available on NCAR HPC resources. D: Default Module. L: Module is loaded.

*" + ] + }, + { + "cell_type": "markdown", + "id": "c523021e-9328-4e0b-8c40-15bcf2ebab75", + "metadata": {}, + "source": [ + "The modules highlighted in blue are text editors discussed further in the [text editors section](https://ncar.github.io/CESM-Tutorial/notebooks/resources/text_editors.html).\n", + "\n", + "The modules highlighted in red are netCDF tools that will be discussed further in the [netCDF section](https://ncar.github.io/CESM-Tutorial/notebooks/resources/netcdf.html).\n", + "\n", + "Note that there are many other analysis software tools available to load into your NCAR HPC environment. These include: idl, julia, matlab, R, python, ncl, etc. While some of these tools are discussed in the [analysis tools section](https://ncar.github.io/CESM-Tutorial/notebooks/diagnostics/additional/analysis_tools.html), we do not highlight them all here and encourage you to further explore your environment and needs." + ] + }, + { + "cell_type": "markdown", + "id": "65848ac8-1cad-47bf-b680-8b129ce4e25d", + "metadata": {}, + "source": [ + "### Loading a new module to your environment\n", + "\n", + "You can load one of the available modules (here we show loading ncview) using the following at the command line: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad9db6c8-91a9-4c3e-84b4-6e6fb65de213", + "metadata": {}, + "outputs": [], + "source": [ + "module load ncview" + ] + }, + { + "cell_type": "markdown", + "id": "a1e13c85-65d1-4904-a07b-6cba1249ddfd", + "metadata": {}, + "source": [ + "
\n", + "NOTE: We will provide a file that will load necessary modules for those attending the in person tutorial. \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "3c9cc169-489e-427a-865a-539468cb060d", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a1cb820-6efd-4eda-9581-a7067ff4f27d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/ncar_hpc_module.ipynb b/_sources/notebooks/resources/ncar_hpc_module.ipynb new file mode 100644 index 000000000..02eac9de8 --- /dev/null +++ b/_sources/notebooks/resources/ncar_hpc_module.ipynb @@ -0,0 +1,177 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "144caca2-989b-40a5-b6c0-c8a0b7a470da", + "metadata": {}, + "source": [ + "# Modules on NCAR HPC" + ] + }, + { + "cell_type": "markdown", + "id": "52805170-9397-48b3-8bdf-a2c76fb45583", + "metadata": {}, + "source": [ + "NCAR maintains a number of different programs on the HPC systems that can be added to your user environment by executing the ``module load`` command. " + ] + }, + { + "cell_type": "markdown", + "id": "a551ace3-3b1a-4130-8084-3034842e0259", + "metadata": {}, + "source": [ + "We will use a few modules throughout this tutorial to visualize data, so you need to be able to check which modules you have loaded and to load necessary modules." + ] + }, + { + "cell_type": "markdown", + "id": "f6edec76-66ba-42f0-b3b2-00a4d90f15fd", + "metadata": {}, + "source": [ + "We provide basic instructions below on how to check and load Modules, but to learn more about Modules on NCAR HPC, please follow the link below." + ] + }, + { + "cell_type": "markdown", + "id": "b2aef333-82a9-4f3d-8afa-2f5c3df4ef4c", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CISL documentation on modules](https://arc.ucar.edu/knowledge_base/72581272)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "33d4014c-bc0f-4ab0-aaf3-cf6cf7572f22", + "metadata": {}, + "source": [ + "### Checking what modules are loaded in your environment\n", + "\n", + "To check what modules you have loaded in your environment, use the following at the command line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fe867e0-f0df-4d87-a9d6-169294ec222c", + "metadata": {}, + "outputs": [], + "source": [ + "module list" + ] + }, + { + "cell_type": "markdown", + "id": "2a5ec941-4f4a-4a99-a3a0-6e514c448805", + "metadata": {}, + "source": [ + "### Checking what modules are available\n", + "\n", + "You can see which modules are available on the HPC resources by using the following at the command line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b974222c-a270-4075-b9b9-7be7b4550942", + "metadata": {}, + "outputs": [], + "source": [ + "module avail" + ] + }, + { + "cell_type": "markdown", + "id": "0d2cfc8e-2085-4b72-b917-9e98a1586e13", + "metadata": {}, + "source": [ + "The command returns a list to the terminal window of the modules available to load to your environment." + ] + }, + { + "cell_type": "markdown", + "id": "ec74810f-c422-468d-b30e-ddb9c41d878f", + "metadata": {}, + "source": [ + "![Modules](../../images/prereqs/modules.png)\n", + "\n", + "*

Figure: Some modules available on NCAR HPC resources. D: Default Module. L: Module is loaded.

*" + ] + }, + { + "cell_type": "markdown", + "id": "c523021e-9328-4e0b-8c40-15bcf2ebab75", + "metadata": {}, + "source": [ + "The modules highlighted in blue are text editors discussed further in the [text editors section](https://ncar.github.io/CESM-Tutorial/notebooks/resources/text_editors.html).\n", + "\n", + "The modules highlighted in red are netCDF tools that will be discussed further in the [netCDF section](https://ncar.github.io/CESM-Tutorial/notebooks/resources/netcdf.html).\n", + "\n", + "Note that there are many other analysis software tools available to load into your NCAR HPC environment. These include: idl, julia, matlab, R, python, ncl, etc. While some of these tools are discussed in the [analysis tools section](https://ncar.github.io/CESM-Tutorial/notebooks/diagnostics/additional/analysis_tools.html), we do not highlight them all here and encourage you to further explore your environment and needs." + ] + }, + { + "cell_type": "markdown", + "id": "65848ac8-1cad-47bf-b680-8b129ce4e25d", + "metadata": {}, + "source": [ + "### Loading a new module to your environment\n", + "\n", + "You can load one of the available modules (here we show loading ncview) using the following at the command line: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad9db6c8-91a9-4c3e-84b4-6e6fb65de213", + "metadata": {}, + "outputs": [], + "source": [ + "module load ncview" + ] + }, + { + "cell_type": "markdown", + "id": "a1e13c85-65d1-4904-a07b-6cba1249ddfd", + "metadata": {}, + "source": [ + "
\n", + "NOTE: We will provide a file that will load necessary modules for those attending the in person tutorial. \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "3c9cc169-489e-427a-865a-539468cb060d", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a1cb820-6efd-4eda-9581-a7067ff4f27d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/netcdf.ipynb b/_sources/notebooks/resources/netcdf.ipynb new file mode 100644 index 000000000..5bbacda9a --- /dev/null +++ b/_sources/notebooks/resources/netcdf.ipynb @@ -0,0 +1,349 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# NetCDF files" + ] + }, + { + "cell_type": "markdown", + "id": "e70f8ee6-91c8-4543-830f-4196163a7131", + "metadata": {}, + "source": [ + "All CESM model output is in netCDF (*.nc) data format. Below, you will find some useful information for how to navigate and manipulate CESM netCDF files." + ] + }, + { + "cell_type": "markdown", + "id": "59bb8a3f-74a5-4c7f-aaa7-15d22fe59b4a", + "metadata": {}, + "source": [ + "## NetCDF\n", + "\n", + "NetCDF stands for “network Common Data Form”. NetCDF files are array-oriented and a community standard for sharing scientific model data.\n", + "\n", + "Some benefits of netCDF files include that they:\n", + "- Are self describing and generally include substantial metadata to assist with comprehension of the data.\n", + "- Supported by a range of languages (Fortran, C, Matlab, ferret, GrADS, NCL, IDL, python).\n", + "- Appendable, so data can be added to a file.\n", + "- Viewable with tools like ncview and panopoly." + ] + }, + { + "cell_type": "markdown", + "id": "5b9c0340-90be-4957-82a7-5d911287a35f", + "metadata": {}, + "source": [ + "The files are saved in netcdf format (denoted with the `.nc` file extension), a file format commonly used for storing large, multi-dimensional scientific variables.\n", + "Netcdf files are platform independent and self-describing; each file includes metadata that describes the data, including: **variables**, **dimensions**, and **attributes**.\n", + "\n", + "The figure below provides a generic example of the data structure in a netcdf file. The dataset illustrated has two variables (temperature and pressure) that have three dimensions. Coordinate data (e.g., latitude, longitude, time) that describe the data are also included. \n", + "\n", + "![Netcdf](https://xarray.pydata.org/en/stable/_images/dataset-diagram.png)" + ] + }, + { + "cell_type": "markdown", + "id": "c6540e1c-d489-401b-b227-2da4f69c50ec", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[netCDF information](https://www.unidata.ucar.edu/software/netcdf/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "eeaa2e1e-68fa-4b72-9415-d12448484719", + "metadata": {}, + "source": [ + "## ncdump\n", + "\n", + "Sometimes you want to see what information a netCDF file without fully opening it. `ncdump` is a command line netCDF utility that allows the user to dump the contents of the netCDF file to the terminal screen or to a file in a human-readable format. \n", + "\n", + "**NOTE:** `ncdump` **is installed by default as part of the netCDF libraries.**" + ] + }, + { + "cell_type": "markdown", + "id": "bf4014fd-c02a-485d-a648-a01d7bb6f204", + "metadata": {}, + "source": [ + "To view the header of a netCDF file, use the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78c32209-629f-4d7e-afe2-64cb6ff4b04c", + "metadata": {}, + "outputs": [], + "source": [ + "ncdump -h file.nc" + ] + }, + { + "cell_type": "markdown", + "id": "177838bf-0241-4265-8418-fcfbdcff7dd0", + "metadata": {}, + "source": [ + "At the command line, you get the following information from the `ncdump -h` command. It includes the dimensions in the file, a list of variables, and global attributes that can be very useful." + ] + }, + { + "cell_type": "markdown", + "id": "c7cdea85-fb03-440b-a65a-53ca69483e02", + "metadata": {}, + "source": [ + "![ncdump](../../images/resources/ncdump_example.png)\n", + "\n", + "*

Figure: Example output from the ncdump -h command.

*" + ] + }, + { + "cell_type": "markdown", + "id": "a06d67d2-b5e5-477a-871b-16dcad514357", + "metadata": {}, + "source": [ + "To view the contents of a variable, use the following command:\n", + "* Note that you must verify the variable exists in the file by first doing a the command above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74324a3f-7129-4b6b-96e8-d3d831247d68", + "metadata": {}, + "outputs": [], + "source": [ + "ncdump -v PSL file.nc" + ] + }, + { + "cell_type": "markdown", + "id": "73922a90-4f0e-488a-a1e5-81d07141a216", + "metadata": {}, + "source": [ + "To view the netCDF file type, use the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1aa78eba-bdab-48fe-a563-6dae2747af2f", + "metadata": {}, + "outputs": [], + "source": [ + "ncdump –k file.nc" + ] + }, + { + "cell_type": "markdown", + "id": "86ba17a2-a119-40d7-bda2-1c0b40694596", + "metadata": {}, + "source": [ + "To print readable date-time strings, use the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e52ddeec-7fe3-49fb-ac4c-e243f5263b72", + "metadata": {}, + "outputs": [], + "source": [ + "ncdump –t –v time file.nc" + ] + }, + { + "cell_type": "markdown", + "id": "b9478866-10ee-4b8f-a80f-7e58f840872c", + "metadata": {}, + "source": [ + "## ncview\n", + "\n", + "`ncview` is a graphical interface which allows the user to quickly view the variables inside a NetCDF file. `ncview` also allows the user to interactively visualize a selected variable aross a selected range (time, spatial).\n", + "\n", + "**NOTE:** `ncview` **must be loaded as a module in your HPC environment.** See section (LINK)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95c41eb1-01cc-4f24-90fb-ca85ed0da51f", + "metadata": {}, + "outputs": [], + "source": [ + "ncview file.nc" + ] + }, + { + "cell_type": "markdown", + "id": "f31e7620-b199-4fd7-8b9c-715b199c0436", + "metadata": {}, + "source": [ + "![ncview](../../images/resources/ncview.png)\n", + "\n", + "*

Figure: Example output from ncview command.

*" + ] + }, + { + "cell_type": "markdown", + "id": "674a8519-2434-4d87-a418-feb10005b83a", + "metadata": {}, + "source": [ + "## netCDF Operators (NCO) \n", + "\n", + "NCO is a suite of programs designed to perform certain “operations” on netCDF files, i.e., things like averaging, concatenating, subsetting, or metadata manipulation.Command-line operations are extremely useful for processing model data given that modelers often work in a UNIX-type environment.\n", + "\n", + "We will describe a few key types of NCO operators below, but there are many other NCO operators beyond these that could be of use. We recommend visiting the NCO page to get full documentation.\n", + "\n", + "**NOTE:** `nco` **must be loaded as a module in your HPC environment.** See section (LINK)." + ] + }, + { + "cell_type": "markdown", + "id": "fab944fa-04c3-4843-af5b-2763970dd0fd", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[NCO github page](https://github.com/nco/nco)\n", + "\n", + "[NCO sourceforge page](http://nco.sourceforge.net)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "de438002-157e-4f2f-8f3f-d0f2c3d01b41", + "metadata": {}, + "source": [ + "`ncra` is a netCDF record averager that averages across the record dimesion (i.e. time) for the files specified. The example below shows the command for how to average across two files from different months." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "604168a3-5268-43f6-a002-3f4906b9caf9", + "metadata": {}, + "outputs": [], + "source": [ + "ncra file1.nc file2.nc avgfile.nc" + ] + }, + { + "cell_type": "markdown", + "id": "575d65ac-82aa-4d13-9702-9c63ce84321e", + "metadata": {}, + "source": [ + "`ncrcat` is a netCDF record concatenator that combines the files specified across the record dimesion (i.e. time). The example below shows the command for how to concatenate two files from different months into a single file that will have two timesteps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88a35e2d-64e0-4c9a-9764-7a4587d25a28", + "metadata": {}, + "outputs": [], + "source": [ + "ncrcat file1.nc file2.nc out12.nc" + ] + }, + { + "cell_type": "markdown", + "id": "8b756d23-71bb-45f4-ba63-83b8ee50f781", + "metadata": {}, + "source": [ + "`ncdiff` is a netCDF differener that will reveal differences between files. The example below shows the command for how to create a file showing differences between two files from different months." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca1c37fc-ab49-4769-aa39-e4804b01dd83", + "metadata": {}, + "outputs": [], + "source": [ + "ncdiff file1.nc file2.nc diff.nc" + ] + }, + { + "cell_type": "markdown", + "id": "91216ea2-7278-4887-8a6f-f9a2e1e4eedb", + "metadata": {}, + "source": [ + "`ncks` stands for netCDF kitchen sink and has numerous functions that may be useful. The examples below show \n", + "1) how to use NCO operator options to subset only some specified variables from the input file because the `-v` option operates only on the variables listed.\n", + "2) how to use NCO operator options to subset only a given latitude and longitude range because the `-d` option operates on the dimensions. Note that real numbers indicate coordinate values while integers indicate array indexes. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d9ba792-79e3-4bdd-9823-816110b5d0a1", + "metadata": {}, + "outputs": [], + "source": [ + "ncks –v T,U,PS file_in.nc file_out.nc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c549782-7aba-4de7-816f-5dcea3264e81", + "metadata": {}, + "outputs": [], + "source": [ + "ncks -d lon,0.,180. -d lat,0,63 file_in.nc file_out.nc" + ] + }, + { + "cell_type": "markdown", + "id": "6b81015d-05e5-44e9-9c3f-6ea31e8eb44f", + "metadata": {}, + "source": [ + "## Climate Data Operators (CDO) \n", + "\n", + "CDO are a suite of command line operators to manipulate and analyze climate and NWP model data. CDO are similar to NCO. The CDO library inclues over 600 command line operators that do a variety of tasks including: detrending, EOF analysis, metadata modification, statistical analysis, etc. \n", + "\n", + "**NOTE:** `cdo` **must be loaded as a module in your HPC environment.** See section (LINK)." + ] + }, + { + "cell_type": "markdown", + "id": "cd5527e1-d0c7-4108-81a9-357a82110f82", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CDO github page](https://github.com/AZed/cdo)\n", + "\n", + "[CDO project page](https://code.mpimet.mpg.de/projects/cdo/)\n", + "\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/porting.ipynb b/_sources/notebooks/resources/porting.ipynb new file mode 100644 index 000000000..c84e59b20 --- /dev/null +++ b/_sources/notebooks/resources/porting.ipynb @@ -0,0 +1,84 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Porting" + ] + }, + { + "cell_type": "markdown", + "id": "fe00d177-b2e2-4067-b1fe-95b0a1d45f3d", + "metadata": {}, + "source": [ + "Moving CESM to a new machine that has not been previously setup requires knowledge of both the CESM model and the target machine architecture and software. Porting details can also be found in specialized lecture slides from previous CESM tutorials.
" + ] + }, + { + "cell_type": "markdown", + "id": "52b78297-4829-477b-8018-6d80512389a5", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[CIME documentation (see part 2)](http://esmci.github.io/cime/)\n", + "\n", + "[Porting CESM2](http://www.cesm.ucar.edu/models/cesm2/linux_cluster/)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "080839b4-514f-4072-88a6-bd514424cf6e", + "metadata": {}, + "source": [ + "![Porting Image](../../images/resources/CESM2_Porting.png)\n", + "*

Figure: Porting CESM2 to the CGD Cluster Hobart

*" + ] + }, + { + "cell_type": "markdown", + "id": "f1ec0337-eadf-46e3-80b5-2085854b9742", + "metadata": {}, + "source": [ + "# Take-away Points\n", + "- On supported machines - no porting is necessary\n", + "- On new machines - porting needs to be done\n", + "- Documentation from CIME and CESM Website\n", + "- Thursday afternoon lecture on Porting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2de6735-4420-4b9d-bae1-3384a34de010", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/profile.ipynb b/_sources/notebooks/resources/profile.ipynb new file mode 100644 index 000000000..f3a27787e --- /dev/null +++ b/_sources/notebooks/resources/profile.ipynb @@ -0,0 +1,413 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b2cd974a-dfbb-4937-8ed0-ab87ab60f1ef", + "metadata": {}, + "source": [ + "# Tutorial specific instructions" + ] + }, + { + "cell_type": "markdown", + "id": "4a6f76fe-9658-443c-89a7-9ede364803e5", + "metadata": {}, + "source": [ + "### Tutorial Project Account\n", + "\n", + "
\n", + "You should have access to project account UESM0013 and use this for your simulations.\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "9db9d54e-ef78-44ef-a003-4ddd8a416317", + "metadata": {}, + "source": [ + "### Special Queues\n", + "\n", + "
\n", + "We have a special queue every day for running to ensure you get through the derecho queues quickly and get your jobs run. These are only active for portions of each day during our lab sessions and change for each session. So you should be sure you are using the correct reservation queue. \n", + " \n", + "Schedule for Tutorial Reservation Queues\n", + "```\n", + "Mon 14:00 - 17:00 derecho R???????\n", + "Tue 10:30 - 12:00 derecho R???????\n", + " 14:00 - 17:00 derecho R???????\n", + "Wed 10:30 - 12:00 derecho R???????\n", + " 14:00 - 17:00 derecho R???????\n", + "Thu 13:30 - 17:00 casper R???????\n", + "Fri 13:30 - 17:00 derecho R??????? \n", + "```\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e127deda-73f0-42fc-9c96-e49bb1bb0f8b", + "metadata": {}, + "source": [ + "### Using these tutorial-specific codes" + ] + }, + { + "cell_type": "markdown", + "id": "ec3ec832-823f-48ce-b142-05c69dcc72b1", + "metadata": {}, + "source": [ + "In theory, you _should_ be able to automatically use this account and the reservation queues if you correctly set up your NCAR HPC environment using your `.profile` or `.tcshrc` files, as described below. If you need to change the values for a run, you can change the account and reservation queue in your case directory using the following command:\n", + "\n", + "```\n", + "./xmlchange --force JOB_QUEUE=R???????\n", + "./xmlchange PROJECT=UESM0013\n", + "```\n", + "\n", + "For instance, on Wednesday\n", + "\n", + "- If (Wed 10:30 - 12:00) then\n", + "\n", + "```\n", + "./xmlchange JOB_QUEUE=R??????? --force\n", + "``` \n", + "\n", + "- If (Wed 14:00 - 17:00) then\n", + "\n", + "```\n", + "./xmlchange JOB_QUEUE=R??????? --force\n", + "```\n", + "\n", + "\n", + "- If (Wed at another time) then\n", + "```\n", + "./xmlchange JOB_QUEUE=tutorial\n", + "```\n", + "\n", + "If you do use these commands, make sure for the `JOB_QUEUE` you are using the **correct** reservation code for the relevant day _and_ time of that lab session. You should not have to set the `PROJECT` more than once during the tutorial if your profile is set up, as described below, but we include it for your reference in case you are having trouble." + ] + }, + { + "cell_type": "markdown", + "id": "0c07b51d-f999-4737-9739-3ea989f20802", + "metadata": {}, + "source": [ + "## Setting up your NCAR HPC environment" + ] + }, + { + "cell_type": "markdown", + "id": "9d6954eb-3505-4a58-b6fa-bea7047c63cf", + "metadata": {}, + "source": [ + "Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded." + ] + }, + { + "cell_type": "markdown", + "id": "7440f1b8-06af-435a-b1db-d444b99bf846", + "metadata": {}, + "source": [ + "
\n", + "NOTE: The next section describes how to use a file that loads the modules necessary for those attending the in-person tutorial. Once you set up your environment you should not have to do it again for the remainder of the tutorial. Every time you login to NCAR HPC these files will automatically be sourced. However, if you intend to use NCAR HPC after the tutorial you may need to modify your `.profile` or `.tcshrc` file to load the correct modules, project numbers, or queues. \n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8e6da3c0-4cbf-42e3-b599-9ef4d1b4a72c", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### SHELL environment " + ] + }, + { + "cell_type": "markdown", + "id": "c04124a8-5e76-4104-8d62-7bd0a329ce58", + "metadata": {}, + "source": [ + "To determine what shell environment you are using on the NCAR HPC, type the following command:" + ] + }, + { + "cell_type": "markdown", + "id": "9f8488f1-72e7-4594-be66-f875c51cc4e1", + "metadata": {}, + "source": [ + "
\n", + "\n", + "```\n", + "echo $SHELL\n", + "```\n", + "\n", + " \n", + "If the command returns, you are a bash user\n", + "```/bin/bash```\n", + "\n", + " \n", + "If the command returns, you are a cshell user\n", + "```/bin/tcsh```\n", + "\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "91a8addf-1e89-43b9-a364-1e1aa151454d", + "metadata": {}, + "source": [ + "**NOTE:** All new NCAR HPC accounts default to bash. " + ] + }, + { + "cell_type": "markdown", + "id": "8c4f6e24-577b-4736-a251-69b51553d704", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### Bash users" + ] + }, + { + "cell_type": "markdown", + "id": "a82c1d5f-eddc-4504-bd66-febd2f3179f8", + "metadata": {}, + "source": [ + "**NOTE:** You may already have a `.profile` file in your home directory. \n", + "- If you have an existing `.profile` file and do not wish to overwrite its contents, please save your original `.profile` file to a new filename before copying the tutorial .profile file into your home directory. \n", + "- Alternatively, you could copy the contents of the tutorial profile file into your existing `.profile` file using a text editor. (see special instructions below)" + ] + }, + { + "cell_type": "markdown", + "id": "870dc6c7-98f5-4e3a-b226-2f2437d5321a", + "metadata": {}, + "source": [ + "#### One-time setup\n", + "To set up your environment for the tutorial, follow the following three steps:" + ] + }, + { + "cell_type": "markdown", + "id": "9a2baee0-804e-4586-b8fc-a3636c528484", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Copy over the `.profile` file into your home directory: \n", + " \n", + "```\n", + "cp /glade/campaign/cesm/development/cross-wg/profile ~/.profile\n", + "```\n", + "
\n", + "\n", + "Source the file:\n", + "\n", + "```\n", + "source ~/.profile\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "bf95578e-40e5-4c40-8884-0b80e29eb858", + "metadata": {}, + "source": [ + "\n", + "#### Before each practical\n", + "Do the following step before **every practical**. This is because we are getting a different special queue every day. \n", + "\n", + "
\n", + "\n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.profile\n", + "```\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4daab2a7-58c1-41f0-b51b-c9e8a573574b", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### Tcsh users" + ] + }, + { + "cell_type": "markdown", + "id": "42432d90-eaef-4205-b4fe-39cf3c7b5881", + "metadata": {}, + "source": [ + "**NOTE:** You should already have a `.tcshrc` file in your home directory. If you do not wish to overwrite the existing `.tcshrc` file, please save this file to a new name OR copy the contents of the `/glade/campaign/cesm/development/cross-wg/tcshrc` file to your `.tcshrc` file using a text editor." + ] + }, + { + "cell_type": "markdown", + "id": "0722df3e-2497-492c-8301-7d54e7485c05", + "metadata": {}, + "source": [ + "#### One-time setup\n", + "\n", + "To set up your environment for the tutorial, follow the following three steps:" + ] + }, + { + "cell_type": "markdown", + "id": "a77636dd-1651-431a-a72e-f862947b37a6", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
\n", + "\n", + "Copy over the `.tcshrc` file to your home directory:\n", + "```\n", + "cp /glade/campaign/cesm/development/cross-wg/tcshrc ~/.tcshrc\n", + "```\n", + " \n", + "
\n", + "\n", + "Source the file:\n", + "\n", + "```\n", + "source ~/.tcshrc\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "637d5219-104b-4e53-ab41-b3969b275527", + "metadata": {}, + "source": [ + "\n", + "#### Before each practical\n", + "\n", + "Do the following step before **every practical**. This is because we are getting a different special queue every day. \n", + "\n", + "
\n", + " \n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.tcshrc\n", + "``` \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "5edccc8b-0080-4837-aa70-d50360cb2c6c", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### If you have any trouble\n", + "\n", + "**Please ask for help if you are having trouble with this step!**\n", + "\n", + "The modules necessary for this tutorial and loaded through these files are:\n", + "- ncarenv/1.3\n", + "- intel\n", + "- ncl\n", + "- nco\n", + "- ncview\n", + "- netcdf\n" + ] + }, + { + "cell_type": "markdown", + "id": "71cae660-0d1a-4193-8333-909310c49dac", + "metadata": {}, + "source": [ + "____\n", + "\n", + "### Special instructions (if you already had an account on derecho)\n", + "\n", + "If you already have a `.profile` or `.tcsh` and you do not wish to overwrite its contents, you need to add the following into your existing `.profile` or `.tcsh` using a text editor.\n", + "\n", + "#### Bash:\n", + "\n", + "
\n", + "\n", + "Add to your .profile: \n", + "\n", + "```\n", + "export PROJECT=UESM0013 #<- This should never change over the course of the tutorial\n", + "export TUTORIAL_QUEUE=R??????? #<- This will be different for every practical. \n", + " #<- Look at the schedule below:\n", + "```\n", + "\n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.profile\n", + "```\n", + "
\n", + "\n", + "#### C-shell:\n", + "\n", + "
\n", + "\n", + "Add to your .tcshrc: \n", + "```\n", + "setenv PROJECT UESM0013 #<-This should never change over the course of the tutorial\n", + "setenv TUTORIAL_QUEUE R??????? #<-This will be different for every practical \n", + " #<- Look at the schedule below:\n", + "```\n", + " \n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.tcshrc\n", + "``` \n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b77ea28-df80-4c20-a123-ec1e09a1475a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/resources_overview.ipynb b/_sources/notebooks/resources/resources_overview.ipynb new file mode 100644 index 000000000..f9ad4a385 --- /dev/null +++ b/_sources/notebooks/resources/resources_overview.ipynb @@ -0,0 +1,49 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Resources" + ] + }, + { + "cell_type": "markdown", + "id": "43fca83b-54e5-4950-a9b3-bbfbbcb01c77", + "metadata": {}, + "source": [ + "While there is no way for this tutorial to provide every bit of information or resources needed to successfully learn CESM, this section provides some resources that you may find particularly helpful." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6dc4950b-9954-4019-9c0b-46a3e3b0b3aa", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/terminals.ipynb b/_sources/notebooks/resources/terminals.ipynb new file mode 100644 index 000000000..ed38fc238 --- /dev/null +++ b/_sources/notebooks/resources/terminals.ipynb @@ -0,0 +1,204 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Terminal Windows" + ] + }, + { + "cell_type": "markdown", + "id": "93b754e9-2569-4779-890f-f3f069fd9faa", + "metadata": {}, + "source": [ + "For local or remote execution of a program, a terminal is a window in a graphical interface that is used to display a command line. In the UNIX environment, the terminal window is widely used by developers to perform myriad maintenance operations in local and remote computers. \n", + "\n", + "Most CESM users and developers use terminal windows to run the model. Users open a terminal window and access the NCAR HPC resources remotely. This way the user can be located anywhere and access the HPC assets located in Cheyenne, WY." + ] + }, + { + "cell_type": "markdown", + "id": "c3c5cecc-b0ef-4bd2-bb50-5f92efeb12c7", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Logging into NCAR HPC](https://ncar.github.io/CESM-Tutorial/notebooks/resources/ncar_hpc.html#logging-in-on-an-ncar-system)\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "75f18a09-8ff0-4944-b19f-a51d6473e645", + "metadata": {}, + "source": [ + "## Logging into a terminal from a Mac" + ] + }, + { + "cell_type": "markdown", + "id": "fa3a2300-0e3a-4b87-9456-0c741acb9e96", + "metadata": {}, + "source": [ + "Go to the search spotlight (magnifying glass icon) and type in \"terminal\". \n", + "\n", + "- `Terminal` is automatically built into the MacOS and clicking on it will open a terminal window.\n", + "\n", + "- `iTerm` is software that was installed by the user on their laptop and is another option for opening a terminal. (*Recommended*)" + ] + }, + { + "cell_type": "markdown", + "id": "d4ad6ecc-155e-40f8-965f-a223c119b85c", + "metadata": {}, + "source": [ + "![mac terminal](../../images/resources/term_mac.png)\n", + "\n", + "*

Figure: Finding terminal on a mac.

*" + ] + }, + { + "cell_type": "markdown", + "id": "6b6d2dbf-f7e1-40a1-a81a-a147189a133a", + "metadata": {}, + "source": [ + "## Logging into a terminal from a PC" + ] + }, + { + "cell_type": "markdown", + "id": "1a24b174-9a10-4863-91b2-7a0408cc9d03", + "metadata": {}, + "source": [ + "Go to the start menu and type in \"terminal\". \n", + "\n", + "- `Terminal` will open a terminal window.\n", + "\n", + "- `Command Prompt` will open a terminal window." + ] + }, + { + "cell_type": "markdown", + "id": "705e15f9-ae66-45a6-a9e3-c212cbc83ba1", + "metadata": {}, + "source": [ + "![pc terminal](../../images/resources/term_pc.png)\n", + "\n", + "*

Figure: Finding terminal on a PC.

*" + ] + }, + { + "cell_type": "markdown", + "id": "99e35425-03b2-40ed-a1ff-2d19655bbdad", + "metadata": {}, + "source": [ + "## Logging into a terminal from JupyterHub" + ] + }, + { + "cell_type": "markdown", + "id": "8db0641a-0960-4e2e-9596-cb97f37b84ca", + "metadata": {}, + "source": [ + "If you have a JupyterHub session open you can open a terminal window as well. \n", + "\n", + "- Click on the + symbol in the upper left for a New Launcher\n", + "- Click on the Terminal icon\n", + "\n", + "Note: some terminal functions (e.g. X11 forwarding) do not work in a terminal opened through JupyterHub." + ] + }, + { + "cell_type": "markdown", + "id": "750465fe-e05d-4d1c-b33c-2c82db333f67", + "metadata": {}, + "source": [ + "![JH terminal](../../images/resources/term_jupyter_1.png)\n", + "\n", + "*

Figure: Opening a terminal using JupyterHub.

*" + ] + }, + { + "cell_type": "markdown", + "id": "d80a918d-4cbc-47aa-b10c-a37f255e6f0f", + "metadata": {}, + "source": [ + "![JH terminal](../../images/resources/term_jupyter_2.png)\n", + "\n", + "*

Figure: Terminal interface in JupyterHub.

*" + ] + }, + { + "cell_type": "markdown", + "id": "9004d0e1-c472-4e9a-9115-0a77fd5d3ee4", + "metadata": {}, + "source": [ + "## Logging into a terminal via fastX" + ] + }, + { + "cell_type": "markdown", + "id": "ee17bae0-38d6-4556-94d0-5aada3603a77", + "metadata": {}, + "source": [ + "CISL has provided an option to log into casper via the fastX software. Detailed instructions are provided [here](https://arc.ucar.edu/knowledge_base/72581391)\n", + "\n", + "- Note that you will not be able to use the first option \"Using FastX via web browser\" as this requires being on the internal UCAR network or VPN. \n", + "\n", + "- If you are able to install the [FastX desktop client](https://arc.ucar.edu/knowledge_base/72581391#UsingFastXforremotedesktops-UsingtheFastXdesktopclient), we would recommend that option\n", + "\n", + "- Otherwise, you can create an [ssh tunnel via a terminal window and then start the browser client](https://arc.ucar.edu/knowledge_base/72581391#UsingFastXforremotedesktops-UsingFastXviawebbrowserandsshtunnel)\n" + ] + }, + { + "cell_type": "markdown", + "id": "da9e1c05-6abb-41ca-ac87-fb7e8b5f463c", + "metadata": {}, + "source": [ + "## Using PuTTY and Xmg" + ] + }, + { + "cell_type": "markdown", + "id": "6b212673-a637-4073-9be5-817d32696560", + "metadata": {}, + "source": [ + "For older Windows laptops, it may require the use of PuTTY and Xmg. These might be installed on your machine already, but if not you can download them. Here is a [nice guide](https://laptops.eng.uci.edu/engineering-software/using-linux/how-to-configure-putty-xming-on-your-laptop) from UC-Irvine.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c94441cd-66f7-4fe9-8ddf-2123048149b9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/text_editors.ipynb b/_sources/notebooks/resources/text_editors.ipynb new file mode 100644 index 000000000..b0e3e272e --- /dev/null +++ b/_sources/notebooks/resources/text_editors.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Text Editors " + ] + }, + { + "cell_type": "markdown", + "id": "d0122319-defa-49ca-a794-91cfc36fb332", + "metadata": {}, + "source": [ + "You will need to edit files directly through the command line when using UNIX. There are quite a few text editors available for UNIX. Below we provide some information about some of the favorite text editors from CESM developers. This list is not comprehensive, so if you have another editor you prefer you can use that." + ] + }, + { + "cell_type": "markdown", + "id": "947bea15-69c9-47e9-815c-f07d89327bab", + "metadata": {}, + "source": [ + "## Vi" + ] + }, + { + "cell_type": "markdown", + "id": "2692e830-0863-4bef-98f7-7796a3bece8e", + "metadata": {}, + "source": [ + "Vi is a text editor included with most UNIX systems, even embedded ones. It was designed to be simple yet powerful for text manipulation. It's a modal text editor, which means has both an insert and command mode. Vi doesn't provide a list of keyboard shortcuts on the screen. \n", + "\n", + "**NOTE:** `vi` **does not need to be loaded in your environment to be used.**" + ] + }, + { + "cell_type": "markdown", + "id": "244ecc7f-b49b-4fba-ad36-9e816701fbb9", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Vi documentation](http://linuxfocus.org/~guido/vi/)\n", + " \n", + "[Vi Introduction](https://www.howtogeek.com/102468/a-beginners-guide-to-editing-text-files-with-vi/)\n", + " \n", + "[Vi cheatsheet](https://www.atmos.albany.edu/daes/atmclasses/atm350/vi_cheat_sheet.pdf)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "da6fee1f-f259-4922-a667-bf903d3536dd", + "metadata": {}, + "source": [ + "## Vim" + ] + }, + { + "cell_type": "markdown", + "id": "9460aa4b-741d-4052-a6a7-82730d5837b7", + "metadata": {}, + "source": [ + "Vim (Vi IMproved) is a clone of Vi but offers more features than Vi. It's free and open source and can be used both at the command-line or in a graphical user interface (GUI).\n", + "\n", + "**NOTE:** `vim` **does not need to be loaded in your environment to be used.**" + ] + }, + { + "cell_type": "markdown", + "id": "bcd11fc0-e9e4-4534-b79c-3963b6b98f7f", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Vi documentation](https://www.vim.org/docs.php)\n", + " \n", + "[Vi cheatsheet](https://vim.rtorr.com/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "234894b0-4983-4d0e-aca1-30c466521c50", + "metadata": {}, + "source": [ + "## Nano" + ] + }, + { + "cell_type": "markdown", + "id": "5e62b82c-dbf8-4724-8e82-869f944f0ba4", + "metadata": {}, + "source": [ + "Nano is a text editor that uses a command line interface. It emulates the Pico text editor and in addition to basic text editing, nano has features such as an interactive search-and-replace, undo/redo, etc.\n", + "\n", + "**NOTE:** `nano` **must be loaded as a module in your HPC environment.** See section (LINK)." + ] + }, + { + "cell_type": "markdown", + "id": "cf16bd44-45f4-4bb4-927b-eafc24d9aeb1", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Nano documentation](https://www.nano-editor.org/docs.php)\n", + "\n", + "[Nano Introduction](https://www.howtogeek.com/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/)\n", + " \n", + "[Nano cheatsheet](https://www.nano-editor.org/dist/latest/cheatsheet.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "69a56d2b-7508-4df0-9dc1-33f1f0887127", + "metadata": {}, + "source": [ + "## Emacs" + ] + }, + { + "cell_type": "markdown", + "id": "342a8b59-a009-4974-9878-66e78c46effc", + "metadata": {}, + "source": [ + "Emacs is an extensible, customizable, and self-documenting editor. Emacs opens a GUI to your computer and requires X11 forwarding. Once open, it can be used similar to a normal document including scrolling.\n", + "\n", + "**NOTE:** `emacs` **does not need to be loaded in your environment to be used. While it will work from the terminal command line, it does not work in the Jupyter environment.**" + ] + }, + { + "cell_type": "markdown", + "id": "0761f906-a868-491e-a89d-4d4a6f6f7bcf", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[Emacs documentation](https://www.gnu.org/software/emacs/manual/html_node/emacs/index.html)\n", + "\n", + "[Emacs Introduction](https://www.gnu.org/software/emacs/tour/)\n", + " \n", + "[Emacs cheatsheet](https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf)\n", + "\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/tutorial_one_time_setup.ipynb b/_sources/notebooks/resources/tutorial_one_time_setup.ipynb new file mode 100644 index 000000000..64f5eeae3 --- /dev/null +++ b/_sources/notebooks/resources/tutorial_one_time_setup.ipynb @@ -0,0 +1,301 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b2cd974a-dfbb-4937-8ed0-ab87ab60f1ef", + "metadata": {}, + "source": [ + "# Tutorial one time setup" + ] + }, + { + "cell_type": "markdown", + "id": "0c07b51d-f999-4737-9739-3ea989f20802", + "metadata": {}, + "source": [ + "## Setting up your NCAR HPC environment" + ] + }, + { + "cell_type": "markdown", + "id": "9d6954eb-3505-4a58-b6fa-bea7047c63cf", + "metadata": {}, + "source": [ + "Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded." + ] + }, + { + "cell_type": "markdown", + "id": "7440f1b8-06af-435a-b1db-d444b99bf846", + "metadata": {}, + "source": [ + "
\n", + "NOTE: The next section describes how to use a file that loads the modules necessary for those attending the in-person tutorial. Once you set up your environment you should not have to do it again for the remainder of the tutorial. Every time you login to NCAR HPC these files will automatically be sourced. However, if you intend to use NCAR HPC after the tutorial you may need to modify your `.profile` or `.tcshrc` file to load the correct modules, project numbers, or queues. \n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8e6da3c0-4cbf-42e3-b599-9ef4d1b4a72c", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### SHELL environment " + ] + }, + { + "cell_type": "markdown", + "id": "c04124a8-5e76-4104-8d62-7bd0a329ce58", + "metadata": {}, + "source": [ + "To determine what shell environment you are using on the NCAR HPC, type the following command:" + ] + }, + { + "cell_type": "markdown", + "id": "9f8488f1-72e7-4594-be66-f875c51cc4e1", + "metadata": {}, + "source": [ + "
\n", + "\n", + "```\n", + "echo $SHELL\n", + "```\n", + "\n", + " \n", + "If the command returns, you are a bash user\n", + "```/bin/bash```\n", + "\n", + " \n", + "If the command returns, you are a cshell user\n", + "```/bin/tcsh```\n", + "\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "91a8addf-1e89-43b9-a364-1e1aa151454d", + "metadata": {}, + "source": [ + "**NOTE:** All new NCAR HPC accounts default to bash. " + ] + }, + { + "cell_type": "markdown", + "id": "8c4f6e24-577b-4736-a251-69b51553d704", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### Bash users" + ] + }, + { + "cell_type": "markdown", + "id": "a82c1d5f-eddc-4504-bd66-febd2f3179f8", + "metadata": {}, + "source": [ + "**NOTE:** You may already have a `.profile` file in your home directory. \n", + "- If you have an existing `.profile` file and do not wish to overwrite its contents, please save your original `.profile` file to a new filename before copying the tutorial .profile file into your home directory. \n", + "- Alternatively, you could copy the contents of the tutorial profile file into your existing `.profile` file using a text editor. (see special instructions below)" + ] + }, + { + "cell_type": "markdown", + "id": "870dc6c7-98f5-4e3a-b226-2f2437d5321a", + "metadata": {}, + "source": [ + "#### One-time setup\n", + "To set up your environment for the tutorial, follow the following three steps:" + ] + }, + { + "cell_type": "markdown", + "id": "9a2baee0-804e-4586-b8fc-a3636c528484", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Copy over the `.profile` file into your home directory: \n", + " \n", + "```\n", + "cp /glade/campaign/cesm/tutorial/tutorial_2024_env/profile ~/.profile\n", + "```\n", + "
\n", + "\n", + "Source the file:\n", + "\n", + "```\n", + "source ~/.profile\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "bf95578e-40e5-4c40-8884-0b80e29eb858", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "4daab2a7-58c1-41f0-b51b-c9e8a573574b", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### Tcsh users" + ] + }, + { + "cell_type": "markdown", + "id": "42432d90-eaef-4205-b4fe-39cf3c7b5881", + "metadata": {}, + "source": [ + "**NOTE:** You should already have a `.tcshrc` file in your home directory. If you do not wish to overwrite the existing `.tcshrc` file, please save this file to a new name OR copy the contents of the `/glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc` file to your `.tcshrc` file using a text editor." + ] + }, + { + "cell_type": "markdown", + "id": "0722df3e-2497-492c-8301-7d54e7485c05", + "metadata": {}, + "source": [ + "#### One-time setup\n", + "\n", + "To set up your environment for the tutorial, follow the following three steps:" + ] + }, + { + "cell_type": "markdown", + "id": "a77636dd-1651-431a-a72e-f862947b37a6", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
\n", + "\n", + "Copy over the `.tcshrc` file to your home directory:\n", + "```\n", + "cp /glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc ~/.tcshrc\n", + "```\n", + " \n", + "
\n", + "\n", + "Source the file:\n", + "\n", + "```\n", + "source ~/.tcshrc\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "637d5219-104b-4e53-ab41-b3969b275527", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "5edccc8b-0080-4837-aa70-d50360cb2c6c", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### If you have any trouble\n", + "\n", + "**Please ask for help if you are having trouble with this step!**\n", + "\n", + "The modules necessary for this tutorial and loaded through these files are:\n", + "- ncarenv\n", + "- intel\n", + "- ncl\n", + "- nco\n", + "- ncview\n", + "- netcdf\n" + ] + }, + { + "cell_type": "markdown", + "id": "71cae660-0d1a-4193-8333-909310c49dac", + "metadata": {}, + "source": [ + "____\n", + "\n", + "### Special instructions (if you already had an account on derecho)\n", + "\n", + "If you already have a `.profile` or `.tcsh` and you do not wish to overwrite its contents, you need to add the following into your existing `.profile` or `.tcsh` using a text editor.\n", + "\n", + "#### Bash:\n", + "\n", + "
\n", + "\n", + "Add to your .profile: \n", + "\n", + "```\n", + "export PROJECT=UESM0013 #<- This should never change over the course of the tutorial\n", + "```\n", + "\n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.profile\n", + "```\n", + "
\n", + "\n", + "#### C-shell:\n", + "\n", + "
\n", + "\n", + "Add to your .tcshrc: \n", + "```\n", + "setenv PROJECT UESM0013 #<-This should never change over the course of the tutorial\n", + "```\n", + " \n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.tcshrc\n", + "``` \n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b77ea28-df80-4c20-a123-ec1e09a1475a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/tutorial_queue_account.ipynb b/_sources/notebooks/resources/tutorial_queue_account.ipynb new file mode 100644 index 000000000..60cf1a3f6 --- /dev/null +++ b/_sources/notebooks/resources/tutorial_queue_account.ipynb @@ -0,0 +1,118 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b2cd974a-dfbb-4937-8ed0-ab87ab60f1ef", + "metadata": {}, + "source": [ + "# Tutorial queue and account" + ] + }, + { + "cell_type": "markdown", + "id": "4a6f76fe-9658-443c-89a7-9ede364803e5", + "metadata": {}, + "source": [ + "### Tutorial Project Account\n", + "\n", + "
\n", + "You should have access to project account UESM0013 and use this for your simulations.\n", + "
\n", + "\n", + "You can change the account in your case directory using the following command:\n", + "```\n", + "./xmlchange PROJECT=UESM0013\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "9db9d54e-ef78-44ef-a003-4ddd8a416317", + "metadata": {}, + "source": [ + "### Special Queues\n", + "\n", + "
\n", + "\n", + "Schedule for Tutorial Reservation Queues\n", + " \n", + "- We have a special queue tutorial during the lab sessions to ensure you get through the derecho queues quickly and get your jobs run. This queue are only active during our lab sessions. \n", + "\n", + "- Outside the lab sessions, you should use the queue main to run cesm.\n", + " \n", + "
\n", + "\n", + "If you need to change the value for a run, you can change the reservation queue in your case directory using the following command:\n", + "\n", + "During the lab sessions:\n", + "```\n", + "./xmlchange JOB_QUEUE=tutorial --force\n", + "```\n", + "\n", + "Outside the lab sessions:\n", + "```\n", + "./xmlchange JOB_QUEUE=main --force\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "d312e6e0-f48b-4f86-a97b-96c255d35d26", + "metadata": {}, + "source": [ + "### Compiling in the Special Queue" + ] + }, + { + "cell_type": "markdown", + "id": "6ddf7177-0dd6-4ce3-be1e-ee70e5be9419", + "metadata": {}, + "source": [ + "By default, we compile cesm on a shared node called `develop`. However, as we want to avoid long wait time during the labs, we will compile in the specialed reservation queue `tutorial`. \n", + "\n", + "During the lab sessions, use\n", + "\n", + "```\n", + "qcmd -q tutorial -- ./case.build \n", + "```\n", + "\n", + "\n", + "Outside the lab sessions, use\n", + "\n", + "```\n", + "qcmd -- ./case.build \n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b77ea28-df80-4c20-a123-ec1e09a1475a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/tutorial_specific.ipynb b/_sources/notebooks/resources/tutorial_specific.ipynb new file mode 100644 index 000000000..4b253a912 --- /dev/null +++ b/_sources/notebooks/resources/tutorial_specific.ipynb @@ -0,0 +1,368 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b2cd974a-dfbb-4937-8ed0-ab87ab60f1ef", + "metadata": {}, + "source": [ + "# Tutorial specific instructions" + ] + }, + { + "cell_type": "markdown", + "id": "4a6f76fe-9658-443c-89a7-9ede364803e5", + "metadata": {}, + "source": [ + "### Tutorial Project Account\n", + "\n", + "
\n", + "You should have access to project account UESM0013 and use this for your simulations.\n", + "
\n", + "\n", + "You can change the account in your case directory using the following command:\n", + "```\n", + "./xmlchange PROJECT=UESM0013\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "9db9d54e-ef78-44ef-a003-4ddd8a416317", + "metadata": {}, + "source": [ + "### Special Queues\n", + "\n", + "
\n", + "\n", + "Schedule for Tutorial Reservation Queues\n", + " \n", + "- We have a special queue tutorial during the lab sessions to ensure you get through the derecho queues quickly and get your jobs run. This queue are only active during our lab sessions. \n", + "\n", + "- Outside the lab sessions, you should use the queue cpu\n", + " \n", + "
\n", + "\n", + "If you need to change the value for a run, you can change the reservation queue in your case directory using the following command:\n", + "\n", + "During the lab sessions:\n", + "```\n", + "./xmlchange JOB_QUEUE=tutorial --force\n", + "```\n", + "\n", + "Outside the lab sessions:\n", + "```\n", + "./xmlchange JOB_QUEUE=cpu --force\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "e127deda-73f0-42fc-9c96-e49bb1bb0f8b", + "metadata": {}, + "source": [ + "### Using these tutorial-specific codes" + ] + }, + { + "cell_type": "markdown", + "id": "ec3ec832-823f-48ce-b142-05c69dcc72b1", + "metadata": {}, + "source": [ + "In theory, you _should_ be able to automatically use this account and the reservation queues if you correctly set up your NCAR HPC environment using your `.profile` or `.tcshrc` files, as described below. If you need to change the values for a run, you can change the account and reservation queue in your case directory using the following command:\n", + "\n", + "If you do use these commands, make sure for the `JOB_QUEUE` you are using the **correct** reservation code for the relevant day _and_ time of that lab session. You should not have to set the `PROJECT` more than once during the tutorial if your profile is set up, as described below, but we include it for your reference in case you are having trouble." + ] + }, + { + "cell_type": "markdown", + "id": "0c07b51d-f999-4737-9739-3ea989f20802", + "metadata": {}, + "source": [ + "## Setting up your NCAR HPC environment" + ] + }, + { + "cell_type": "markdown", + "id": "9d6954eb-3505-4a58-b6fa-bea7047c63cf", + "metadata": {}, + "source": [ + "Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded." + ] + }, + { + "cell_type": "markdown", + "id": "7440f1b8-06af-435a-b1db-d444b99bf846", + "metadata": {}, + "source": [ + "
\n", + "NOTE: The next section describes how to use a file that loads the modules necessary for those attending the in-person tutorial. Once you set up your environment you should not have to do it again for the remainder of the tutorial. Every time you login to NCAR HPC these files will automatically be sourced. However, if you intend to use NCAR HPC after the tutorial you may need to modify your `.profile` or `.tcshrc` file to load the correct modules, project numbers, or queues. \n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8e6da3c0-4cbf-42e3-b599-9ef4d1b4a72c", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### SHELL environment " + ] + }, + { + "cell_type": "markdown", + "id": "c04124a8-5e76-4104-8d62-7bd0a329ce58", + "metadata": {}, + "source": [ + "To determine what shell environment you are using on the NCAR HPC, type the following command:" + ] + }, + { + "cell_type": "markdown", + "id": "9f8488f1-72e7-4594-be66-f875c51cc4e1", + "metadata": {}, + "source": [ + "
\n", + "\n", + "```\n", + "echo $SHELL\n", + "```\n", + "\n", + " \n", + "If the command returns, you are a bash user\n", + "```/bin/bash```\n", + "\n", + " \n", + "If the command returns, you are a cshell user\n", + "```/bin/tcsh```\n", + "\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "91a8addf-1e89-43b9-a364-1e1aa151454d", + "metadata": {}, + "source": [ + "**NOTE:** All new NCAR HPC accounts default to bash. " + ] + }, + { + "cell_type": "markdown", + "id": "8c4f6e24-577b-4736-a251-69b51553d704", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### Bash users" + ] + }, + { + "cell_type": "markdown", + "id": "a82c1d5f-eddc-4504-bd66-febd2f3179f8", + "metadata": {}, + "source": [ + "**NOTE:** You may already have a `.profile` file in your home directory. \n", + "- If you have an existing `.profile` file and do not wish to overwrite its contents, please save your original `.profile` file to a new filename before copying the tutorial .profile file into your home directory. \n", + "- Alternatively, you could copy the contents of the tutorial profile file into your existing `.profile` file using a text editor. (see special instructions below)" + ] + }, + { + "cell_type": "markdown", + "id": "870dc6c7-98f5-4e3a-b226-2f2437d5321a", + "metadata": {}, + "source": [ + "#### One-time setup\n", + "To set up your environment for the tutorial, follow the following three steps:" + ] + }, + { + "cell_type": "markdown", + "id": "9a2baee0-804e-4586-b8fc-a3636c528484", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Copy over the `.profile` file into your home directory: \n", + " \n", + "```\n", + "cp /glade/campaign/cesm/tutorial/tutorial_2024_env/profile ~/.profile\n", + "```\n", + "
\n", + "\n", + "Source the file:\n", + "\n", + "```\n", + "source ~/.profile\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "bf95578e-40e5-4c40-8884-0b80e29eb858", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "4daab2a7-58c1-41f0-b51b-c9e8a573574b", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### Tcsh users" + ] + }, + { + "cell_type": "markdown", + "id": "42432d90-eaef-4205-b4fe-39cf3c7b5881", + "metadata": {}, + "source": [ + "**NOTE:** You should already have a `.tcshrc` file in your home directory. If you do not wish to overwrite the existing `.tcshrc` file, please save this file to a new name OR copy the contents of the `/glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc` file to your `.tcshrc` file using a text editor." + ] + }, + { + "cell_type": "markdown", + "id": "0722df3e-2497-492c-8301-7d54e7485c05", + "metadata": {}, + "source": [ + "#### One-time setup\n", + "\n", + "To set up your environment for the tutorial, follow the following three steps:" + ] + }, + { + "cell_type": "markdown", + "id": "a77636dd-1651-431a-a72e-f862947b37a6", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
\n", + "\n", + "Copy over the `.tcshrc` file to your home directory:\n", + "```\n", + "cp /glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc ~/.tcshrc\n", + "```\n", + " \n", + "
\n", + "\n", + "Source the file:\n", + "\n", + "```\n", + "source ~/.tcshrc\n", + "```\n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "637d5219-104b-4e53-ab41-b3969b275527", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "5edccc8b-0080-4837-aa70-d50360cb2c6c", + "metadata": {}, + "source": [ + "___\n", + "\n", + "### If you have any trouble\n", + "\n", + "**Please ask for help if you are having trouble with this step!**\n", + "\n", + "The modules necessary for this tutorial and loaded through these files are:\n", + "- ncarenv/1.3\n", + "- intel\n", + "- ncl\n", + "- nco\n", + "- ncview\n", + "- netcdf\n" + ] + }, + { + "cell_type": "markdown", + "id": "71cae660-0d1a-4193-8333-909310c49dac", + "metadata": {}, + "source": [ + "____\n", + "\n", + "### Special instructions (if you already had an account on derecho)\n", + "\n", + "If you already have a `.profile` or `.tcsh` and you do not wish to overwrite its contents, you need to add the following into your existing `.profile` or `.tcsh` using a text editor.\n", + "\n", + "#### Bash:\n", + "\n", + "
\n", + "\n", + "Add to your .profile: \n", + "\n", + "```\n", + "export PROJECT=UESM0013 #<- This should never change over the course of the tutorial\n", + "export TUTORIAL_QUEUE=tutorial #<- Special queue for the tutorial\n", + "```\n", + "\n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.profile\n", + "```\n", + "
\n", + "\n", + "#### C-shell:\n", + "\n", + "
\n", + "\n", + "Add to your .tcshrc: \n", + "```\n", + "setenv PROJECT UESM0013 #<-This should never change over the course of the tutorial\n", + "setenv TUTORIAL_QUEUE tutorial #<- Special queue for the tutorial\n", + "```\n", + " \n", + "Source the file:
\n", + "\n", + "```\n", + "source ~/.tcshrc\n", + "``` \n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b77ea28-df80-4c20-a123-ec1e09a1475a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/unix-cheatsheet.ipynb b/_sources/notebooks/resources/unix-cheatsheet.ipynb new file mode 100644 index 000000000..0ddd8e275 --- /dev/null +++ b/_sources/notebooks/resources/unix-cheatsheet.ipynb @@ -0,0 +1,114 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# UNIX cheatsheet\n", + "\n", + "This Unix commands cheat sheet summarizes a few basic commands you will need during the tutorial." + ] + }, + { + "cell_type": "markdown", + "id": "76bc874f-270c-4a05-8fe9-eac874cb0db7", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "805c8473-8106-4ba6-9d8e-c27cee7fcd7d", + "metadata": {}, + "source": [ + "You can also find a lot of resources online. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96f010ce-2005-4a69-9081-7ced219e66ea", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/resources/unix.ipynb b/_sources/notebooks/resources/unix.ipynb new file mode 100644 index 000000000..195769a04 --- /dev/null +++ b/_sources/notebooks/resources/unix.ipynb @@ -0,0 +1,95 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# UNIX" + ] + }, + { + "cell_type": "markdown", + "id": "011c91f1-75f0-496e-a329-45ed70297e86", + "metadata": {}, + "source": [ + "Most CESM users and developers use the UNIX environment to set up CESM experiments and do preliminary analysis of their CESM model output data. We strongly suggest those using CESM become familiar with working in a command line environment." + ] + }, + { + "cell_type": "markdown", + "id": "31e68033-a4f3-4866-8048-f2f57900f98b", + "metadata": {}, + "source": [ + "## Some Unix Basics\n", + "\n", + "The module listed below, from The COMET Program, will help those unfamiliar with UNIX. You can learn about the basics of UNIX file structures, how to navigate in a UNIX environment, and you'll get to practice creating, storing and searching for files.\n", + "\n", + "The expected length is 15-30 minutes for users with some UNIX experience, and 30-60 minutes for novices.\n" + ] + }, + { + "cell_type": "markdown", + "id": "b343574d-dae5-4653-87fd-db6d0748b338", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[UNIX module from COMET](https://www.meted.ucar.edu/ucar/unix/)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "ef5eda98-33cc-460d-be37-fc080c09a1a2", + "metadata": {}, + "source": [ + "## Unix cheatsheet\n", + "\n", + "This Unix commands cheat sheet summarizes a few basic commands you will need during the tutorial." + ] + }, + { + "cell_type": "markdown", + "id": "399759d6-00b3-41f2-b483-541b84032ce3", + "metadata": {}, + "source": [ + "
\n", + "\n", + "[UNIX cheatsheet](https://ncar.github.io/CESM-Tutorial/notebooks/resources/unix-cheatsheet.html)\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66239ceb-8b7c-4d1b-9d6d-56a8c2ace41c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/sourcemods/add_fields_cam.ipynb b/_sources/notebooks/sourcemods/add_fields_cam.ipynb new file mode 100644 index 000000000..f1b3eb835 --- /dev/null +++ b/_sources/notebooks/sourcemods/add_fields_cam.ipynb @@ -0,0 +1,123 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Source Modification Example\n", + "\n", + "A common source code modification that you may want to do is to output a **new variable** that is not defined in CESM. \n", + "\n", + "As an example, we will add a new variable to CAM: the atmopsheric **temperature at 750hPa**.\n", + "\n", + "## Adding a variable to CAM\n", + "CAM has a history field that corresponds to the **temperature at 500hPa** and a number of other pressure levels, but not at **750hPa**. Suppose you wanted to output the **temperature at 750hPa**. The following two\n", + "calls are required to add an output variable:\n", + "```\n", + "call addfld(’T750’,...) (Add a field to the master field list)\n", + "call outfld(’T750’,...) (Collect values for this field and write to history file)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "08800317-afcb-42b5-a181-38003b2323aa", + "metadata": {}, + "source": [ + "Each of these are now described in more detail:\n", + "\n", + "## ``addfld``\n", + "The sub-routine ``addfld`` adds a field to the master list with the following syntax:\n", + "```\n", + "addfld(fname,type,avgflag,units,long name)\n", + "```\n", + "where\n", + "\n", + "- **``fname``** = field name\n", + "- **``type``** = the type of field. The entry for a single level field would be “horiz only” and the entry\n", + "for a 3D field would be “(/ ’lev’ /)”.\n", + "- **``avgflag``** = Averaging flag, A = average, I=instantaneous\n", + "- **``units``** = the units of the field\n", + "- **``long name``** = Field full name\n", + "\n", + "Appropriate values of these parameters for the output of T750 are:\n", + "\n", + "```\n", + "call addfld(’T750’,horiz only, ’A’, ’K’, ’Temperature at 750hPa pressure surface’)\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "5fe6a0f0-e750-4d0c-bd8a-4966286a4764", + "metadata": {}, + "source": [ + "\n", + "## ``outfld``\n", + "The subroutine ``outfld`` accumulates (or takes the minimum or maximum of, as appropriate) the field into the history buffer for the appropriate history tape with the following syntax\n", + "```\n", + " outfld(fname, field, idim, c)\n", + "```\n", + "\n", + "with\n", + "- **``fname``** = Field name\n", + "- **``field``** = array containing field values\n", + "- **``idim``** = longitude dimension of field array\n", + "- **``c``** = chunk (physics) or latitude (dynamics) index.\n", + "\n", + "For example:\n", + "\n", + "```\n", + " call outfld(’T750’,t750, pcols, lchnk)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "c1978926-c9f9-4405-8574-12d39e3f8ed8", + "metadata": {}, + "source": [ + "\n", + "## ``add_default`` \n", + "Another useful subroutine is the subroutine ``add_default``. The subroutine ``add_default`` Add a field to the list of default fields on history file with the following syntax\n", + "```\n", + " subroutine add_default (fname, tindex, flag)\n", + "```\n", + "where\n", + "- **``fname``** = Field name\n", + "- **``tindex``** = history tape index\n", + "- **``flag``** = Averaging flag: A = average (default). I = instantaneous\n", + "\n", + "\n", + "For example:\n", + "\n", + "```\n", + " call add_default ('T500', 1, ' ')\n", + "```" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/sourcemods/exercises/exercise_add_field.ipynb b/_sources/notebooks/sourcemods/exercises/exercise_add_field.ipynb new file mode 100644 index 000000000..ec6efb5bf --- /dev/null +++ b/_sources/notebooks/sourcemods/exercises/exercise_add_field.ipynb @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Add output variable in CAM" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Add an additional output variable

\n", + " \n", + "Create a case called `b1850_T750` using the compset `B1850` at `f19_g17` resolution. \n", + "- Add an output field for the temperature at 750 mbar. \n", + "- Output daily values of `T750` and `T500` in the `h1` history file. \n", + "- Set the namelist to output a single `h1` for the run. \n", + "- Make a 1-month run. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e4e74779-4778-446a-be7e-50e0c1ee125e", + "metadata": {}, + "source": [ + "
\n", + "
\n", + " \n", + " Click here for hints\n", + " \n", + " \n", + "**Tip to add `T750`**
\n", + "- Use `T500` as a template for your changes.\n", + "\n", + "- Find the subroutine containing `T500`. \n", + "For instance, in the CESMROOT, use the command: \n", + "\n", + "```\n", + " grep –r T500 * \n", + "```\n", + " \n", + " \n", + "**Tip to check your solution `T750`**
\n", + "- When the run is completed, go to your archive directory:\n", + "- check the fields `T750` and `T500` are in the file `h1`\n", + "- create a file with the difference between `T750-T500`\n", + "- For instance, you can use ``ncap2`` \n", + "```\n", + " ncap2 -s ’T750_minus_T500=T750-T500' b1850_T750.cam.h1.0001-01-01-00000.nc T750-T500.nc\n", + "```\n", + "- Look at the difference with ``ncview``. \n", + "```\n", + " ncview T750-T500.nc\n", + "```\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "fbfacd19-3e46-4ef4-9111-7bb1b4669b2f", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "**# Create a new case**\n", + " \n", + "Create a new case `b1850_T750` with the command:\n", + "```\n", + " cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + "./create_newcase --case ~/cases/b1850_T750 --compset B1850 --res f19_g17 \n", + "```\n", + "\n", + "**# Setup**\n", + "\n", + "Invoke case.setup with the command:\n", + "``` \n", + "cd ~/cases/b1850_T750\n", + "./case.setup\n", + "```\n", + "\n", + "**# Make Source Modifications** \n", + "Use `T500` as a template for your changes. For that purpose, locate the file where `T500` is computed and copy it into\n", + " `SourceMods/src.atm`:\n", + " \n", + "``` \n", + "cp /glade/u/home/$USER/code/my_cesm_code/components/cam/src/physics/cam/cam_diagnostics.F90 SourceMods/src.cam\n", + "```\n", + "\n", + "Now, let's use `T500` as a template for your changes and add the relevant lines for `T750`: edit the file `SourceMods/src.cam/cam_diagnostics.F90` to add the following.\n", + " \n", + "**First change**\n", + " \n", + "Under the lines: \n", + "```\n", + "!++ add a variable for T500 \n", + "call addfld ('T500', horiz_only, 'A', 'K','Temperature at 500 mbar pressure surface') \n", + "```\n", + "add the lines:\n", + "\n", + "```\n", + "!++ add a variable for T750 \n", + "call addfld ('T750', horiz_only, 'A', 'K','Temperature at 750 mbar pressure surface') \n", + "```\n", + " \n", + "**Second change**\n", + "Under the lines: \n", + "```\n", + "!++ add a variable for T500 \n", + "if (hist_fld_active('T500')) then \n", + " call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, state%t, p_surf, & \n", + " extrapolate='T', ps=state%ps, phis=state%phis)\n", + " call outfld('T500 ', p_surf, pcols, lchnk )\n", + "end if\n", + "```\n", + "add the lines:\n", + " \n", + "``` \n", + "!++ add a variable for T750 \n", + "if (hist_fld_active('T750')) then \n", + " call vertinterp(ncol, pcols, pver, state%pmid, 75000._r8, state%t, p_surf, & \n", + " extrapolate='T', ps=state%ps, phis=state%phis)\n", + " call outfld('T750 ', p_surf, pcols, lchnk )\n", + "end if\n", + "```\n", + "\n", + "**# Customize namelists**\n", + "Edit the file `user_nl_cam` and add the lines:\n", + "```\n", + " nhtfrq = 0, -24\n", + " mfilt = 1, 31\n", + " fincl2 = 'T750', 'T500'\n", + "```\n", + " \n", + " \n", + "**# Set run length**\n", + "\n", + "Set the **run length** to 1 month:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nmonths\n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change `job queue` and `account number`.
\n", + "For instance, to run in the queue `tutorial` and the project number `UESM0013`, use the command:\n", + "\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "**# Build and submit**\n", + " \n", + "Build the model and submit your job:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "____\n", + " \n", + "**# Look at your solution**\n", + " \n", + "When the run is completed, check the fields `T750` and `T500` are in the file `h1`:\n", + "``` \n", + "cd /glade/derecho/scratch/$USER/archive/b1850_T750/atm/hist/ \n", + "ncdump -h b1850_T750.cam.h1.0001-01-01-00000.nc\n", + "```\n", + " \n", + "The file should contain:\n", + "```\n", + "float T500(time, lat, lon) ;\n", + " T500:units = \"K\" ;\n", + " T500:long_name = \"Temperature at 500 mbar pressure surface\" ;\n", + " T500:cell_methods = \"time: mean\" ;\n", + "float T750(time, lat, lon) ;\n", + " T750:units = \"K\" ;\n", + " T750:long_name = \"Temperature at 750 mbar pressure surface\" ;\n", + " T750:cell_methods = \"time: mean\" ;\n", + "```\n", + "If you don't see these variables, check you correctly set the `user_nl_cam`.\n", + " \n", + "Create a file with the difference between `T750-T500`:\n", + "``` \n", + "cd /glade/derecho/scratch/$USER/archive/b1850_T750/atm/hist/ \n", + "ncap2 -s 'T750_minus_T500=T750-T500' b1850_T750.cam.h1.0001-01-01-00000.nc T750-T500.nc \n", + "```\n", + "\n", + "Look at the difference between `T750-T500` with `ncview`: \n", + "```\n", + "cd /glade/derecho/scratch/$USER/archive/b1850_T750/atm/hist/ \n", + "ncview T750-T500.nc\n", + "```\n", + " \n", + "The field `T750-T500` looks like:\n", + "\n", + "*

\n", + " ![ncview T750-T500](../../../images/sourcemods/ncview_T750-T500.png) \n", + " Figure: Overview of the CESM directories and the SourceMods directories.

*\n", + " \n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99077aae-e99c-479f-b7a9-b1af1fd4e62f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/sourcemods/exercises/exercise_rain_threshold.ipynb b/_sources/notebooks/sourcemods/exercises/exercise_rain_threshold.ipynb new file mode 100644 index 000000000..52b1b9132 --- /dev/null +++ b/_sources/notebooks/sourcemods/exercises/exercise_rain_threshold.ipynb @@ -0,0 +1,153 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "be068a4c-5d8d-442f-aa26-65712f572c65", + "metadata": {}, + "source": [ + "# Modify the `rain_threshold` in CLM\n", + "\n", + "In the below exercise, we will change the rain threshold for stress deciduous vegetation, which includes C3 grasses. The rain threshold is the amount of rain required to initiate leaf onset. Reaching the rain threshold is one of several requirements for stress deciduous vegetation leaf onset. If you are interested, you can find more information about the stress deciduous phenology representation in the CLM Technical Note.\n", + "\n", + "The current value of rain_threshold is 20mm as specified in the code:\n", + "\n", + "```\n", + "rain_threshold = 20._r8 \n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "571a03a6-51cb-425a-b9c2-d674b097f5b8", + "metadata": {}, + "source": [ + "\n", + "\n", + "
\n", + "Exercise: Modify the CLM rain_threshold parameter

\n", + " \n", + "Create a case called `b1850_rain_threshold` using the compset `B1850` at `f19_g17` resolution. \n", + "- Change the rain_threshold from 20mm to 1mm. \n", + "- Make a 1-month run. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e4e74779-4778-446a-be7e-50e0c1ee125e", + "metadata": {}, + "source": [ + "
\n", + "
\n", + " \n", + " Click here for hints\n", + " \n", + " \n", + "**Tip to locate the 'rain_threshold' parameter**
\n", + "\n", + "- Find the subroutine containing `rain_threshold`. \n", + "For instance, in the CESMROOT, use the command: \n", + "\n", + "```\n", + " grep –r rain_threshold * \n", + "```\n", + " \n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "fbfacd19-3e46-4ef4-9111-7bb1b4669b2f", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "Create a new case `b1850_rain_threshold` with the command:\n", + "```\n", + "cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts\n", + "./create_newcase --case ~/cases/b1850_rain_threshold --compset B1850 --res f19_g17 \n", + "```\n", + "\n", + "Case `setup`:\n", + "``` \n", + "cd ~/cases/b1850_rain_threshold\n", + "./case.setup\n", + "```\n", + "\n", + " \n", + "Locate the file where `rain_threshold` is defined and copy it into\n", + " `SourceMods/src.lnd`:\n", + "``` \n", + "cp /glade/u/home/$USER/code/my_cesm_code/components/clm/src/biogeochem/CNPhenologyMod.F90 SourceMods/src.clm\n", + "```\n", + " \n", + "Edit the file `SourceMods/src.clm/CNPhenologyMod.F90 ` and add the lines:\n", + "```\n", + " ! specify rain threshold for leaf onset \n", + " rain_threshold = 20._r8\n", + "```\n", + "to \n", + "```\n", + " ! specify rain threshold for leaf onset \n", + " rain_threshold = 1._r8\n", + "```\n", + " \n", + " \n", + "Change the `run length`:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nmonths\n", + "```\n", + "\n", + "If needed, change `job queue` and `account number` \n", + "For instance:\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "Build and submit:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + " \n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "831a1859-4cd1-48aa-b1d2-616216d2f9cb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/sourcemods/exercises_overview.ipynb b/_sources/notebooks/sourcemods/exercises_overview.ipynb new file mode 100644 index 000000000..5b5709e9e --- /dev/null +++ b/_sources/notebooks/sourcemods/exercises_overview.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Exercise Overview \n", + "\n", + "## Learning Goals\n", + "\n", + "- Student will practice how to make a code modification in CESM. \n", + "\n", + "\n", + "## Exercise overview:\n", + "\n", + "Do at least one exercise:\n", + "- Add a new variable in CAM\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/sourcemods/overview.ipynb b/_sources/notebooks/sourcemods/overview.ipynb new file mode 100644 index 000000000..c1ac414b4 --- /dev/null +++ b/_sources/notebooks/sourcemods/overview.ipynb @@ -0,0 +1,73 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Overview\n", + "\n", + "If you want to make modifications to the CESM code, the best practice is to copy the relevant sub-routine into the relevant sub-directory within the `SourceMods` directory in your case directory. \n", + "\n", + "For example, if you wanted to modify a CAM subroutine, in the case called case01, you would copy that subroutine to the following location\n", + "\n", + "```\n", + " case01/SourceMods/src.cam\n", + "```\n", + "and modify it there.\n", + "\n", + "*Figure 1* shows the location of the `SourceMods` directory and sub-directories.\n", + "\n", + "
\n", + "\n", + "The **steps** when making a **source code modification** are:\n", + "\n", + "- In the **CESM code**, find the subroutine you want to modify.\n", + "- Copy this subroutine to the relevant **SourceMods** directory within your **case directory**\n", + "- Make your **modifications**\n", + "- **Compile** and **run** the model \n", + " \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "017b45ad-dcff-42b2-8623-06033b8e11d8", + "metadata": {}, + "source": [ + "![CESM directories and namelists](../../images/sourcemods/CESM_directories_and_SourceMods.png)\n", + "\n", + "*

Figure: Overview of the CESM directories and the SourceMods directories.

*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14f20e06-e171-4891-96de-759c5f5182a9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/sourcemods/sourcemods.ipynb b/_sources/notebooks/sourcemods/sourcemods.ipynb new file mode 100644 index 000000000..d9f0b8b21 --- /dev/null +++ b/_sources/notebooks/sourcemods/sourcemods.ipynb @@ -0,0 +1,49 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Source Modifications\n", + "\n", + "The goal of this chapter is to understand how to modify the CESM code. This is referred to as **_source modifications_**.\n", + "\n", + "- The section **_Overview_** describes the steps for making source modifications and provides a visual representation of the directories and files that need to be modified.\n", + "\n", + "- The section **_Source Modification Example_** provides detailed instructions on how to add a new variable to CAM: the atmospheric temperature at 750hPa.\n", + "\n", + "- The section **_Exercises_** offers opportunities to practice the concepts learned in this chapter." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35b1a8e6-f30e-4e15-b519-a87d23bfffc6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/troubleshooting/debugging_flag.ipynb b/_sources/notebooks/troubleshooting/debugging_flag.ipynb new file mode 100644 index 000000000..ed4f5054a --- /dev/null +++ b/_sources/notebooks/troubleshooting/debugging_flag.ipynb @@ -0,0 +1,52 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "afbbe9ba-517d-4db4-9c7c-0b3daaf0e7ac", + "metadata": {}, + "source": [ + "# Adding debugging info\n", + "\n", + "If you cannot find the reason of the crash in the **log** files, there are two ways to add more debugging information. \n", + "- Increase the value of the run-time xml variable ``INFO_DBUG`` (This **does NOT require rebuilding**): \n", + "```\n", + "./xmlchange INFO_DBUG=2. \n", + "```\n", + "This adds more information to the ``cpl.log`` file that can be useful if you can’t tell what component is aborting the run, or where bad coupling fields are originating.\n", + "\n", + "- Try rebuilding and rerunning with the variable DEBUG set to TRUE (This ** requires rebuilding**): \n", + "```\n", + "./xmlchange DEBUG=TRUE.\n", + "```\n", + "This adds various runtime checks that trap conditions such as out-of-bounds array indexing, divide by 0, and other floating point exceptions.\n", + "Before running, you must rebuild the run: \n", + "```\n", + "./case.build --clean-all\n", + "qcmd -- ./case.build.\n", + "```\n", + "Note that the model will run **significantly slower** in ``DEBUG mode``, so this may not be feasible if the model has to run a long time before producing the error. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/troubleshooting/exercises/troubleshooting_cam.ipynb b/_sources/notebooks/troubleshooting/exercises/troubleshooting_cam.ipynb new file mode 100644 index 000000000..5890b93b5 --- /dev/null +++ b/_sources/notebooks/troubleshooting/exercises/troubleshooting_cam.ipynb @@ -0,0 +1,201 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Debugging CAM" + ] + }, + { + "cell_type": "markdown", + "id": "b90d4773-7ca0-4131-ab07-517608a3e976", + "metadata": {}, + "source": [ + "\n", + "
\n", + "Exercise: Add an additional output variable

\n", + " \n", + "Create a case called ``b1850_high_freq_bugfixing`` using the compset ``B1850`` at ``f19_g17`` resolution. \n", + "Set the run length to ``1 month``. \n", + " \n", + "Now in addition to the default monthly output, add the following output:\n", + "- an ``h1`` file containing daily averages of ``T2M`` and set your namelist so that there is one file per day for this daily averaged output.\n", + "\n", + "Set up, build and submit your case. \n", + "\n", + "Your goal is to make the model crash. And then to troubleshoot why it crashed. \n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "e4e74779-4778-446a-be7e-50e0c1ee125e", + "metadata": {}, + "source": [ + "
\n", + "
\n", + " \n", + " Click here for hints\n", + " \n", + "\n", + "**Tip to add a ``h1`` file** \n", + "\n", + "For more information about how to add a ``h1`` file, check the section about namelist modifications. \n", + "\n", + "If you don't have time to check the section immediately, the way to add an ``h1`` file with daily averages of ``T2M`` and create one file per day for this daily averaged output is:\n", + "\n", + "add the following lines in ``user nl cam``\n", + " \n", + "```\n", + " fincl2 = ’T2M:A’\n", + " nhtfrq = 0,-24\n", + " mfilt = 1,1\n", + "```\n", + "\n", + "**Tip to for troubleshooting** \n", + "\n", + "Check the derecho queue and wait until your run doesn't show in the queue anymore. \n", + "\n", + "When your run is not in the queue anymore:\n", + "- Go to the ``archive`` directory: can you see the history files in the archive directory? The answer should be no. Why? \n", + "- Go to the ``run`` directory: Is there any evidence of history files or restart files being created by the run? The answer, again, should be no. This is because we have tricked you, with a bug.\n", + "\n", + "Look at the log files in the ``RUNDIR`` to try to understand why the run crashed. \n", + "\n", + "
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "fbfacd19-3e46-4ef4-9111-7bb1b4669b2f", + "metadata": {}, + "source": [ + "\n", + "
\n", + "
\n", + "Click here for the solution
\n", + " \n", + "**# Create a new case**\n", + " \n", + "Create a new case ``b1850_high_freq_bugfixing`` with the command:\n", + "```\n", + " cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/\n", + " ./create_newcase --case ~/cases/b1850_high_freq_bugfixing --compset B1850 --res f19_g17 \n", + "```\n", + "\n", + "**# Setup**\n", + "\n", + "Invoke case.setup with the command:\n", + "``` \n", + " cd ~/cases/b1850_high_freq_bugfixing\n", + " ./case.setup\n", + "```\n", + "\n", + "**# Customize namelists**\n", + " \n", + "Add the daily output of ``T2M`` by editing the file ``user_nl_cam`` and adding the lines:\n", + "```\n", + " fincl2 = 'T2M:A'\n", + " nhtfrq = 0,-24\n", + " mfilt = 1,1\n", + "```\n", + "\n", + "**# Set run length**\n", + "\n", + "Set the **run length** to 1 month:\n", + "``` \n", + "./xmlchange STOP_N=1,STOP_OPTION=nmonths\n", + "```\n", + "\n", + "**# Change the job queue and account number**\n", + "\n", + "If needed, change `job queue` and `account number`.
\n", + "For instance, to run in the queue `tutorial` and the project number ``UESM0013`` (you should use the project number given for this tutorial), use the command:\n", + "\n", + "``` \n", + "./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force\n", + "```\n", + "\n", + "**# Build and submit**\n", + " \n", + "Build the model and submit your job:\n", + "```\n", + "qcmd -- ./case.build\n", + "./case.submit\n", + "```\n", + "\n", + "____\n", + " \n", + "**# Look at what happened**\n", + "\n", + "**Your run should crash !!!**. This is normal. The goal of the exercise is to troubleshooting. \n", + "\n", + "What you should find in your run directory is three log files. \n", + "- One for the coupler ``cpl.log.*``,\n", + "- one for CAM ``atm.log.*`` \n", + "- and one for CESM ``cesm.log.*``.\n", + "\n", + "Somewhere in these log files is information about what has gone wrong, but it is often not entirely\n", + "straightforward to find. \n", + "- Often at the bottom of the log file, there are errors that are not relative to your problem because\n", + "they are just demonstrating that individual processes are exiting. \n", + "- Often the relevant error lies above this and can sometimes be found by searching for the first occurrence of ERROR or ABORT or cesm.exe. \n", + "\n", + "In this case, searching for the first occurrence of ERROR in ``cesm.log.*`` gives us some relevant information. We find\n", + "```\n", + "ERROR: FLDLST: 1 errors found, see log\n", + "```\n", + "This tells us is that something has gone wrong with the list of output variables that we have asked for.\n", + "\n", + "More information can then be found in the CAM log file ``atm.log.*``.\n", + "Look at the very end of that file and you should see\n", + "```\n", + "FLDLST: T2M in fincl(1, 2) not found\n", + "ERROR: FLDLST: 1 errors found, see log\n", + "```\n", + "This tells us that ``T2M`` is not a valid history variable for CAM. That’s because the correct variable\n", + "for near surface temperature is ``TREFHT``. ``T2M`` is not a CAM\n", + "history field and this has caused CESM to crash.\n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "848cf254-9146-4f58-ad1b-2d46325e5067", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/troubleshooting/exercises_overview.ipynb b/_sources/notebooks/troubleshooting/exercises_overview.ipynb new file mode 100644 index 000000000..36cbf2792 --- /dev/null +++ b/_sources/notebooks/troubleshooting/exercises_overview.ipynb @@ -0,0 +1,39 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# Exercise Overview \n", + "\n", + "## Learning Goals\n", + "- The goal of the exercise is to make the model crash, and then troubleshoot as to why it crashed. \n", + "\n", + "## Exercise\n", + "- Do the exercise: Debugging CAM. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/troubleshooting/log_files.ipynb b/_sources/notebooks/troubleshooting/log_files.ipynb new file mode 100644 index 000000000..53e2cb146 --- /dev/null +++ b/_sources/notebooks/troubleshooting/log_files.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f406f992-92bd-4b17-9bd3-b99c5c8abaf3", + "metadata": {}, + "source": [ + "# The log files\n", + "\n", + "The log files are files in the format ``$model.log.*`` \n", + "- When the model is running, it produces the log files in the **run directory**: ``RUNDIR``. \n", + "- When the run completes successfully, the model moves the log files into the **archive** directory: ``DOUT_S_ROOT``\n", + "- When the model fails, the log files remain in the run directory ``RUNDIR``\n", + "\n", + "![CESM directories and namelists](../../images/troubleshooting/CESM_directories_and_log_files.png)\n", + "\n", + "*

Figure: Overview of the CESM directories and the log files.

*\n" + ] + }, + { + "cell_type": "markdown", + "id": "017b45ad-dcff-42b2-8623-06033b8e11d8", + "metadata": {}, + "source": [ + "## What to do when a run fails? \n", + "\n", + "First, check the latest ``cpl.log.*``, which will often tell you when the model failed. If a run completed successfully, the last several lines of the ``cpl.log.*`` file will have a string like ``SUCCESSFUL TERMINATION OF CESM``. \n", + "If you don't see this message, it means the run has failed. \n", + "\n", + "Check these things first when a job fails:\n", + "- Did the model time out?\n", + "- Was a disk quota limit hit?\n", + "- Did a machine go down?\n", + "- Did a file system become full?\n", + "If any of those things happened, take appropriate corrective action and resubmit the job.\n", + "\n", + "If it is not clear that any of the above caused a case to fail, check the rest of the component log files ``$model.log.*`` for error messages. It takes a bit of practice to interpret message errors. We will look at an example later on in this chapter's exercises. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/troubleshooting/troubleshooting.ipynb b/_sources/notebooks/troubleshooting/troubleshooting.ipynb new file mode 100644 index 000000000..a8863e162 --- /dev/null +++ b/_sources/notebooks/troubleshooting/troubleshooting.ipynb @@ -0,0 +1,44 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0959db1d-1790-4519-a34e-7026444af537", + "metadata": {}, + "source": [ + "# Troubleshooting runtime errors\n", + "\n", + "There are several places to look for information if a job fails. \n", + "- The log files will probably give you a hint. \n", + "- It is also possible to run with more debugging info. \n", + "\n", + "\n", + "
\n", + "\n", + "More information about troubleshooting can be found in the [CIME documentation](https://esmci.github.io/cime/versions/master/html/users_guide/troubleshooting.html).\n", + "\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sphinx_design_static/design-tabs.js b/_sphinx_design_static/design-tabs.js new file mode 100644 index 000000000..b25bd6a4f --- /dev/null +++ b/_sphinx_design_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_sphinx_design_static/sphinx-design.min.css b/_sphinx_design_static/sphinx-design.min.css new file mode 100644 index 000000000..860c36da0 --- /dev/null +++ b/_sphinx_design_static/sphinx-design.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em .6em .5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 000000000..2af6139e6 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/check-solid.svg b/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/_static/copybutton.css b/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_static/design-tabs.js b/_static/design-tabs.js new file mode 100644 index 000000000..b25bd6a4f --- /dev/null +++ b/_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 000000000..dab586c0d --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_static/file.png differ diff --git a/_static/images/logo_binder.svg b/_static/images/logo_binder.svg new file mode 100644 index 000000000..45fecf751 --- /dev/null +++ b/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/_static/images/logo_colab.png b/_static/images/logo_colab.png new file mode 100644 index 000000000..b7560ec21 Binary files /dev/null and b/_static/images/logo_colab.png differ diff --git a/_static/images/logo_deepnote.svg b/_static/images/logo_deepnote.svg new file mode 100644 index 000000000..fa77ebfc2 --- /dev/null +++ b/_static/images/logo_deepnote.svg @@ -0,0 +1 @@ + diff --git a/_static/images/logo_jupyterhub.svg b/_static/images/logo_jupyterhub.svg new file mode 100644 index 000000000..60cfe9f22 --- /dev/null +++ b/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 000000000..367b8ed81 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/locales/ar/LC_MESSAGES/booktheme.mo b/_static/locales/ar/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..15541a6a3 Binary files /dev/null and b/_static/locales/ar/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ar/LC_MESSAGES/booktheme.po b/_static/locales/ar/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..34d404c6d --- /dev/null +++ b/_static/locales/ar/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "Theme by the" +msgstr "موضوع بواسطة" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "Contents" +msgstr "محتويات" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "By" +msgstr "بواسطة" + +msgid "repository" +msgstr "مخزن" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "suggest edit" +msgstr "أقترح تحرير" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "By the" +msgstr "بواسطة" + +msgid "next page" +msgstr "الصفحة التالية" diff --git a/_static/locales/bg/LC_MESSAGES/booktheme.mo b/_static/locales/bg/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..da9512003 Binary files /dev/null and b/_static/locales/bg/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/bg/LC_MESSAGES/booktheme.po b/_static/locales/bg/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..7420c19eb --- /dev/null +++ b/_static/locales/bg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "open issue" +msgstr "отворен брой" + +msgid "Contents" +msgstr "Съдържание" + +msgid "previous page" +msgstr "предишна страница" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "By" +msgstr "От" + +msgid "repository" +msgstr "хранилище" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "suggest edit" +msgstr "предложи редактиране" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Следваща страница" diff --git a/_static/locales/bn/LC_MESSAGES/booktheme.mo b/_static/locales/bn/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..6b96639b7 Binary files /dev/null and b/_static/locales/bn/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/bn/LC_MESSAGES/booktheme.po b/_static/locales/bn/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..63a07c362 --- /dev/null +++ b/_static/locales/bn/LC_MESSAGES/booktheme.po @@ -0,0 +1,63 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "পিডিএফ প্রিন্ট করুন" + +msgid "Theme by the" +msgstr "থিম দ্বারা" + +msgid "Download source file" +msgstr "উত্স ফাইল ডাউনলোড করুন" + +msgid "open issue" +msgstr "খোলা সমস্যা" + +msgid "previous page" +msgstr "আগের পৃষ্ঠা" + +msgid "Download notebook file" +msgstr "নোটবুক ফাইল ডাউনলোড করুন" + +msgid "Copyright" +msgstr "কপিরাইট" + +msgid "Download this page" +msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" + +msgid "Source repository" +msgstr "উত্স সংগ্রহস্থল" + +msgid "By" +msgstr "দ্বারা" + +msgid "Last updated on" +msgstr "সর্বশেষ আপডেট" + +msgid "Toggle navigation" +msgstr "নেভিগেশন টগল করুন" + +msgid "Sphinx Book Theme" +msgstr "স্পিনিক্স বুক থিম" + +msgid "Open an issue" +msgstr "একটি সমস্যা খুলুন" + +msgid "Launch" +msgstr "শুরু করা" + +msgid "Edit this page" +msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" + +msgid "By the" +msgstr "দ্বারা" + +msgid "next page" +msgstr "পরবর্তী পৃষ্ঠা" diff --git a/_static/locales/ca/LC_MESSAGES/booktheme.mo b/_static/locales/ca/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..a4dd30e9b Binary files /dev/null and b/_static/locales/ca/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ca/LC_MESSAGES/booktheme.po b/_static/locales/ca/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..8fb358bf1 --- /dev/null +++ b/_static/locales/ca/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimeix a PDF" + +msgid "Theme by the" +msgstr "Tema del" + +msgid "Download source file" +msgstr "Baixeu el fitxer font" + +msgid "open issue" +msgstr "número obert" + +msgid "previous page" +msgstr "Pàgina anterior" + +msgid "Download notebook file" +msgstr "Descarregar fitxer de quadern" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "Descarregueu aquesta pàgina" + +msgid "Source repository" +msgstr "Dipòsit de fonts" + +msgid "By" +msgstr "Per" + +msgid "Last updated on" +msgstr "Darrera actualització el" + +msgid "Toggle navigation" +msgstr "Commuta la navegació" + +msgid "Sphinx Book Theme" +msgstr "Tema del llibre Esfinx" + +msgid "suggest edit" +msgstr "suggerir edició" + +msgid "Open an issue" +msgstr "Obriu un número" + +msgid "Launch" +msgstr "Llançament" + +msgid "Edit this page" +msgstr "Editeu aquesta pàgina" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "pàgina següent" diff --git a/_static/locales/cs/LC_MESSAGES/booktheme.mo b/_static/locales/cs/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..c39e01a6a Binary files /dev/null and b/_static/locales/cs/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/cs/LC_MESSAGES/booktheme.po b/_static/locales/cs/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..c6ef46908 --- /dev/null +++ b/_static/locales/cs/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "Contents" +msgstr "Obsah" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "By" +msgstr "Podle" + +msgid "repository" +msgstr "úložiště" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "suggest edit" +msgstr "navrhnout úpravy" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "By the" +msgstr "Podle" + +msgid "next page" +msgstr "další strana" diff --git a/_static/locales/da/LC_MESSAGES/booktheme.mo b/_static/locales/da/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..f43157d70 Binary files /dev/null and b/_static/locales/da/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/da/LC_MESSAGES/booktheme.po b/_static/locales/da/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..306a38e52 --- /dev/null +++ b/_static/locales/da/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Udskriv til PDF" + +msgid "Theme by the" +msgstr "Tema af" + +msgid "Download source file" +msgstr "Download kildefil" + +msgid "open issue" +msgstr "åbent nummer" + +msgid "Contents" +msgstr "Indhold" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download notebook file" +msgstr "Download notesbog-fil" + +msgid "Copyright" +msgstr "ophavsret" + +msgid "Download this page" +msgstr "Download denne side" + +msgid "Source repository" +msgstr "Kildelager" + +msgid "By" +msgstr "Ved" + +msgid "repository" +msgstr "lager" + +msgid "Last updated on" +msgstr "Sidst opdateret den" + +msgid "Toggle navigation" +msgstr "Skift navigation" + +msgid "Sphinx Book Theme" +msgstr "Sphinx bogtema" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Open an issue" +msgstr "Åbn et problem" + +msgid "Launch" +msgstr "Start" + +msgid "Fullscreen mode" +msgstr "Fuldskærmstilstand" + +msgid "Edit this page" +msgstr "Rediger denne side" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "Næste side" diff --git a/_static/locales/de/LC_MESSAGES/booktheme.mo b/_static/locales/de/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..648b565c7 Binary files /dev/null and b/_static/locales/de/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/de/LC_MESSAGES/booktheme.po b/_static/locales/de/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..4925360d4 --- /dev/null +++ b/_static/locales/de/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "Theme by the" +msgstr "Thema von der" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "Contents" +msgstr "Inhalt" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "By" +msgstr "Durch" + +msgid "repository" +msgstr "Repository" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "Launch" +msgstr "Starten" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "By the" +msgstr "Bis zum" + +msgid "next page" +msgstr "Nächste Seite" diff --git a/_static/locales/el/LC_MESSAGES/booktheme.mo b/_static/locales/el/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..fca6e9355 Binary files /dev/null and b/_static/locales/el/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/el/LC_MESSAGES/booktheme.po b/_static/locales/el/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..3e01acbd9 --- /dev/null +++ b/_static/locales/el/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Εκτύπωση σε PDF" + +msgid "Theme by the" +msgstr "Θέμα από το" + +msgid "Download source file" +msgstr "Λήψη αρχείου προέλευσης" + +msgid "open issue" +msgstr "ανοιχτό ζήτημα" + +msgid "Contents" +msgstr "Περιεχόμενα" + +msgid "previous page" +msgstr "προηγούμενη σελίδα" + +msgid "Download notebook file" +msgstr "Λήψη αρχείου σημειωματάριου" + +msgid "Copyright" +msgstr "Πνευματική ιδιοκτησία" + +msgid "Download this page" +msgstr "Λήψη αυτής της σελίδας" + +msgid "Source repository" +msgstr "Αποθήκη πηγής" + +msgid "By" +msgstr "Με" + +msgid "repository" +msgstr "αποθήκη" + +msgid "Last updated on" +msgstr "Τελευταία ενημέρωση στις" + +msgid "Toggle navigation" +msgstr "Εναλλαγή πλοήγησης" + +msgid "Sphinx Book Theme" +msgstr "Θέμα βιβλίου Sphinx" + +msgid "suggest edit" +msgstr "προτείνω επεξεργασία" + +msgid "Open an issue" +msgstr "Ανοίξτε ένα ζήτημα" + +msgid "Launch" +msgstr "Εκτόξευση" + +msgid "Fullscreen mode" +msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" + +msgid "Edit this page" +msgstr "Επεξεργαστείτε αυτήν τη σελίδα" + +msgid "By the" +msgstr "Από το" + +msgid "next page" +msgstr "επόμενη σελίδα" diff --git a/_static/locales/eo/LC_MESSAGES/booktheme.mo b/_static/locales/eo/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..d1072bbec Binary files /dev/null and b/_static/locales/eo/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/eo/LC_MESSAGES/booktheme.po b/_static/locales/eo/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..f7ed2262d --- /dev/null +++ b/_static/locales/eo/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "Theme by the" +msgstr "Temo de la" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "open issue" +msgstr "malferma numero" + +msgid "Contents" +msgstr "Enhavo" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "deponejo" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "suggest edit" +msgstr "sugesti redaktadon" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "sekva paĝo" diff --git a/_static/locales/es/LC_MESSAGES/booktheme.mo b/_static/locales/es/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..ba2ee4dc2 Binary files /dev/null and b/_static/locales/es/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/es/LC_MESSAGES/booktheme.po b/_static/locales/es/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..5e0029e5f --- /dev/null +++ b/_static/locales/es/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "Theme by the" +msgstr "Tema por el" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "Contents" +msgstr "Contenido" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "By" +msgstr "Por" + +msgid "repository" +msgstr "repositorio" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "suggest edit" +msgstr "sugerir editar" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "By the" +msgstr "Por el" + +msgid "next page" +msgstr "siguiente página" diff --git a/_static/locales/et/LC_MESSAGES/booktheme.mo b/_static/locales/et/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..983b82391 Binary files /dev/null and b/_static/locales/et/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/et/LC_MESSAGES/booktheme.po b/_static/locales/et/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..8680982a9 --- /dev/null +++ b/_static/locales/et/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "Theme by the" +msgstr "Teema" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "Contents" +msgstr "Sisu" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "By" +msgstr "Kõrval" + +msgid "repository" +msgstr "hoidla" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "suggest edit" +msgstr "soovita muuta" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "By the" +msgstr "Autor" + +msgid "next page" +msgstr "järgmine leht" diff --git a/_static/locales/fi/LC_MESSAGES/booktheme.mo b/_static/locales/fi/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..d8ac05459 Binary files /dev/null and b/_static/locales/fi/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/fi/LC_MESSAGES/booktheme.po b/_static/locales/fi/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..34dac2183 --- /dev/null +++ b/_static/locales/fi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "Theme by the" +msgstr "Teeman tekijä" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "Contents" +msgstr "Sisällys" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "By" +msgstr "Tekijä" + +msgid "repository" +msgstr "arkisto" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "suggest edit" +msgstr "ehdottaa muokkausta" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "By the" +msgstr "Mukaan" + +msgid "next page" +msgstr "seuraava sivu" diff --git a/_static/locales/fr/LC_MESSAGES/booktheme.mo b/_static/locales/fr/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..f663d39f0 Binary files /dev/null and b/_static/locales/fr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/fr/LC_MESSAGES/booktheme.po b/_static/locales/fr/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..8991a1b87 --- /dev/null +++ b/_static/locales/fr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "Theme by the" +msgstr "Thème par le" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "Contents" +msgstr "Contenu" + +msgid "previous page" +msgstr "page précédente" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "By" +msgstr "Par" + +msgid "repository" +msgstr "dépôt" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "suggest edit" +msgstr "suggestion de modification" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "Launch" +msgstr "lancement" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "By the" +msgstr "Par le" + +msgid "next page" +msgstr "page suivante" diff --git a/_static/locales/hr/LC_MESSAGES/booktheme.mo b/_static/locales/hr/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..eca4a1a28 Binary files /dev/null and b/_static/locales/hr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/hr/LC_MESSAGES/booktheme.po b/_static/locales/hr/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..42c4233d0 --- /dev/null +++ b/_static/locales/hr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Ispis u PDF" + +msgid "Theme by the" +msgstr "Tema autora" + +msgid "Download source file" +msgstr "Preuzmi izvornu datoteku" + +msgid "open issue" +msgstr "otvoreno izdanje" + +msgid "Contents" +msgstr "Sadržaj" + +msgid "previous page" +msgstr "Prethodna stranica" + +msgid "Download notebook file" +msgstr "Preuzmi datoteku bilježnice" + +msgid "Copyright" +msgstr "Autorska prava" + +msgid "Download this page" +msgstr "Preuzmite ovu stranicu" + +msgid "Source repository" +msgstr "Izvorno spremište" + +msgid "By" +msgstr "Po" + +msgid "repository" +msgstr "spremište" + +msgid "Last updated on" +msgstr "Posljednje ažuriranje:" + +msgid "Toggle navigation" +msgstr "Uključi / isključi navigaciju" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "suggest edit" +msgstr "predloži uređivanje" + +msgid "Open an issue" +msgstr "Otvorite izdanje" + +msgid "Launch" +msgstr "Pokrenite" + +msgid "Fullscreen mode" +msgstr "Način preko cijelog zaslona" + +msgid "Edit this page" +msgstr "Uredite ovu stranicu" + +msgid "By the" +msgstr "Od strane" + +msgid "next page" +msgstr "sljedeća stranica" diff --git a/_static/locales/id/LC_MESSAGES/booktheme.mo b/_static/locales/id/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..d07a06a9d Binary files /dev/null and b/_static/locales/id/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/id/LC_MESSAGES/booktheme.po b/_static/locales/id/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..b8d8d898e --- /dev/null +++ b/_static/locales/id/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "Contents" +msgstr "Isi" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By" +msgstr "Oleh" + +msgid "repository" +msgstr "gudang" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "suggest edit" +msgstr "menyarankan edit" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "halaman selanjutnya" diff --git a/_static/locales/it/LC_MESSAGES/booktheme.mo b/_static/locales/it/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..53ba476ed Binary files /dev/null and b/_static/locales/it/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/it/LC_MESSAGES/booktheme.po b/_static/locales/it/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..36fca59f8 --- /dev/null +++ b/_static/locales/it/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Stampa in PDF" + +msgid "Theme by the" +msgstr "Tema di" + +msgid "Download source file" +msgstr "Scarica il file sorgente" + +msgid "open issue" +msgstr "questione aperta" + +msgid "Contents" +msgstr "Contenuti" + +msgid "previous page" +msgstr "pagina precedente" + +msgid "Download notebook file" +msgstr "Scarica il file del taccuino" + +msgid "Copyright" +msgstr "Diritto d'autore" + +msgid "Download this page" +msgstr "Scarica questa pagina" + +msgid "Source repository" +msgstr "Repository di origine" + +msgid "By" +msgstr "Di" + +msgid "repository" +msgstr "repository" + +msgid "Last updated on" +msgstr "Ultimo aggiornamento il" + +msgid "Toggle navigation" +msgstr "Attiva / disattiva la navigazione" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro della Sfinge" + +msgid "suggest edit" +msgstr "suggerisci modifica" + +msgid "Open an issue" +msgstr "Apri un problema" + +msgid "Launch" +msgstr "Lanciare" + +msgid "Fullscreen mode" +msgstr "Modalità schermo intero" + +msgid "Edit this page" +msgstr "Modifica questa pagina" + +msgid "By the" +msgstr "Dal" + +msgid "next page" +msgstr "pagina successiva" diff --git a/_static/locales/iw/LC_MESSAGES/booktheme.mo b/_static/locales/iw/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..a45c6575e Binary files /dev/null and b/_static/locales/iw/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/iw/LC_MESSAGES/booktheme.po b/_static/locales/iw/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..dede9cb08 --- /dev/null +++ b/_static/locales/iw/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: iw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "Theme by the" +msgstr "נושא מאת" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "Contents" +msgstr "תוכן" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "By" +msgstr "על ידי" + +msgid "repository" +msgstr "מאגר" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "suggest edit" +msgstr "מציע לערוך" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "By the" +msgstr "דרך" + +msgid "next page" +msgstr "עמוד הבא" diff --git a/_static/locales/ja/LC_MESSAGES/booktheme.mo b/_static/locales/ja/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..1cefd29ce Binary files /dev/null and b/_static/locales/ja/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ja/LC_MESSAGES/booktheme.po b/_static/locales/ja/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..2615f0d87 --- /dev/null +++ b/_static/locales/ja/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDFに印刷" + +msgid "Theme by the" +msgstr "のテーマ" + +msgid "Download source file" +msgstr "ソースファイルをダウンロード" + +msgid "open issue" +msgstr "未解決の問題" + +msgid "Contents" +msgstr "目次" + +msgid "previous page" +msgstr "前のページ" + +msgid "Download notebook file" +msgstr "ノートブックファイルをダウンロード" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "このページをダウンロード" + +msgid "Source repository" +msgstr "ソースリポジトリ" + +msgid "By" +msgstr "著者" + +msgid "repository" +msgstr "リポジトリ" + +msgid "Last updated on" +msgstr "最終更新日" + +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替え" + +msgid "Sphinx Book Theme" +msgstr "スフィンクスの本のテーマ" + +msgid "suggest edit" +msgstr "編集を提案する" + +msgid "Open an issue" +msgstr "問題を報告" + +msgid "Launch" +msgstr "起動" + +msgid "Fullscreen mode" +msgstr "全画面モード" + +msgid "Edit this page" +msgstr "このページを編集" + +msgid "By the" +msgstr "によって" + +msgid "next page" +msgstr "次のページ" diff --git a/_static/locales/ko/LC_MESSAGES/booktheme.mo b/_static/locales/ko/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..06c7ec938 Binary files /dev/null and b/_static/locales/ko/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ko/LC_MESSAGES/booktheme.po b/_static/locales/ko/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..c9e13a427 --- /dev/null +++ b/_static/locales/ko/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "Theme by the" +msgstr "테마별" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "open issue" +msgstr "열린 문제" + +msgid "Contents" +msgstr "내용" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Copyright" +msgstr "저작권" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "By" +msgstr "으로" + +msgid "repository" +msgstr "저장소" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "suggest edit" +msgstr "편집 제안" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "Launch" +msgstr "시작하다" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "By the" +msgstr "에 의해" + +msgid "next page" +msgstr "다음 페이지" diff --git a/_static/locales/lt/LC_MESSAGES/booktheme.mo b/_static/locales/lt/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..4468ba04b Binary files /dev/null and b/_static/locales/lt/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/lt/LC_MESSAGES/booktheme.po b/_static/locales/lt/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..35eabd955 --- /dev/null +++ b/_static/locales/lt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "Theme by the" +msgstr "Tema" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "Contents" +msgstr "Turinys" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "By" +msgstr "Iki" + +msgid "repository" +msgstr "saugykla" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "By the" +msgstr "Prie" + +msgid "next page" +msgstr "Kitas puslapis" diff --git a/_static/locales/lv/LC_MESSAGES/booktheme.mo b/_static/locales/lv/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..74aa4d898 Binary files /dev/null and b/_static/locales/lv/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/lv/LC_MESSAGES/booktheme.po b/_static/locales/lv/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..ee1bd08df --- /dev/null +++ b/_static/locales/lv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "Theme by the" +msgstr "Autora tēma" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "Contents" +msgstr "Saturs" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "By" +msgstr "Autors" + +msgid "repository" +msgstr "krātuve" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "suggest edit" +msgstr "ieteikt rediģēt" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "By the" +msgstr "Ar" + +msgid "next page" +msgstr "nākamā lapaspuse" diff --git a/_static/locales/ml/LC_MESSAGES/booktheme.mo b/_static/locales/ml/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..2736e8fcf Binary files /dev/null and b/_static/locales/ml/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ml/LC_MESSAGES/booktheme.po b/_static/locales/ml/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..d471277d6 --- /dev/null +++ b/_static/locales/ml/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "Theme by the" +msgstr "പ്രമേയം" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "By the" +msgstr "എഴുതിയത്" + +msgid "next page" +msgstr "അടുത്ത പേജ്" diff --git a/_static/locales/mr/LC_MESSAGES/booktheme.mo b/_static/locales/mr/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..fe530100d Binary files /dev/null and b/_static/locales/mr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/mr/LC_MESSAGES/booktheme.po b/_static/locales/mr/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..f3694acfa --- /dev/null +++ b/_static/locales/mr/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "Theme by the" +msgstr "द्वारा थीम" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "By" +msgstr "द्वारा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "suggest edit" +msgstr "संपादन सुचवा" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "By the" +msgstr "द्वारा" + +msgid "next page" +msgstr "पुढील पृष्ठ" diff --git a/_static/locales/ms/LC_MESSAGES/booktheme.mo b/_static/locales/ms/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..f02603fa2 Binary files /dev/null and b/_static/locales/ms/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ms/LC_MESSAGES/booktheme.po b/_static/locales/ms/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..65b7c6026 --- /dev/null +++ b/_static/locales/ms/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By" +msgstr "Oleh" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "suggest edit" +msgstr "cadangkan edit" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "muka surat seterusnya" diff --git a/_static/locales/nl/LC_MESSAGES/booktheme.mo b/_static/locales/nl/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..e59e7ecb3 Binary files /dev/null and b/_static/locales/nl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/nl/LC_MESSAGES/booktheme.po b/_static/locales/nl/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..71bd1cda7 --- /dev/null +++ b/_static/locales/nl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "Theme by the" +msgstr "Thema door de" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "open issue" +msgstr "open probleem" + +msgid "Contents" +msgstr "Inhoud" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "By" +msgstr "Door" + +msgid "repository" +msgstr "repository" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "suggest edit" +msgstr "suggereren bewerken" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "Launch" +msgstr "Lancering" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "By the" +msgstr "Door de" + +msgid "next page" +msgstr "volgende bladzijde" diff --git a/_static/locales/no/LC_MESSAGES/booktheme.mo b/_static/locales/no/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..6cd15c88d Binary files /dev/null and b/_static/locales/no/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/no/LC_MESSAGES/booktheme.po b/_static/locales/no/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..b21346a51 --- /dev/null +++ b/_static/locales/no/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Skriv ut til PDF" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Download source file" +msgstr "Last ned kildefilen" + +msgid "open issue" +msgstr "åpent nummer" + +msgid "Contents" +msgstr "Innhold" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download notebook file" +msgstr "Last ned notatbokfilen" + +msgid "Copyright" +msgstr "opphavsrett" + +msgid "Download this page" +msgstr "Last ned denne siden" + +msgid "Source repository" +msgstr "Kildedepot" + +msgid "By" +msgstr "Av" + +msgid "repository" +msgstr "oppbevaringssted" + +msgid "Last updated on" +msgstr "Sist oppdatert den" + +msgid "Toggle navigation" +msgstr "Bytt navigasjon" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Open an issue" +msgstr "Åpne et problem" + +msgid "Launch" +msgstr "Start" + +msgid "Fullscreen mode" +msgstr "Fullskjerm-modus" + +msgid "Edit this page" +msgstr "Rediger denne siden" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "neste side" diff --git a/_static/locales/pl/LC_MESSAGES/booktheme.mo b/_static/locales/pl/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..9ebb584f7 Binary files /dev/null and b/_static/locales/pl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/pl/LC_MESSAGES/booktheme.po b/_static/locales/pl/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..1b7233f4f --- /dev/null +++ b/_static/locales/pl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "Theme by the" +msgstr "Motyw autorstwa" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "Contents" +msgstr "Zawartość" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "By" +msgstr "Przez" + +msgid "repository" +msgstr "magazyn" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "suggest edit" +msgstr "zaproponuj edycję" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "By the" +msgstr "Przez" + +msgid "next page" +msgstr "Następna strona" diff --git a/_static/locales/pt/LC_MESSAGES/booktheme.mo b/_static/locales/pt/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..d0ddb8728 Binary files /dev/null and b/_static/locales/pt/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/pt/LC_MESSAGES/booktheme.po b/_static/locales/pt/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..1b27314d6 --- /dev/null +++ b/_static/locales/pt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "Theme by the" +msgstr "Tema por" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "open issue" +msgstr "questão aberta" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "previous page" +msgstr "página anterior" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "repositório" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "suggest edit" +msgstr "sugerir edição" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "By the" +msgstr "Pelo" + +msgid "next page" +msgstr "próxima página" diff --git a/_static/locales/ro/LC_MESSAGES/booktheme.mo b/_static/locales/ro/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..3c36ab1df Binary files /dev/null and b/_static/locales/ro/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ro/LC_MESSAGES/booktheme.po b/_static/locales/ro/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..1783ad2c4 --- /dev/null +++ b/_static/locales/ro/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "Theme by the" +msgstr "Tema de" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "Contents" +msgstr "Cuprins" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "repertoriu" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "suggest edit" +msgstr "sugerează editare" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "Launch" +msgstr "Lansa" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "By the" +msgstr "Langa" + +msgid "next page" +msgstr "pagina următoare" diff --git a/_static/locales/ru/LC_MESSAGES/booktheme.mo b/_static/locales/ru/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..6b8ca41f3 Binary files /dev/null and b/_static/locales/ru/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ru/LC_MESSAGES/booktheme.po b/_static/locales/ru/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..b1176b7ae --- /dev/null +++ b/_static/locales/ru/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "Contents" +msgstr "Содержание" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "By" +msgstr "По" + +msgid "repository" +msgstr "хранилище" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "suggest edit" +msgstr "предложить редактировать" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "Launch" +msgstr "Запуск" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "By the" +msgstr "Посредством" + +msgid "next page" +msgstr "Следующая страница" diff --git a/_static/locales/sk/LC_MESSAGES/booktheme.mo b/_static/locales/sk/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..59bd0ddfa Binary files /dev/null and b/_static/locales/sk/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sk/LC_MESSAGES/booktheme.po b/_static/locales/sk/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..650128817 --- /dev/null +++ b/_static/locales/sk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "Contents" +msgstr "Obsah" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "By" +msgstr "Autor:" + +msgid "repository" +msgstr "Úložisko" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "suggest edit" +msgstr "navrhnúť úpravu" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "By the" +msgstr "Podľa" + +msgid "next page" +msgstr "ďalšia strana" diff --git a/_static/locales/sl/LC_MESSAGES/booktheme.mo b/_static/locales/sl/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..87bf26de6 Binary files /dev/null and b/_static/locales/sl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sl/LC_MESSAGES/booktheme.po b/_static/locales/sl/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..3c7e3a866 --- /dev/null +++ b/_static/locales/sl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "Theme by the" +msgstr "Tema avtorja" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "Contents" +msgstr "Vsebina" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "By" +msgstr "Avtor" + +msgid "repository" +msgstr "odlagališče" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "suggest edit" +msgstr "predlagajte urejanje" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "By the" +msgstr "Avtor" + +msgid "next page" +msgstr "Naslednja stran" diff --git a/_static/locales/sr/LC_MESSAGES/booktheme.mo b/_static/locales/sr/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..ec740f485 Binary files /dev/null and b/_static/locales/sr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sr/LC_MESSAGES/booktheme.po b/_static/locales/sr/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..773b8adae --- /dev/null +++ b/_static/locales/sr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "Theme by the" +msgstr "Тхеме би" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "open issue" +msgstr "отворено издање" + +msgid "Contents" +msgstr "Садржај" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "By" +msgstr "Од стране" + +msgid "repository" +msgstr "спремиште" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "suggest edit" +msgstr "предложи уређивање" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "By the" +msgstr "Од" + +msgid "next page" +msgstr "Следећа страна" diff --git a/_static/locales/sv/LC_MESSAGES/booktheme.mo b/_static/locales/sv/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..b07dc76ff Binary files /dev/null and b/_static/locales/sv/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sv/LC_MESSAGES/booktheme.po b/_static/locales/sv/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..bcac54c07 --- /dev/null +++ b/_static/locales/sv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Skriv ut till PDF" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "open issue" +msgstr "öppna problemrapport" + +msgid "Contents" +msgstr "Innehåll" + +msgid "previous page" +msgstr "föregående sida" + +msgid "Download notebook file" +msgstr "Ladda ner notebook-fil" + +msgid "Copyright" +msgstr "Upphovsrätt" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" + +msgid "Source repository" +msgstr "Källkodsrepositorium" + +msgid "By" +msgstr "Av" + +msgid "repository" +msgstr "repositorium" + +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Boktema" + +msgid "suggest edit" +msgstr "föreslå ändring" + +msgid "Open an issue" +msgstr "Öppna en problemrapport" + +msgid "Launch" +msgstr "Öppna" + +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" + +msgid "Edit this page" +msgstr "Redigera den här sidan" + +msgid "By the" +msgstr "Av den" + +msgid "next page" +msgstr "nästa sida" diff --git a/_static/locales/ta/LC_MESSAGES/booktheme.mo b/_static/locales/ta/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..29f52e1f6 Binary files /dev/null and b/_static/locales/ta/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ta/LC_MESSAGES/booktheme.po b/_static/locales/ta/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..b48bdfaf1 --- /dev/null +++ b/_static/locales/ta/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "Theme by the" +msgstr "வழங்கிய தீம்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "By the" +msgstr "மூலம்" + +msgid "next page" +msgstr "அடுத்த பக்கம்" diff --git a/_static/locales/te/LC_MESSAGES/booktheme.mo b/_static/locales/te/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..0a5f4b46a Binary files /dev/null and b/_static/locales/te/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/te/LC_MESSAGES/booktheme.po b/_static/locales/te/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..952278f5f --- /dev/null +++ b/_static/locales/te/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "Theme by the" +msgstr "ద్వారా థీమ్" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "By" +msgstr "ద్వారా" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "By the" +msgstr "ద్వారా" + +msgid "next page" +msgstr "తరువాతి పేజీ" diff --git a/_static/locales/tg/LC_MESSAGES/booktheme.mo b/_static/locales/tg/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..b21c6c634 Binary files /dev/null and b/_static/locales/tg/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tg/LC_MESSAGES/booktheme.po b/_static/locales/tg/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..c33dc4217 --- /dev/null +++ b/_static/locales/tg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "Theme by the" +msgstr "Мавзӯъи аз" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "By" +msgstr "Бо" + +msgid "repository" +msgstr "анбор" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "suggest edit" +msgstr "пешниҳод вироиш" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "By the" +msgstr "Бо" + +msgid "next page" +msgstr "саҳифаи оянда" diff --git a/_static/locales/th/LC_MESSAGES/booktheme.mo b/_static/locales/th/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..abede98aa Binary files /dev/null and b/_static/locales/th/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/th/LC_MESSAGES/booktheme.po b/_static/locales/th/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..9d24294a7 --- /dev/null +++ b/_static/locales/th/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "Theme by the" +msgstr "ธีมโดย" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "By" +msgstr "โดย" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "suggest edit" +msgstr "แนะนำแก้ไข" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "Launch" +msgstr "เปิด" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "By the" +msgstr "โดย" + +msgid "next page" +msgstr "หน้าต่อไป" diff --git a/_static/locales/tl/LC_MESSAGES/booktheme.mo b/_static/locales/tl/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..8df1b7331 Binary files /dev/null and b/_static/locales/tl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tl/LC_MESSAGES/booktheme.po b/_static/locales/tl/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..20e0d07ce --- /dev/null +++ b/_static/locales/tl/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "Theme by the" +msgstr "Tema ng" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "By" +msgstr "Ni" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "suggest edit" +msgstr "iminumungkahi i-edit" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "By the" +msgstr "Sa pamamagitan ng" + +msgid "next page" +msgstr "Susunod na pahina" diff --git a/_static/locales/tr/LC_MESSAGES/booktheme.mo b/_static/locales/tr/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..029ae18af Binary files /dev/null and b/_static/locales/tr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tr/LC_MESSAGES/booktheme.po b/_static/locales/tr/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..a77eb0273 --- /dev/null +++ b/_static/locales/tr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "Theme by the" +msgstr "Tarafından tema" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "open issue" +msgstr "Açık konu" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "By" +msgstr "Tarafından" + +msgid "repository" +msgstr "depo" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "suggest edit" +msgstr "düzenleme öner" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "By the" +msgstr "Tarafından" + +msgid "next page" +msgstr "sonraki Sayfa" diff --git a/_static/locales/uk/LC_MESSAGES/booktheme.mo b/_static/locales/uk/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..16ab78909 Binary files /dev/null and b/_static/locales/uk/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/uk/LC_MESSAGES/booktheme.po b/_static/locales/uk/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..993dd0781 --- /dev/null +++ b/_static/locales/uk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Друк у форматі PDF" + +msgid "Theme by the" +msgstr "Тема від" + +msgid "Download source file" +msgstr "Завантажити вихідний файл" + +msgid "open issue" +msgstr "відкритий випуск" + +msgid "Contents" +msgstr "Зміст" + +msgid "previous page" +msgstr "Попередня сторінка" + +msgid "Download notebook file" +msgstr "Завантажте файл блокнота" + +msgid "Copyright" +msgstr "Авторське право" + +msgid "Download this page" +msgstr "Завантажте цю сторінку" + +msgid "Source repository" +msgstr "Джерело сховища" + +msgid "By" +msgstr "Автор" + +msgid "repository" +msgstr "сховище" + +msgid "Last updated on" +msgstr "Останнє оновлення:" + +msgid "Toggle navigation" +msgstr "Переключити навігацію" + +msgid "Sphinx Book Theme" +msgstr "Тема книги \"Сфінкс\"" + +msgid "suggest edit" +msgstr "запропонувати редагувати" + +msgid "Open an issue" +msgstr "Відкрийте випуск" + +msgid "Launch" +msgstr "Запуск" + +msgid "Fullscreen mode" +msgstr "Повноекранний режим" + +msgid "Edit this page" +msgstr "Редагувати цю сторінку" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Наступна сторінка" diff --git a/_static/locales/ur/LC_MESSAGES/booktheme.mo b/_static/locales/ur/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..de8c84b93 Binary files /dev/null and b/_static/locales/ur/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ur/LC_MESSAGES/booktheme.po b/_static/locales/ur/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..2f774267f --- /dev/null +++ b/_static/locales/ur/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "By" +msgstr "بذریعہ" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "By the" +msgstr "کی طرف" + +msgid "next page" +msgstr "اگلا صفحہ" diff --git a/_static/locales/vi/LC_MESSAGES/booktheme.mo b/_static/locales/vi/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..2bb32555c Binary files /dev/null and b/_static/locales/vi/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/vi/LC_MESSAGES/booktheme.po b/_static/locales/vi/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..33159f3ef --- /dev/null +++ b/_static/locales/vi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "In sang PDF" + +msgid "Theme by the" +msgstr "Chủ đề của" + +msgid "Download source file" +msgstr "Tải xuống tệp nguồn" + +msgid "open issue" +msgstr "vấn đề mở" + +msgid "Contents" +msgstr "Nội dung" + +msgid "previous page" +msgstr "trang trước" + +msgid "Download notebook file" +msgstr "Tải xuống tệp sổ tay" + +msgid "Copyright" +msgstr "Bản quyền" + +msgid "Download this page" +msgstr "Tải xuống trang này" + +msgid "Source repository" +msgstr "Kho nguồn" + +msgid "By" +msgstr "Bởi" + +msgid "repository" +msgstr "kho" + +msgid "Last updated on" +msgstr "Cập nhật lần cuối vào" + +msgid "Toggle navigation" +msgstr "Chuyển đổi điều hướng thành" + +msgid "Sphinx Book Theme" +msgstr "Chủ đề sách nhân sư" + +msgid "suggest edit" +msgstr "đề nghị chỉnh sửa" + +msgid "Open an issue" +msgstr "Mở một vấn đề" + +msgid "Launch" +msgstr "Phóng" + +msgid "Fullscreen mode" +msgstr "Chế độ toàn màn hình" + +msgid "Edit this page" +msgstr "chỉnh sửa trang này" + +msgid "By the" +msgstr "Bằng" + +msgid "next page" +msgstr "Trang tiếp theo" diff --git a/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo b/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..0e3235d09 Binary files /dev/null and b/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/zh_CN/LC_MESSAGES/booktheme.po b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..2e519ef45 --- /dev/null +++ b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Theme by the" +msgstr "主题作者:" + +msgid "Download source file" +msgstr "下载源文件" + +msgid "open issue" +msgstr "创建议题" + +msgid "Contents" +msgstr "目录" + +msgid "previous page" +msgstr "上一页" + +msgid "Download notebook file" +msgstr "下载笔记本文件" + +msgid "Copyright" +msgstr "版权" + +msgid "Download this page" +msgstr "下载此页面" + +msgid "Source repository" +msgstr "源码库" + +msgid "By" +msgstr "作者:" + +msgid "repository" +msgstr "仓库" + +msgid "Last updated on" +msgstr "上次更新时间:" + +msgid "Toggle navigation" +msgstr "显示或隐藏导航栏" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 主题" + +msgid "suggest edit" +msgstr "提出修改建议" + +msgid "Open an issue" +msgstr "创建议题" + +msgid "Launch" +msgstr "启动" + +msgid "Fullscreen mode" +msgstr "全屏模式" + +msgid "Edit this page" +msgstr "编辑此页面" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一页" diff --git a/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo b/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo new file mode 100644 index 000000000..9116fa95d Binary files /dev/null and b/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po new file mode 100644 index 000000000..beecb076b --- /dev/null +++ b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Theme by the" +msgstr "佈景主題作者:" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "open issue" +msgstr "公開的問題" + +msgid "Contents" +msgstr "目錄" + +msgid "previous page" +msgstr "上一頁" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "By" +msgstr "作者:" + +msgid "repository" +msgstr "儲存庫" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "suggest edit" +msgstr "提出修改建議" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "Launch" +msgstr "啟動" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一頁" diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css new file mode 100644 index 000000000..335663106 --- /dev/null +++ b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css @@ -0,0 +1,2342 @@ +/* Variables */ +:root { + --mystnb-source-bg-color: #f7f7f7; + --mystnb-stdout-bg-color: #fcfcfc; + --mystnb-stderr-bg-color: #fdd; + --mystnb-traceback-bg-color: #fcfcfc; + --mystnb-source-border-color: #ccc; + --mystnb-source-margin-color: green; + --mystnb-stdout-border-color: #f7f7f7; + --mystnb-stderr-border-color: #f7f7f7; + --mystnb-traceback-border-color: #ffd6d6; + --mystnb-hide-prompt-opacity: 70%; + --mystnb-source-border-radius: .4em; + --mystnb-source-border-width: 1px; +} + +/* Whole cell */ +div.container.cell { + padding-left: 0; + margin-bottom: 1em; +} + +/* Removing all background formatting so we can control at the div level */ +.cell_input div.highlight, +.cell_output pre, +.cell_input pre, +.cell_output .output { + border: none; + box-shadow: none; +} + +.cell_output .output pre, +.cell_input pre { + margin: 0px; +} + +/* Input cells */ +div.cell div.cell_input, +div.cell details.above-input>summary { + padding-left: 0em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + background-color: var(--mystnb-source-bg-color); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; + border-radius: var(--mystnb-source-border-radius); +} + +div.cell_input>div, +div.cell_output div.output>div.highlight { + margin: 0em !important; + border: none !important; +} + +/* All cell outputs */ +.cell_output { + padding-left: 1em; + padding-right: 0em; + margin-top: 1em; +} + +/* Text outputs from cells */ +.cell_output .output.text_plain, +.cell_output .output.traceback, +.cell_output .output.stream, +.cell_output .output.stderr { + margin-top: 1em; + margin-bottom: 0em; + box-shadow: none; +} + +.cell_output .output.text_plain, +.cell_output .output.stream { + background: var(--mystnb-stdout-bg-color); + border: 1px solid var(--mystnb-stdout-border-color); +} + +.cell_output .output.stderr { + background: var(--mystnb-stderr-bg-color); + border: 1px solid var(--mystnb-stderr-border-color); +} + +.cell_output .output.traceback { + background: var(--mystnb-traceback-bg-color); + border: 1px solid var(--mystnb-traceback-border-color); +} + +/* Collapsible cell content */ +div.cell details.above-input div.cell_input { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; +} + +div.cell div.cell_input.above-output-prompt { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +div.cell details.above-input>summary { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; + padding-left: 1em; + margin-bottom: 0; +} + +div.cell details.above-output>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.below-input>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-top: none; + border-bottom-left-radius: var(--mystnb-source-border-radius); + border-bottom-right-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.hide>summary>span { + opacity: var(--mystnb-hide-prompt-opacity); +} + +div.cell details.hide[open]>summary>span.collapsed { + display: none; +} + +div.cell details.hide:not([open])>summary>span.expanded { + display: none; +} + +@keyframes collapsed-fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} +div.cell details.hide[open]>summary~* { + -moz-animation: collapsed-fade-in 0.3s ease-in-out; + -webkit-animation: collapsed-fade-in 0.3s ease-in-out; + animation: collapsed-fade-in 0.3s ease-in-out; +} + +/* Math align to the left */ +.cell_output .MathJax_Display { + text-align: left !important; +} + +/* Pandas tables. Pulled from the Jupyter / nbsphinx CSS */ +div.cell_output table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 1em; + table-layout: fixed; +} + +div.cell_output thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} + +div.cell_output tr, +div.cell_output th, +div.cell_output td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +div.cell_output th { + font-weight: bold; +} + +div.cell_output tbody tr:nth-child(odd) { + background: #f5f5f5; +} + +div.cell_output tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + +/** source code line numbers **/ +span.linenos { + opacity: 0.5; +} + +/* Inline text from `paste` operation */ + +span.pasted-text { + font-weight: bold; +} + +span.pasted-inline img { + max-height: 2em; +} + +tbody span.pasted-inline img { + max-height: none; +} + +/* Font colors for translated ANSI escape sequences +Color values are copied from Jupyter Notebook +https://github.com/jupyter/notebook/blob/52581f8eda9b319eb0390ac77fe5903c38f81e3e/notebook/static/notebook/less/ansicolors.less#L14-L21 +Background colors from +https://nbsphinx.readthedocs.io/en/latest/code-cells.html#ANSI-Colors +*/ +div.highlight .-Color-Bold { + font-weight: bold; +} + +div.highlight .-Color[class*=-Black] { + color: #3E424D +} + +div.highlight .-Color[class*=-Red] { + color: #E75C58 +} + +div.highlight .-Color[class*=-Green] { + color: #00A250 +} + +div.highlight .-Color[class*=-Yellow] { + color: #DDB62B +} + +div.highlight .-Color[class*=-Blue] { + color: #208FFB +} + +div.highlight .-Color[class*=-Magenta] { + color: #D160C4 +} + +div.highlight .-Color[class*=-Cyan] { + color: #60C6C8 +} + +div.highlight .-Color[class*=-White] { + color: #C5C1B4 +} + +div.highlight .-Color[class*=-BGBlack] { + background-color: #3E424D +} + +div.highlight .-Color[class*=-BGRed] { + background-color: #E75C58 +} + +div.highlight .-Color[class*=-BGGreen] { + background-color: #00A250 +} + +div.highlight .-Color[class*=-BGYellow] { + background-color: #DDB62B +} + +div.highlight .-Color[class*=-BGBlue] { + background-color: #208FFB +} + +div.highlight .-Color[class*=-BGMagenta] { + background-color: #D160C4 +} + +div.highlight .-Color[class*=-BGCyan] { + background-color: #60C6C8 +} + +div.highlight .-Color[class*=-BGWhite] { + background-color: #C5C1B4 +} + +/* Font colors for 8-bit ANSI */ + +div.highlight .-Color[class*=-C0] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC0] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C1] { + color: #800000 +} + +div.highlight .-Color[class*=-BGC1] { + background-color: #800000 +} + +div.highlight .-Color[class*=-C2] { + color: #008000 +} + +div.highlight .-Color[class*=-BGC2] { + background-color: #008000 +} + +div.highlight .-Color[class*=-C3] { + color: #808000 +} + +div.highlight .-Color[class*=-BGC3] { + background-color: #808000 +} + +div.highlight .-Color[class*=-C4] { + color: #000080 +} + +div.highlight .-Color[class*=-BGC4] { + background-color: #000080 +} + +div.highlight .-Color[class*=-C5] { + color: #800080 +} + +div.highlight .-Color[class*=-BGC5] { + background-color: #800080 +} + +div.highlight .-Color[class*=-C6] { + color: #008080 +} + +div.highlight .-Color[class*=-BGC6] { + background-color: #008080 +} + +div.highlight .-Color[class*=-C7] { + color: #C0C0C0 +} + +div.highlight .-Color[class*=-BGC7] { + background-color: #C0C0C0 +} + +div.highlight .-Color[class*=-C8] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC8] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C9] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC9] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C10] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC10] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C11] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC11] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C12] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC12] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C13] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC13] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C14] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC14] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C15] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC15] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C16] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC16] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C17] { + color: #00005F +} + +div.highlight .-Color[class*=-BGC17] { + background-color: #00005F +} + +div.highlight .-Color[class*=-C18] { + color: #000087 +} + +div.highlight .-Color[class*=-BGC18] { + background-color: #000087 +} + +div.highlight .-Color[class*=-C19] { + color: #0000AF +} + +div.highlight .-Color[class*=-BGC19] { + background-color: #0000AF +} + +div.highlight .-Color[class*=-C20] { + color: #0000D7 +} + +div.highlight .-Color[class*=-BGC20] { + background-color: #0000D7 +} + +div.highlight .-Color[class*=-C21] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC21] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C22] { + color: #005F00 +} + +div.highlight .-Color[class*=-BGC22] { + background-color: #005F00 +} + +div.highlight .-Color[class*=-C23] { + color: #005F5F +} + +div.highlight .-Color[class*=-BGC23] { + background-color: #005F5F +} + +div.highlight .-Color[class*=-C24] { + color: #005F87 +} + +div.highlight .-Color[class*=-BGC24] { + background-color: #005F87 +} + +div.highlight .-Color[class*=-C25] { + color: #005FAF +} + +div.highlight .-Color[class*=-BGC25] { + background-color: #005FAF +} + +div.highlight .-Color[class*=-C26] { + color: #005FD7 +} + +div.highlight .-Color[class*=-BGC26] { + background-color: #005FD7 +} + +div.highlight .-Color[class*=-C27] { + color: #005FFF +} + +div.highlight .-Color[class*=-BGC27] { + background-color: #005FFF +} + +div.highlight .-Color[class*=-C28] { + color: #008700 +} + +div.highlight .-Color[class*=-BGC28] { + background-color: #008700 +} + +div.highlight .-Color[class*=-C29] { + color: #00875F +} + +div.highlight .-Color[class*=-BGC29] { + background-color: #00875F +} + +div.highlight .-Color[class*=-C30] { + color: #008787 +} + +div.highlight .-Color[class*=-BGC30] { + background-color: #008787 +} + +div.highlight .-Color[class*=-C31] { + color: #0087AF +} + +div.highlight .-Color[class*=-BGC31] { + background-color: #0087AF +} + +div.highlight .-Color[class*=-C32] { + color: #0087D7 +} + +div.highlight .-Color[class*=-BGC32] { + background-color: #0087D7 +} + +div.highlight .-Color[class*=-C33] { + color: #0087FF +} + +div.highlight .-Color[class*=-BGC33] { + background-color: #0087FF +} + +div.highlight .-Color[class*=-C34] { + color: #00AF00 +} + +div.highlight .-Color[class*=-BGC34] { + background-color: #00AF00 +} + +div.highlight .-Color[class*=-C35] { + color: #00AF5F +} + +div.highlight .-Color[class*=-BGC35] { + background-color: #00AF5F +} + +div.highlight .-Color[class*=-C36] { + color: #00AF87 +} + +div.highlight .-Color[class*=-BGC36] { + background-color: #00AF87 +} + +div.highlight .-Color[class*=-C37] { + color: #00AFAF +} + +div.highlight .-Color[class*=-BGC37] { + background-color: #00AFAF +} + +div.highlight .-Color[class*=-C38] { + color: #00AFD7 +} + +div.highlight .-Color[class*=-BGC38] { + background-color: #00AFD7 +} + +div.highlight .-Color[class*=-C39] { + color: #00AFFF +} + +div.highlight .-Color[class*=-BGC39] { + background-color: #00AFFF +} + +div.highlight .-Color[class*=-C40] { + color: #00D700 +} + +div.highlight .-Color[class*=-BGC40] { + background-color: #00D700 +} + +div.highlight .-Color[class*=-C41] { + color: #00D75F +} + +div.highlight .-Color[class*=-BGC41] { + background-color: #00D75F +} + +div.highlight .-Color[class*=-C42] { + color: #00D787 +} + +div.highlight .-Color[class*=-BGC42] { + background-color: #00D787 +} + +div.highlight .-Color[class*=-C43] { + color: #00D7AF +} + +div.highlight .-Color[class*=-BGC43] { + background-color: #00D7AF +} + +div.highlight .-Color[class*=-C44] { + color: #00D7D7 +} + +div.highlight .-Color[class*=-BGC44] { + background-color: #00D7D7 +} + +div.highlight .-Color[class*=-C45] { + color: #00D7FF +} + +div.highlight .-Color[class*=-BGC45] { + background-color: #00D7FF +} + +div.highlight .-Color[class*=-C46] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC46] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C47] { + color: #00FF5F +} + +div.highlight .-Color[class*=-BGC47] { + background-color: #00FF5F +} + +div.highlight .-Color[class*=-C48] { + color: #00FF87 +} + +div.highlight .-Color[class*=-BGC48] { + background-color: #00FF87 +} + +div.highlight .-Color[class*=-C49] { + color: #00FFAF +} + +div.highlight .-Color[class*=-BGC49] { + background-color: #00FFAF +} + +div.highlight .-Color[class*=-C50] { + color: #00FFD7 +} + +div.highlight .-Color[class*=-BGC50] { + background-color: #00FFD7 +} + +div.highlight .-Color[class*=-C51] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC51] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C52] { + color: #5F0000 +} + +div.highlight .-Color[class*=-BGC52] { + background-color: #5F0000 +} + +div.highlight .-Color[class*=-C53] { + color: #5F005F +} + +div.highlight .-Color[class*=-BGC53] { + background-color: #5F005F +} + +div.highlight .-Color[class*=-C54] { + color: #5F0087 +} + +div.highlight .-Color[class*=-BGC54] { + background-color: #5F0087 +} + +div.highlight .-Color[class*=-C55] { + color: #5F00AF +} + +div.highlight .-Color[class*=-BGC55] { + background-color: #5F00AF +} + +div.highlight .-Color[class*=-C56] { + color: #5F00D7 +} + +div.highlight .-Color[class*=-BGC56] { + background-color: #5F00D7 +} + +div.highlight .-Color[class*=-C57] { + color: #5F00FF +} + +div.highlight .-Color[class*=-BGC57] { + background-color: #5F00FF +} + +div.highlight .-Color[class*=-C58] { + color: #5F5F00 +} + +div.highlight .-Color[class*=-BGC58] { + background-color: #5F5F00 +} + +div.highlight .-Color[class*=-C59] { + color: #5F5F5F +} + +div.highlight .-Color[class*=-BGC59] { + background-color: #5F5F5F +} + +div.highlight .-Color[class*=-C60] { + color: #5F5F87 +} + +div.highlight .-Color[class*=-BGC60] { + background-color: #5F5F87 +} + +div.highlight .-Color[class*=-C61] { + color: #5F5FAF +} + +div.highlight .-Color[class*=-BGC61] { + background-color: #5F5FAF +} + +div.highlight .-Color[class*=-C62] { + color: #5F5FD7 +} + +div.highlight .-Color[class*=-BGC62] { + background-color: #5F5FD7 +} + +div.highlight .-Color[class*=-C63] { + color: #5F5FFF +} + +div.highlight .-Color[class*=-BGC63] { + background-color: #5F5FFF +} + +div.highlight .-Color[class*=-C64] { + color: #5F8700 +} + +div.highlight .-Color[class*=-BGC64] { + background-color: #5F8700 +} + +div.highlight .-Color[class*=-C65] { + color: #5F875F +} + +div.highlight .-Color[class*=-BGC65] { + background-color: #5F875F +} + +div.highlight .-Color[class*=-C66] { + color: #5F8787 +} + +div.highlight .-Color[class*=-BGC66] { + background-color: #5F8787 +} + +div.highlight .-Color[class*=-C67] { + color: #5F87AF +} + +div.highlight .-Color[class*=-BGC67] { + background-color: #5F87AF +} + +div.highlight .-Color[class*=-C68] { + color: #5F87D7 +} + +div.highlight .-Color[class*=-BGC68] { + background-color: #5F87D7 +} + +div.highlight .-Color[class*=-C69] { + color: #5F87FF +} + +div.highlight .-Color[class*=-BGC69] { + background-color: #5F87FF +} + +div.highlight .-Color[class*=-C70] { + color: #5FAF00 +} + +div.highlight .-Color[class*=-BGC70] { + background-color: #5FAF00 +} + +div.highlight .-Color[class*=-C71] { + color: #5FAF5F +} + +div.highlight .-Color[class*=-BGC71] { + background-color: #5FAF5F +} + +div.highlight .-Color[class*=-C72] { + color: #5FAF87 +} + +div.highlight .-Color[class*=-BGC72] { + background-color: #5FAF87 +} + +div.highlight .-Color[class*=-C73] { + color: #5FAFAF +} + +div.highlight .-Color[class*=-BGC73] { + background-color: #5FAFAF +} + +div.highlight .-Color[class*=-C74] { + color: #5FAFD7 +} + +div.highlight .-Color[class*=-BGC74] { + background-color: #5FAFD7 +} + +div.highlight .-Color[class*=-C75] { + color: #5FAFFF +} + +div.highlight .-Color[class*=-BGC75] { + background-color: #5FAFFF +} + +div.highlight .-Color[class*=-C76] { + color: #5FD700 +} + +div.highlight .-Color[class*=-BGC76] { + background-color: #5FD700 +} + +div.highlight .-Color[class*=-C77] { + color: #5FD75F +} + +div.highlight .-Color[class*=-BGC77] { + background-color: #5FD75F +} + +div.highlight .-Color[class*=-C78] { + color: #5FD787 +} + +div.highlight .-Color[class*=-BGC78] { + background-color: #5FD787 +} + +div.highlight .-Color[class*=-C79] { + color: #5FD7AF +} + +div.highlight .-Color[class*=-BGC79] { + background-color: #5FD7AF +} + +div.highlight .-Color[class*=-C80] { + color: #5FD7D7 +} + +div.highlight .-Color[class*=-BGC80] { + background-color: #5FD7D7 +} + +div.highlight .-Color[class*=-C81] { + color: #5FD7FF +} + +div.highlight .-Color[class*=-BGC81] { + background-color: #5FD7FF +} + +div.highlight .-Color[class*=-C82] { + color: #5FFF00 +} + +div.highlight .-Color[class*=-BGC82] { + background-color: #5FFF00 +} + +div.highlight .-Color[class*=-C83] { + color: #5FFF5F +} + +div.highlight .-Color[class*=-BGC83] { + background-color: #5FFF5F +} + +div.highlight .-Color[class*=-C84] { + color: #5FFF87 +} + +div.highlight .-Color[class*=-BGC84] { + background-color: #5FFF87 +} + +div.highlight .-Color[class*=-C85] { + color: #5FFFAF +} + +div.highlight .-Color[class*=-BGC85] { + background-color: #5FFFAF +} + +div.highlight .-Color[class*=-C86] { + color: #5FFFD7 +} + +div.highlight .-Color[class*=-BGC86] { + background-color: #5FFFD7 +} + +div.highlight .-Color[class*=-C87] { + color: #5FFFFF +} + +div.highlight .-Color[class*=-BGC87] { + background-color: #5FFFFF +} + +div.highlight .-Color[class*=-C88] { + color: #870000 +} + +div.highlight .-Color[class*=-BGC88] { + background-color: #870000 +} + +div.highlight .-Color[class*=-C89] { + color: #87005F +} + +div.highlight .-Color[class*=-BGC89] { + background-color: #87005F +} + +div.highlight .-Color[class*=-C90] { + color: #870087 +} + +div.highlight .-Color[class*=-BGC90] { + background-color: #870087 +} + +div.highlight .-Color[class*=-C91] { + color: #8700AF +} + +div.highlight .-Color[class*=-BGC91] { + background-color: #8700AF +} + +div.highlight .-Color[class*=-C92] { + color: #8700D7 +} + +div.highlight .-Color[class*=-BGC92] { + background-color: #8700D7 +} + +div.highlight .-Color[class*=-C93] { + color: #8700FF +} + +div.highlight .-Color[class*=-BGC93] { + background-color: #8700FF +} + +div.highlight .-Color[class*=-C94] { + color: #875F00 +} + +div.highlight .-Color[class*=-BGC94] { + background-color: #875F00 +} + +div.highlight .-Color[class*=-C95] { + color: #875F5F +} + +div.highlight .-Color[class*=-BGC95] { + background-color: #875F5F +} + +div.highlight .-Color[class*=-C96] { + color: #875F87 +} + +div.highlight .-Color[class*=-BGC96] { + background-color: #875F87 +} + +div.highlight .-Color[class*=-C97] { + color: #875FAF +} + +div.highlight .-Color[class*=-BGC97] { + background-color: #875FAF +} + +div.highlight .-Color[class*=-C98] { + color: #875FD7 +} + +div.highlight .-Color[class*=-BGC98] { + background-color: #875FD7 +} + +div.highlight .-Color[class*=-C99] { + color: #875FFF +} + +div.highlight .-Color[class*=-BGC99] { + background-color: #875FFF +} + +div.highlight .-Color[class*=-C100] { + color: #878700 +} + +div.highlight .-Color[class*=-BGC100] { + background-color: #878700 +} + +div.highlight .-Color[class*=-C101] { + color: #87875F +} + +div.highlight .-Color[class*=-BGC101] { + background-color: #87875F +} + +div.highlight .-Color[class*=-C102] { + color: #878787 +} + +div.highlight .-Color[class*=-BGC102] { + background-color: #878787 +} + +div.highlight .-Color[class*=-C103] { + color: #8787AF +} + +div.highlight .-Color[class*=-BGC103] { + background-color: #8787AF +} + +div.highlight .-Color[class*=-C104] { + color: #8787D7 +} + +div.highlight .-Color[class*=-BGC104] { + background-color: #8787D7 +} + +div.highlight .-Color[class*=-C105] { + color: #8787FF +} + +div.highlight .-Color[class*=-BGC105] { + background-color: #8787FF +} + +div.highlight .-Color[class*=-C106] { + color: #87AF00 +} + +div.highlight .-Color[class*=-BGC106] { + background-color: #87AF00 +} + +div.highlight .-Color[class*=-C107] { + color: #87AF5F +} + +div.highlight .-Color[class*=-BGC107] { + background-color: #87AF5F +} + +div.highlight .-Color[class*=-C108] { + color: #87AF87 +} + +div.highlight .-Color[class*=-BGC108] { + background-color: #87AF87 +} + +div.highlight .-Color[class*=-C109] { + color: #87AFAF +} + +div.highlight .-Color[class*=-BGC109] { + background-color: #87AFAF +} + +div.highlight .-Color[class*=-C110] { + color: #87AFD7 +} + +div.highlight .-Color[class*=-BGC110] { + background-color: #87AFD7 +} + +div.highlight .-Color[class*=-C111] { + color: #87AFFF +} + +div.highlight .-Color[class*=-BGC111] { + background-color: #87AFFF +} + +div.highlight .-Color[class*=-C112] { + color: #87D700 +} + +div.highlight .-Color[class*=-BGC112] { + background-color: #87D700 +} + +div.highlight .-Color[class*=-C113] { + color: #87D75F +} + +div.highlight .-Color[class*=-BGC113] { + background-color: #87D75F +} + +div.highlight .-Color[class*=-C114] { + color: #87D787 +} + +div.highlight .-Color[class*=-BGC114] { + background-color: #87D787 +} + +div.highlight .-Color[class*=-C115] { + color: #87D7AF +} + +div.highlight .-Color[class*=-BGC115] { + background-color: #87D7AF +} + +div.highlight .-Color[class*=-C116] { + color: #87D7D7 +} + +div.highlight .-Color[class*=-BGC116] { + background-color: #87D7D7 +} + +div.highlight .-Color[class*=-C117] { + color: #87D7FF +} + +div.highlight .-Color[class*=-BGC117] { + background-color: #87D7FF +} + +div.highlight .-Color[class*=-C118] { + color: #87FF00 +} + +div.highlight .-Color[class*=-BGC118] { + background-color: #87FF00 +} + +div.highlight .-Color[class*=-C119] { + color: #87FF5F +} + +div.highlight .-Color[class*=-BGC119] { + background-color: #87FF5F +} + +div.highlight .-Color[class*=-C120] { + color: #87FF87 +} + +div.highlight .-Color[class*=-BGC120] { + background-color: #87FF87 +} + +div.highlight .-Color[class*=-C121] { + color: #87FFAF +} + +div.highlight .-Color[class*=-BGC121] { + background-color: #87FFAF +} + +div.highlight .-Color[class*=-C122] { + color: #87FFD7 +} + +div.highlight .-Color[class*=-BGC122] { + background-color: #87FFD7 +} + +div.highlight .-Color[class*=-C123] { + color: #87FFFF +} + +div.highlight .-Color[class*=-BGC123] { + background-color: #87FFFF +} + +div.highlight .-Color[class*=-C124] { + color: #AF0000 +} + +div.highlight .-Color[class*=-BGC124] { + background-color: #AF0000 +} + +div.highlight .-Color[class*=-C125] { + color: #AF005F +} + +div.highlight .-Color[class*=-BGC125] { + background-color: #AF005F +} + +div.highlight .-Color[class*=-C126] { + color: #AF0087 +} + +div.highlight .-Color[class*=-BGC126] { + background-color: #AF0087 +} + +div.highlight .-Color[class*=-C127] { + color: #AF00AF +} + +div.highlight .-Color[class*=-BGC127] { + background-color: #AF00AF +} + +div.highlight .-Color[class*=-C128] { + color: #AF00D7 +} + +div.highlight .-Color[class*=-BGC128] { + background-color: #AF00D7 +} + +div.highlight .-Color[class*=-C129] { + color: #AF00FF +} + +div.highlight .-Color[class*=-BGC129] { + background-color: #AF00FF +} + +div.highlight .-Color[class*=-C130] { + color: #AF5F00 +} + +div.highlight .-Color[class*=-BGC130] { + background-color: #AF5F00 +} + +div.highlight .-Color[class*=-C131] { + color: #AF5F5F +} + +div.highlight .-Color[class*=-BGC131] { + background-color: #AF5F5F +} + +div.highlight .-Color[class*=-C132] { + color: #AF5F87 +} + +div.highlight .-Color[class*=-BGC132] { + background-color: #AF5F87 +} + +div.highlight .-Color[class*=-C133] { + color: #AF5FAF +} + +div.highlight .-Color[class*=-BGC133] { + background-color: #AF5FAF +} + +div.highlight .-Color[class*=-C134] { + color: #AF5FD7 +} + +div.highlight .-Color[class*=-BGC134] { + background-color: #AF5FD7 +} + +div.highlight .-Color[class*=-C135] { + color: #AF5FFF +} + +div.highlight .-Color[class*=-BGC135] { + background-color: #AF5FFF +} + +div.highlight .-Color[class*=-C136] { + color: #AF8700 +} + +div.highlight .-Color[class*=-BGC136] { + background-color: #AF8700 +} + +div.highlight .-Color[class*=-C137] { + color: #AF875F +} + +div.highlight .-Color[class*=-BGC137] { + background-color: #AF875F +} + +div.highlight .-Color[class*=-C138] { + color: #AF8787 +} + +div.highlight .-Color[class*=-BGC138] { + background-color: #AF8787 +} + +div.highlight .-Color[class*=-C139] { + color: #AF87AF +} + +div.highlight .-Color[class*=-BGC139] { + background-color: #AF87AF +} + +div.highlight .-Color[class*=-C140] { + color: #AF87D7 +} + +div.highlight .-Color[class*=-BGC140] { + background-color: #AF87D7 +} + +div.highlight .-Color[class*=-C141] { + color: #AF87FF +} + +div.highlight .-Color[class*=-BGC141] { + background-color: #AF87FF +} + +div.highlight .-Color[class*=-C142] { + color: #AFAF00 +} + +div.highlight .-Color[class*=-BGC142] { + background-color: #AFAF00 +} + +div.highlight .-Color[class*=-C143] { + color: #AFAF5F +} + +div.highlight .-Color[class*=-BGC143] { + background-color: #AFAF5F +} + +div.highlight .-Color[class*=-C144] { + color: #AFAF87 +} + +div.highlight .-Color[class*=-BGC144] { + background-color: #AFAF87 +} + +div.highlight .-Color[class*=-C145] { + color: #AFAFAF +} + +div.highlight .-Color[class*=-BGC145] { + background-color: #AFAFAF +} + +div.highlight .-Color[class*=-C146] { + color: #AFAFD7 +} + +div.highlight .-Color[class*=-BGC146] { + background-color: #AFAFD7 +} + +div.highlight .-Color[class*=-C147] { + color: #AFAFFF +} + +div.highlight .-Color[class*=-BGC147] { + background-color: #AFAFFF +} + +div.highlight .-Color[class*=-C148] { + color: #AFD700 +} + +div.highlight .-Color[class*=-BGC148] { + background-color: #AFD700 +} + +div.highlight .-Color[class*=-C149] { + color: #AFD75F +} + +div.highlight .-Color[class*=-BGC149] { + background-color: #AFD75F +} + +div.highlight .-Color[class*=-C150] { + color: #AFD787 +} + +div.highlight .-Color[class*=-BGC150] { + background-color: #AFD787 +} + +div.highlight .-Color[class*=-C151] { + color: #AFD7AF +} + +div.highlight .-Color[class*=-BGC151] { + background-color: #AFD7AF +} + +div.highlight .-Color[class*=-C152] { + color: #AFD7D7 +} + +div.highlight .-Color[class*=-BGC152] { + background-color: #AFD7D7 +} + +div.highlight .-Color[class*=-C153] { + color: #AFD7FF +} + +div.highlight .-Color[class*=-BGC153] { + background-color: #AFD7FF +} + +div.highlight .-Color[class*=-C154] { + color: #AFFF00 +} + +div.highlight .-Color[class*=-BGC154] { + background-color: #AFFF00 +} + +div.highlight .-Color[class*=-C155] { + color: #AFFF5F +} + +div.highlight .-Color[class*=-BGC155] { + background-color: #AFFF5F +} + +div.highlight .-Color[class*=-C156] { + color: #AFFF87 +} + +div.highlight .-Color[class*=-BGC156] { + background-color: #AFFF87 +} + +div.highlight .-Color[class*=-C157] { + color: #AFFFAF +} + +div.highlight .-Color[class*=-BGC157] { + background-color: #AFFFAF +} + +div.highlight .-Color[class*=-C158] { + color: #AFFFD7 +} + +div.highlight .-Color[class*=-BGC158] { + background-color: #AFFFD7 +} + +div.highlight .-Color[class*=-C159] { + color: #AFFFFF +} + +div.highlight .-Color[class*=-BGC159] { + background-color: #AFFFFF +} + +div.highlight .-Color[class*=-C160] { + color: #D70000 +} + +div.highlight .-Color[class*=-BGC160] { + background-color: #D70000 +} + +div.highlight .-Color[class*=-C161] { + color: #D7005F +} + +div.highlight .-Color[class*=-BGC161] { + background-color: #D7005F +} + +div.highlight .-Color[class*=-C162] { + color: #D70087 +} + +div.highlight .-Color[class*=-BGC162] { + background-color: #D70087 +} + +div.highlight .-Color[class*=-C163] { + color: #D700AF +} + +div.highlight .-Color[class*=-BGC163] { + background-color: #D700AF +} + +div.highlight .-Color[class*=-C164] { + color: #D700D7 +} + +div.highlight .-Color[class*=-BGC164] { + background-color: #D700D7 +} + +div.highlight .-Color[class*=-C165] { + color: #D700FF +} + +div.highlight .-Color[class*=-BGC165] { + background-color: #D700FF +} + +div.highlight .-Color[class*=-C166] { + color: #D75F00 +} + +div.highlight .-Color[class*=-BGC166] { + background-color: #D75F00 +} + +div.highlight .-Color[class*=-C167] { + color: #D75F5F +} + +div.highlight .-Color[class*=-BGC167] { + background-color: #D75F5F +} + +div.highlight .-Color[class*=-C168] { + color: #D75F87 +} + +div.highlight .-Color[class*=-BGC168] { + background-color: #D75F87 +} + +div.highlight .-Color[class*=-C169] { + color: #D75FAF +} + +div.highlight .-Color[class*=-BGC169] { + background-color: #D75FAF +} + +div.highlight .-Color[class*=-C170] { + color: #D75FD7 +} + +div.highlight .-Color[class*=-BGC170] { + background-color: #D75FD7 +} + +div.highlight .-Color[class*=-C171] { + color: #D75FFF +} + +div.highlight .-Color[class*=-BGC171] { + background-color: #D75FFF +} + +div.highlight .-Color[class*=-C172] { + color: #D78700 +} + +div.highlight .-Color[class*=-BGC172] { + background-color: #D78700 +} + +div.highlight .-Color[class*=-C173] { + color: #D7875F +} + +div.highlight .-Color[class*=-BGC173] { + background-color: #D7875F +} + +div.highlight .-Color[class*=-C174] { + color: #D78787 +} + +div.highlight .-Color[class*=-BGC174] { + background-color: #D78787 +} + +div.highlight .-Color[class*=-C175] { + color: #D787AF +} + +div.highlight .-Color[class*=-BGC175] { + background-color: #D787AF +} + +div.highlight .-Color[class*=-C176] { + color: #D787D7 +} + +div.highlight .-Color[class*=-BGC176] { + background-color: #D787D7 +} + +div.highlight .-Color[class*=-C177] { + color: #D787FF +} + +div.highlight .-Color[class*=-BGC177] { + background-color: #D787FF +} + +div.highlight .-Color[class*=-C178] { + color: #D7AF00 +} + +div.highlight .-Color[class*=-BGC178] { + background-color: #D7AF00 +} + +div.highlight .-Color[class*=-C179] { + color: #D7AF5F +} + +div.highlight .-Color[class*=-BGC179] { + background-color: #D7AF5F +} + +div.highlight .-Color[class*=-C180] { + color: #D7AF87 +} + +div.highlight .-Color[class*=-BGC180] { + background-color: #D7AF87 +} + +div.highlight .-Color[class*=-C181] { + color: #D7AFAF +} + +div.highlight .-Color[class*=-BGC181] { + background-color: #D7AFAF +} + +div.highlight .-Color[class*=-C182] { + color: #D7AFD7 +} + +div.highlight .-Color[class*=-BGC182] { + background-color: #D7AFD7 +} + +div.highlight .-Color[class*=-C183] { + color: #D7AFFF +} + +div.highlight .-Color[class*=-BGC183] { + background-color: #D7AFFF +} + +div.highlight .-Color[class*=-C184] { + color: #D7D700 +} + +div.highlight .-Color[class*=-BGC184] { + background-color: #D7D700 +} + +div.highlight .-Color[class*=-C185] { + color: #D7D75F +} + +div.highlight .-Color[class*=-BGC185] { + background-color: #D7D75F +} + +div.highlight .-Color[class*=-C186] { + color: #D7D787 +} + +div.highlight .-Color[class*=-BGC186] { + background-color: #D7D787 +} + +div.highlight .-Color[class*=-C187] { + color: #D7D7AF +} + +div.highlight .-Color[class*=-BGC187] { + background-color: #D7D7AF +} + +div.highlight .-Color[class*=-C188] { + color: #D7D7D7 +} + +div.highlight .-Color[class*=-BGC188] { + background-color: #D7D7D7 +} + +div.highlight .-Color[class*=-C189] { + color: #D7D7FF +} + +div.highlight .-Color[class*=-BGC189] { + background-color: #D7D7FF +} + +div.highlight .-Color[class*=-C190] { + color: #D7FF00 +} + +div.highlight .-Color[class*=-BGC190] { + background-color: #D7FF00 +} + +div.highlight .-Color[class*=-C191] { + color: #D7FF5F +} + +div.highlight .-Color[class*=-BGC191] { + background-color: #D7FF5F +} + +div.highlight .-Color[class*=-C192] { + color: #D7FF87 +} + +div.highlight .-Color[class*=-BGC192] { + background-color: #D7FF87 +} + +div.highlight .-Color[class*=-C193] { + color: #D7FFAF +} + +div.highlight .-Color[class*=-BGC193] { + background-color: #D7FFAF +} + +div.highlight .-Color[class*=-C194] { + color: #D7FFD7 +} + +div.highlight .-Color[class*=-BGC194] { + background-color: #D7FFD7 +} + +div.highlight .-Color[class*=-C195] { + color: #D7FFFF +} + +div.highlight .-Color[class*=-BGC195] { + background-color: #D7FFFF +} + +div.highlight .-Color[class*=-C196] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC196] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C197] { + color: #FF005F +} + +div.highlight .-Color[class*=-BGC197] { + background-color: #FF005F +} + +div.highlight .-Color[class*=-C198] { + color: #FF0087 +} + +div.highlight .-Color[class*=-BGC198] { + background-color: #FF0087 +} + +div.highlight .-Color[class*=-C199] { + color: #FF00AF +} + +div.highlight .-Color[class*=-BGC199] { + background-color: #FF00AF +} + +div.highlight .-Color[class*=-C200] { + color: #FF00D7 +} + +div.highlight .-Color[class*=-BGC200] { + background-color: #FF00D7 +} + +div.highlight .-Color[class*=-C201] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC201] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C202] { + color: #FF5F00 +} + +div.highlight .-Color[class*=-BGC202] { + background-color: #FF5F00 +} + +div.highlight .-Color[class*=-C203] { + color: #FF5F5F +} + +div.highlight .-Color[class*=-BGC203] { + background-color: #FF5F5F +} + +div.highlight .-Color[class*=-C204] { + color: #FF5F87 +} + +div.highlight .-Color[class*=-BGC204] { + background-color: #FF5F87 +} + +div.highlight .-Color[class*=-C205] { + color: #FF5FAF +} + +div.highlight .-Color[class*=-BGC205] { + background-color: #FF5FAF +} + +div.highlight .-Color[class*=-C206] { + color: #FF5FD7 +} + +div.highlight .-Color[class*=-BGC206] { + background-color: #FF5FD7 +} + +div.highlight .-Color[class*=-C207] { + color: #FF5FFF +} + +div.highlight .-Color[class*=-BGC207] { + background-color: #FF5FFF +} + +div.highlight .-Color[class*=-C208] { + color: #FF8700 +} + +div.highlight .-Color[class*=-BGC208] { + background-color: #FF8700 +} + +div.highlight .-Color[class*=-C209] { + color: #FF875F +} + +div.highlight .-Color[class*=-BGC209] { + background-color: #FF875F +} + +div.highlight .-Color[class*=-C210] { + color: #FF8787 +} + +div.highlight .-Color[class*=-BGC210] { + background-color: #FF8787 +} + +div.highlight .-Color[class*=-C211] { + color: #FF87AF +} + +div.highlight .-Color[class*=-BGC211] { + background-color: #FF87AF +} + +div.highlight .-Color[class*=-C212] { + color: #FF87D7 +} + +div.highlight .-Color[class*=-BGC212] { + background-color: #FF87D7 +} + +div.highlight .-Color[class*=-C213] { + color: #FF87FF +} + +div.highlight .-Color[class*=-BGC213] { + background-color: #FF87FF +} + +div.highlight .-Color[class*=-C214] { + color: #FFAF00 +} + +div.highlight .-Color[class*=-BGC214] { + background-color: #FFAF00 +} + +div.highlight .-Color[class*=-C215] { + color: #FFAF5F +} + +div.highlight .-Color[class*=-BGC215] { + background-color: #FFAF5F +} + +div.highlight .-Color[class*=-C216] { + color: #FFAF87 +} + +div.highlight .-Color[class*=-BGC216] { + background-color: #FFAF87 +} + +div.highlight .-Color[class*=-C217] { + color: #FFAFAF +} + +div.highlight .-Color[class*=-BGC217] { + background-color: #FFAFAF +} + +div.highlight .-Color[class*=-C218] { + color: #FFAFD7 +} + +div.highlight .-Color[class*=-BGC218] { + background-color: #FFAFD7 +} + +div.highlight .-Color[class*=-C219] { + color: #FFAFFF +} + +div.highlight .-Color[class*=-BGC219] { + background-color: #FFAFFF +} + +div.highlight .-Color[class*=-C220] { + color: #FFD700 +} + +div.highlight .-Color[class*=-BGC220] { + background-color: #FFD700 +} + +div.highlight .-Color[class*=-C221] { + color: #FFD75F +} + +div.highlight .-Color[class*=-BGC221] { + background-color: #FFD75F +} + +div.highlight .-Color[class*=-C222] { + color: #FFD787 +} + +div.highlight .-Color[class*=-BGC222] { + background-color: #FFD787 +} + +div.highlight .-Color[class*=-C223] { + color: #FFD7AF +} + +div.highlight .-Color[class*=-BGC223] { + background-color: #FFD7AF +} + +div.highlight .-Color[class*=-C224] { + color: #FFD7D7 +} + +div.highlight .-Color[class*=-BGC224] { + background-color: #FFD7D7 +} + +div.highlight .-Color[class*=-C225] { + color: #FFD7FF +} + +div.highlight .-Color[class*=-BGC225] { + background-color: #FFD7FF +} + +div.highlight .-Color[class*=-C226] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC226] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C227] { + color: #FFFF5F +} + +div.highlight .-Color[class*=-BGC227] { + background-color: #FFFF5F +} + +div.highlight .-Color[class*=-C228] { + color: #FFFF87 +} + +div.highlight .-Color[class*=-BGC228] { + background-color: #FFFF87 +} + +div.highlight .-Color[class*=-C229] { + color: #FFFFAF +} + +div.highlight .-Color[class*=-BGC229] { + background-color: #FFFFAF +} + +div.highlight .-Color[class*=-C230] { + color: #FFFFD7 +} + +div.highlight .-Color[class*=-BGC230] { + background-color: #FFFFD7 +} + +div.highlight .-Color[class*=-C231] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC231] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C232] { + color: #080808 +} + +div.highlight .-Color[class*=-BGC232] { + background-color: #080808 +} + +div.highlight .-Color[class*=-C233] { + color: #121212 +} + +div.highlight .-Color[class*=-BGC233] { + background-color: #121212 +} + +div.highlight .-Color[class*=-C234] { + color: #1C1C1C +} + +div.highlight .-Color[class*=-BGC234] { + background-color: #1C1C1C +} + +div.highlight .-Color[class*=-C235] { + color: #262626 +} + +div.highlight .-Color[class*=-BGC235] { + background-color: #262626 +} + +div.highlight .-Color[class*=-C236] { + color: #303030 +} + +div.highlight .-Color[class*=-BGC236] { + background-color: #303030 +} + +div.highlight .-Color[class*=-C237] { + color: #3A3A3A +} + +div.highlight .-Color[class*=-BGC237] { + background-color: #3A3A3A +} + +div.highlight .-Color[class*=-C238] { + color: #444444 +} + +div.highlight .-Color[class*=-BGC238] { + background-color: #444444 +} + +div.highlight .-Color[class*=-C239] { + color: #4E4E4E +} + +div.highlight .-Color[class*=-BGC239] { + background-color: #4E4E4E +} + +div.highlight .-Color[class*=-C240] { + color: #585858 +} + +div.highlight .-Color[class*=-BGC240] { + background-color: #585858 +} + +div.highlight .-Color[class*=-C241] { + color: #626262 +} + +div.highlight .-Color[class*=-BGC241] { + background-color: #626262 +} + +div.highlight .-Color[class*=-C242] { + color: #6C6C6C +} + +div.highlight .-Color[class*=-BGC242] { + background-color: #6C6C6C +} + +div.highlight .-Color[class*=-C243] { + color: #767676 +} + +div.highlight .-Color[class*=-BGC243] { + background-color: #767676 +} + +div.highlight .-Color[class*=-C244] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC244] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C245] { + color: #8A8A8A +} + +div.highlight .-Color[class*=-BGC245] { + background-color: #8A8A8A +} + +div.highlight .-Color[class*=-C246] { + color: #949494 +} + +div.highlight .-Color[class*=-BGC246] { + background-color: #949494 +} + +div.highlight .-Color[class*=-C247] { + color: #9E9E9E +} + +div.highlight .-Color[class*=-BGC247] { + background-color: #9E9E9E +} + +div.highlight .-Color[class*=-C248] { + color: #A8A8A8 +} + +div.highlight .-Color[class*=-BGC248] { + background-color: #A8A8A8 +} + +div.highlight .-Color[class*=-C249] { + color: #B2B2B2 +} + +div.highlight .-Color[class*=-BGC249] { + background-color: #B2B2B2 +} + +div.highlight .-Color[class*=-C250] { + color: #BCBCBC +} + +div.highlight .-Color[class*=-BGC250] { + background-color: #BCBCBC +} + +div.highlight .-Color[class*=-C251] { + color: #C6C6C6 +} + +div.highlight .-Color[class*=-BGC251] { + background-color: #C6C6C6 +} + +div.highlight .-Color[class*=-C252] { + color: #D0D0D0 +} + +div.highlight .-Color[class*=-BGC252] { + background-color: #D0D0D0 +} + +div.highlight .-Color[class*=-C253] { + color: #DADADA +} + +div.highlight .-Color[class*=-BGC253] { + background-color: #DADADA +} + +div.highlight .-Color[class*=-C254] { + color: #E4E4E4 +} + +div.highlight .-Color[class*=-BGC254] { + background-color: #E4E4E4 +} + +div.highlight .-Color[class*=-C255] { + color: #EEEEEE +} + +div.highlight .-Color[class*=-BGC255] { + background-color: #EEEEEE +} diff --git a/_static/ncar_logo.png b/_static/ncar_logo.png new file mode 100644 index 000000000..f6981cef3 Binary files /dev/null and b/_static/ncar_logo.png differ diff --git a/_static/play-solid.svg b/_static/play-solid.svg new file mode 100644 index 000000000..bcd81f7a6 --- /dev/null +++ b/_static/play-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 000000000..012e6a00a --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #fae4c2 } +html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } +html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #a12236 } /* Error */ +html[data-theme="light"] .highlight .k { color: #6730c5 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #7f4707 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ +html[data-theme="light"] .highlight .o { color: #00622f } /* Operator */ +html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #005b82 } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #005b82 } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #005b82 } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #6730c5 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #6730c5 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #6730c5 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #6730c5 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #6730c5 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #7f4707 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #7f4707 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #7f4707 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #00622f } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #7f4707 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #005b82 } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #005b82 } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #7f4707 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #00622f } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #6730c5 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #005b82 } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #7f4707 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #005b82 } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #005b82 } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #a12236 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #6730c5 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #7f4707 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #7f4707 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #7f4707 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #7f4707 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #7f4707 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #00622f } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #00622f } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #00622f } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #00622f } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #00622f } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #00622f } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #00622f } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #00622f } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #00622f } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #00622f } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #a12236 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #00622f } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #005b82 } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #7f4707 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #005b82 } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #a12236 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #a12236 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #a12236 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #7f4707 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #7f4707 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } +html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ +html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/sbt-webpack-macros.html b/_static/sbt-webpack-macros.html new file mode 100644 index 000000000..6cbf559fa --- /dev/null +++ b/_static/sbt-webpack-macros.html @@ -0,0 +1,11 @@ + +{% macro head_pre_bootstrap() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} diff --git a/_static/scripts/bootstrap.js b/_static/scripts/bootstrap.js new file mode 100644 index 000000000..c8178debb --- /dev/null +++ b/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>li,Collapse:()=>Ei,Dropdown:()=>Ki,Modal:()=>Ln,Offcanvas:()=>Kn,Popover:()=>bs,ScrollSpy:()=>Ls,Tab:()=>Js,Toast:()=>po,Tooltip:()=>fs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];S(s)&&x(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function B(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=X(T,O,C),k=f;i.modifiersData[a]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:I(e.placement),variation:Z(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var nt={passive:!0};const st={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function vt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=Ft(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ye=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>Mt(t))).join(","):null},we={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Fe=".bs.carousel",He=".data-api",Be="ArrowLeft",We="ArrowRight",ze="next",Re="prev",qe="left",Ve="right",Ye=`slide${Fe}`,Ke=`slid${Fe}`,Qe=`keydown${Fe}`,Xe=`mouseenter${Fe}`,Ue=`mouseleave${Fe}`,Ge=`dragstart${Fe}`,Je=`load${Fe}${He}`,Ze=`click${Fe}${He}`,ti="carousel",ei="active",ii=".active",ni=".carousel-item",si=ii+ni,oi={[Be]:Ve,[We]:qe},ri={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ai={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class li extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===ti&&this.cycle()}static get Default(){return ri}static get DefaultType(){return ai}static get NAME(){return"carousel"}next(){this._slide(ze)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(Re)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ke,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ke,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ze:Re;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&fe.on(this._element,Qe,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Xe,(()=>this.pause())),fe.on(this._element,Ue,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Ge,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(qe)),rightCallback:()=>this._slide(this._directionToOrder(Ve)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=oi[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=we.findOne(ii,this._indicatorsElement);e.classList.remove(ei),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(ei),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ze,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Ye).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(ei),i.classList.remove(ei,c,l),this._isSliding=!1,r(Ke)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(si,this._element)}_getItems(){return we.find(ni,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===qe?Re:ze:t===qe?ze:Re}_orderToDirection(t){return Kt()?t===Re?qe:Ve:t===Re?Ve:qe}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}fe.on(document,Ze,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(ti))return;t.preventDefault();const i=li.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Je,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)li.getOrCreateInstance(e)})),Qt(li);const ci=".bs.collapse",hi=`show${ci}`,di=`shown${ci}`,ui=`hide${ci}`,fi=`hidden${ci}`,pi=`click${ci}.data-api`,mi="show",gi="collapse",_i="collapsing",bi=`:scope .${gi} .${gi}`,vi='[data-bs-toggle="collapse"]',yi={parent:null,toggle:!0},wi={parent:"(null|element)",toggle:"boolean"};class Ei extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(vi);for(const t of i){const e=we.getSelectorFromElement(t),i=we.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return yi}static get DefaultType(){return wi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Ei.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,hi).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(gi),this._element.classList.add(_i),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi,mi),this._element.style[e]="",fe.trigger(this._element,di)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,ui).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(_i),this._element.classList.remove(gi,mi);for(const t of this._triggerArray){const e=we.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi),fe.trigger(this._element,fi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(mi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(vi);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(bi,this._config.parent);return we.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Ei.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,pi,vi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))Ei.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(Ei);const Ai="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",Mi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ji=`${Mi}.${Pi}`,Fi=".dropdown-menu",Hi=Kt()?"top-end":"top-start",Bi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",zi=Kt()?"bottom-start":"bottom-end",Ri=Kt()?"left-start":"right-start",qi=Kt()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Yi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Ki extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Fi)[0]||we.prev(this._element,Fi)[0]||we.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Yi}static get NAME(){return Ai}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),fe.trigger(this._element,Di,t)}}hide(){if(Wt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!fe.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ai.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Bi:Hi:e?zi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ki.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=we.find(ji);for(const i of e){const e=Ki.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Mi)?this:we.prev(this,Mi)[0]||we.next(this,Mi)[0]||we.findOne(Mi,t.delegateTarget.parentNode),o=Ki.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Ii,Mi,Ki.dataApiKeydownHandler),fe.on(document,Ii,Fi,Ki.dataApiKeydownHandler),fe.on(document,$i,Ki.clearMenus),fe.on(document,Ni,Ki.clearMenus),fe.on(document,$i,Mi,(function(t){t.preventDefault(),Ki.getOrCreateInstance(this).toggle()})),Qt(Ki);const Qi="backdrop",Xi="show",Ui=`mousedown.bs.${Qi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Qi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Xi),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Xi),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Ui,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,tn),fe.on(document,en,(t=>this._handleFocusin(t))),fe.on(document,nn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,(e=>e+t)),this._setElementAttributes(ln,hn,(e=>e+t)),this._setElementAttributes(cn,dn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,En=`keydown.dismiss${fn}`,An=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,fn),fe.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(Cn),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,bn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,En,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,vn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,wn,(t=>{fe.one(this._element,yn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,gn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback((()=>{this._element.classList.remove(On),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,An,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,_n,(t=>{t.defaultPrevented||fe.one(e,gn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)})),Ee(Ln),Qt(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",Mn=".offcanvas.show",jn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Bn=`hidePrevented${Sn}`,Wn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Yn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Kn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Yn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,jn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),fe.trigger(this._element,Fn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),fe.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Bn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){fe.on(this._element,qn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Bn))}))}static jQueryInterface(t){return this.each((function(){const e=Kn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}fe.on(document,Rn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Wn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Mn);i&&i!==e&&Kn.getInstance(i).hide(),Kn.getOrCreateInstance(e).toggle(this)})),fe.on(window,$n,(()=>{for(const t of we.find(Mn))Kn.getOrCreateInstance(t).show()})),fe.on(window,zn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Kn.getOrCreateInstance(t).hide()})),Ee(Kn),Qt(Kn);const Qn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Xn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Jn={allowList:Qn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ds={allowList:Qn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},us={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class fs extends ve{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return ds}static get DefaultType(){return us}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),fe.off(this._element.closest(rs),as,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=hs[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Xt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=_e.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".popover-header",ms=".popover-body",gs={...fs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},_s={...fs.DefaultType,content:"(null|string|element|function)"};class bs extends fs{static get Default(){return gs}static get DefaultType(){return _s}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ps]:this._getTitle(),[ms]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=bs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(bs);const vs=".bs.scrollspy",ys=`activate${vs}`,ws=`click${vs}`,Es=`load${vs}.data-api`,As="active",Ts="[href]",Cs=".nav-link",Os=`${Cs}, .nav-item > ${Cs}, .list-group-item`,xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ks={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ls extends ve{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return xs}static get DefaultType(){return ks}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(fe.off(this._config.target,ws),fe.on(this._config.target,ws,Ts,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=we.find(Ts,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(As),this._activateParents(t),fe.trigger(this._element,ys,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(As);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,Os))t.classList.add(As)}_clearActiveClass(t){t.classList.remove(As);const e=we.find(`${Ts}.${As}`,t);for(const t of e)t.classList.remove(As)}static jQueryInterface(t){return this.each((function(){const e=Ls.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(window,Es,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ls.getOrCreateInstance(t)})),Qt(Ls);const Ss=".bs.tab",Ds=`hide${Ss}`,$s=`hidden${Ss}`,Is=`show${Ss}`,Ns=`shown${Ss}`,Ps=`click${Ss}`,Ms=`keydown${Ss}`,js=`load${Ss}`,Fs="ArrowLeft",Hs="ArrowRight",Bs="ArrowUp",Ws="ArrowDown",zs="Home",Rs="End",qs="active",Vs="fade",Ys="show",Ks=".dropdown-toggle",Qs=`:not(${Ks})`,Xs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Us=`.nav-link${Qs}, .list-group-item${Qs}, [role="tab"]${Qs}, ${Xs}`,Gs=`.${qs}[data-bs-toggle="tab"], .${qs}[data-bs-toggle="pill"], .${qs}[data-bs-toggle="list"]`;class Js extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ms,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?fe.trigger(e,Ds,{relatedTarget:t}):null;fe.trigger(t,Is,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(qs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ns,{relatedTarget:e})):t.classList.add(Ys)}),t,t.classList.contains(Vs)))}_deactivate(t,e){t&&(t.classList.remove(qs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,$s,{relatedTarget:e})):t.classList.remove(Ys)}),t,t.classList.contains(Vs)))}_keydown(t){if(![Fs,Hs,Bs,Ws,zs,Rs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([zs,Rs].includes(t.key))i=e[t.key===zs?0:e.length-1];else{const n=[Hs,Ws].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Js.getOrCreateInstance(i).show())}_getChildren(){return we.find(Us,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=we.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ks,qs),n(".dropdown-menu",Ys),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(qs)}_getInnerElement(t){return t.matches(Us)?t:we.findOne(Us,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Js.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ps,Xs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Js.getOrCreateInstance(this).show()})),fe.on(window,js,(()=>{for(const t of we.find(Gs))Js.getOrCreateInstance(t)})),Qt(Js);const Zs=".bs.toast",to=`mouseover${Zs}`,eo=`mouseout${Zs}`,io=`focusin${Zs}`,no=`focusout${Zs}`,so=`hide${Zs}`,oo=`hidden${Zs}`,ro=`show${Zs}`,ao=`shown${Zs}`,lo="hide",co="show",ho="showing",uo={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class po extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return uo}static get NAME(){return"toast"}show(){fe.trigger(this._element,ro).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(lo),qt(this._element),this._element.classList.add(co,ho),this._queueCallback((()=>{this._element.classList.remove(ho),fe.trigger(this._element,ao),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,so).defaultPrevented||(this._element.classList.add(ho),this._queueCallback((()=>{this._element.classList.add(lo),this._element.classList.remove(ho,co),fe.trigger(this._element,oo)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(co),super.dispose()}isShown(){return this._element.classList.contains(co)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){fe.on(this._element,to,(t=>this._onInteraction(t,!0))),fe.on(this._element,eo,(t=>this._onInteraction(t,!1))),fe.on(this._element,io,(t=>this._onInteraction(t,!0))),fe.on(this._element,no,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=po.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function mo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(po),Qt(po),mo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new fs(t,{delay:{show:500,hide:100}})}))})),mo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),mo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))})),window.bootstrap=i})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/_static/scripts/bootstrap.js.LICENSE.txt b/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 000000000..28755c2c5 --- /dev/null +++ b/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/_static/scripts/bootstrap.js.map b/_static/scripts/bootstrap.js.map new file mode 100644 index 000000000..e9e815891 --- /dev/null +++ b/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":";mBACA,IAAIA,EAAsB,CCA1BA,EAAwB,CAACC,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXF,EAAoBI,EAAEF,EAAYC,KAASH,EAAoBI,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDH,EAAwB,CAACS,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFV,EAAyBC,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,01BCLvD,IAAI,EAAM,MACNC,EAAS,SACTC,EAAQ,QACRC,EAAO,OACPC,EAAO,OACPC,EAAiB,CAAC,EAAKJ,EAAQC,EAAOC,GACtCG,EAAQ,QACRC,EAAM,MACNC,EAAkB,kBAClBC,EAAW,WACXC,EAAS,SACTC,EAAY,YACZC,EAAmCP,EAAeQ,QAAO,SAAUC,EAAKC,GACjF,OAAOD,EAAIE,OAAO,CAACD,EAAY,IAAMT,EAAOS,EAAY,IAAMR,GAChE,GAAG,IACQ,EAA0B,GAAGS,OAAOX,EAAgB,CAACD,IAAOS,QAAO,SAAUC,EAAKC,GAC3F,OAAOD,EAAIE,OAAO,CAACD,EAAWA,EAAY,IAAMT,EAAOS,EAAY,IAAMR,GAC3E,GAAG,IAEQU,EAAa,aACbC,EAAO,OACPC,EAAY,YAEZC,EAAa,aACbC,EAAO,OACPC,EAAY,YAEZC,EAAc,cACdC,EAAQ,QACRC,EAAa,aACbC,EAAiB,CAACT,EAAYC,EAAMC,EAAWC,EAAYC,EAAMC,EAAWC,EAAaC,EAAOC,GC9B5F,SAASE,EAAYC,GAClC,OAAOA,GAAWA,EAAQC,UAAY,IAAIC,cAAgB,IAC5D,CCFe,SAASC,EAAUC,GAChC,GAAY,MAARA,EACF,OAAOC,OAGT,GAAwB,oBAApBD,EAAKE,WAAkC,CACzC,IAAIC,EAAgBH,EAAKG,cACzB,OAAOA,GAAgBA,EAAcC,aAAwBH,MAC/D,CAEA,OAAOD,CACT,CCTA,SAASK,EAAUL,GAEjB,OAAOA,aADUD,EAAUC,GAAMM,SACIN,aAAgBM,OACvD,CAEA,SAASC,EAAcP,GAErB,OAAOA,aADUD,EAAUC,GAAMQ,aACIR,aAAgBQ,WACvD,CAEA,SAASC,EAAaT,GAEpB,MAA0B,oBAAfU,aAKJV,aADUD,EAAUC,GAAMU,YACIV,aAAgBU,WACvD,CCwDA,SACEC,KAAM,cACNC,SAAS,EACTC,MAAO,QACPC,GA5EF,SAAqBC,GACnB,IAAIC,EAAQD,EAAKC,MACjB3D,OAAO4D,KAAKD,EAAME,UAAUC,SAAQ,SAAUR,GAC5C,IAAIS,EAAQJ,EAAMK,OAAOV,IAAS,CAAC,EAC/BW,EAAaN,EAAMM,WAAWX,IAAS,CAAC,EACxCf,EAAUoB,EAAME,SAASP,GAExBJ,EAAcX,IAAaD,EAAYC,KAO5CvC,OAAOkE,OAAO3B,EAAQwB,MAAOA,GAC7B/D,OAAO4D,KAAKK,GAAYH,SAAQ,SAAUR,GACxC,IAAI3C,EAAQsD,EAAWX,IAET,IAAV3C,EACF4B,EAAQ4B,gBAAgBb,GAExBf,EAAQ6B,aAAad,GAAgB,IAAV3C,EAAiB,GAAKA,EAErD,IACF,GACF,EAoDE0D,OAlDF,SAAgBC,GACd,IAAIX,EAAQW,EAAMX,MACdY,EAAgB,CAClBlD,OAAQ,CACNmD,SAAUb,EAAMc,QAAQC,SACxB5D,KAAM,IACN6D,IAAK,IACLC,OAAQ,KAEVC,MAAO,CACLL,SAAU,YAEZlD,UAAW,CAAC,GASd,OAPAtB,OAAOkE,OAAOP,EAAME,SAASxC,OAAO0C,MAAOQ,EAAclD,QACzDsC,EAAMK,OAASO,EAEXZ,EAAME,SAASgB,OACjB7E,OAAOkE,OAAOP,EAAME,SAASgB,MAAMd,MAAOQ,EAAcM,OAGnD,WACL7E,OAAO4D,KAAKD,EAAME,UAAUC,SAAQ,SAAUR,GAC5C,IAAIf,EAAUoB,EAAME,SAASP,GACzBW,EAAaN,EAAMM,WAAWX,IAAS,CAAC,EAGxCS,EAFkB/D,OAAO4D,KAAKD,EAAMK,OAAOzD,eAAe+C,GAAQK,EAAMK,OAAOV,GAAQiB,EAAcjB,IAE7E9B,QAAO,SAAUuC,EAAOe,GAElD,OADAf,EAAMe,GAAY,GACXf,CACT,GAAG,CAAC,GAECb,EAAcX,IAAaD,EAAYC,KAI5CvC,OAAOkE,OAAO3B,EAAQwB,MAAOA,GAC7B/D,OAAO4D,KAAKK,GAAYH,SAAQ,SAAUiB,GACxCxC,EAAQ4B,gBAAgBY,EAC1B,IACF,GACF,CACF,EASEC,SAAU,CAAC,kBCjFE,SAASC,EAAiBvD,GACvC,OAAOA,EAAUwD,MAAM,KAAK,EAC9B,CCHO,IAAI,EAAMC,KAAKC,IACX,EAAMD,KAAKE,IACXC,EAAQH,KAAKG,MCFT,SAASC,IACtB,IAAIC,EAASC,UAAUC,cAEvB,OAAc,MAAVF,GAAkBA,EAAOG,QAAUC,MAAMC,QAAQL,EAAOG,QACnDH,EAAOG,OAAOG,KAAI,SAAUC,GACjC,OAAOA,EAAKC,MAAQ,IAAMD,EAAKE,OACjC,IAAGC,KAAK,KAGHT,UAAUU,SACnB,CCTe,SAASC,IACtB,OAAQ,iCAAiCC,KAAKd,IAChD,CCCe,SAASe,EAAsB/D,EAASgE,EAAcC,QAC9C,IAAjBD,IACFA,GAAe,QAGO,IAApBC,IACFA,GAAkB,GAGpB,IAAIC,EAAalE,EAAQ+D,wBACrBI,EAAS,EACTC,EAAS,EAETJ,GAAgBrD,EAAcX,KAChCmE,EAASnE,EAAQqE,YAAc,GAAItB,EAAMmB,EAAWI,OAAStE,EAAQqE,aAAmB,EACxFD,EAASpE,EAAQuE,aAAe,GAAIxB,EAAMmB,EAAWM,QAAUxE,EAAQuE,cAAoB,GAG7F,IACIE,GADOhE,EAAUT,GAAWG,EAAUH,GAAWK,QAC3BoE,eAEtBC,GAAoBb,KAAsBI,EAC1CU,GAAKT,EAAW3F,MAAQmG,GAAoBD,EAAiBA,EAAeG,WAAa,IAAMT,EAC/FU,GAAKX,EAAW9B,KAAOsC,GAAoBD,EAAiBA,EAAeK,UAAY,IAAMV,EAC7FE,EAAQJ,EAAWI,MAAQH,EAC3BK,EAASN,EAAWM,OAASJ,EACjC,MAAO,CACLE,MAAOA,EACPE,OAAQA,EACRpC,IAAKyC,EACLvG,MAAOqG,EAAIL,EACXjG,OAAQwG,EAAIL,EACZjG,KAAMoG,EACNA,EAAGA,EACHE,EAAGA,EAEP,CCrCe,SAASE,EAAc/E,GACpC,IAAIkE,EAAaH,EAAsB/D,GAGnCsE,EAAQtE,EAAQqE,YAChBG,EAASxE,EAAQuE,aAUrB,OARI3B,KAAKoC,IAAId,EAAWI,MAAQA,IAAU,IACxCA,EAAQJ,EAAWI,OAGjB1B,KAAKoC,IAAId,EAAWM,OAASA,IAAW,IAC1CA,EAASN,EAAWM,QAGf,CACLG,EAAG3E,EAAQ4E,WACXC,EAAG7E,EAAQ8E,UACXR,MAAOA,EACPE,OAAQA,EAEZ,CCvBe,SAASS,EAASC,EAAQC,GACvC,IAAIC,EAAWD,EAAME,aAAeF,EAAME,cAE1C,GAAIH,EAAOD,SAASE,GAClB,OAAO,EAEJ,GAAIC,GAAYvE,EAAauE,GAAW,CACzC,IAAIE,EAAOH,EAEX,EAAG,CACD,GAAIG,GAAQJ,EAAOK,WAAWD,GAC5B,OAAO,EAITA,EAAOA,EAAKE,YAAcF,EAAKG,IACjC,OAASH,EACX,CAGF,OAAO,CACT,CCrBe,SAAS,EAAiBtF,GACvC,OAAOG,EAAUH,GAAS0F,iBAAiB1F,EAC7C,CCFe,SAAS2F,EAAe3F,GACrC,MAAO,CAAC,QAAS,KAAM,MAAM4F,QAAQ7F,EAAYC,KAAa,CAChE,CCFe,SAAS6F,EAAmB7F,GAEzC,QAASS,EAAUT,GAAWA,EAAQO,cACtCP,EAAQ8F,WAAazF,OAAOyF,UAAUC,eACxC,CCFe,SAASC,EAAchG,GACpC,MAA6B,SAAzBD,EAAYC,GACPA,EAMPA,EAAQiG,cACRjG,EAAQwF,aACR3E,EAAab,GAAWA,EAAQyF,KAAO,OAEvCI,EAAmB7F,EAGvB,CCVA,SAASkG,EAAoBlG,GAC3B,OAAKW,EAAcX,IACoB,UAAvC,EAAiBA,GAASiC,SAInBjC,EAAQmG,aAHN,IAIX,CAwCe,SAASC,EAAgBpG,GAItC,IAHA,IAAIK,EAASF,EAAUH,GACnBmG,EAAeD,EAAoBlG,GAEhCmG,GAAgBR,EAAeQ,IAA6D,WAA5C,EAAiBA,GAAclE,UACpFkE,EAAeD,EAAoBC,GAGrC,OAAIA,IAA+C,SAA9BpG,EAAYoG,IAA0D,SAA9BpG,EAAYoG,IAAwE,WAA5C,EAAiBA,GAAclE,UAC3H5B,EAGF8F,GAhDT,SAA4BnG,GAC1B,IAAIqG,EAAY,WAAWvC,KAAKd,KAGhC,GAFW,WAAWc,KAAKd,MAEfrC,EAAcX,IAII,UAFX,EAAiBA,GAEnBiC,SACb,OAAO,KAIX,IAAIqE,EAAcN,EAAchG,GAMhC,IAJIa,EAAayF,KACfA,EAAcA,EAAYb,MAGrB9E,EAAc2F,IAAgB,CAAC,OAAQ,QAAQV,QAAQ7F,EAAYuG,IAAgB,GAAG,CAC3F,IAAIC,EAAM,EAAiBD,GAI3B,GAAsB,SAAlBC,EAAIC,WAA4C,SAApBD,EAAIE,aAA0C,UAAhBF,EAAIG,UAAiF,IAA1D,CAAC,YAAa,eAAed,QAAQW,EAAII,aAAsBN,GAAgC,WAAnBE,EAAII,YAA2BN,GAAaE,EAAIK,QAAyB,SAAfL,EAAIK,OACjO,OAAON,EAEPA,EAAcA,EAAYd,UAE9B,CAEA,OAAO,IACT,CAgByBqB,CAAmB7G,IAAYK,CACxD,CCpEe,SAASyG,EAAyB3H,GAC/C,MAAO,CAAC,MAAO,UAAUyG,QAAQzG,IAAc,EAAI,IAAM,GAC3D,CCDO,SAAS4H,EAAOjE,EAAK1E,EAAOyE,GACjC,OAAO,EAAQC,EAAK,EAAQ1E,EAAOyE,GACrC,CCFe,SAASmE,EAAmBC,GACzC,OAAOxJ,OAAOkE,OAAO,CAAC,ECDf,CACLS,IAAK,EACL9D,MAAO,EACPD,OAAQ,EACRE,KAAM,GDHuC0I,EACjD,CEHe,SAASC,EAAgB9I,EAAOiD,GAC7C,OAAOA,EAAKpC,QAAO,SAAUkI,EAAS5J,GAEpC,OADA4J,EAAQ5J,GAAOa,EACR+I,CACT,GAAG,CAAC,EACN,CC4EA,SACEpG,KAAM,QACNC,SAAS,EACTC,MAAO,OACPC,GApEF,SAAeC,GACb,IAAIiG,EAEAhG,EAAQD,EAAKC,MACbL,EAAOI,EAAKJ,KACZmB,EAAUf,EAAKe,QACfmF,EAAejG,EAAME,SAASgB,MAC9BgF,EAAgBlG,EAAMmG,cAAcD,cACpCE,EAAgB9E,EAAiBtB,EAAMjC,WACvCsI,EAAOX,EAAyBU,GAEhCE,EADa,CAACnJ,EAAMD,GAAOsH,QAAQ4B,IAAkB,EAClC,SAAW,QAElC,GAAKH,GAAiBC,EAAtB,CAIA,IAAIL,EAxBgB,SAAyBU,EAASvG,GAItD,OAAO4F,EAAsC,iBAH7CW,EAA6B,mBAAZA,EAAyBA,EAAQlK,OAAOkE,OAAO,CAAC,EAAGP,EAAMwG,MAAO,CAC/EzI,UAAWiC,EAAMjC,aACbwI,GACkDA,EAAUT,EAAgBS,EAASlJ,GAC7F,CAmBsBoJ,CAAgB3F,EAAQyF,QAASvG,GACjD0G,EAAY/C,EAAcsC,GAC1BU,EAAmB,MAATN,EAAe,EAAMlJ,EAC/ByJ,EAAmB,MAATP,EAAepJ,EAASC,EAClC2J,EAAU7G,EAAMwG,MAAM7I,UAAU2I,GAAOtG,EAAMwG,MAAM7I,UAAU0I,GAAQH,EAAcG,GAAQrG,EAAMwG,MAAM9I,OAAO4I,GAC9GQ,EAAYZ,EAAcG,GAAQrG,EAAMwG,MAAM7I,UAAU0I,GACxDU,EAAoB/B,EAAgBiB,GACpCe,EAAaD,EAA6B,MAATV,EAAeU,EAAkBE,cAAgB,EAAIF,EAAkBG,aAAe,EAAI,EAC3HC,EAAoBN,EAAU,EAAIC,EAAY,EAG9CpF,EAAMmE,EAAcc,GACpBlF,EAAMuF,EAAaN,EAAUJ,GAAOT,EAAce,GAClDQ,EAASJ,EAAa,EAAIN,EAAUJ,GAAO,EAAIa,EAC/CE,EAAS1B,EAAOjE,EAAK0F,EAAQ3F,GAE7B6F,EAAWjB,EACfrG,EAAMmG,cAAcxG,KAASqG,EAAwB,CAAC,GAAyBsB,GAAYD,EAAQrB,EAAsBuB,aAAeF,EAASD,EAAQpB,EAnBzJ,CAoBF,EAkCEtF,OAhCF,SAAgBC,GACd,IAAIX,EAAQW,EAAMX,MAEdwH,EADU7G,EAAMG,QACWlC,QAC3BqH,OAAoC,IAArBuB,EAA8B,sBAAwBA,EAErD,MAAhBvB,IAKwB,iBAAjBA,IACTA,EAAejG,EAAME,SAASxC,OAAO+J,cAAcxB,MAOhDpC,EAAS7D,EAAME,SAASxC,OAAQuI,KAIrCjG,EAAME,SAASgB,MAAQ+E,EACzB,EASE5E,SAAU,CAAC,iBACXqG,iBAAkB,CAAC,oBCxFN,SAASC,EAAa5J,GACnC,OAAOA,EAAUwD,MAAM,KAAK,EAC9B,CCOA,IAAIqG,GAAa,CACf5G,IAAK,OACL9D,MAAO,OACPD,OAAQ,OACRE,KAAM,QAeD,SAAS0K,GAAYlH,GAC1B,IAAImH,EAEApK,EAASiD,EAAMjD,OACfqK,EAAapH,EAAMoH,WACnBhK,EAAY4C,EAAM5C,UAClBiK,EAAYrH,EAAMqH,UAClBC,EAAUtH,EAAMsH,QAChBpH,EAAWF,EAAME,SACjBqH,EAAkBvH,EAAMuH,gBACxBC,EAAWxH,EAAMwH,SACjBC,EAAezH,EAAMyH,aACrBC,EAAU1H,EAAM0H,QAChBC,EAAaL,EAAQ1E,EACrBA,OAAmB,IAAf+E,EAAwB,EAAIA,EAChCC,EAAaN,EAAQxE,EACrBA,OAAmB,IAAf8E,EAAwB,EAAIA,EAEhCC,EAAgC,mBAAjBJ,EAA8BA,EAAa,CAC5D7E,EAAGA,EACHE,IACG,CACHF,EAAGA,EACHE,GAGFF,EAAIiF,EAAMjF,EACVE,EAAI+E,EAAM/E,EACV,IAAIgF,EAAOR,EAAQrL,eAAe,KAC9B8L,EAAOT,EAAQrL,eAAe,KAC9B+L,EAAQxL,EACRyL,EAAQ,EACRC,EAAM5J,OAEV,GAAIkJ,EAAU,CACZ,IAAIpD,EAAeC,EAAgBtH,GAC/BoL,EAAa,eACbC,EAAY,cAEZhE,IAAiBhG,EAAUrB,IAGmB,WAA5C,EAFJqH,EAAeN,EAAmB/G,IAECmD,UAAsC,aAAbA,IAC1DiI,EAAa,eACbC,EAAY,gBAOZhL,IAAc,IAAQA,IAAcZ,GAAQY,IAAcb,IAAU8K,IAAczK,KACpFqL,EAAQ3L,EAGRwG,IAFc4E,GAAWtD,IAAiB8D,GAAOA,EAAIxF,eAAiBwF,EAAIxF,eAAeD,OACzF2B,EAAa+D,IACEf,EAAW3E,OAC1BK,GAAKyE,EAAkB,GAAK,GAG1BnK,IAAcZ,IAASY,IAAc,GAAOA,IAAcd,GAAW+K,IAAczK,KACrFoL,EAAQzL,EAGRqG,IAFc8E,GAAWtD,IAAiB8D,GAAOA,EAAIxF,eAAiBwF,EAAIxF,eAAeH,MACzF6B,EAAagE,IACEhB,EAAW7E,MAC1BK,GAAK2E,EAAkB,GAAK,EAEhC,CAEA,IAgBMc,EAhBFC,EAAe5M,OAAOkE,OAAO,CAC/BM,SAAUA,GACTsH,GAAYP,IAEXsB,GAAyB,IAAjBd,EAlFd,SAA2BrI,EAAM8I,GAC/B,IAAItF,EAAIxD,EAAKwD,EACTE,EAAI1D,EAAK0D,EACT0F,EAAMN,EAAIO,kBAAoB,EAClC,MAAO,CACL7F,EAAG5B,EAAM4B,EAAI4F,GAAOA,GAAO,EAC3B1F,EAAG9B,EAAM8B,EAAI0F,GAAOA,GAAO,EAE/B,CA0EsCE,CAAkB,CACpD9F,EAAGA,EACHE,GACC1E,EAAUrB,IAAW,CACtB6F,EAAGA,EACHE,GAMF,OAHAF,EAAI2F,EAAM3F,EACVE,EAAIyF,EAAMzF,EAENyE,EAGK7L,OAAOkE,OAAO,CAAC,EAAG0I,IAAeD,EAAiB,CAAC,GAAkBJ,GAASF,EAAO,IAAM,GAAIM,EAAeL,GAASF,EAAO,IAAM,GAAIO,EAAe5D,WAAayD,EAAIO,kBAAoB,IAAM,EAAI,aAAe7F,EAAI,OAASE,EAAI,MAAQ,eAAiBF,EAAI,OAASE,EAAI,SAAUuF,IAG5R3M,OAAOkE,OAAO,CAAC,EAAG0I,IAAenB,EAAkB,CAAC,GAAmBc,GAASF,EAAOjF,EAAI,KAAO,GAAIqE,EAAgBa,GAASF,EAAOlF,EAAI,KAAO,GAAIuE,EAAgB1C,UAAY,GAAI0C,GAC9L,CA4CA,UACEnI,KAAM,gBACNC,SAAS,EACTC,MAAO,cACPC,GA9CF,SAAuBwJ,GACrB,IAAItJ,EAAQsJ,EAAMtJ,MACdc,EAAUwI,EAAMxI,QAChByI,EAAwBzI,EAAQoH,gBAChCA,OAA4C,IAA1BqB,GAA0CA,EAC5DC,EAAoB1I,EAAQqH,SAC5BA,OAAiC,IAAtBqB,GAAsCA,EACjDC,EAAwB3I,EAAQsH,aAChCA,OAAyC,IAA1BqB,GAA0CA,EACzDR,EAAe,CACjBlL,UAAWuD,EAAiBtB,EAAMjC,WAClCiK,UAAWL,EAAa3H,EAAMjC,WAC9BL,OAAQsC,EAAME,SAASxC,OACvBqK,WAAY/H,EAAMwG,MAAM9I,OACxBwK,gBAAiBA,EACjBG,QAAoC,UAA3BrI,EAAMc,QAAQC,UAGgB,MAArCf,EAAMmG,cAAcD,gBACtBlG,EAAMK,OAAO3C,OAASrB,OAAOkE,OAAO,CAAC,EAAGP,EAAMK,OAAO3C,OAAQmK,GAAYxL,OAAOkE,OAAO,CAAC,EAAG0I,EAAc,CACvGhB,QAASjI,EAAMmG,cAAcD,cAC7BrF,SAAUb,EAAMc,QAAQC,SACxBoH,SAAUA,EACVC,aAAcA,OAIe,MAA7BpI,EAAMmG,cAAcjF,QACtBlB,EAAMK,OAAOa,MAAQ7E,OAAOkE,OAAO,CAAC,EAAGP,EAAMK,OAAOa,MAAO2G,GAAYxL,OAAOkE,OAAO,CAAC,EAAG0I,EAAc,CACrGhB,QAASjI,EAAMmG,cAAcjF,MAC7BL,SAAU,WACVsH,UAAU,EACVC,aAAcA,OAIlBpI,EAAMM,WAAW5C,OAASrB,OAAOkE,OAAO,CAAC,EAAGP,EAAMM,WAAW5C,OAAQ,CACnE,wBAAyBsC,EAAMjC,WAEnC,EAQE2L,KAAM,CAAC,GCrKT,IAAIC,GAAU,CACZA,SAAS,GAsCX,UACEhK,KAAM,iBACNC,SAAS,EACTC,MAAO,QACPC,GAAI,WAAe,EACnBY,OAxCF,SAAgBX,GACd,IAAIC,EAAQD,EAAKC,MACb4J,EAAW7J,EAAK6J,SAChB9I,EAAUf,EAAKe,QACf+I,EAAkB/I,EAAQgJ,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7CE,EAAkBjJ,EAAQkJ,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7C9K,EAASF,EAAUiB,EAAME,SAASxC,QAClCuM,EAAgB,GAAGjM,OAAOgC,EAAMiK,cAActM,UAAWqC,EAAMiK,cAAcvM,QAYjF,OAVIoM,GACFG,EAAc9J,SAAQ,SAAU+J,GAC9BA,EAAaC,iBAAiB,SAAUP,EAASQ,OAAQT,GAC3D,IAGEK,GACF/K,EAAOkL,iBAAiB,SAAUP,EAASQ,OAAQT,IAG9C,WACDG,GACFG,EAAc9J,SAAQ,SAAU+J,GAC9BA,EAAaG,oBAAoB,SAAUT,EAASQ,OAAQT,GAC9D,IAGEK,GACF/K,EAAOoL,oBAAoB,SAAUT,EAASQ,OAAQT,GAE1D,CACF,EASED,KAAM,CAAC,GC/CT,IAAIY,GAAO,CACTnN,KAAM,QACND,MAAO,OACPD,OAAQ,MACR+D,IAAK,UAEQ,SAASuJ,GAAqBxM,GAC3C,OAAOA,EAAUyM,QAAQ,0BAA0B,SAAUC,GAC3D,OAAOH,GAAKG,EACd,GACF,CCVA,IAAI,GAAO,CACTnN,MAAO,MACPC,IAAK,SAEQ,SAASmN,GAA8B3M,GACpD,OAAOA,EAAUyM,QAAQ,cAAc,SAAUC,GAC/C,OAAO,GAAKA,EACd,GACF,CCPe,SAASE,GAAgB3L,GACtC,IAAI6J,EAAM9J,EAAUC,GAGpB,MAAO,CACL4L,WAHe/B,EAAIgC,YAInBC,UAHcjC,EAAIkC,YAKtB,CCNe,SAASC,GAAoBpM,GAQ1C,OAAO+D,EAAsB8B,EAAmB7F,IAAUzB,KAAOwN,GAAgB/L,GAASgM,UAC5F,CCXe,SAASK,GAAerM,GAErC,IAAIsM,EAAoB,EAAiBtM,GACrCuM,EAAWD,EAAkBC,SAC7BC,EAAYF,EAAkBE,UAC9BC,EAAYH,EAAkBG,UAElC,MAAO,6BAA6B3I,KAAKyI,EAAWE,EAAYD,EAClE,CCLe,SAASE,GAAgBtM,GACtC,MAAI,CAAC,OAAQ,OAAQ,aAAawF,QAAQ7F,EAAYK,KAAU,EAEvDA,EAAKG,cAAcoM,KAGxBhM,EAAcP,IAASiM,GAAejM,GACjCA,EAGFsM,GAAgB1G,EAAc5F,GACvC,CCJe,SAASwM,GAAkB5M,EAAS6M,GACjD,IAAIC,OAES,IAATD,IACFA,EAAO,IAGT,IAAIvB,EAAeoB,GAAgB1M,GAC/B+M,EAASzB,KAAqE,OAAlDwB,EAAwB9M,EAAQO,oBAAyB,EAASuM,EAAsBH,MACpH1C,EAAM9J,EAAUmL,GAChB0B,EAASD,EAAS,CAAC9C,GAAK7K,OAAO6K,EAAIxF,gBAAkB,GAAI4H,GAAef,GAAgBA,EAAe,IAAMA,EAC7G2B,EAAcJ,EAAKzN,OAAO4N,GAC9B,OAAOD,EAASE,EAChBA,EAAY7N,OAAOwN,GAAkB5G,EAAcgH,IACrD,CCzBe,SAASE,GAAiBC,GACvC,OAAO1P,OAAOkE,OAAO,CAAC,EAAGwL,EAAM,CAC7B5O,KAAM4O,EAAKxI,EACXvC,IAAK+K,EAAKtI,EACVvG,MAAO6O,EAAKxI,EAAIwI,EAAK7I,MACrBjG,OAAQ8O,EAAKtI,EAAIsI,EAAK3I,QAE1B,CCqBA,SAAS4I,GAA2BpN,EAASqN,EAAgBlL,GAC3D,OAAOkL,IAAmBxO,EAAWqO,GCzBxB,SAAyBlN,EAASmC,GAC/C,IAAI8H,EAAM9J,EAAUH,GAChBsN,EAAOzH,EAAmB7F,GAC1ByE,EAAiBwF,EAAIxF,eACrBH,EAAQgJ,EAAKhF,YACb9D,EAAS8I,EAAKjF,aACd1D,EAAI,EACJE,EAAI,EAER,GAAIJ,EAAgB,CAClBH,EAAQG,EAAeH,MACvBE,EAASC,EAAeD,OACxB,IAAI+I,EAAiB1J,KAEjB0J,IAAmBA,GAA+B,UAAbpL,KACvCwC,EAAIF,EAAeG,WACnBC,EAAIJ,EAAeK,UAEvB,CAEA,MAAO,CACLR,MAAOA,EACPE,OAAQA,EACRG,EAAGA,EAAIyH,GAAoBpM,GAC3B6E,EAAGA,EAEP,CDDwD2I,CAAgBxN,EAASmC,IAAa1B,EAAU4M,GAdxG,SAAoCrN,EAASmC,GAC3C,IAAIgL,EAAOpJ,EAAsB/D,GAAS,EAAoB,UAAbmC,GASjD,OARAgL,EAAK/K,IAAM+K,EAAK/K,IAAMpC,EAAQyN,UAC9BN,EAAK5O,KAAO4O,EAAK5O,KAAOyB,EAAQ0N,WAChCP,EAAK9O,OAAS8O,EAAK/K,IAAMpC,EAAQqI,aACjC8E,EAAK7O,MAAQ6O,EAAK5O,KAAOyB,EAAQsI,YACjC6E,EAAK7I,MAAQtE,EAAQsI,YACrB6E,EAAK3I,OAASxE,EAAQqI,aACtB8E,EAAKxI,EAAIwI,EAAK5O,KACd4O,EAAKtI,EAAIsI,EAAK/K,IACP+K,CACT,CAG0HQ,CAA2BN,EAAgBlL,GAAY+K,GEtBlK,SAAyBlN,GACtC,IAAI8M,EAEAQ,EAAOzH,EAAmB7F,GAC1B4N,EAAY7B,GAAgB/L,GAC5B2M,EAA0D,OAAlDG,EAAwB9M,EAAQO,oBAAyB,EAASuM,EAAsBH,KAChGrI,EAAQ,EAAIgJ,EAAKO,YAAaP,EAAKhF,YAAaqE,EAAOA,EAAKkB,YAAc,EAAGlB,EAAOA,EAAKrE,YAAc,GACvG9D,EAAS,EAAI8I,EAAKQ,aAAcR,EAAKjF,aAAcsE,EAAOA,EAAKmB,aAAe,EAAGnB,EAAOA,EAAKtE,aAAe,GAC5G1D,GAAKiJ,EAAU5B,WAAaI,GAAoBpM,GAChD6E,GAAK+I,EAAU1B,UAMnB,MAJiD,QAA7C,EAAiBS,GAAQW,GAAMS,YACjCpJ,GAAK,EAAI2I,EAAKhF,YAAaqE,EAAOA,EAAKrE,YAAc,GAAKhE,GAGrD,CACLA,MAAOA,EACPE,OAAQA,EACRG,EAAGA,EACHE,EAAGA,EAEP,CFCkMmJ,CAAgBnI,EAAmB7F,IACrO,CG1Be,SAASiO,GAAe9M,GACrC,IAOIkI,EAPAtK,EAAYoC,EAAKpC,UACjBiB,EAAUmB,EAAKnB,QACfb,EAAYgC,EAAKhC,UACjBqI,EAAgBrI,EAAYuD,EAAiBvD,GAAa,KAC1DiK,EAAYjK,EAAY4J,EAAa5J,GAAa,KAClD+O,EAAUnP,EAAU4F,EAAI5F,EAAUuF,MAAQ,EAAItE,EAAQsE,MAAQ,EAC9D6J,EAAUpP,EAAU8F,EAAI9F,EAAUyF,OAAS,EAAIxE,EAAQwE,OAAS,EAGpE,OAAQgD,GACN,KAAK,EACH6B,EAAU,CACR1E,EAAGuJ,EACHrJ,EAAG9F,EAAU8F,EAAI7E,EAAQwE,QAE3B,MAEF,KAAKnG,EACHgL,EAAU,CACR1E,EAAGuJ,EACHrJ,EAAG9F,EAAU8F,EAAI9F,EAAUyF,QAE7B,MAEF,KAAKlG,EACH+K,EAAU,CACR1E,EAAG5F,EAAU4F,EAAI5F,EAAUuF,MAC3BO,EAAGsJ,GAEL,MAEF,KAAK5P,EACH8K,EAAU,CACR1E,EAAG5F,EAAU4F,EAAI3E,EAAQsE,MACzBO,EAAGsJ,GAEL,MAEF,QACE9E,EAAU,CACR1E,EAAG5F,EAAU4F,EACbE,EAAG9F,EAAU8F,GAInB,IAAIuJ,EAAW5G,EAAgBV,EAAyBU,GAAiB,KAEzE,GAAgB,MAAZ4G,EAAkB,CACpB,IAAI1G,EAAmB,MAAb0G,EAAmB,SAAW,QAExC,OAAQhF,GACN,KAAK1K,EACH2K,EAAQ+E,GAAY/E,EAAQ+E,IAAarP,EAAU2I,GAAO,EAAI1H,EAAQ0H,GAAO,GAC7E,MAEF,KAAK/I,EACH0K,EAAQ+E,GAAY/E,EAAQ+E,IAAarP,EAAU2I,GAAO,EAAI1H,EAAQ0H,GAAO,GAKnF,CAEA,OAAO2B,CACT,CC3De,SAASgF,GAAejN,EAAOc,QAC5B,IAAZA,IACFA,EAAU,CAAC,GAGb,IAAIoM,EAAWpM,EACXqM,EAAqBD,EAASnP,UAC9BA,OAAmC,IAAvBoP,EAAgCnN,EAAMjC,UAAYoP,EAC9DC,EAAoBF,EAASnM,SAC7BA,OAAiC,IAAtBqM,EAA+BpN,EAAMe,SAAWqM,EAC3DC,EAAoBH,EAASI,SAC7BA,OAAiC,IAAtBD,EAA+B7P,EAAkB6P,EAC5DE,EAAwBL,EAASM,aACjCA,OAAyC,IAA1BD,EAAmC9P,EAAW8P,EAC7DE,EAAwBP,EAASQ,eACjCA,OAA2C,IAA1BD,EAAmC/P,EAAS+P,EAC7DE,EAAuBT,EAASU,YAChCA,OAAuC,IAAzBD,GAA0CA,EACxDE,EAAmBX,EAAS3G,QAC5BA,OAA+B,IAArBsH,EAA8B,EAAIA,EAC5ChI,EAAgBD,EAAsC,iBAAZW,EAAuBA,EAAUT,EAAgBS,EAASlJ,IACpGyQ,EAAaJ,IAAmBhQ,EAASC,EAAYD,EACrDqK,EAAa/H,EAAMwG,MAAM9I,OACzBkB,EAAUoB,EAAME,SAAS0N,EAAcE,EAAaJ,GACpDK,EJkBS,SAAyBnP,EAAS0O,EAAUE,EAAczM,GACvE,IAAIiN,EAAmC,oBAAbV,EAlB5B,SAA4B1O,GAC1B,IAAIpB,EAAkBgO,GAAkB5G,EAAchG,IAElDqP,EADoB,CAAC,WAAY,SAASzJ,QAAQ,EAAiB5F,GAASiC,WAAa,GACnDtB,EAAcX,GAAWoG,EAAgBpG,GAAWA,EAE9F,OAAKS,EAAU4O,GAKRzQ,EAAgBgI,QAAO,SAAUyG,GACtC,OAAO5M,EAAU4M,IAAmBpI,EAASoI,EAAgBgC,IAAmD,SAAhCtP,EAAYsN,EAC9F,IANS,EAOX,CAK6DiC,CAAmBtP,GAAW,GAAGZ,OAAOsP,GAC/F9P,EAAkB,GAAGQ,OAAOgQ,EAAqB,CAACR,IAClDW,EAAsB3Q,EAAgB,GACtC4Q,EAAe5Q,EAAgBK,QAAO,SAAUwQ,EAASpC,GAC3D,IAAIF,EAAOC,GAA2BpN,EAASqN,EAAgBlL,GAK/D,OAJAsN,EAAQrN,IAAM,EAAI+K,EAAK/K,IAAKqN,EAAQrN,KACpCqN,EAAQnR,MAAQ,EAAI6O,EAAK7O,MAAOmR,EAAQnR,OACxCmR,EAAQpR,OAAS,EAAI8O,EAAK9O,OAAQoR,EAAQpR,QAC1CoR,EAAQlR,KAAO,EAAI4O,EAAK5O,KAAMkR,EAAQlR,MAC/BkR,CACT,GAAGrC,GAA2BpN,EAASuP,EAAqBpN,IAK5D,OAJAqN,EAAalL,MAAQkL,EAAalR,MAAQkR,EAAajR,KACvDiR,EAAahL,OAASgL,EAAanR,OAASmR,EAAapN,IACzDoN,EAAa7K,EAAI6K,EAAajR,KAC9BiR,EAAa3K,EAAI2K,EAAapN,IACvBoN,CACT,CInC2BE,CAAgBjP,EAAUT,GAAWA,EAAUA,EAAQ2P,gBAAkB9J,EAAmBzE,EAAME,SAASxC,QAAS4P,EAAUE,EAAczM,GACjKyN,EAAsB7L,EAAsB3C,EAAME,SAASvC,WAC3DuI,EAAgB2G,GAAe,CACjClP,UAAW6Q,EACX5P,QAASmJ,EACThH,SAAU,WACVhD,UAAWA,IAET0Q,EAAmB3C,GAAiBzP,OAAOkE,OAAO,CAAC,EAAGwH,EAAY7B,IAClEwI,EAAoBhB,IAAmBhQ,EAAS+Q,EAAmBD,EAGnEG,EAAkB,CACpB3N,IAAK+M,EAAmB/M,IAAM0N,EAAkB1N,IAAM6E,EAAc7E,IACpE/D,OAAQyR,EAAkBzR,OAAS8Q,EAAmB9Q,OAAS4I,EAAc5I,OAC7EE,KAAM4Q,EAAmB5Q,KAAOuR,EAAkBvR,KAAO0I,EAAc1I,KACvED,MAAOwR,EAAkBxR,MAAQ6Q,EAAmB7Q,MAAQ2I,EAAc3I,OAExE0R,EAAa5O,EAAMmG,cAAckB,OAErC,GAAIqG,IAAmBhQ,GAAUkR,EAAY,CAC3C,IAAIvH,EAASuH,EAAW7Q,GACxB1B,OAAO4D,KAAK0O,GAAiBxO,SAAQ,SAAUhE,GAC7C,IAAI0S,EAAW,CAAC3R,EAAOD,GAAQuH,QAAQrI,IAAQ,EAAI,GAAK,EACpDkK,EAAO,CAAC,EAAKpJ,GAAQuH,QAAQrI,IAAQ,EAAI,IAAM,IACnDwS,EAAgBxS,IAAQkL,EAAOhB,GAAQwI,CACzC,GACF,CAEA,OAAOF,CACT,CCyEA,UACEhP,KAAM,OACNC,SAAS,EACTC,MAAO,OACPC,GA5HF,SAAcC,GACZ,IAAIC,EAAQD,EAAKC,MACbc,EAAUf,EAAKe,QACfnB,EAAOI,EAAKJ,KAEhB,IAAIK,EAAMmG,cAAcxG,GAAMmP,MAA9B,CAoCA,IAhCA,IAAIC,EAAoBjO,EAAQkM,SAC5BgC,OAAsC,IAAtBD,GAAsCA,EACtDE,EAAmBnO,EAAQoO,QAC3BC,OAAoC,IAArBF,GAAqCA,EACpDG,EAA8BtO,EAAQuO,mBACtC9I,EAAUzF,EAAQyF,QAClB+G,EAAWxM,EAAQwM,SACnBE,EAAe1M,EAAQ0M,aACvBI,EAAc9M,EAAQ8M,YACtB0B,EAAwBxO,EAAQyO,eAChCA,OAA2C,IAA1BD,GAA0CA,EAC3DE,EAAwB1O,EAAQ0O,sBAChCC,EAAqBzP,EAAMc,QAAQ/C,UACnCqI,EAAgB9E,EAAiBmO,GAEjCJ,EAAqBD,IADHhJ,IAAkBqJ,GACqCF,EAjC/E,SAAuCxR,GACrC,GAAIuD,EAAiBvD,KAAeX,EAClC,MAAO,GAGT,IAAIsS,EAAoBnF,GAAqBxM,GAC7C,MAAO,CAAC2M,GAA8B3M,GAAY2R,EAAmBhF,GAA8BgF,GACrG,CA0B6IC,CAA8BF,GAA3E,CAAClF,GAAqBkF,KAChHG,EAAa,CAACH,GAAoBzR,OAAOqR,GAAoBxR,QAAO,SAAUC,EAAKC,GACrF,OAAOD,EAAIE,OAAOsD,EAAiBvD,KAAeX,ECvCvC,SAA8B4C,EAAOc,QAClC,IAAZA,IACFA,EAAU,CAAC,GAGb,IAAIoM,EAAWpM,EACX/C,EAAYmP,EAASnP,UACrBuP,EAAWJ,EAASI,SACpBE,EAAeN,EAASM,aACxBjH,EAAU2G,EAAS3G,QACnBgJ,EAAiBrC,EAASqC,eAC1BM,EAAwB3C,EAASsC,sBACjCA,OAAkD,IAA1BK,EAAmC,EAAgBA,EAC3E7H,EAAYL,EAAa5J,GACzB6R,EAAa5H,EAAYuH,EAAiB3R,EAAsBA,EAAoB4H,QAAO,SAAUzH,GACvG,OAAO4J,EAAa5J,KAAeiK,CACrC,IAAK3K,EACDyS,EAAoBF,EAAWpK,QAAO,SAAUzH,GAClD,OAAOyR,EAAsBhL,QAAQzG,IAAc,CACrD,IAEiC,IAA7B+R,EAAkBC,SACpBD,EAAoBF,GAItB,IAAII,EAAYF,EAAkBjS,QAAO,SAAUC,EAAKC,GAOtD,OANAD,EAAIC,GAAakP,GAAejN,EAAO,CACrCjC,UAAWA,EACXuP,SAAUA,EACVE,aAAcA,EACdjH,QAASA,IACRjF,EAAiBvD,IACbD,CACT,GAAG,CAAC,GACJ,OAAOzB,OAAO4D,KAAK+P,GAAWC,MAAK,SAAUC,EAAGC,GAC9C,OAAOH,EAAUE,GAAKF,EAAUG,EAClC,GACF,CDC6DC,CAAqBpQ,EAAO,CACnFjC,UAAWA,EACXuP,SAAUA,EACVE,aAAcA,EACdjH,QAASA,EACTgJ,eAAgBA,EAChBC,sBAAuBA,IACpBzR,EACP,GAAG,IACCsS,EAAgBrQ,EAAMwG,MAAM7I,UAC5BoK,EAAa/H,EAAMwG,MAAM9I,OACzB4S,EAAY,IAAIC,IAChBC,GAAqB,EACrBC,EAAwBb,EAAW,GAE9Bc,EAAI,EAAGA,EAAId,EAAWG,OAAQW,IAAK,CAC1C,IAAI3S,EAAY6R,EAAWc,GAEvBC,EAAiBrP,EAAiBvD,GAElC6S,EAAmBjJ,EAAa5J,KAAeT,EAC/CuT,EAAa,CAAC,EAAK5T,GAAQuH,QAAQmM,IAAmB,EACtDrK,EAAMuK,EAAa,QAAU,SAC7B1F,EAAW8B,GAAejN,EAAO,CACnCjC,UAAWA,EACXuP,SAAUA,EACVE,aAAcA,EACdI,YAAaA,EACbrH,QAASA,IAEPuK,EAAoBD,EAAaD,EAAmB1T,EAAQC,EAAOyT,EAAmB3T,EAAS,EAE/FoT,EAAc/J,GAAOyB,EAAWzB,KAClCwK,EAAoBvG,GAAqBuG,IAG3C,IAAIC,EAAmBxG,GAAqBuG,GACxCE,EAAS,GAUb,GARIhC,GACFgC,EAAOC,KAAK9F,EAASwF,IAAmB,GAGtCxB,GACF6B,EAAOC,KAAK9F,EAAS2F,IAAsB,EAAG3F,EAAS4F,IAAqB,GAG1EC,EAAOE,OAAM,SAAUC,GACzB,OAAOA,CACT,IAAI,CACFV,EAAwB1S,EACxByS,GAAqB,EACrB,KACF,CAEAF,EAAUc,IAAIrT,EAAWiT,EAC3B,CAEA,GAAIR,EAqBF,IAnBA,IAEIa,EAAQ,SAAeC,GACzB,IAAIC,EAAmB3B,EAAW4B,MAAK,SAAUzT,GAC/C,IAAIiT,EAASV,EAAU9T,IAAIuB,GAE3B,GAAIiT,EACF,OAAOA,EAAOS,MAAM,EAAGH,GAAIJ,OAAM,SAAUC,GACzC,OAAOA,CACT,GAEJ,IAEA,GAAII,EAEF,OADAd,EAAwBc,EACjB,OAEX,EAESD,EAnBY/B,EAAiB,EAAI,EAmBZ+B,EAAK,GAGpB,UAFFD,EAAMC,GADmBA,KAOpCtR,EAAMjC,YAAc0S,IACtBzQ,EAAMmG,cAAcxG,GAAMmP,OAAQ,EAClC9O,EAAMjC,UAAY0S,EAClBzQ,EAAM0R,OAAQ,EA5GhB,CA8GF,EAQEhK,iBAAkB,CAAC,UACnBgC,KAAM,CACJoF,OAAO,IE7IX,SAAS6C,GAAexG,EAAUY,EAAM6F,GAQtC,YAPyB,IAArBA,IACFA,EAAmB,CACjBrO,EAAG,EACHE,EAAG,IAIA,CACLzC,IAAKmK,EAASnK,IAAM+K,EAAK3I,OAASwO,EAAiBnO,EACnDvG,MAAOiO,EAASjO,MAAQ6O,EAAK7I,MAAQ0O,EAAiBrO,EACtDtG,OAAQkO,EAASlO,OAAS8O,EAAK3I,OAASwO,EAAiBnO,EACzDtG,KAAMgO,EAAShO,KAAO4O,EAAK7I,MAAQ0O,EAAiBrO,EAExD,CAEA,SAASsO,GAAsB1G,GAC7B,MAAO,CAAC,EAAKjO,EAAOD,EAAQE,GAAM2U,MAAK,SAAUC,GAC/C,OAAO5G,EAAS4G,IAAS,CAC3B,GACF,CA+BA,UACEpS,KAAM,OACNC,SAAS,EACTC,MAAO,OACP6H,iBAAkB,CAAC,mBACnB5H,GAlCF,SAAcC,GACZ,IAAIC,EAAQD,EAAKC,MACbL,EAAOI,EAAKJ,KACZ0Q,EAAgBrQ,EAAMwG,MAAM7I,UAC5BoK,EAAa/H,EAAMwG,MAAM9I,OACzBkU,EAAmB5R,EAAMmG,cAAc6L,gBACvCC,EAAoBhF,GAAejN,EAAO,CAC5C0N,eAAgB,cAEdwE,EAAoBjF,GAAejN,EAAO,CAC5C4N,aAAa,IAEXuE,EAA2BR,GAAeM,EAAmB5B,GAC7D+B,EAAsBT,GAAeO,EAAmBnK,EAAY6J,GACpES,EAAoBR,GAAsBM,GAC1CG,EAAmBT,GAAsBO,GAC7CpS,EAAMmG,cAAcxG,GAAQ,CAC1BwS,yBAA0BA,EAC1BC,oBAAqBA,EACrBC,kBAAmBA,EACnBC,iBAAkBA,GAEpBtS,EAAMM,WAAW5C,OAASrB,OAAOkE,OAAO,CAAC,EAAGP,EAAMM,WAAW5C,OAAQ,CACnE,+BAAgC2U,EAChC,sBAAuBC,GAE3B,GCJA,IACE3S,KAAM,SACNC,SAAS,EACTC,MAAO,OACPwB,SAAU,CAAC,iBACXvB,GA5BF,SAAgBa,GACd,IAAIX,EAAQW,EAAMX,MACdc,EAAUH,EAAMG,QAChBnB,EAAOgB,EAAMhB,KACb4S,EAAkBzR,EAAQuG,OAC1BA,OAA6B,IAApBkL,EAA6B,CAAC,EAAG,GAAKA,EAC/C7I,EAAO,EAAW7L,QAAO,SAAUC,EAAKC,GAE1C,OADAD,EAAIC,GA5BD,SAAiCA,EAAWyI,EAAOa,GACxD,IAAIjB,EAAgB9E,EAAiBvD,GACjCyU,EAAiB,CAACrV,EAAM,GAAKqH,QAAQ4B,IAAkB,GAAK,EAAI,EAEhErG,EAAyB,mBAAXsH,EAAwBA,EAAOhL,OAAOkE,OAAO,CAAC,EAAGiG,EAAO,CACxEzI,UAAWA,KACPsJ,EACFoL,EAAW1S,EAAK,GAChB2S,EAAW3S,EAAK,GAIpB,OAFA0S,EAAWA,GAAY,EACvBC,GAAYA,GAAY,GAAKF,EACtB,CAACrV,EAAMD,GAAOsH,QAAQ4B,IAAkB,EAAI,CACjD7C,EAAGmP,EACHjP,EAAGgP,GACD,CACFlP,EAAGkP,EACHhP,EAAGiP,EAEP,CASqBC,CAAwB5U,EAAWiC,EAAMwG,MAAOa,GAC1DvJ,CACT,GAAG,CAAC,GACA8U,EAAwBlJ,EAAK1J,EAAMjC,WACnCwF,EAAIqP,EAAsBrP,EAC1BE,EAAImP,EAAsBnP,EAEW,MAArCzD,EAAMmG,cAAcD,gBACtBlG,EAAMmG,cAAcD,cAAc3C,GAAKA,EACvCvD,EAAMmG,cAAcD,cAAczC,GAAKA,GAGzCzD,EAAMmG,cAAcxG,GAAQ+J,CAC9B,GC1BA,IACE/J,KAAM,gBACNC,SAAS,EACTC,MAAO,OACPC,GApBF,SAAuBC,GACrB,IAAIC,EAAQD,EAAKC,MACbL,EAAOI,EAAKJ,KAKhBK,EAAMmG,cAAcxG,GAAQkN,GAAe,CACzClP,UAAWqC,EAAMwG,MAAM7I,UACvBiB,QAASoB,EAAMwG,MAAM9I,OACrBqD,SAAU,WACVhD,UAAWiC,EAAMjC,WAErB,EAQE2L,KAAM,CAAC,GCgHT,IACE/J,KAAM,kBACNC,SAAS,EACTC,MAAO,OACPC,GA/HF,SAAyBC,GACvB,IAAIC,EAAQD,EAAKC,MACbc,EAAUf,EAAKe,QACfnB,EAAOI,EAAKJ,KACZoP,EAAoBjO,EAAQkM,SAC5BgC,OAAsC,IAAtBD,GAAsCA,EACtDE,EAAmBnO,EAAQoO,QAC3BC,OAAoC,IAArBF,GAAsCA,EACrD3B,EAAWxM,EAAQwM,SACnBE,EAAe1M,EAAQ0M,aACvBI,EAAc9M,EAAQ8M,YACtBrH,EAAUzF,EAAQyF,QAClBsM,EAAkB/R,EAAQgS,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7CE,EAAwBjS,EAAQkS,aAChCA,OAAyC,IAA1BD,EAAmC,EAAIA,EACtD5H,EAAW8B,GAAejN,EAAO,CACnCsN,SAAUA,EACVE,aAAcA,EACdjH,QAASA,EACTqH,YAAaA,IAEXxH,EAAgB9E,EAAiBtB,EAAMjC,WACvCiK,EAAYL,EAAa3H,EAAMjC,WAC/BkV,GAAmBjL,EACnBgF,EAAWtH,EAAyBU,GACpC8I,ECrCY,MDqCSlC,ECrCH,IAAM,IDsCxB9G,EAAgBlG,EAAMmG,cAAcD,cACpCmK,EAAgBrQ,EAAMwG,MAAM7I,UAC5BoK,EAAa/H,EAAMwG,MAAM9I,OACzBwV,EAA4C,mBAAjBF,EAA8BA,EAAa3W,OAAOkE,OAAO,CAAC,EAAGP,EAAMwG,MAAO,CACvGzI,UAAWiC,EAAMjC,aACbiV,EACFG,EAA2D,iBAAtBD,EAAiC,CACxElG,SAAUkG,EACVhE,QAASgE,GACP7W,OAAOkE,OAAO,CAChByM,SAAU,EACVkC,QAAS,GACRgE,GACCE,EAAsBpT,EAAMmG,cAAckB,OAASrH,EAAMmG,cAAckB,OAAOrH,EAAMjC,WAAa,KACjG2L,EAAO,CACTnG,EAAG,EACHE,EAAG,GAGL,GAAKyC,EAAL,CAIA,GAAI8I,EAAe,CACjB,IAAIqE,EAEAC,EAAwB,MAAbtG,EAAmB,EAAM7P,EACpCoW,EAAuB,MAAbvG,EAAmB/P,EAASC,EACtCoJ,EAAmB,MAAb0G,EAAmB,SAAW,QACpC3F,EAASnB,EAAc8G,GACvBtL,EAAM2F,EAAS8D,EAASmI,GACxB7R,EAAM4F,EAAS8D,EAASoI,GACxBC,EAAWV,GAAU/K,EAAWzB,GAAO,EAAI,EAC3CmN,EAASzL,IAAc1K,EAAQ+S,EAAc/J,GAAOyB,EAAWzB,GAC/DoN,EAAS1L,IAAc1K,GAASyK,EAAWzB,IAAQ+J,EAAc/J,GAGjEL,EAAejG,EAAME,SAASgB,MAC9BwF,EAAYoM,GAAU7M,EAAetC,EAAcsC,GAAgB,CACrE/C,MAAO,EACPE,OAAQ,GAENuQ,GAAqB3T,EAAMmG,cAAc,oBAAsBnG,EAAMmG,cAAc,oBAAoBI,QxBhFtG,CACLvF,IAAK,EACL9D,MAAO,EACPD,OAAQ,EACRE,KAAM,GwB6EFyW,GAAkBD,GAAmBL,GACrCO,GAAkBF,GAAmBJ,GAMrCO,GAAWnO,EAAO,EAAG0K,EAAc/J,GAAMI,EAAUJ,IACnDyN,GAAYd,EAAkB5C,EAAc/J,GAAO,EAAIkN,EAAWM,GAAWF,GAAkBT,EAA4BnG,SAAWyG,EAASK,GAAWF,GAAkBT,EAA4BnG,SACxMgH,GAAYf,GAAmB5C,EAAc/J,GAAO,EAAIkN,EAAWM,GAAWD,GAAkBV,EAA4BnG,SAAW0G,EAASI,GAAWD,GAAkBV,EAA4BnG,SACzMjG,GAAoB/G,EAAME,SAASgB,OAAS8D,EAAgBhF,EAAME,SAASgB,OAC3E+S,GAAelN,GAAiC,MAAbiG,EAAmBjG,GAAkBsF,WAAa,EAAItF,GAAkBuF,YAAc,EAAI,EAC7H4H,GAAwH,OAAjGb,EAA+C,MAAvBD,OAA8B,EAASA,EAAoBpG,IAAqBqG,EAAwB,EAEvJc,GAAY9M,EAAS2M,GAAYE,GACjCE,GAAkBzO,EAAOmN,EAAS,EAAQpR,EAF9B2F,EAAS0M,GAAYG,GAAsBD,IAEKvS,EAAK2F,EAAQyL,EAAS,EAAQrR,EAAK0S,IAAa1S,GAChHyE,EAAc8G,GAAYoH,GAC1B1K,EAAKsD,GAAYoH,GAAkB/M,CACrC,CAEA,GAAI8H,EAAc,CAChB,IAAIkF,GAEAC,GAAyB,MAAbtH,EAAmB,EAAM7P,EAErCoX,GAAwB,MAAbvH,EAAmB/P,EAASC,EAEvCsX,GAAUtO,EAAcgJ,GAExBuF,GAAmB,MAAZvF,EAAkB,SAAW,QAEpCwF,GAAOF,GAAUrJ,EAASmJ,IAE1BK,GAAOH,GAAUrJ,EAASoJ,IAE1BK,IAAuD,IAAxC,CAAC,EAAKzX,GAAMqH,QAAQ4B,GAEnCyO,GAAyH,OAAjGR,GAAgD,MAAvBjB,OAA8B,EAASA,EAAoBlE,IAAoBmF,GAAyB,EAEzJS,GAAaF,GAAeF,GAAOF,GAAUnE,EAAcoE,IAAQ1M,EAAW0M,IAAQI,GAAuB1B,EAA4BjE,QAEzI6F,GAAaH,GAAeJ,GAAUnE,EAAcoE,IAAQ1M,EAAW0M,IAAQI,GAAuB1B,EAA4BjE,QAAUyF,GAE5IK,GAAmBlC,GAAU8B,G1BzH9B,SAAwBlT,EAAK1E,EAAOyE,GACzC,IAAIwT,EAAItP,EAAOjE,EAAK1E,EAAOyE,GAC3B,OAAOwT,EAAIxT,EAAMA,EAAMwT,CACzB,C0BsHoDC,CAAeJ,GAAYN,GAASO,IAAcpP,EAAOmN,EAASgC,GAAaJ,GAAMF,GAAS1B,EAASiC,GAAaJ,IAEpKzO,EAAcgJ,GAAW8F,GACzBtL,EAAKwF,GAAW8F,GAAmBR,EACrC,CAEAxU,EAAMmG,cAAcxG,GAAQ+J,CAvE5B,CAwEF,EAQEhC,iBAAkB,CAAC,WE1HN,SAASyN,GAAiBC,EAAyBrQ,EAAcsD,QAC9D,IAAZA,IACFA,GAAU,GAGZ,ICnBoCrJ,ECJOJ,EFuBvCyW,EAA0B9V,EAAcwF,GACxCuQ,EAAuB/V,EAAcwF,IAf3C,SAAyBnG,GACvB,IAAImN,EAAOnN,EAAQ+D,wBACfI,EAASpB,EAAMoK,EAAK7I,OAAStE,EAAQqE,aAAe,EACpDD,EAASrB,EAAMoK,EAAK3I,QAAUxE,EAAQuE,cAAgB,EAC1D,OAAkB,IAAXJ,GAA2B,IAAXC,CACzB,CAU4DuS,CAAgBxQ,GACtEJ,EAAkBF,EAAmBM,GACrCgH,EAAOpJ,EAAsByS,EAAyBE,EAAsBjN,GAC5EyB,EAAS,CACXc,WAAY,EACZE,UAAW,GAET7C,EAAU,CACZ1E,EAAG,EACHE,EAAG,GAkBL,OAfI4R,IAA4BA,IAA4BhN,MACxB,SAA9B1J,EAAYoG,IAChBkG,GAAetG,MACbmF,GCnCgC9K,EDmCT+F,KClCdhG,EAAUC,IAAUO,EAAcP,GCJxC,CACL4L,YAFyChM,EDQbI,GCNR4L,WACpBE,UAAWlM,EAAQkM,WDGZH,GAAgB3L,IDoCnBO,EAAcwF,KAChBkD,EAAUtF,EAAsBoC,GAAc,IACtCxB,GAAKwB,EAAauH,WAC1BrE,EAAQxE,GAAKsB,EAAasH,WACjB1H,IACTsD,EAAQ1E,EAAIyH,GAAoBrG,KAI7B,CACLpB,EAAGwI,EAAK5O,KAAO2M,EAAOc,WAAa3C,EAAQ1E,EAC3CE,EAAGsI,EAAK/K,IAAM8I,EAAOgB,UAAY7C,EAAQxE,EACzCP,MAAO6I,EAAK7I,MACZE,OAAQ2I,EAAK3I,OAEjB,CGvDA,SAASoS,GAAMC,GACb,IAAItT,EAAM,IAAIoO,IACVmF,EAAU,IAAIC,IACdC,EAAS,GAKb,SAAS3F,EAAK4F,GACZH,EAAQI,IAAID,EAASlW,MACN,GAAG3B,OAAO6X,EAASxU,UAAY,GAAIwU,EAASnO,kBAAoB,IACtEvH,SAAQ,SAAU4V,GACzB,IAAKL,EAAQM,IAAID,GAAM,CACrB,IAAIE,EAAc9T,EAAI3F,IAAIuZ,GAEtBE,GACFhG,EAAKgG,EAET,CACF,IACAL,EAAO3E,KAAK4E,EACd,CAQA,OAzBAJ,EAAUtV,SAAQ,SAAU0V,GAC1B1T,EAAIiP,IAAIyE,EAASlW,KAAMkW,EACzB,IAiBAJ,EAAUtV,SAAQ,SAAU0V,GACrBH,EAAQM,IAAIH,EAASlW,OAExBsQ,EAAK4F,EAET,IACOD,CACT,CCvBA,IAAIM,GAAkB,CACpBnY,UAAW,SACX0X,UAAW,GACX1U,SAAU,YAGZ,SAASoV,KACP,IAAK,IAAI1B,EAAO2B,UAAUrG,OAAQsG,EAAO,IAAIpU,MAAMwS,GAAO6B,EAAO,EAAGA,EAAO7B,EAAM6B,IAC/ED,EAAKC,GAAQF,UAAUE,GAGzB,OAAQD,EAAKvE,MAAK,SAAUlT,GAC1B,QAASA,GAAoD,mBAAlCA,EAAQ+D,sBACrC,GACF,CAEO,SAAS4T,GAAgBC,QACL,IAArBA,IACFA,EAAmB,CAAC,GAGtB,IAAIC,EAAoBD,EACpBE,EAAwBD,EAAkBE,iBAC1CA,OAA6C,IAA1BD,EAAmC,GAAKA,EAC3DE,EAAyBH,EAAkBI,eAC3CA,OAA4C,IAA3BD,EAAoCV,GAAkBU,EAC3E,OAAO,SAAsBjZ,EAAWD,EAAQoD,QAC9B,IAAZA,IACFA,EAAU+V,GAGZ,ICxC6B/W,EAC3BgX,EDuCE9W,EAAQ,CACVjC,UAAW,SACXgZ,iBAAkB,GAClBjW,QAASzE,OAAOkE,OAAO,CAAC,EAAG2V,GAAiBW,GAC5C1Q,cAAe,CAAC,EAChBjG,SAAU,CACRvC,UAAWA,EACXD,OAAQA,GAEV4C,WAAY,CAAC,EACbD,OAAQ,CAAC,GAEP2W,EAAmB,GACnBC,GAAc,EACdrN,EAAW,CACb5J,MAAOA,EACPkX,WAAY,SAAoBC,GAC9B,IAAIrW,EAAsC,mBAArBqW,EAAkCA,EAAiBnX,EAAMc,SAAWqW,EACzFC,IACApX,EAAMc,QAAUzE,OAAOkE,OAAO,CAAC,EAAGsW,EAAgB7W,EAAMc,QAASA,GACjEd,EAAMiK,cAAgB,CACpBtM,UAAW0B,EAAU1B,GAAa6N,GAAkB7N,GAAaA,EAAU4Q,eAAiB/C,GAAkB7N,EAAU4Q,gBAAkB,GAC1I7Q,OAAQ8N,GAAkB9N,IAI5B,IElE4B+X,EAC9B4B,EFiEMN,EDhCG,SAAwBtB,GAErC,IAAIsB,EAAmBvB,GAAMC,GAE7B,OAAO/W,EAAeb,QAAO,SAAUC,EAAK+B,GAC1C,OAAO/B,EAAIE,OAAO+Y,EAAiBvR,QAAO,SAAUqQ,GAClD,OAAOA,EAAShW,QAAUA,CAC5B,IACF,GAAG,GACL,CCuB+ByX,EElEK7B,EFkEsB,GAAGzX,OAAO2Y,EAAkB3W,EAAMc,QAAQ2U,WEjE9F4B,EAAS5B,EAAU5X,QAAO,SAAUwZ,EAAQE,GAC9C,IAAIC,EAAWH,EAAOE,EAAQ5X,MAK9B,OAJA0X,EAAOE,EAAQ5X,MAAQ6X,EAAWnb,OAAOkE,OAAO,CAAC,EAAGiX,EAAUD,EAAS,CACrEzW,QAASzE,OAAOkE,OAAO,CAAC,EAAGiX,EAAS1W,QAASyW,EAAQzW,SACrD4I,KAAMrN,OAAOkE,OAAO,CAAC,EAAGiX,EAAS9N,KAAM6N,EAAQ7N,QAC5C6N,EACEF,CACT,GAAG,CAAC,GAEGhb,OAAO4D,KAAKoX,GAAQlV,KAAI,SAAUhG,GACvC,OAAOkb,EAAOlb,EAChB,MF4DM,OAJA6D,EAAM+W,iBAAmBA,EAAiBvR,QAAO,SAAUiS,GACzD,OAAOA,EAAE7X,OACX,IA+FFI,EAAM+W,iBAAiB5W,SAAQ,SAAUJ,GACvC,IAAIJ,EAAOI,EAAKJ,KACZ+X,EAAe3X,EAAKe,QACpBA,OAA2B,IAAjB4W,EAA0B,CAAC,EAAIA,EACzChX,EAASX,EAAKW,OAElB,GAAsB,mBAAXA,EAAuB,CAChC,IAAIiX,EAAYjX,EAAO,CACrBV,MAAOA,EACPL,KAAMA,EACNiK,SAAUA,EACV9I,QAASA,IAKXkW,EAAiB/F,KAAK0G,GAFT,WAAmB,EAGlC,CACF,IA/GS/N,EAASQ,QAClB,EAMAwN,YAAa,WACX,IAAIX,EAAJ,CAIA,IAAIY,EAAkB7X,EAAME,SACxBvC,EAAYka,EAAgBla,UAC5BD,EAASma,EAAgBna,OAG7B,GAAKyY,GAAiBxY,EAAWD,GAAjC,CAKAsC,EAAMwG,MAAQ,CACZ7I,UAAWwX,GAAiBxX,EAAWqH,EAAgBtH,GAAoC,UAA3BsC,EAAMc,QAAQC,UAC9ErD,OAAQiG,EAAcjG,IAOxBsC,EAAM0R,OAAQ,EACd1R,EAAMjC,UAAYiC,EAAMc,QAAQ/C,UAKhCiC,EAAM+W,iBAAiB5W,SAAQ,SAAU0V,GACvC,OAAO7V,EAAMmG,cAAc0P,EAASlW,MAAQtD,OAAOkE,OAAO,CAAC,EAAGsV,EAASnM,KACzE,IAEA,IAAK,IAAIoO,EAAQ,EAAGA,EAAQ9X,EAAM+W,iBAAiBhH,OAAQ+H,IACzD,IAAoB,IAAhB9X,EAAM0R,MAAV,CAMA,IAAIqG,EAAwB/X,EAAM+W,iBAAiBe,GAC/ChY,EAAKiY,EAAsBjY,GAC3BkY,EAAyBD,EAAsBjX,QAC/CoM,OAAsC,IAA3B8K,EAAoC,CAAC,EAAIA,EACpDrY,EAAOoY,EAAsBpY,KAEf,mBAAPG,IACTE,EAAQF,EAAG,CACTE,MAAOA,EACPc,QAASoM,EACTvN,KAAMA,EACNiK,SAAUA,KACN5J,EAdR,MAHEA,EAAM0R,OAAQ,EACdoG,GAAS,CAzBb,CATA,CAqDF,EAGA1N,QC1I2BtK,ED0IV,WACf,OAAO,IAAImY,SAAQ,SAAUC,GAC3BtO,EAASgO,cACTM,EAAQlY,EACV,GACF,EC7IG,WAUL,OATK8W,IACHA,EAAU,IAAImB,SAAQ,SAAUC,GAC9BD,QAAQC,UAAUC,MAAK,WACrBrB,OAAUsB,EACVF,EAAQpY,IACV,GACF,KAGKgX,CACT,GDmIIuB,QAAS,WACPjB,IACAH,GAAc,CAChB,GAGF,IAAKd,GAAiBxY,EAAWD,GAC/B,OAAOkM,EAmCT,SAASwN,IACPJ,EAAiB7W,SAAQ,SAAUL,GACjC,OAAOA,GACT,IACAkX,EAAmB,EACrB,CAEA,OAvCApN,EAASsN,WAAWpW,GAASqX,MAAK,SAAUnY,IACrCiX,GAAenW,EAAQwX,eAC1BxX,EAAQwX,cAActY,EAE1B,IAmCO4J,CACT,CACF,CACO,IAAI2O,GAA4BhC,KGzLnC,GAA4BA,GAAgB,CAC9CI,iBAFqB,CAAC6B,GAAgB,GAAe,GAAe,EAAa,GAAQ,GAAM,GAAiB,EAAO,MCJrH,GAA4BjC,GAAgB,CAC9CI,iBAFqB,CAAC6B,GAAgB,GAAe,GAAe,KCatE,MAAMC,GAAa,IAAIlI,IACjBmI,GAAO,CACX,GAAAtH,CAAIxS,EAASzC,EAAKyN,GACX6O,GAAWzC,IAAIpX,IAClB6Z,GAAWrH,IAAIxS,EAAS,IAAI2R,KAE9B,MAAMoI,EAAcF,GAAWjc,IAAIoC,GAI9B+Z,EAAY3C,IAAI7Z,IAA6B,IAArBwc,EAAYC,KAKzCD,EAAYvH,IAAIjV,EAAKyN,GAHnBiP,QAAQC,MAAM,+EAA+E7W,MAAM8W,KAAKJ,EAAY1Y,QAAQ,MAIhI,EACAzD,IAAG,CAACoC,EAASzC,IACPsc,GAAWzC,IAAIpX,IACV6Z,GAAWjc,IAAIoC,GAASpC,IAAIL,IAE9B,KAET,MAAA6c,CAAOpa,EAASzC,GACd,IAAKsc,GAAWzC,IAAIpX,GAClB,OAEF,MAAM+Z,EAAcF,GAAWjc,IAAIoC,GACnC+Z,EAAYM,OAAO9c,GAGM,IAArBwc,EAAYC,MACdH,GAAWQ,OAAOra,EAEtB,GAYIsa,GAAiB,gBAOjBC,GAAgBC,IAChBA,GAAYna,OAAOoa,KAAOpa,OAAOoa,IAAIC,SAEvCF,EAAWA,EAAS5O,QAAQ,iBAAiB,CAAC+O,EAAOC,IAAO,IAAIH,IAAIC,OAAOE,QAEtEJ,GA4CHK,GAAuB7a,IAC3BA,EAAQ8a,cAAc,IAAIC,MAAMT,IAAgB,EAE5C,GAAYU,MACXA,GAA4B,iBAAXA,UAGO,IAAlBA,EAAOC,SAChBD,EAASA,EAAO,SAEgB,IAApBA,EAAOE,UAEjBC,GAAaH,GAEb,GAAUA,GACLA,EAAOC,OAASD,EAAO,GAAKA,EAEf,iBAAXA,GAAuBA,EAAO7J,OAAS,EACzCrL,SAAS+C,cAAc0R,GAAcS,IAEvC,KAEHI,GAAYpb,IAChB,IAAK,GAAUA,IAAgD,IAApCA,EAAQqb,iBAAiBlK,OAClD,OAAO,EAET,MAAMmK,EAAgF,YAA7D5V,iBAAiB1F,GAASub,iBAAiB,cAE9DC,EAAgBxb,EAAQyb,QAAQ,uBACtC,IAAKD,EACH,OAAOF,EAET,GAAIE,IAAkBxb,EAAS,CAC7B,MAAM0b,EAAU1b,EAAQyb,QAAQ,WAChC,GAAIC,GAAWA,EAAQlW,aAAegW,EACpC,OAAO,EAET,GAAgB,OAAZE,EACF,OAAO,CAEX,CACA,OAAOJ,CAAgB,EAEnBK,GAAa3b,IACZA,GAAWA,EAAQkb,WAAaU,KAAKC,gBAGtC7b,EAAQ8b,UAAU7W,SAAS,mBAGC,IAArBjF,EAAQ+b,SACV/b,EAAQ+b,SAEV/b,EAAQgc,aAAa,aAAoD,UAArChc,EAAQic,aAAa,aAE5DC,GAAiBlc,IACrB,IAAK8F,SAASC,gBAAgBoW,aAC5B,OAAO,KAIT,GAAmC,mBAAxBnc,EAAQqF,YAA4B,CAC7C,MAAM+W,EAAOpc,EAAQqF,cACrB,OAAO+W,aAAgBtb,WAAasb,EAAO,IAC7C,CACA,OAAIpc,aAAmBc,WACdd,EAIJA,EAAQwF,WAGN0W,GAAelc,EAAQwF,YAFrB,IAEgC,EAErC6W,GAAO,OAUPC,GAAStc,IACbA,EAAQuE,YAAY,EAEhBgY,GAAY,IACZlc,OAAOmc,SAAW1W,SAAS6G,KAAKqP,aAAa,qBACxC3b,OAAOmc,OAET,KAEHC,GAA4B,GAgB5BC,GAAQ,IAAuC,QAAjC5W,SAASC,gBAAgB4W,IACvCC,GAAqBC,IAhBAC,QAiBN,KACjB,MAAMC,EAAIR,KAEV,GAAIQ,EAAG,CACL,MAAMhc,EAAO8b,EAAOG,KACdC,EAAqBF,EAAE7b,GAAGH,GAChCgc,EAAE7b,GAAGH,GAAQ8b,EAAOK,gBACpBH,EAAE7b,GAAGH,GAAMoc,YAAcN,EACzBE,EAAE7b,GAAGH,GAAMqc,WAAa,KACtBL,EAAE7b,GAAGH,GAAQkc,EACNJ,EAAOK,gBAElB,GA5B0B,YAAxBpX,SAASuX,YAENZ,GAA0BtL,QAC7BrL,SAASyF,iBAAiB,oBAAoB,KAC5C,IAAK,MAAMuR,KAAYL,GACrBK,GACF,IAGJL,GAA0BpK,KAAKyK,IAE/BA,GAkBA,EAEEQ,GAAU,CAACC,EAAkB9F,EAAO,GAAI+F,EAAeD,IACxB,mBAArBA,EAAkCA,KAAoB9F,GAAQ+F,EAExEC,GAAyB,CAACX,EAAUY,EAAmBC,GAAoB,KAC/E,IAAKA,EAEH,YADAL,GAAQR,GAGV,MACMc,EA/JiC5d,KACvC,IAAKA,EACH,OAAO,EAIT,IAAI,mBACF6d,EAAkB,gBAClBC,GACEzd,OAAOqF,iBAAiB1F,GAC5B,MAAM+d,EAA0BC,OAAOC,WAAWJ,GAC5CK,EAAuBF,OAAOC,WAAWH,GAG/C,OAAKC,GAA4BG,GAKjCL,EAAqBA,EAAmBlb,MAAM,KAAK,GACnDmb,EAAkBA,EAAgBnb,MAAM,KAAK,GAtDf,KAuDtBqb,OAAOC,WAAWJ,GAAsBG,OAAOC,WAAWH,KANzD,CAMoG,EA0IpFK,CAAiCT,GADlC,EAExB,IAAIU,GAAS,EACb,MAAMC,EAAU,EACdrR,aAEIA,IAAW0Q,IAGfU,GAAS,EACTV,EAAkBjS,oBAAoB6O,GAAgB+D,GACtDf,GAAQR,GAAS,EAEnBY,EAAkBnS,iBAAiB+O,GAAgB+D,GACnDC,YAAW,KACJF,GACHvD,GAAqB6C,EACvB,GACCE,EAAiB,EAYhBW,GAAuB,CAAC1R,EAAM2R,EAAeC,EAAeC,KAChE,MAAMC,EAAa9R,EAAKsE,OACxB,IAAI+H,EAAQrM,EAAKjH,QAAQ4Y,GAIzB,OAAe,IAAXtF,GACMuF,GAAiBC,EAAiB7R,EAAK8R,EAAa,GAAK9R,EAAK,IAExEqM,GAASuF,EAAgB,GAAK,EAC1BC,IACFxF,GAASA,EAAQyF,GAAcA,GAE1B9R,EAAKjK,KAAKC,IAAI,EAAGD,KAAKE,IAAIoW,EAAOyF,EAAa,KAAI,EAerDC,GAAiB,qBACjBC,GAAiB,OACjBC,GAAgB,SAChBC,GAAgB,CAAC,EACvB,IAAIC,GAAW,EACf,MAAMC,GAAe,CACnBC,WAAY,YACZC,WAAY,YAERC,GAAe,IAAIrI,IAAI,CAAC,QAAS,WAAY,UAAW,YAAa,cAAe,aAAc,iBAAkB,YAAa,WAAY,YAAa,cAAe,YAAa,UAAW,WAAY,QAAS,oBAAqB,aAAc,YAAa,WAAY,cAAe,cAAe,cAAe,YAAa,eAAgB,gBAAiB,eAAgB,gBAAiB,aAAc,QAAS,OAAQ,SAAU,QAAS,SAAU,SAAU,UAAW,WAAY,OAAQ,SAAU,eAAgB,SAAU,OAAQ,mBAAoB,mBAAoB,QAAS,QAAS,WAM/lB,SAASsI,GAAarf,EAASsf,GAC7B,OAAOA,GAAO,GAAGA,MAAQN,QAAgBhf,EAAQgf,UAAYA,IAC/D,CACA,SAASO,GAAiBvf,GACxB,MAAMsf,EAAMD,GAAarf,GAGzB,OAFAA,EAAQgf,SAAWM,EACnBP,GAAcO,GAAOP,GAAcO,IAAQ,CAAC,EACrCP,GAAcO,EACvB,CAiCA,SAASE,GAAYC,EAAQC,EAAUC,EAAqB,MAC1D,OAAOliB,OAAOmiB,OAAOH,GAAQ7M,MAAKiN,GAASA,EAAMH,WAAaA,GAAYG,EAAMF,qBAAuBA,GACzG,CACA,SAASG,GAAoBC,EAAmB1B,EAAS2B,GACvD,MAAMC,EAAiC,iBAAZ5B,EAErBqB,EAAWO,EAAcD,EAAqB3B,GAAW2B,EAC/D,IAAIE,EAAYC,GAAaJ,GAI7B,OAHKX,GAAahI,IAAI8I,KACpBA,EAAYH,GAEP,CAACE,EAAaP,EAAUQ,EACjC,CACA,SAASE,GAAWpgB,EAAS+f,EAAmB1B,EAAS2B,EAAoBK,GAC3E,GAAiC,iBAAtBN,IAAmC/f,EAC5C,OAEF,IAAKigB,EAAaP,EAAUQ,GAAaJ,GAAoBC,EAAmB1B,EAAS2B,GAIzF,GAAID,KAAqBd,GAAc,CACrC,MAAMqB,EAAepf,GACZ,SAAU2e,GACf,IAAKA,EAAMU,eAAiBV,EAAMU,gBAAkBV,EAAMW,iBAAmBX,EAAMW,eAAevb,SAAS4a,EAAMU,eAC/G,OAAOrf,EAAGjD,KAAKwiB,KAAMZ,EAEzB,EAEFH,EAAWY,EAAaZ,EAC1B,CACA,MAAMD,EAASF,GAAiBvf,GAC1B0gB,EAAWjB,EAAOS,KAAeT,EAAOS,GAAa,CAAC,GACtDS,EAAmBnB,GAAYkB,EAAUhB,EAAUO,EAAc5B,EAAU,MACjF,GAAIsC,EAEF,YADAA,EAAiBN,OAASM,EAAiBN,QAAUA,GAGvD,MAAMf,EAAMD,GAAaK,EAAUK,EAAkBnU,QAAQgT,GAAgB,KACvE1d,EAAK+e,EA5Db,SAAoCjgB,EAASwa,EAAUtZ,GACrD,OAAO,SAASmd,EAAQwB,GACtB,MAAMe,EAAc5gB,EAAQ6gB,iBAAiBrG,GAC7C,IAAK,IAAI,OACPxN,GACE6S,EAAO7S,GAAUA,IAAWyT,KAAMzT,EAASA,EAAOxH,WACpD,IAAK,MAAMsb,KAAcF,EACvB,GAAIE,IAAe9T,EASnB,OANA+T,GAAWlB,EAAO,CAChBW,eAAgBxT,IAEdqR,EAAQgC,QACVW,GAAaC,IAAIjhB,EAAS6f,EAAMqB,KAAM1G,EAAUtZ,GAE3CA,EAAGigB,MAAMnU,EAAQ,CAAC6S,GAG/B,CACF,CAwC2BuB,CAA2BphB,EAASqe,EAASqB,GAvExE,SAA0B1f,EAASkB,GACjC,OAAO,SAASmd,EAAQwB,GAOtB,OANAkB,GAAWlB,EAAO,CAChBW,eAAgBxgB,IAEdqe,EAAQgC,QACVW,GAAaC,IAAIjhB,EAAS6f,EAAMqB,KAAMhgB,GAEjCA,EAAGigB,MAAMnhB,EAAS,CAAC6f,GAC5B,CACF,CA6DoFwB,CAAiBrhB,EAAS0f,GAC5Gxe,EAAGye,mBAAqBM,EAAc5B,EAAU,KAChDnd,EAAGwe,SAAWA,EACdxe,EAAGmf,OAASA,EACZnf,EAAG8d,SAAWM,EACdoB,EAASpB,GAAOpe,EAChBlB,EAAQuL,iBAAiB2U,EAAWhf,EAAI+e,EAC1C,CACA,SAASqB,GAActhB,EAASyf,EAAQS,EAAW7B,EAASsB,GAC1D,MAAMze,EAAKse,GAAYC,EAAOS,GAAY7B,EAASsB,GAC9Cze,IAGLlB,EAAQyL,oBAAoByU,EAAWhf,EAAIqgB,QAAQ5B,WAC5CF,EAAOS,GAAWhf,EAAG8d,UAC9B,CACA,SAASwC,GAAyBxhB,EAASyf,EAAQS,EAAWuB,GAC5D,MAAMC,EAAoBjC,EAAOS,IAAc,CAAC,EAChD,IAAK,MAAOyB,EAAY9B,KAAUpiB,OAAOmkB,QAAQF,GAC3CC,EAAWE,SAASJ,IACtBH,GAActhB,EAASyf,EAAQS,EAAWL,EAAMH,SAAUG,EAAMF,mBAGtE,CACA,SAASQ,GAAaN,GAGpB,OADAA,EAAQA,EAAMjU,QAAQiT,GAAgB,IAC/BI,GAAaY,IAAUA,CAChC,CACA,MAAMmB,GAAe,CACnB,EAAAc,CAAG9hB,EAAS6f,EAAOxB,EAAS2B,GAC1BI,GAAWpgB,EAAS6f,EAAOxB,EAAS2B,GAAoB,EAC1D,EACA,GAAA+B,CAAI/hB,EAAS6f,EAAOxB,EAAS2B,GAC3BI,GAAWpgB,EAAS6f,EAAOxB,EAAS2B,GAAoB,EAC1D,EACA,GAAAiB,CAAIjhB,EAAS+f,EAAmB1B,EAAS2B,GACvC,GAAiC,iBAAtBD,IAAmC/f,EAC5C,OAEF,MAAOigB,EAAaP,EAAUQ,GAAaJ,GAAoBC,EAAmB1B,EAAS2B,GACrFgC,EAAc9B,IAAcH,EAC5BN,EAASF,GAAiBvf,GAC1B0hB,EAAoBjC,EAAOS,IAAc,CAAC,EAC1C+B,EAAclC,EAAkBmC,WAAW,KACjD,QAAwB,IAAbxC,EAAX,CAQA,GAAIuC,EACF,IAAK,MAAME,KAAgB1kB,OAAO4D,KAAKoe,GACrC+B,GAAyBxhB,EAASyf,EAAQ0C,EAAcpC,EAAkBlN,MAAM,IAGpF,IAAK,MAAOuP,EAAavC,KAAUpiB,OAAOmkB,QAAQF,GAAoB,CACpE,MAAMC,EAAaS,EAAYxW,QAAQkT,GAAe,IACjDkD,IAAejC,EAAkB8B,SAASF,IAC7CL,GAActhB,EAASyf,EAAQS,EAAWL,EAAMH,SAAUG,EAAMF,mBAEpE,CAXA,KAPA,CAEE,IAAKliB,OAAO4D,KAAKqgB,GAAmBvQ,OAClC,OAEFmQ,GAActhB,EAASyf,EAAQS,EAAWR,EAAUO,EAAc5B,EAAU,KAE9E,CAYF,EACA,OAAAgE,CAAQriB,EAAS6f,EAAOpI,GACtB,GAAqB,iBAAVoI,IAAuB7f,EAChC,OAAO,KAET,MAAM+c,EAAIR,KAGV,IAAI+F,EAAc,KACdC,GAAU,EACVC,GAAiB,EACjBC,GAAmB,EAJH5C,IADFM,GAAaN,IAMZ9C,IACjBuF,EAAcvF,EAAEhC,MAAM8E,EAAOpI,GAC7BsF,EAAE/c,GAASqiB,QAAQC,GACnBC,GAAWD,EAAYI,uBACvBF,GAAkBF,EAAYK,gCAC9BF,EAAmBH,EAAYM,sBAEjC,MAAMC,EAAM9B,GAAW,IAAIhG,MAAM8E,EAAO,CACtC0C,UACAO,YAAY,IACVrL,GAUJ,OATIgL,GACFI,EAAIE,iBAEFP,GACFxiB,EAAQ8a,cAAc+H,GAEpBA,EAAIJ,kBAAoBH,GAC1BA,EAAYS,iBAEPF,CACT,GAEF,SAAS9B,GAAWljB,EAAKmlB,EAAO,CAAC,GAC/B,IAAK,MAAOzlB,EAAKa,KAAUX,OAAOmkB,QAAQoB,GACxC,IACEnlB,EAAIN,GAAOa,CACb,CAAE,MAAO6kB,GACPxlB,OAAOC,eAAeG,EAAKN,EAAK,CAC9B2lB,cAAc,EACdtlB,IAAG,IACMQ,GAGb,CAEF,OAAOP,CACT,CASA,SAASslB,GAAc/kB,GACrB,GAAc,SAAVA,EACF,OAAO,EAET,GAAc,UAAVA,EACF,OAAO,EAET,GAAIA,IAAU4f,OAAO5f,GAAOkC,WAC1B,OAAO0d,OAAO5f,GAEhB,GAAc,KAAVA,GAA0B,SAAVA,EAClB,OAAO,KAET,GAAqB,iBAAVA,EACT,OAAOA,EAET,IACE,OAAOglB,KAAKC,MAAMC,mBAAmBllB,GACvC,CAAE,MAAO6kB,GACP,OAAO7kB,CACT,CACF,CACA,SAASmlB,GAAiBhmB,GACxB,OAAOA,EAAIqO,QAAQ,UAAU4X,GAAO,IAAIA,EAAItjB,iBAC9C,CACA,MAAMujB,GAAc,CAClB,gBAAAC,CAAiB1jB,EAASzC,EAAKa,GAC7B4B,EAAQ6B,aAAa,WAAW0hB,GAAiBhmB,KAAQa,EAC3D,EACA,mBAAAulB,CAAoB3jB,EAASzC,GAC3ByC,EAAQ4B,gBAAgB,WAAW2hB,GAAiBhmB,KACtD,EACA,iBAAAqmB,CAAkB5jB,GAChB,IAAKA,EACH,MAAO,CAAC,EAEV,MAAM0B,EAAa,CAAC,EACdmiB,EAASpmB,OAAO4D,KAAKrB,EAAQ8jB,SAASld,QAAOrJ,GAAOA,EAAI2kB,WAAW,QAAU3kB,EAAI2kB,WAAW,cAClG,IAAK,MAAM3kB,KAAOsmB,EAAQ,CACxB,IAAIE,EAAUxmB,EAAIqO,QAAQ,MAAO,IACjCmY,EAAUA,EAAQC,OAAO,GAAG9jB,cAAgB6jB,EAAQlR,MAAM,EAAGkR,EAAQ5S,QACrEzP,EAAWqiB,GAAWZ,GAAcnjB,EAAQ8jB,QAAQvmB,GACtD,CACA,OAAOmE,CACT,EACAuiB,iBAAgB,CAACjkB,EAASzC,IACjB4lB,GAAcnjB,EAAQic,aAAa,WAAWsH,GAAiBhmB,QAgB1E,MAAM2mB,GAEJ,kBAAWC,GACT,MAAO,CAAC,CACV,CACA,sBAAWC,GACT,MAAO,CAAC,CACV,CACA,eAAWpH,GACT,MAAM,IAAIqH,MAAM,sEAClB,CACA,UAAAC,CAAWC,GAIT,OAHAA,EAAS9D,KAAK+D,gBAAgBD,GAC9BA,EAAS9D,KAAKgE,kBAAkBF,GAChC9D,KAAKiE,iBAAiBH,GACfA,CACT,CACA,iBAAAE,CAAkBF,GAChB,OAAOA,CACT,CACA,eAAAC,CAAgBD,EAAQvkB,GACtB,MAAM2kB,EAAa,GAAU3kB,GAAWyjB,GAAYQ,iBAAiBjkB,EAAS,UAAY,CAAC,EAE3F,MAAO,IACFygB,KAAKmE,YAAYT,WACM,iBAAfQ,EAA0BA,EAAa,CAAC,KAC/C,GAAU3kB,GAAWyjB,GAAYG,kBAAkB5jB,GAAW,CAAC,KAC7C,iBAAXukB,EAAsBA,EAAS,CAAC,EAE/C,CACA,gBAAAG,CAAiBH,EAAQM,EAAcpE,KAAKmE,YAAYR,aACtD,IAAK,MAAO7hB,EAAUuiB,KAAkBrnB,OAAOmkB,QAAQiD,GAAc,CACnE,MAAMzmB,EAAQmmB,EAAOhiB,GACfwiB,EAAY,GAAU3mB,GAAS,UAhiBrC4c,OADSA,EAiiB+C5c,GA/hBnD,GAAG4c,IAELvd,OAAOM,UAAUuC,SAASrC,KAAK+c,GAAQL,MAAM,eAAe,GAAGza,cA8hBlE,IAAK,IAAI8kB,OAAOF,GAAehhB,KAAKihB,GAClC,MAAM,IAAIE,UAAU,GAAGxE,KAAKmE,YAAY5H,KAAKkI,0BAA0B3iB,qBAA4BwiB,yBAAiCD,MAExI,CAriBW9J,KAsiBb,EAqBF,MAAMmK,WAAsBjB,GAC1B,WAAAU,CAAY5kB,EAASukB,GACnBa,SACAplB,EAAUmb,GAAWnb,MAIrBygB,KAAK4E,SAAWrlB,EAChBygB,KAAK6E,QAAU7E,KAAK6D,WAAWC,GAC/BzK,GAAKtH,IAAIiO,KAAK4E,SAAU5E,KAAKmE,YAAYW,SAAU9E,MACrD,CAGA,OAAA+E,GACE1L,GAAKM,OAAOqG,KAAK4E,SAAU5E,KAAKmE,YAAYW,UAC5CvE,GAAaC,IAAIR,KAAK4E,SAAU5E,KAAKmE,YAAYa,WACjD,IAAK,MAAMC,KAAgBjoB,OAAOkoB,oBAAoBlF,MACpDA,KAAKiF,GAAgB,IAEzB,CACA,cAAAE,CAAe9I,EAAU9c,EAAS6lB,GAAa,GAC7CpI,GAAuBX,EAAU9c,EAAS6lB,EAC5C,CACA,UAAAvB,CAAWC,GAIT,OAHAA,EAAS9D,KAAK+D,gBAAgBD,EAAQ9D,KAAK4E,UAC3Cd,EAAS9D,KAAKgE,kBAAkBF,GAChC9D,KAAKiE,iBAAiBH,GACfA,CACT,CAGA,kBAAOuB,CAAY9lB,GACjB,OAAO8Z,GAAKlc,IAAIud,GAAWnb,GAAUygB,KAAK8E,SAC5C,CACA,0BAAOQ,CAAoB/lB,EAASukB,EAAS,CAAC,GAC5C,OAAO9D,KAAKqF,YAAY9lB,IAAY,IAAIygB,KAAKzgB,EAA2B,iBAAXukB,EAAsBA,EAAS,KAC9F,CACA,kBAAWyB,GACT,MA5CY,OA6Cd,CACA,mBAAWT,GACT,MAAO,MAAM9E,KAAKzD,MACpB,CACA,oBAAWyI,GACT,MAAO,IAAIhF,KAAK8E,UAClB,CACA,gBAAOU,CAAUllB,GACf,MAAO,GAAGA,IAAO0f,KAAKgF,WACxB,EAUF,MAAMS,GAAclmB,IAClB,IAAIwa,EAAWxa,EAAQic,aAAa,kBACpC,IAAKzB,GAAyB,MAAbA,EAAkB,CACjC,IAAI2L,EAAgBnmB,EAAQic,aAAa,QAMzC,IAAKkK,IAAkBA,EAActE,SAAS,OAASsE,EAAcjE,WAAW,KAC9E,OAAO,KAILiE,EAActE,SAAS,OAASsE,EAAcjE,WAAW,OAC3DiE,EAAgB,IAAIA,EAAcxjB,MAAM,KAAK,MAE/C6X,EAAW2L,GAAmC,MAAlBA,EAAwBA,EAAcC,OAAS,IAC7E,CACA,OAAO5L,EAAWA,EAAS7X,MAAM,KAAKY,KAAI8iB,GAAO9L,GAAc8L,KAAM1iB,KAAK,KAAO,IAAI,EAEjF2iB,GAAiB,CACrB1T,KAAI,CAAC4H,EAAUxa,EAAU8F,SAASC,kBACzB,GAAG3G,UAAUsB,QAAQ3C,UAAU8iB,iBAAiB5iB,KAAK+B,EAASwa,IAEvE+L,QAAO,CAAC/L,EAAUxa,EAAU8F,SAASC,kBAC5BrF,QAAQ3C,UAAU8K,cAAc5K,KAAK+B,EAASwa,GAEvDgM,SAAQ,CAACxmB,EAASwa,IACT,GAAGpb,UAAUY,EAAQwmB,UAAU5f,QAAOzB,GAASA,EAAMshB,QAAQjM,KAEtE,OAAAkM,CAAQ1mB,EAASwa,GACf,MAAMkM,EAAU,GAChB,IAAIC,EAAW3mB,EAAQwF,WAAWiW,QAAQjB,GAC1C,KAAOmM,GACLD,EAAQrU,KAAKsU,GACbA,EAAWA,EAASnhB,WAAWiW,QAAQjB,GAEzC,OAAOkM,CACT,EACA,IAAAE,CAAK5mB,EAASwa,GACZ,IAAIqM,EAAW7mB,EAAQ8mB,uBACvB,KAAOD,GAAU,CACf,GAAIA,EAASJ,QAAQjM,GACnB,MAAO,CAACqM,GAEVA,EAAWA,EAASC,sBACtB,CACA,MAAO,EACT,EAEA,IAAAxhB,CAAKtF,EAASwa,GACZ,IAAIlV,EAAOtF,EAAQ+mB,mBACnB,KAAOzhB,GAAM,CACX,GAAIA,EAAKmhB,QAAQjM,GACf,MAAO,CAAClV,GAEVA,EAAOA,EAAKyhB,kBACd,CACA,MAAO,EACT,EACA,iBAAAC,CAAkBhnB,GAChB,MAAMinB,EAAa,CAAC,IAAK,SAAU,QAAS,WAAY,SAAU,UAAW,aAAc,4BAA4B1jB,KAAIiX,GAAY,GAAGA,2BAAiC7W,KAAK,KAChL,OAAO8c,KAAK7N,KAAKqU,EAAYjnB,GAAS4G,QAAOsgB,IAAOvL,GAAWuL,IAAO9L,GAAU8L,IAClF,EACA,sBAAAC,CAAuBnnB,GACrB,MAAMwa,EAAW0L,GAAYlmB,GAC7B,OAAIwa,GACK8L,GAAeC,QAAQ/L,GAAYA,EAErC,IACT,EACA,sBAAA4M,CAAuBpnB,GACrB,MAAMwa,EAAW0L,GAAYlmB,GAC7B,OAAOwa,EAAW8L,GAAeC,QAAQ/L,GAAY,IACvD,EACA,+BAAA6M,CAAgCrnB,GAC9B,MAAMwa,EAAW0L,GAAYlmB,GAC7B,OAAOwa,EAAW8L,GAAe1T,KAAK4H,GAAY,EACpD,GAUI8M,GAAuB,CAACC,EAAWC,EAAS,UAChD,MAAMC,EAAa,gBAAgBF,EAAU9B,YACvC1kB,EAAOwmB,EAAUvK,KACvBgE,GAAac,GAAGhc,SAAU2hB,EAAY,qBAAqB1mB,OAAU,SAAU8e,GAI7E,GAHI,CAAC,IAAK,QAAQgC,SAASpB,KAAKiH,UAC9B7H,EAAMkD,iBAEJpH,GAAW8E,MACb,OAEF,MAAMzT,EAASsZ,GAAec,uBAAuB3G,OAASA,KAAKhF,QAAQ,IAAI1a,KAC9DwmB,EAAUxB,oBAAoB/Y,GAGtCwa,IACX,GAAE,EAiBEG,GAAc,YACdC,GAAc,QAAQD,KACtBE,GAAe,SAASF,KAQ9B,MAAMG,WAAc3C,GAElB,eAAWnI,GACT,MAfW,OAgBb,CAGA,KAAA+K,GAEE,GADmB/G,GAAaqB,QAAQ5B,KAAK4E,SAAUuC,IACxCnF,iBACb,OAEFhC,KAAK4E,SAASvJ,UAAU1B,OAlBF,QAmBtB,MAAMyL,EAAapF,KAAK4E,SAASvJ,UAAU7W,SApBrB,QAqBtBwb,KAAKmF,gBAAe,IAAMnF,KAAKuH,mBAAmBvH,KAAK4E,SAAUQ,EACnE,CAGA,eAAAmC,GACEvH,KAAK4E,SAASjL,SACd4G,GAAaqB,QAAQ5B,KAAK4E,SAAUwC,IACpCpH,KAAK+E,SACP,CAGA,sBAAOtI,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAOgd,GAAM/B,oBAAoBtF,MACvC,GAAsB,iBAAX8D,EAAX,CAGA,QAAqB/K,IAAjB1O,EAAKyZ,IAAyBA,EAAOrC,WAAW,MAAmB,gBAAXqC,EAC1D,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,GAAQ9D,KAJb,CAKF,GACF,EAOF6G,GAAqBQ,GAAO,SAM5BlL,GAAmBkL,IAcnB,MAKMI,GAAyB,4BAO/B,MAAMC,WAAehD,GAEnB,eAAWnI,GACT,MAfW,QAgBb,CAGA,MAAAoL,GAEE3H,KAAK4E,SAASxjB,aAAa,eAAgB4e,KAAK4E,SAASvJ,UAAUsM,OAjB3C,UAkB1B,CAGA,sBAAOlL,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAOqd,GAAOpC,oBAAoBtF,MACzB,WAAX8D,GACFzZ,EAAKyZ,IAET,GACF,EAOFvD,GAAac,GAAGhc,SAjCe,2BAiCmBoiB,IAAwBrI,IACxEA,EAAMkD,iBACN,MAAMsF,EAASxI,EAAM7S,OAAOyO,QAAQyM,IACvBC,GAAOpC,oBAAoBsC,GACnCD,QAAQ,IAOfxL,GAAmBuL,IAcnB,MACMG,GAAc,YACdC,GAAmB,aAAaD,KAChCE,GAAkB,YAAYF,KAC9BG,GAAiB,WAAWH,KAC5BI,GAAoB,cAAcJ,KAClCK,GAAkB,YAAYL,KAK9BM,GAAY,CAChBC,YAAa,KACbC,aAAc,KACdC,cAAe,MAEXC,GAAgB,CACpBH,YAAa,kBACbC,aAAc,kBACdC,cAAe,mBAOjB,MAAME,WAAc/E,GAClB,WAAAU,CAAY5kB,EAASukB,GACnBa,QACA3E,KAAK4E,SAAWrlB,EACXA,GAAYipB,GAAMC,gBAGvBzI,KAAK6E,QAAU7E,KAAK6D,WAAWC,GAC/B9D,KAAK0I,QAAU,EACf1I,KAAK2I,sBAAwB7H,QAAQlhB,OAAOgpB,cAC5C5I,KAAK6I,cACP,CAGA,kBAAWnF,GACT,OAAOyE,EACT,CACA,sBAAWxE,GACT,OAAO4E,EACT,CACA,eAAWhM,GACT,MA/CW,OAgDb,CAGA,OAAAwI,GACExE,GAAaC,IAAIR,KAAK4E,SAAUiD,GAClC,CAGA,MAAAiB,CAAO1J,GACAY,KAAK2I,sBAIN3I,KAAK+I,wBAAwB3J,KAC/BY,KAAK0I,QAAUtJ,EAAM4J,SAJrBhJ,KAAK0I,QAAUtJ,EAAM6J,QAAQ,GAAGD,OAMpC,CACA,IAAAE,CAAK9J,GACCY,KAAK+I,wBAAwB3J,KAC/BY,KAAK0I,QAAUtJ,EAAM4J,QAAUhJ,KAAK0I,SAEtC1I,KAAKmJ,eACLtM,GAAQmD,KAAK6E,QAAQuD,YACvB,CACA,KAAAgB,CAAMhK,GACJY,KAAK0I,QAAUtJ,EAAM6J,SAAW7J,EAAM6J,QAAQvY,OAAS,EAAI,EAAI0O,EAAM6J,QAAQ,GAAGD,QAAUhJ,KAAK0I,OACjG,CACA,YAAAS,GACE,MAAME,EAAYlnB,KAAKoC,IAAIyb,KAAK0I,SAChC,GAAIW,GAnEgB,GAoElB,OAEF,MAAM/b,EAAY+b,EAAYrJ,KAAK0I,QACnC1I,KAAK0I,QAAU,EACVpb,GAGLuP,GAAQvP,EAAY,EAAI0S,KAAK6E,QAAQyD,cAAgBtI,KAAK6E,QAAQwD,aACpE,CACA,WAAAQ,GACM7I,KAAK2I,uBACPpI,GAAac,GAAGrB,KAAK4E,SAAUqD,IAAmB7I,GAASY,KAAK8I,OAAO1J,KACvEmB,GAAac,GAAGrB,KAAK4E,SAAUsD,IAAiB9I,GAASY,KAAKkJ,KAAK9J,KACnEY,KAAK4E,SAASvJ,UAAU5E,IAlFG,mBAoF3B8J,GAAac,GAAGrB,KAAK4E,SAAUkD,IAAkB1I,GAASY,KAAK8I,OAAO1J,KACtEmB,GAAac,GAAGrB,KAAK4E,SAAUmD,IAAiB3I,GAASY,KAAKoJ,MAAMhK,KACpEmB,GAAac,GAAGrB,KAAK4E,SAAUoD,IAAgB5I,GAASY,KAAKkJ,KAAK9J,KAEtE,CACA,uBAAA2J,CAAwB3J,GACtB,OAAOY,KAAK2I,wBA3FS,QA2FiBvJ,EAAMkK,aA5FrB,UA4FyDlK,EAAMkK,YACxF,CAGA,kBAAOb,GACL,MAAO,iBAAkBpjB,SAASC,iBAAmB7C,UAAU8mB,eAAiB,CAClF,EAeF,MAEMC,GAAc,eACdC,GAAiB,YACjBC,GAAmB,YACnBC,GAAoB,aAGpBC,GAAa,OACbC,GAAa,OACbC,GAAiB,OACjBC,GAAkB,QAClBC,GAAc,QAAQR,KACtBS,GAAa,OAAOT,KACpBU,GAAkB,UAAUV,KAC5BW,GAAqB,aAAaX,KAClCY,GAAqB,aAAaZ,KAClCa,GAAmB,YAAYb,KAC/Bc,GAAwB,OAAOd,KAAcC,KAC7Cc,GAAyB,QAAQf,KAAcC,KAC/Ce,GAAsB,WACtBC,GAAsB,SAMtBC,GAAkB,UAClBC,GAAgB,iBAChBC,GAAuBF,GAAkBC,GAKzCE,GAAmB,CACvB,CAACnB,IAAmBK,GACpB,CAACJ,IAAoBG,IAEjBgB,GAAY,CAChBC,SAAU,IACVC,UAAU,EACVC,MAAO,QACPC,MAAM,EACNC,OAAO,EACPC,MAAM,GAEFC,GAAgB,CACpBN,SAAU,mBAEVC,SAAU,UACVC,MAAO,mBACPC,KAAM,mBACNC,MAAO,UACPC,KAAM,WAOR,MAAME,WAAiB5G,GACrB,WAAAP,CAAY5kB,EAASukB,GACnBa,MAAMplB,EAASukB,GACf9D,KAAKuL,UAAY,KACjBvL,KAAKwL,eAAiB,KACtBxL,KAAKyL,YAAa,EAClBzL,KAAK0L,aAAe,KACpB1L,KAAK2L,aAAe,KACpB3L,KAAK4L,mBAAqB/F,GAAeC,QArCjB,uBAqC8C9F,KAAK4E,UAC3E5E,KAAK6L,qBACD7L,KAAK6E,QAAQqG,OAASV,IACxBxK,KAAK8L,OAET,CAGA,kBAAWpI,GACT,OAAOoH,EACT,CACA,sBAAWnH,GACT,OAAO0H,EACT,CACA,eAAW9O,GACT,MAnFW,UAoFb,CAGA,IAAA1X,GACEmb,KAAK+L,OAAOnC,GACd,CACA,eAAAoC,IAIO3mB,SAAS4mB,QAAUtR,GAAUqF,KAAK4E,WACrC5E,KAAKnb,MAET,CACA,IAAAshB,GACEnG,KAAK+L,OAAOlC,GACd,CACA,KAAAoB,GACMjL,KAAKyL,YACPrR,GAAqB4F,KAAK4E,UAE5B5E,KAAKkM,gBACP,CACA,KAAAJ,GACE9L,KAAKkM,iBACLlM,KAAKmM,kBACLnM,KAAKuL,UAAYa,aAAY,IAAMpM,KAAKgM,mBAAmBhM,KAAK6E,QAAQkG,SAC1E,CACA,iBAAAsB,GACOrM,KAAK6E,QAAQqG,OAGdlL,KAAKyL,WACPlL,GAAae,IAAItB,KAAK4E,SAAUqF,IAAY,IAAMjK,KAAK8L,UAGzD9L,KAAK8L,QACP,CACA,EAAAQ,CAAG7T,GACD,MAAM8T,EAAQvM,KAAKwM,YACnB,GAAI/T,EAAQ8T,EAAM7b,OAAS,GAAK+H,EAAQ,EACtC,OAEF,GAAIuH,KAAKyL,WAEP,YADAlL,GAAae,IAAItB,KAAK4E,SAAUqF,IAAY,IAAMjK,KAAKsM,GAAG7T,KAG5D,MAAMgU,EAAczM,KAAK0M,cAAc1M,KAAK2M,cAC5C,GAAIF,IAAgBhU,EAClB,OAEF,MAAMtC,EAAQsC,EAAQgU,EAAc7C,GAAaC,GACjD7J,KAAK+L,OAAO5V,EAAOoW,EAAM9T,GAC3B,CACA,OAAAsM,GACM/E,KAAK2L,cACP3L,KAAK2L,aAAa5G,UAEpBJ,MAAMI,SACR,CAGA,iBAAAf,CAAkBF,GAEhB,OADAA,EAAO8I,gBAAkB9I,EAAOiH,SACzBjH,CACT,CACA,kBAAA+H,GACM7L,KAAK6E,QAAQmG,UACfzK,GAAac,GAAGrB,KAAK4E,SAAUsF,IAAiB9K,GAASY,KAAK6M,SAASzN,KAE9C,UAAvBY,KAAK6E,QAAQoG,QACf1K,GAAac,GAAGrB,KAAK4E,SAAUuF,IAAoB,IAAMnK,KAAKiL,UAC9D1K,GAAac,GAAGrB,KAAK4E,SAAUwF,IAAoB,IAAMpK,KAAKqM,uBAE5DrM,KAAK6E,QAAQsG,OAAS3C,GAAMC,eAC9BzI,KAAK8M,yBAET,CACA,uBAAAA,GACE,IAAK,MAAMC,KAAOlH,GAAe1T,KArIX,qBAqImC6N,KAAK4E,UAC5DrE,GAAac,GAAG0L,EAAK1C,IAAkBjL,GAASA,EAAMkD,mBAExD,MAmBM0K,EAAc,CAClB3E,aAAc,IAAMrI,KAAK+L,OAAO/L,KAAKiN,kBAAkBnD,KACvDxB,cAAe,IAAMtI,KAAK+L,OAAO/L,KAAKiN,kBAAkBlD,KACxD3B,YAtBkB,KACS,UAAvBpI,KAAK6E,QAAQoG,QAYjBjL,KAAKiL,QACDjL,KAAK0L,cACPwB,aAAalN,KAAK0L,cAEpB1L,KAAK0L,aAAe7N,YAAW,IAAMmC,KAAKqM,qBAjLjB,IAiL+DrM,KAAK6E,QAAQkG,UAAS,GAOhH/K,KAAK2L,aAAe,IAAInD,GAAMxI,KAAK4E,SAAUoI,EAC/C,CACA,QAAAH,CAASzN,GACP,GAAI,kBAAkB/b,KAAK+b,EAAM7S,OAAO0a,SACtC,OAEF,MAAM3Z,EAAYud,GAAiBzL,EAAMtiB,KACrCwQ,IACF8R,EAAMkD,iBACNtC,KAAK+L,OAAO/L,KAAKiN,kBAAkB3f,IAEvC,CACA,aAAAof,CAAcntB,GACZ,OAAOygB,KAAKwM,YAAYrnB,QAAQ5F,EAClC,CACA,0BAAA4tB,CAA2B1U,GACzB,IAAKuH,KAAK4L,mBACR,OAEF,MAAMwB,EAAkBvH,GAAeC,QAAQ4E,GAAiB1K,KAAK4L,oBACrEwB,EAAgB/R,UAAU1B,OAAO8Q,IACjC2C,EAAgBjsB,gBAAgB,gBAChC,MAAMksB,EAAqBxH,GAAeC,QAAQ,sBAAsBrN,MAAWuH,KAAK4L,oBACpFyB,IACFA,EAAmBhS,UAAU5E,IAAIgU,IACjC4C,EAAmBjsB,aAAa,eAAgB,QAEpD,CACA,eAAA+qB,GACE,MAAM5sB,EAAUygB,KAAKwL,gBAAkBxL,KAAK2M,aAC5C,IAAKptB,EACH,OAEF,MAAM+tB,EAAkB/P,OAAOgQ,SAAShuB,EAAQic,aAAa,oBAAqB,IAClFwE,KAAK6E,QAAQkG,SAAWuC,GAAmBtN,KAAK6E,QAAQ+H,eAC1D,CACA,MAAAb,CAAO5V,EAAO5W,EAAU,MACtB,GAAIygB,KAAKyL,WACP,OAEF,MAAM1N,EAAgBiC,KAAK2M,aACrBa,EAASrX,IAAUyT,GACnB6D,EAAcluB,GAAWue,GAAqBkC,KAAKwM,YAAazO,EAAeyP,EAAQxN,KAAK6E,QAAQuG,MAC1G,GAAIqC,IAAgB1P,EAClB,OAEF,MAAM2P,EAAmB1N,KAAK0M,cAAce,GACtCE,EAAenI,GACZjF,GAAaqB,QAAQ5B,KAAK4E,SAAUY,EAAW,CACpD1F,cAAe2N,EACfngB,UAAW0S,KAAK4N,kBAAkBzX,GAClCuD,KAAMsG,KAAK0M,cAAc3O,GACzBuO,GAAIoB,IAIR,GADmBC,EAAa3D,IACjBhI,iBACb,OAEF,IAAKjE,IAAkB0P,EAGrB,OAEF,MAAMI,EAAY/M,QAAQd,KAAKuL,WAC/BvL,KAAKiL,QACLjL,KAAKyL,YAAa,EAClBzL,KAAKmN,2BAA2BO,GAChC1N,KAAKwL,eAAiBiC,EACtB,MAAMK,EAAuBN,EA3OR,sBADF,oBA6ObO,EAAiBP,EA3OH,qBACA,qBA2OpBC,EAAYpS,UAAU5E,IAAIsX,GAC1BlS,GAAO4R,GACP1P,EAAc1C,UAAU5E,IAAIqX,GAC5BL,EAAYpS,UAAU5E,IAAIqX,GAQ1B9N,KAAKmF,gBAPoB,KACvBsI,EAAYpS,UAAU1B,OAAOmU,EAAsBC,GACnDN,EAAYpS,UAAU5E,IAAIgU,IAC1B1M,EAAc1C,UAAU1B,OAAO8Q,GAAqBsD,EAAgBD,GACpE9N,KAAKyL,YAAa,EAClBkC,EAAa1D,GAAW,GAEYlM,EAAeiC,KAAKgO,eACtDH,GACF7N,KAAK8L,OAET,CACA,WAAAkC,GACE,OAAOhO,KAAK4E,SAASvJ,UAAU7W,SAhQV,QAiQvB,CACA,UAAAmoB,GACE,OAAO9G,GAAeC,QAAQ8E,GAAsB5K,KAAK4E,SAC3D,CACA,SAAA4H,GACE,OAAO3G,GAAe1T,KAAKwY,GAAe3K,KAAK4E,SACjD,CACA,cAAAsH,GACMlM,KAAKuL,YACP0C,cAAcjO,KAAKuL,WACnBvL,KAAKuL,UAAY,KAErB,CACA,iBAAA0B,CAAkB3f,GAChB,OAAI2O,KACK3O,IAAcwc,GAAiBD,GAAaD,GAE9Ctc,IAAcwc,GAAiBF,GAAaC,EACrD,CACA,iBAAA+D,CAAkBzX,GAChB,OAAI8F,KACK9F,IAAU0T,GAAaC,GAAiBC,GAE1C5T,IAAU0T,GAAaE,GAAkBD,EAClD,CAGA,sBAAOrN,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAOihB,GAAShG,oBAAoBtF,KAAM8D,GAChD,GAAsB,iBAAXA,GAIX,GAAsB,iBAAXA,EAAqB,CAC9B,QAAqB/K,IAAjB1O,EAAKyZ,IAAyBA,EAAOrC,WAAW,MAAmB,gBAAXqC,EAC1D,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,IACP,OAREzZ,EAAKiiB,GAAGxI,EASZ,GACF,EAOFvD,GAAac,GAAGhc,SAAUklB,GAvSE,uCAuS2C,SAAUnL,GAC/E,MAAM7S,EAASsZ,GAAec,uBAAuB3G,MACrD,IAAKzT,IAAWA,EAAO8O,UAAU7W,SAASgmB,IACxC,OAEFpL,EAAMkD,iBACN,MAAM4L,EAAW5C,GAAShG,oBAAoB/Y,GACxC4hB,EAAanO,KAAKxE,aAAa,oBACrC,OAAI2S,GACFD,EAAS5B,GAAG6B,QACZD,EAAS7B,qBAGyC,SAAhDrJ,GAAYQ,iBAAiBxD,KAAM,UACrCkO,EAASrpB,YACTqpB,EAAS7B,sBAGX6B,EAAS/H,YACT+H,EAAS7B,oBACX,IACA9L,GAAac,GAAGzhB,OAAQ0qB,IAAuB,KAC7C,MAAM8D,EAAYvI,GAAe1T,KA5TR,6BA6TzB,IAAK,MAAM+b,KAAYE,EACrB9C,GAAShG,oBAAoB4I,EAC/B,IAOF/R,GAAmBmP,IAcnB,MAEM+C,GAAc,eAEdC,GAAe,OAAOD,KACtBE,GAAgB,QAAQF,KACxBG,GAAe,OAAOH,KACtBI,GAAiB,SAASJ,KAC1BK,GAAyB,QAAQL,cACjCM,GAAoB,OACpBC,GAAsB,WACtBC,GAAwB,aAExBC,GAA6B,WAAWF,OAAwBA,KAKhEG,GAAyB,8BACzBC,GAAY,CAChBvqB,OAAQ,KACRkjB,QAAQ,GAEJsH,GAAgB,CACpBxqB,OAAQ,iBACRkjB,OAAQ,WAOV,MAAMuH,WAAiBxK,GACrB,WAAAP,CAAY5kB,EAASukB,GACnBa,MAAMplB,EAASukB,GACf9D,KAAKmP,kBAAmB,EACxBnP,KAAKoP,cAAgB,GACrB,MAAMC,EAAaxJ,GAAe1T,KAAK4c,IACvC,IAAK,MAAMO,KAAQD,EAAY,CAC7B,MAAMtV,EAAW8L,GAAea,uBAAuB4I,GACjDC,EAAgB1J,GAAe1T,KAAK4H,GAAU5T,QAAOqpB,GAAgBA,IAAiBxP,KAAK4E,WAChF,OAAb7K,GAAqBwV,EAAc7e,QACrCsP,KAAKoP,cAAcxd,KAAK0d,EAE5B,CACAtP,KAAKyP,sBACAzP,KAAK6E,QAAQpgB,QAChBub,KAAK0P,0BAA0B1P,KAAKoP,cAAepP,KAAK2P,YAEtD3P,KAAK6E,QAAQ8C,QACf3H,KAAK2H,QAET,CAGA,kBAAWjE,GACT,OAAOsL,EACT,CACA,sBAAWrL,GACT,OAAOsL,EACT,CACA,eAAW1S,GACT,MA9DW,UA+Db,CAGA,MAAAoL,GACM3H,KAAK2P,WACP3P,KAAK4P,OAEL5P,KAAK6P,MAET,CACA,IAAAA,GACE,GAAI7P,KAAKmP,kBAAoBnP,KAAK2P,WAChC,OAEF,IAAIG,EAAiB,GAQrB,GALI9P,KAAK6E,QAAQpgB,SACfqrB,EAAiB9P,KAAK+P,uBAhEH,wCAgE4C5pB,QAAO5G,GAAWA,IAAYygB,KAAK4E,WAAU9hB,KAAIvD,GAAW2vB,GAAS5J,oBAAoB/lB,EAAS,CAC/JooB,QAAQ,OAGRmI,EAAepf,QAAUof,EAAe,GAAGX,iBAC7C,OAGF,GADmB5O,GAAaqB,QAAQ5B,KAAK4E,SAAU0J,IACxCtM,iBACb,OAEF,IAAK,MAAMgO,KAAkBF,EAC3BE,EAAeJ,OAEjB,MAAMK,EAAYjQ,KAAKkQ,gBACvBlQ,KAAK4E,SAASvJ,UAAU1B,OAAOiV,IAC/B5O,KAAK4E,SAASvJ,UAAU5E,IAAIoY,IAC5B7O,KAAK4E,SAAS7jB,MAAMkvB,GAAa,EACjCjQ,KAAK0P,0BAA0B1P,KAAKoP,eAAe,GACnDpP,KAAKmP,kBAAmB,EACxB,MAQMgB,EAAa,SADUF,EAAU,GAAGxL,cAAgBwL,EAAU7d,MAAM,KAE1E4N,KAAKmF,gBATY,KACfnF,KAAKmP,kBAAmB,EACxBnP,KAAK4E,SAASvJ,UAAU1B,OAAOkV,IAC/B7O,KAAK4E,SAASvJ,UAAU5E,IAAImY,GAAqBD,IACjD3O,KAAK4E,SAAS7jB,MAAMkvB,GAAa,GACjC1P,GAAaqB,QAAQ5B,KAAK4E,SAAU2J,GAAc,GAItBvO,KAAK4E,UAAU,GAC7C5E,KAAK4E,SAAS7jB,MAAMkvB,GAAa,GAAGjQ,KAAK4E,SAASuL,MACpD,CACA,IAAAP,GACE,GAAI5P,KAAKmP,mBAAqBnP,KAAK2P,WACjC,OAGF,GADmBpP,GAAaqB,QAAQ5B,KAAK4E,SAAU4J,IACxCxM,iBACb,OAEF,MAAMiO,EAAYjQ,KAAKkQ,gBACvBlQ,KAAK4E,SAAS7jB,MAAMkvB,GAAa,GAAGjQ,KAAK4E,SAASthB,wBAAwB2sB,OAC1EpU,GAAOmE,KAAK4E,UACZ5E,KAAK4E,SAASvJ,UAAU5E,IAAIoY,IAC5B7O,KAAK4E,SAASvJ,UAAU1B,OAAOiV,GAAqBD,IACpD,IAAK,MAAM/M,KAAW5B,KAAKoP,cAAe,CACxC,MAAM7vB,EAAUsmB,GAAec,uBAAuB/E,GAClDriB,IAAYygB,KAAK2P,SAASpwB,IAC5BygB,KAAK0P,0BAA0B,CAAC9N,IAAU,EAE9C,CACA5B,KAAKmP,kBAAmB,EAOxBnP,KAAK4E,SAAS7jB,MAAMkvB,GAAa,GACjCjQ,KAAKmF,gBAPY,KACfnF,KAAKmP,kBAAmB,EACxBnP,KAAK4E,SAASvJ,UAAU1B,OAAOkV,IAC/B7O,KAAK4E,SAASvJ,UAAU5E,IAAImY,IAC5BrO,GAAaqB,QAAQ5B,KAAK4E,SAAU6J,GAAe,GAGvBzO,KAAK4E,UAAU,EAC/C,CACA,QAAA+K,CAASpwB,EAAUygB,KAAK4E,UACtB,OAAOrlB,EAAQ8b,UAAU7W,SAASmqB,GACpC,CAGA,iBAAA3K,CAAkBF,GAGhB,OAFAA,EAAO6D,OAAS7G,QAAQgD,EAAO6D,QAC/B7D,EAAOrf,OAASiW,GAAWoJ,EAAOrf,QAC3Bqf,CACT,CACA,aAAAoM,GACE,OAAOlQ,KAAK4E,SAASvJ,UAAU7W,SA3IL,uBAChB,QACC,QA0Ib,CACA,mBAAAirB,GACE,IAAKzP,KAAK6E,QAAQpgB,OAChB,OAEF,MAAMshB,EAAW/F,KAAK+P,uBAAuBhB,IAC7C,IAAK,MAAMxvB,KAAWwmB,EAAU,CAC9B,MAAMqK,EAAWvK,GAAec,uBAAuBpnB,GACnD6wB,GACFpQ,KAAK0P,0BAA0B,CAACnwB,GAAUygB,KAAK2P,SAASS,GAE5D,CACF,CACA,sBAAAL,CAAuBhW,GACrB,MAAMgM,EAAWF,GAAe1T,KAAK2c,GAA4B9O,KAAK6E,QAAQpgB,QAE9E,OAAOohB,GAAe1T,KAAK4H,EAAUiG,KAAK6E,QAAQpgB,QAAQ0B,QAAO5G,IAAYwmB,EAAS3E,SAAS7hB,IACjG,CACA,yBAAAmwB,CAA0BW,EAAcC,GACtC,GAAKD,EAAa3f,OAGlB,IAAK,MAAMnR,KAAW8wB,EACpB9wB,EAAQ8b,UAAUsM,OArKK,aAqKyB2I,GAChD/wB,EAAQ6B,aAAa,gBAAiBkvB,EAE1C,CAGA,sBAAO7T,CAAgBqH,GACrB,MAAMe,EAAU,CAAC,EAIjB,MAHsB,iBAAXf,GAAuB,YAAYzgB,KAAKygB,KACjDe,EAAQ8C,QAAS,GAEZ3H,KAAKwH,MAAK,WACf,MAAMnd,EAAO6kB,GAAS5J,oBAAoBtF,KAAM6E,GAChD,GAAsB,iBAAXf,EAAqB,CAC9B,QAA4B,IAAjBzZ,EAAKyZ,GACd,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,IACP,CACF,GACF,EAOFvD,GAAac,GAAGhc,SAAUqpB,GAAwBK,IAAwB,SAAU3P,IAErD,MAAzBA,EAAM7S,OAAO0a,SAAmB7H,EAAMW,gBAAmD,MAAjCX,EAAMW,eAAekH,UAC/E7H,EAAMkD,iBAER,IAAK,MAAM/iB,KAAWsmB,GAAee,gCAAgC5G,MACnEkP,GAAS5J,oBAAoB/lB,EAAS,CACpCooB,QAAQ,IACPA,QAEP,IAMAxL,GAAmB+S,IAcnB,MAAMqB,GAAS,WAETC,GAAc,eACdC,GAAiB,YAGjBC,GAAiB,UACjBC,GAAmB,YAGnBC,GAAe,OAAOJ,KACtBK,GAAiB,SAASL,KAC1BM,GAAe,OAAON,KACtBO,GAAgB,QAAQP,KACxBQ,GAAyB,QAAQR,KAAcC,KAC/CQ,GAAyB,UAAUT,KAAcC,KACjDS,GAAuB,QAAQV,KAAcC,KAC7CU,GAAoB,OAMpBC,GAAyB,4DACzBC,GAA6B,GAAGD,MAA0BD,KAC1DG,GAAgB,iBAIhBC,GAAgBtV,KAAU,UAAY,YACtCuV,GAAmBvV,KAAU,YAAc,UAC3CwV,GAAmBxV,KAAU,aAAe,eAC5CyV,GAAsBzV,KAAU,eAAiB,aACjD0V,GAAkB1V,KAAU,aAAe,cAC3C2V,GAAiB3V,KAAU,cAAgB,aAG3C4V,GAAY,CAChBC,WAAW,EACX7jB,SAAU,kBACV8jB,QAAS,UACT/pB,OAAQ,CAAC,EAAG,GACZgqB,aAAc,KACd1zB,UAAW,UAEP2zB,GAAgB,CACpBH,UAAW,mBACX7jB,SAAU,mBACV8jB,QAAS,SACT/pB,OAAQ,0BACRgqB,aAAc,yBACd1zB,UAAW,2BAOb,MAAM4zB,WAAiBxN,GACrB,WAAAP,CAAY5kB,EAASukB,GACnBa,MAAMplB,EAASukB,GACf9D,KAAKmS,QAAU,KACfnS,KAAKoS,QAAUpS,KAAK4E,SAAS7f,WAE7Bib,KAAKqS,MAAQxM,GAAehhB,KAAKmb,KAAK4E,SAAU0M,IAAe,IAAMzL,GAAeM,KAAKnG,KAAK4E,SAAU0M,IAAe,IAAMzL,GAAeC,QAAQwL,GAAetR,KAAKoS,SACxKpS,KAAKsS,UAAYtS,KAAKuS,eACxB,CAGA,kBAAW7O,GACT,OAAOmO,EACT,CACA,sBAAWlO,GACT,OAAOsO,EACT,CACA,eAAW1V,GACT,OAAOgU,EACT,CAGA,MAAA5I,GACE,OAAO3H,KAAK2P,WAAa3P,KAAK4P,OAAS5P,KAAK6P,MAC9C,CACA,IAAAA,GACE,GAAI3U,GAAW8E,KAAK4E,WAAa5E,KAAK2P,WACpC,OAEF,MAAM7P,EAAgB,CACpBA,cAAeE,KAAK4E,UAGtB,IADkBrE,GAAaqB,QAAQ5B,KAAK4E,SAAUkM,GAAchR,GACtDkC,iBAAd,CASA,GANAhC,KAAKwS,gBAMD,iBAAkBntB,SAASC,kBAAoB0a,KAAKoS,QAAQpX,QAzExC,eA0EtB,IAAK,MAAMzb,IAAW,GAAGZ,UAAU0G,SAAS6G,KAAK6Z,UAC/CxF,GAAac,GAAG9hB,EAAS,YAAaqc,IAG1CoE,KAAK4E,SAAS6N,QACdzS,KAAK4E,SAASxjB,aAAa,iBAAiB,GAC5C4e,KAAKqS,MAAMhX,UAAU5E,IAAI0a,IACzBnR,KAAK4E,SAASvJ,UAAU5E,IAAI0a,IAC5B5Q,GAAaqB,QAAQ5B,KAAK4E,SAAUmM,GAAejR,EAhBnD,CAiBF,CACA,IAAA8P,GACE,GAAI1U,GAAW8E,KAAK4E,YAAc5E,KAAK2P,WACrC,OAEF,MAAM7P,EAAgB,CACpBA,cAAeE,KAAK4E,UAEtB5E,KAAK0S,cAAc5S,EACrB,CACA,OAAAiF,GACM/E,KAAKmS,SACPnS,KAAKmS,QAAQnZ,UAEf2L,MAAMI,SACR,CACA,MAAAha,GACEiV,KAAKsS,UAAYtS,KAAKuS,gBAClBvS,KAAKmS,SACPnS,KAAKmS,QAAQpnB,QAEjB,CAGA,aAAA2nB,CAAc5S,GAEZ,IADkBS,GAAaqB,QAAQ5B,KAAK4E,SAAUgM,GAAc9Q,GACtDkC,iBAAd,CAMA,GAAI,iBAAkB3c,SAASC,gBAC7B,IAAK,MAAM/F,IAAW,GAAGZ,UAAU0G,SAAS6G,KAAK6Z,UAC/CxF,GAAaC,IAAIjhB,EAAS,YAAaqc,IAGvCoE,KAAKmS,SACPnS,KAAKmS,QAAQnZ,UAEfgH,KAAKqS,MAAMhX,UAAU1B,OAAOwX,IAC5BnR,KAAK4E,SAASvJ,UAAU1B,OAAOwX,IAC/BnR,KAAK4E,SAASxjB,aAAa,gBAAiB,SAC5C4hB,GAAYE,oBAAoBlD,KAAKqS,MAAO,UAC5C9R,GAAaqB,QAAQ5B,KAAK4E,SAAUiM,GAAgB/Q,EAhBpD,CAiBF,CACA,UAAA+D,CAAWC,GAET,GAAgC,iBADhCA,EAASa,MAAMd,WAAWC,IACRxlB,YAA2B,GAAUwlB,EAAOxlB,YAAgE,mBAA3CwlB,EAAOxlB,UAAUgF,sBAElG,MAAM,IAAIkhB,UAAU,GAAG+L,GAAO9L,+GAEhC,OAAOX,CACT,CACA,aAAA0O,GACE,QAAsB,IAAX,EACT,MAAM,IAAIhO,UAAU,gEAEtB,IAAImO,EAAmB3S,KAAK4E,SACG,WAA3B5E,KAAK6E,QAAQvmB,UACfq0B,EAAmB3S,KAAKoS,QACf,GAAUpS,KAAK6E,QAAQvmB,WAChCq0B,EAAmBjY,GAAWsF,KAAK6E,QAAQvmB,WACA,iBAA3B0hB,KAAK6E,QAAQvmB,YAC7Bq0B,EAAmB3S,KAAK6E,QAAQvmB,WAElC,MAAM0zB,EAAehS,KAAK4S,mBAC1B5S,KAAKmS,QAAU,GAAoBQ,EAAkB3S,KAAKqS,MAAOL,EACnE,CACA,QAAArC,GACE,OAAO3P,KAAKqS,MAAMhX,UAAU7W,SAAS2sB,GACvC,CACA,aAAA0B,GACE,MAAMC,EAAiB9S,KAAKoS,QAC5B,GAAIU,EAAezX,UAAU7W,SArKN,WAsKrB,OAAOmtB,GAET,GAAImB,EAAezX,UAAU7W,SAvKJ,aAwKvB,OAAOotB,GAET,GAAIkB,EAAezX,UAAU7W,SAzKA,iBA0K3B,MA5JsB,MA8JxB,GAAIsuB,EAAezX,UAAU7W,SA3KE,mBA4K7B,MA9JyB,SAkK3B,MAAMuuB,EAAkF,QAA1E9tB,iBAAiB+a,KAAKqS,OAAOvX,iBAAiB,iBAAiB6K,OAC7E,OAAImN,EAAezX,UAAU7W,SArLP,UAsLbuuB,EAAQvB,GAAmBD,GAE7BwB,EAAQrB,GAAsBD,EACvC,CACA,aAAAc,GACE,OAAkD,OAA3CvS,KAAK4E,SAAS5J,QAnLD,UAoLtB,CACA,UAAAgY,GACE,MAAM,OACJhrB,GACEgY,KAAK6E,QACT,MAAsB,iBAAX7c,EACFA,EAAO9F,MAAM,KAAKY,KAAInF,GAAS4f,OAAOgQ,SAAS5vB,EAAO,MAEzC,mBAAXqK,EACFirB,GAAcjrB,EAAOirB,EAAYjT,KAAK4E,UAExC5c,CACT,CACA,gBAAA4qB,GACE,MAAMM,EAAwB,CAC5Bx0B,UAAWshB,KAAK6S,gBAChBzc,UAAW,CAAC,CACV9V,KAAM,kBACNmB,QAAS,CACPwM,SAAU+R,KAAK6E,QAAQ5W,WAExB,CACD3N,KAAM,SACNmB,QAAS,CACPuG,OAAQgY,KAAKgT,iBAanB,OAPIhT,KAAKsS,WAAsC,WAAzBtS,KAAK6E,QAAQkN,WACjC/O,GAAYC,iBAAiBjD,KAAKqS,MAAO,SAAU,UACnDa,EAAsB9c,UAAY,CAAC,CACjC9V,KAAM,cACNC,SAAS,KAGN,IACF2yB,KACArW,GAAQmD,KAAK6E,QAAQmN,aAAc,CAACkB,IAE3C,CACA,eAAAC,EAAgB,IACdr2B,EAAG,OACHyP,IAEA,MAAMggB,EAAQ1G,GAAe1T,KAhOF,8DAgO+B6N,KAAKqS,OAAOlsB,QAAO5G,GAAWob,GAAUpb,KAC7FgtB,EAAM7b,QAMXoN,GAAqByO,EAAOhgB,EAAQzP,IAAQ6zB,IAAmBpE,EAAMnL,SAAS7U,IAASkmB,OACzF,CAGA,sBAAOhW,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAO6nB,GAAS5M,oBAAoBtF,KAAM8D,GAChD,GAAsB,iBAAXA,EAAX,CAGA,QAA4B,IAAjBzZ,EAAKyZ,GACd,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,IAJL,CAKF,GACF,CACA,iBAAOsP,CAAWhU,GAChB,GA5QuB,IA4QnBA,EAAMwI,QAAgD,UAAfxI,EAAMqB,MA/QnC,QA+QuDrB,EAAMtiB,IACzE,OAEF,MAAMu2B,EAAcxN,GAAe1T,KAAKkf,IACxC,IAAK,MAAM1J,KAAU0L,EAAa,CAChC,MAAMC,EAAUpB,GAAS7M,YAAYsC,GACrC,IAAK2L,IAAyC,IAA9BA,EAAQzO,QAAQiN,UAC9B,SAEF,MAAMyB,EAAenU,EAAMmU,eACrBC,EAAeD,EAAanS,SAASkS,EAAQjB,OACnD,GAAIkB,EAAanS,SAASkS,EAAQ1O,WAA2C,WAA9B0O,EAAQzO,QAAQiN,YAA2B0B,GAA8C,YAA9BF,EAAQzO,QAAQiN,WAA2B0B,EACnJ,SAIF,GAAIF,EAAQjB,MAAM7tB,SAAS4a,EAAM7S,UAA2B,UAAf6S,EAAMqB,MA/RvC,QA+R2DrB,EAAMtiB,KAAqB,qCAAqCuG,KAAK+b,EAAM7S,OAAO0a,UACvJ,SAEF,MAAMnH,EAAgB,CACpBA,cAAewT,EAAQ1O,UAEN,UAAfxF,EAAMqB,OACRX,EAAckH,WAAa5H,GAE7BkU,EAAQZ,cAAc5S,EACxB,CACF,CACA,4BAAO2T,CAAsBrU,GAI3B,MAAMsU,EAAU,kBAAkBrwB,KAAK+b,EAAM7S,OAAO0a,SAC9C0M,EAjTW,WAiTKvU,EAAMtiB,IACtB82B,EAAkB,CAAClD,GAAgBC,IAAkBvP,SAAShC,EAAMtiB,KAC1E,IAAK82B,IAAoBD,EACvB,OAEF,GAAID,IAAYC,EACd,OAEFvU,EAAMkD,iBAGN,MAAMuR,EAAkB7T,KAAKgG,QAAQoL,IAA0BpR,KAAO6F,GAAeM,KAAKnG,KAAMoR,IAAwB,IAAMvL,GAAehhB,KAAKmb,KAAMoR,IAAwB,IAAMvL,GAAeC,QAAQsL,GAAwBhS,EAAMW,eAAehb,YACpPwF,EAAW2nB,GAAS5M,oBAAoBuO,GAC9C,GAAID,EAIF,OAHAxU,EAAM0U,kBACNvpB,EAASslB,YACTtlB,EAAS4oB,gBAAgB/T,GAGvB7U,EAASolB,aAEXvQ,EAAM0U,kBACNvpB,EAASqlB,OACTiE,EAAgBpB,QAEpB,EAOFlS,GAAac,GAAGhc,SAAU4rB,GAAwBG,GAAwBc,GAASuB,uBACnFlT,GAAac,GAAGhc,SAAU4rB,GAAwBK,GAAeY,GAASuB,uBAC1ElT,GAAac,GAAGhc,SAAU2rB,GAAwBkB,GAASkB,YAC3D7S,GAAac,GAAGhc,SAAU6rB,GAAsBgB,GAASkB,YACzD7S,GAAac,GAAGhc,SAAU2rB,GAAwBI,IAAwB,SAAUhS,GAClFA,EAAMkD,iBACN4P,GAAS5M,oBAAoBtF,MAAM2H,QACrC,IAMAxL,GAAmB+V,IAcnB,MAAM6B,GAAS,WAETC,GAAoB,OACpBC,GAAkB,gBAAgBF,KAClCG,GAAY,CAChBC,UAAW,iBACXC,cAAe,KACfhP,YAAY,EACZzK,WAAW,EAEX0Z,YAAa,QAETC,GAAgB,CACpBH,UAAW,SACXC,cAAe,kBACfhP,WAAY,UACZzK,UAAW,UACX0Z,YAAa,oBAOf,MAAME,WAAiB9Q,GACrB,WAAAU,CAAYL,GACVa,QACA3E,KAAK6E,QAAU7E,KAAK6D,WAAWC,GAC/B9D,KAAKwU,aAAc,EACnBxU,KAAK4E,SAAW,IAClB,CAGA,kBAAWlB,GACT,OAAOwQ,EACT,CACA,sBAAWvQ,GACT,OAAO2Q,EACT,CACA,eAAW/X,GACT,OAAOwX,EACT,CAGA,IAAAlE,CAAKxT,GACH,IAAK2D,KAAK6E,QAAQlK,UAEhB,YADAkC,GAAQR,GAGV2D,KAAKyU,UACL,MAAMl1B,EAAUygB,KAAK0U,cACjB1U,KAAK6E,QAAQO,YACfvJ,GAAOtc,GAETA,EAAQ8b,UAAU5E,IAAIud,IACtBhU,KAAK2U,mBAAkB,KACrB9X,GAAQR,EAAS,GAErB,CACA,IAAAuT,CAAKvT,GACE2D,KAAK6E,QAAQlK,WAIlBqF,KAAK0U,cAAcrZ,UAAU1B,OAAOqa,IACpChU,KAAK2U,mBAAkB,KACrB3U,KAAK+E,UACLlI,GAAQR,EAAS,KANjBQ,GAAQR,EAQZ,CACA,OAAA0I,GACO/E,KAAKwU,cAGVjU,GAAaC,IAAIR,KAAK4E,SAAUqP,IAChCjU,KAAK4E,SAASjL,SACdqG,KAAKwU,aAAc,EACrB,CAGA,WAAAE,GACE,IAAK1U,KAAK4E,SAAU,CAClB,MAAMgQ,EAAWvvB,SAASwvB,cAAc,OACxCD,EAAST,UAAYnU,KAAK6E,QAAQsP,UAC9BnU,KAAK6E,QAAQO,YACfwP,EAASvZ,UAAU5E,IApFD,QAsFpBuJ,KAAK4E,SAAWgQ,CAClB,CACA,OAAO5U,KAAK4E,QACd,CACA,iBAAAZ,CAAkBF,GAGhB,OADAA,EAAOuQ,YAAc3Z,GAAWoJ,EAAOuQ,aAChCvQ,CACT,CACA,OAAA2Q,GACE,GAAIzU,KAAKwU,YACP,OAEF,MAAMj1B,EAAUygB,KAAK0U,cACrB1U,KAAK6E,QAAQwP,YAAYS,OAAOv1B,GAChCghB,GAAac,GAAG9hB,EAAS00B,IAAiB,KACxCpX,GAAQmD,KAAK6E,QAAQuP,cAAc,IAErCpU,KAAKwU,aAAc,CACrB,CACA,iBAAAG,CAAkBtY,GAChBW,GAAuBX,EAAU2D,KAAK0U,cAAe1U,KAAK6E,QAAQO,WACpE,EAeF,MAEM2P,GAAc,gBACdC,GAAkB,UAAUD,KAC5BE,GAAoB,cAAcF,KAGlCG,GAAmB,WACnBC,GAAY,CAChBC,WAAW,EACXC,YAAa,MAETC,GAAgB,CACpBF,UAAW,UACXC,YAAa,WAOf,MAAME,WAAkB9R,GACtB,WAAAU,CAAYL,GACVa,QACA3E,KAAK6E,QAAU7E,KAAK6D,WAAWC,GAC/B9D,KAAKwV,WAAY,EACjBxV,KAAKyV,qBAAuB,IAC9B,CAGA,kBAAW/R,GACT,OAAOyR,EACT,CACA,sBAAWxR,GACT,OAAO2R,EACT,CACA,eAAW/Y,GACT,MArCW,WAsCb,CAGA,QAAAmZ,GACM1V,KAAKwV,YAGLxV,KAAK6E,QAAQuQ,WACfpV,KAAK6E,QAAQwQ,YAAY5C,QAE3BlS,GAAaC,IAAInb,SAAU0vB,IAC3BxU,GAAac,GAAGhc,SAAU2vB,IAAiB5V,GAASY,KAAK2V,eAAevW,KACxEmB,GAAac,GAAGhc,SAAU4vB,IAAmB7V,GAASY,KAAK4V,eAAexW,KAC1EY,KAAKwV,WAAY,EACnB,CACA,UAAAK,GACO7V,KAAKwV,YAGVxV,KAAKwV,WAAY,EACjBjV,GAAaC,IAAInb,SAAU0vB,IAC7B,CAGA,cAAAY,CAAevW,GACb,MAAM,YACJiW,GACErV,KAAK6E,QACT,GAAIzF,EAAM7S,SAAWlH,UAAY+Z,EAAM7S,SAAW8oB,GAAeA,EAAY7wB,SAAS4a,EAAM7S,QAC1F,OAEF,MAAM1L,EAAWglB,GAAeU,kBAAkB8O,GAC1B,IAApBx0B,EAAS6P,OACX2kB,EAAY5C,QACHzS,KAAKyV,uBAAyBP,GACvCr0B,EAASA,EAAS6P,OAAS,GAAG+hB,QAE9B5xB,EAAS,GAAG4xB,OAEhB,CACA,cAAAmD,CAAexW,GAzED,QA0ERA,EAAMtiB,MAGVkjB,KAAKyV,qBAAuBrW,EAAM0W,SAAWZ,GA5EzB,UA6EtB,EAeF,MAAMa,GAAyB,oDACzBC,GAA0B,cAC1BC,GAAmB,gBACnBC,GAAkB,eAMxB,MAAMC,GACJ,WAAAhS,GACEnE,KAAK4E,SAAWvf,SAAS6G,IAC3B,CAGA,QAAAkqB,GAEE,MAAMC,EAAgBhxB,SAASC,gBAAgBuC,YAC/C,OAAO1F,KAAKoC,IAAI3E,OAAO02B,WAAaD,EACtC,CACA,IAAAzG,GACE,MAAM/rB,EAAQmc,KAAKoW,WACnBpW,KAAKuW,mBAELvW,KAAKwW,sBAAsBxW,KAAK4E,SAAUqR,IAAkBQ,GAAmBA,EAAkB5yB,IAEjGmc,KAAKwW,sBAAsBT,GAAwBE,IAAkBQ,GAAmBA,EAAkB5yB,IAC1Gmc,KAAKwW,sBAAsBR,GAAyBE,IAAiBO,GAAmBA,EAAkB5yB,GAC5G,CACA,KAAAwO,GACE2N,KAAK0W,wBAAwB1W,KAAK4E,SAAU,YAC5C5E,KAAK0W,wBAAwB1W,KAAK4E,SAAUqR,IAC5CjW,KAAK0W,wBAAwBX,GAAwBE,IACrDjW,KAAK0W,wBAAwBV,GAAyBE,GACxD,CACA,aAAAS,GACE,OAAO3W,KAAKoW,WAAa,CAC3B,CAGA,gBAAAG,GACEvW,KAAK4W,sBAAsB5W,KAAK4E,SAAU,YAC1C5E,KAAK4E,SAAS7jB,MAAM+K,SAAW,QACjC,CACA,qBAAA0qB,CAAsBzc,EAAU8c,EAAexa,GAC7C,MAAMya,EAAiB9W,KAAKoW,WAS5BpW,KAAK+W,2BAA2Bhd,GARHxa,IAC3B,GAAIA,IAAYygB,KAAK4E,UAAYhlB,OAAO02B,WAAa/2B,EAAQsI,YAAcivB,EACzE,OAEF9W,KAAK4W,sBAAsBr3B,EAASs3B,GACpC,MAAMJ,EAAkB72B,OAAOqF,iBAAiB1F,GAASub,iBAAiB+b,GAC1Et3B,EAAQwB,MAAMi2B,YAAYH,EAAe,GAAGxa,EAASkB,OAAOC,WAAWiZ,QAAsB,GAGjG,CACA,qBAAAG,CAAsBr3B,EAASs3B,GAC7B,MAAMI,EAAc13B,EAAQwB,MAAM+Z,iBAAiB+b,GAC/CI,GACFjU,GAAYC,iBAAiB1jB,EAASs3B,EAAeI,EAEzD,CACA,uBAAAP,CAAwB3c,EAAU8c,GAWhC7W,KAAK+W,2BAA2Bhd,GAVHxa,IAC3B,MAAM5B,EAAQqlB,GAAYQ,iBAAiBjkB,EAASs3B,GAEtC,OAAVl5B,GAIJqlB,GAAYE,oBAAoB3jB,EAASs3B,GACzCt3B,EAAQwB,MAAMi2B,YAAYH,EAAel5B,IAJvC4B,EAAQwB,MAAMm2B,eAAeL,EAIgB,GAGnD,CACA,0BAAAE,CAA2Bhd,EAAUod,GACnC,GAAI,GAAUpd,GACZod,EAASpd,QAGX,IAAK,MAAM6L,KAAOC,GAAe1T,KAAK4H,EAAUiG,KAAK4E,UACnDuS,EAASvR,EAEb,EAeF,MAEMwR,GAAc,YAGdC,GAAe,OAAOD,KACtBE,GAAyB,gBAAgBF,KACzCG,GAAiB,SAASH,KAC1BI,GAAe,OAAOJ,KACtBK,GAAgB,QAAQL,KACxBM,GAAiB,SAASN,KAC1BO,GAAsB,gBAAgBP,KACtCQ,GAA0B,oBAAoBR,KAC9CS,GAA0B,kBAAkBT,KAC5CU,GAAyB,QAAQV,cACjCW,GAAkB,aAElBC,GAAoB,OACpBC,GAAoB,eAKpBC,GAAY,CAChBtD,UAAU,EACVnC,OAAO,EACPzH,UAAU,GAENmN,GAAgB,CACpBvD,SAAU,mBACVnC,MAAO,UACPzH,SAAU,WAOZ,MAAMoN,WAAc1T,GAClB,WAAAP,CAAY5kB,EAASukB,GACnBa,MAAMplB,EAASukB,GACf9D,KAAKqY,QAAUxS,GAAeC,QArBV,gBAqBmC9F,KAAK4E,UAC5D5E,KAAKsY,UAAYtY,KAAKuY,sBACtBvY,KAAKwY,WAAaxY,KAAKyY,uBACvBzY,KAAK2P,UAAW,EAChB3P,KAAKmP,kBAAmB,EACxBnP,KAAK0Y,WAAa,IAAIvC,GACtBnW,KAAK6L,oBACP,CAGA,kBAAWnI,GACT,OAAOwU,EACT,CACA,sBAAWvU,GACT,OAAOwU,EACT,CACA,eAAW5b,GACT,MA1DW,OA2Db,CAGA,MAAAoL,CAAO7H,GACL,OAAOE,KAAK2P,SAAW3P,KAAK4P,OAAS5P,KAAK6P,KAAK/P,EACjD,CACA,IAAA+P,CAAK/P,GACCE,KAAK2P,UAAY3P,KAAKmP,kBAGR5O,GAAaqB,QAAQ5B,KAAK4E,SAAU4S,GAAc,CAClE1X,kBAEYkC,mBAGdhC,KAAK2P,UAAW,EAChB3P,KAAKmP,kBAAmB,EACxBnP,KAAK0Y,WAAW9I,OAChBvqB,SAAS6G,KAAKmP,UAAU5E,IAAIshB,IAC5B/X,KAAK2Y,gBACL3Y,KAAKsY,UAAUzI,MAAK,IAAM7P,KAAK4Y,aAAa9Y,KAC9C,CACA,IAAA8P,GACO5P,KAAK2P,WAAY3P,KAAKmP,mBAGT5O,GAAaqB,QAAQ5B,KAAK4E,SAAUyS,IACxCrV,mBAGdhC,KAAK2P,UAAW,EAChB3P,KAAKmP,kBAAmB,EACxBnP,KAAKwY,WAAW3C,aAChB7V,KAAK4E,SAASvJ,UAAU1B,OAAOqe,IAC/BhY,KAAKmF,gBAAe,IAAMnF,KAAK6Y,cAAc7Y,KAAK4E,SAAU5E,KAAKgO,gBACnE,CACA,OAAAjJ,GACExE,GAAaC,IAAI5gB,OAAQw3B,IACzB7W,GAAaC,IAAIR,KAAKqY,QAASjB,IAC/BpX,KAAKsY,UAAUvT,UACf/E,KAAKwY,WAAW3C,aAChBlR,MAAMI,SACR,CACA,YAAA+T,GACE9Y,KAAK2Y,eACP,CAGA,mBAAAJ,GACE,OAAO,IAAIhE,GAAS,CAClB5Z,UAAWmG,QAAQd,KAAK6E,QAAQ+P,UAEhCxP,WAAYpF,KAAKgO,eAErB,CACA,oBAAAyK,GACE,OAAO,IAAIlD,GAAU,CACnBF,YAAarV,KAAK4E,UAEtB,CACA,YAAAgU,CAAa9Y,GAENza,SAAS6G,KAAK1H,SAASwb,KAAK4E,WAC/Bvf,SAAS6G,KAAK4oB,OAAO9U,KAAK4E,UAE5B5E,KAAK4E,SAAS7jB,MAAMgxB,QAAU,QAC9B/R,KAAK4E,SAASzjB,gBAAgB,eAC9B6e,KAAK4E,SAASxjB,aAAa,cAAc,GACzC4e,KAAK4E,SAASxjB,aAAa,OAAQ,UACnC4e,KAAK4E,SAASnZ,UAAY,EAC1B,MAAMstB,EAAYlT,GAAeC,QA7GT,cA6GsC9F,KAAKqY,SAC/DU,IACFA,EAAUttB,UAAY,GAExBoQ,GAAOmE,KAAK4E,UACZ5E,KAAK4E,SAASvJ,UAAU5E,IAAIuhB,IAU5BhY,KAAKmF,gBATsB,KACrBnF,KAAK6E,QAAQ4N,OACfzS,KAAKwY,WAAW9C,WAElB1V,KAAKmP,kBAAmB,EACxB5O,GAAaqB,QAAQ5B,KAAK4E,SAAU6S,GAAe,CACjD3X,iBACA,GAEoCE,KAAKqY,QAASrY,KAAKgO,cAC7D,CACA,kBAAAnC,GACEtL,GAAac,GAAGrB,KAAK4E,SAAUiT,IAAyBzY,IAhJvC,WAiJXA,EAAMtiB,MAGNkjB,KAAK6E,QAAQmG,SACfhL,KAAK4P,OAGP5P,KAAKgZ,6BAA4B,IAEnCzY,GAAac,GAAGzhB,OAAQ83B,IAAgB,KAClC1X,KAAK2P,WAAa3P,KAAKmP,kBACzBnP,KAAK2Y,eACP,IAEFpY,GAAac,GAAGrB,KAAK4E,SAAUgT,IAAyBxY,IAEtDmB,GAAae,IAAItB,KAAK4E,SAAU+S,IAAqBsB,IAC/CjZ,KAAK4E,WAAaxF,EAAM7S,QAAUyT,KAAK4E,WAAaqU,EAAO1sB,SAGjC,WAA1ByT,KAAK6E,QAAQ+P,SAIb5U,KAAK6E,QAAQ+P,UACf5U,KAAK4P,OAJL5P,KAAKgZ,6BAKP,GACA,GAEN,CACA,UAAAH,GACE7Y,KAAK4E,SAAS7jB,MAAMgxB,QAAU,OAC9B/R,KAAK4E,SAASxjB,aAAa,eAAe,GAC1C4e,KAAK4E,SAASzjB,gBAAgB,cAC9B6e,KAAK4E,SAASzjB,gBAAgB,QAC9B6e,KAAKmP,kBAAmB,EACxBnP,KAAKsY,UAAU1I,MAAK,KAClBvqB,SAAS6G,KAAKmP,UAAU1B,OAAOoe,IAC/B/X,KAAKkZ,oBACLlZ,KAAK0Y,WAAWrmB,QAChBkO,GAAaqB,QAAQ5B,KAAK4E,SAAU2S,GAAe,GAEvD,CACA,WAAAvJ,GACE,OAAOhO,KAAK4E,SAASvJ,UAAU7W,SAjLT,OAkLxB,CACA,0BAAAw0B,GAEE,GADkBzY,GAAaqB,QAAQ5B,KAAK4E,SAAU0S,IACxCtV,iBACZ,OAEF,MAAMmX,EAAqBnZ,KAAK4E,SAASvX,aAAehI,SAASC,gBAAgBsC,aAC3EwxB,EAAmBpZ,KAAK4E,SAAS7jB,MAAMiL,UAEpB,WAArBotB,GAAiCpZ,KAAK4E,SAASvJ,UAAU7W,SAASyzB,MAGjEkB,IACHnZ,KAAK4E,SAAS7jB,MAAMiL,UAAY,UAElCgU,KAAK4E,SAASvJ,UAAU5E,IAAIwhB,IAC5BjY,KAAKmF,gBAAe,KAClBnF,KAAK4E,SAASvJ,UAAU1B,OAAOse,IAC/BjY,KAAKmF,gBAAe,KAClBnF,KAAK4E,SAAS7jB,MAAMiL,UAAYotB,CAAgB,GAC/CpZ,KAAKqY,QAAQ,GACfrY,KAAKqY,SACRrY,KAAK4E,SAAS6N,QAChB,CAMA,aAAAkG,GACE,MAAMQ,EAAqBnZ,KAAK4E,SAASvX,aAAehI,SAASC,gBAAgBsC,aAC3EkvB,EAAiB9W,KAAK0Y,WAAWtC,WACjCiD,EAAoBvC,EAAiB,EAC3C,GAAIuC,IAAsBF,EAAoB,CAC5C,MAAMr3B,EAAWma,KAAU,cAAgB,eAC3C+D,KAAK4E,SAAS7jB,MAAMe,GAAY,GAAGg1B,KACrC,CACA,IAAKuC,GAAqBF,EAAoB,CAC5C,MAAMr3B,EAAWma,KAAU,eAAiB,cAC5C+D,KAAK4E,SAAS7jB,MAAMe,GAAY,GAAGg1B,KACrC,CACF,CACA,iBAAAoC,GACElZ,KAAK4E,SAAS7jB,MAAMu4B,YAAc,GAClCtZ,KAAK4E,SAAS7jB,MAAMw4B,aAAe,EACrC,CAGA,sBAAO9c,CAAgBqH,EAAQhE,GAC7B,OAAOE,KAAKwH,MAAK,WACf,MAAMnd,EAAO+tB,GAAM9S,oBAAoBtF,KAAM8D,GAC7C,GAAsB,iBAAXA,EAAX,CAGA,QAA4B,IAAjBzZ,EAAKyZ,GACd,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,GAAQhE,EAJb,CAKF,GACF,EAOFS,GAAac,GAAGhc,SAAUyyB,GA9OK,4BA8O2C,SAAU1Y,GAClF,MAAM7S,EAASsZ,GAAec,uBAAuB3G,MACjD,CAAC,IAAK,QAAQoB,SAASpB,KAAKiH,UAC9B7H,EAAMkD,iBAER/B,GAAae,IAAI/U,EAAQirB,IAAcgC,IACjCA,EAAUxX,kBAIdzB,GAAae,IAAI/U,EAAQgrB,IAAgB,KACnC5c,GAAUqF,OACZA,KAAKyS,OACP,GACA,IAIJ,MAAMgH,EAAc5T,GAAeC,QAnQb,eAoQlB2T,GACFrB,GAAM/S,YAAYoU,GAAa7J,OAEpBwI,GAAM9S,oBAAoB/Y,GAClCob,OAAO3H,KACd,IACA6G,GAAqBuR,IAMrBjc,GAAmBic,IAcnB,MAEMsB,GAAc,gBACdC,GAAiB,YACjBC,GAAwB,OAAOF,KAAcC,KAE7CE,GAAoB,OACpBC,GAAuB,UACvBC,GAAoB,SAEpBC,GAAgB,kBAChBC,GAAe,OAAOP,KACtBQ,GAAgB,QAAQR,KACxBS,GAAe,OAAOT,KACtBU,GAAuB,gBAAgBV,KACvCW,GAAiB,SAASX,KAC1BY,GAAe,SAASZ,KACxBa,GAAyB,QAAQb,KAAcC,KAC/Ca,GAAwB,kBAAkBd,KAE1Ce,GAAY,CAChB7F,UAAU,EACV5J,UAAU,EACVvgB,QAAQ,GAEJiwB,GAAgB,CACpB9F,SAAU,mBACV5J,SAAU,UACVvgB,OAAQ,WAOV,MAAMkwB,WAAkBjW,GACtB,WAAAP,CAAY5kB,EAASukB,GACnBa,MAAMplB,EAASukB,GACf9D,KAAK2P,UAAW,EAChB3P,KAAKsY,UAAYtY,KAAKuY,sBACtBvY,KAAKwY,WAAaxY,KAAKyY,uBACvBzY,KAAK6L,oBACP,CAGA,kBAAWnI,GACT,OAAO+W,EACT,CACA,sBAAW9W,GACT,OAAO+W,EACT,CACA,eAAWne,GACT,MApDW,WAqDb,CAGA,MAAAoL,CAAO7H,GACL,OAAOE,KAAK2P,SAAW3P,KAAK4P,OAAS5P,KAAK6P,KAAK/P,EACjD,CACA,IAAA+P,CAAK/P,GACCE,KAAK2P,UAGSpP,GAAaqB,QAAQ5B,KAAK4E,SAAUqV,GAAc,CAClEna,kBAEYkC,mBAGdhC,KAAK2P,UAAW,EAChB3P,KAAKsY,UAAUzI,OACV7P,KAAK6E,QAAQpa,SAChB,IAAI0rB,IAAkBvG,OAExB5P,KAAK4E,SAASxjB,aAAa,cAAc,GACzC4e,KAAK4E,SAASxjB,aAAa,OAAQ,UACnC4e,KAAK4E,SAASvJ,UAAU5E,IAAIqjB,IAW5B9Z,KAAKmF,gBAVoB,KAClBnF,KAAK6E,QAAQpa,SAAUuV,KAAK6E,QAAQ+P,UACvC5U,KAAKwY,WAAW9C,WAElB1V,KAAK4E,SAASvJ,UAAU5E,IAAIojB,IAC5B7Z,KAAK4E,SAASvJ,UAAU1B,OAAOmgB,IAC/BvZ,GAAaqB,QAAQ5B,KAAK4E,SAAUsV,GAAe,CACjDpa,iBACA,GAEkCE,KAAK4E,UAAU,GACvD,CACA,IAAAgL,GACO5P,KAAK2P,WAGQpP,GAAaqB,QAAQ5B,KAAK4E,SAAUuV,IACxCnY,mBAGdhC,KAAKwY,WAAW3C,aAChB7V,KAAK4E,SAASgW,OACd5a,KAAK2P,UAAW,EAChB3P,KAAK4E,SAASvJ,UAAU5E,IAAIsjB,IAC5B/Z,KAAKsY,UAAU1I,OAUf5P,KAAKmF,gBAToB,KACvBnF,KAAK4E,SAASvJ,UAAU1B,OAAOkgB,GAAmBE,IAClD/Z,KAAK4E,SAASzjB,gBAAgB,cAC9B6e,KAAK4E,SAASzjB,gBAAgB,QACzB6e,KAAK6E,QAAQpa,SAChB,IAAI0rB,IAAkB9jB,QAExBkO,GAAaqB,QAAQ5B,KAAK4E,SAAUyV,GAAe,GAEfra,KAAK4E,UAAU,IACvD,CACA,OAAAG,GACE/E,KAAKsY,UAAUvT,UACf/E,KAAKwY,WAAW3C,aAChBlR,MAAMI,SACR,CAGA,mBAAAwT,GACE,MASM5d,EAAYmG,QAAQd,KAAK6E,QAAQ+P,UACvC,OAAO,IAAIL,GAAS,CAClBJ,UA3HsB,qBA4HtBxZ,YACAyK,YAAY,EACZiP,YAAarU,KAAK4E,SAAS7f,WAC3BqvB,cAAezZ,EAfK,KACU,WAA1BqF,KAAK6E,QAAQ+P,SAIjB5U,KAAK4P,OAHHrP,GAAaqB,QAAQ5B,KAAK4E,SAAUwV,GAG3B,EAUgC,MAE/C,CACA,oBAAA3B,GACE,OAAO,IAAIlD,GAAU,CACnBF,YAAarV,KAAK4E,UAEtB,CACA,kBAAAiH,GACEtL,GAAac,GAAGrB,KAAK4E,SAAU4V,IAAuBpb,IA5IvC,WA6ITA,EAAMtiB,MAGNkjB,KAAK6E,QAAQmG,SACfhL,KAAK4P,OAGPrP,GAAaqB,QAAQ5B,KAAK4E,SAAUwV,IAAqB,GAE7D,CAGA,sBAAO3d,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAOswB,GAAUrV,oBAAoBtF,KAAM8D,GACjD,GAAsB,iBAAXA,EAAX,CAGA,QAAqB/K,IAAjB1O,EAAKyZ,IAAyBA,EAAOrC,WAAW,MAAmB,gBAAXqC,EAC1D,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,GAAQ9D,KAJb,CAKF,GACF,EAOFO,GAAac,GAAGhc,SAAUk1B,GA7JK,gCA6J2C,SAAUnb,GAClF,MAAM7S,EAASsZ,GAAec,uBAAuB3G,MAIrD,GAHI,CAAC,IAAK,QAAQoB,SAASpB,KAAKiH,UAC9B7H,EAAMkD,iBAEJpH,GAAW8E,MACb,OAEFO,GAAae,IAAI/U,EAAQ8tB,IAAgB,KAEnC1f,GAAUqF,OACZA,KAAKyS,OACP,IAIF,MAAMgH,EAAc5T,GAAeC,QAAQkU,IACvCP,GAAeA,IAAgBltB,GACjCouB,GAAUtV,YAAYoU,GAAa7J,OAExB+K,GAAUrV,oBAAoB/Y,GACtCob,OAAO3H,KACd,IACAO,GAAac,GAAGzhB,OAAQg6B,IAAuB,KAC7C,IAAK,MAAM7f,KAAY8L,GAAe1T,KAAK6nB,IACzCW,GAAUrV,oBAAoBvL,GAAU8V,MAC1C,IAEFtP,GAAac,GAAGzhB,OAAQ06B,IAAc,KACpC,IAAK,MAAM/6B,KAAWsmB,GAAe1T,KAAK,gDACG,UAAvClN,iBAAiB1F,GAASiC,UAC5Bm5B,GAAUrV,oBAAoB/lB,GAASqwB,MAE3C,IAEF/I,GAAqB8T,IAMrBxe,GAAmBwe,IAUnB,MACME,GAAmB,CAEvB,IAAK,CAAC,QAAS,MAAO,KAAM,OAAQ,OAHP,kBAI7BhqB,EAAG,CAAC,SAAU,OAAQ,QAAS,OAC/BiqB,KAAM,GACNhqB,EAAG,GACHiqB,GAAI,GACJC,IAAK,GACLC,KAAM,GACNC,GAAI,GACJC,IAAK,GACLC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJxqB,EAAG,GACH0b,IAAK,CAAC,MAAO,SAAU,MAAO,QAAS,QAAS,UAChD+O,GAAI,GACJC,GAAI,GACJC,EAAG,GACHC,IAAK,GACLC,EAAG,GACHC,MAAO,GACPC,KAAM,GACNC,IAAK,GACLC,IAAK,GACLC,OAAQ,GACRC,EAAG,GACHC,GAAI,IAIAC,GAAgB,IAAIpmB,IAAI,CAAC,aAAc,OAAQ,OAAQ,WAAY,WAAY,SAAU,MAAO,eAShGqmB,GAAmB,0DACnBC,GAAmB,CAAC76B,EAAW86B,KACnC,MAAMC,EAAgB/6B,EAAUvC,SAASC,cACzC,OAAIo9B,EAAqBzb,SAAS0b,IAC5BJ,GAAc/lB,IAAImmB,IACbhc,QAAQ6b,GAAiBt5B,KAAKtB,EAAUg7B,YAM5CF,EAAqB12B,QAAO62B,GAAkBA,aAA0BzY,SAAQ9R,MAAKwqB,GAASA,EAAM55B,KAAKy5B,IAAe,EA0C3HI,GAAY,CAChBC,UAAWtC,GACXuC,QAAS,CAAC,EAEVC,WAAY,GACZxwB,MAAM,EACNywB,UAAU,EACVC,WAAY,KACZC,SAAU,eAENC,GAAgB,CACpBN,UAAW,SACXC,QAAS,SACTC,WAAY,oBACZxwB,KAAM,UACNywB,SAAU,UACVC,WAAY,kBACZC,SAAU,UAENE,GAAqB,CACzBC,MAAO,iCACP5jB,SAAU,oBAOZ,MAAM6jB,WAAwBna,GAC5B,WAAAU,CAAYL,GACVa,QACA3E,KAAK6E,QAAU7E,KAAK6D,WAAWC,EACjC,CAGA,kBAAWJ,GACT,OAAOwZ,EACT,CACA,sBAAWvZ,GACT,OAAO8Z,EACT,CACA,eAAWlhB,GACT,MA3CW,iBA4Cb,CAGA,UAAAshB,GACE,OAAO7gC,OAAOmiB,OAAOa,KAAK6E,QAAQuY,SAASt6B,KAAIghB,GAAU9D,KAAK8d,yBAAyBha,KAAS3d,OAAO2a,QACzG,CACA,UAAAid,GACE,OAAO/d,KAAK6d,aAAantB,OAAS,CACpC,CACA,aAAAstB,CAAcZ,GAMZ,OALApd,KAAKie,cAAcb,GACnBpd,KAAK6E,QAAQuY,QAAU,IAClBpd,KAAK6E,QAAQuY,WACbA,GAEEpd,IACT,CACA,MAAAke,GACE,MAAMC,EAAkB94B,SAASwvB,cAAc,OAC/CsJ,EAAgBC,UAAYpe,KAAKqe,eAAere,KAAK6E,QAAQ2Y,UAC7D,IAAK,MAAOzjB,EAAUukB,KAASthC,OAAOmkB,QAAQnB,KAAK6E,QAAQuY,SACzDpd,KAAKue,YAAYJ,EAAiBG,EAAMvkB,GAE1C,MAAMyjB,EAAWW,EAAgBpY,SAAS,GACpCsX,EAAard,KAAK8d,yBAAyB9d,KAAK6E,QAAQwY,YAI9D,OAHIA,GACFG,EAASniB,UAAU5E,OAAO4mB,EAAWn7B,MAAM,MAEtCs7B,CACT,CAGA,gBAAAvZ,CAAiBH,GACfa,MAAMV,iBAAiBH,GACvB9D,KAAKie,cAAcna,EAAOsZ,QAC5B,CACA,aAAAa,CAAcO,GACZ,IAAK,MAAOzkB,EAAUqjB,KAAYpgC,OAAOmkB,QAAQqd,GAC/C7Z,MAAMV,iBAAiB,CACrBlK,WACA4jB,MAAOP,GACNM,GAEP,CACA,WAAAa,CAAYf,EAAUJ,EAASrjB,GAC7B,MAAM0kB,EAAkB5Y,GAAeC,QAAQ/L,EAAUyjB,GACpDiB,KAGLrB,EAAUpd,KAAK8d,yBAAyBV,IAKpC,GAAUA,GACZpd,KAAK0e,sBAAsBhkB,GAAW0iB,GAAUqB,GAG9Cze,KAAK6E,QAAQhY,KACf4xB,EAAgBL,UAAYpe,KAAKqe,eAAejB,GAGlDqB,EAAgBE,YAAcvB,EAX5BqB,EAAgB9kB,SAYpB,CACA,cAAA0kB,CAAeG,GACb,OAAOxe,KAAK6E,QAAQyY,SApJxB,SAAsBsB,EAAYzB,EAAW0B,GAC3C,IAAKD,EAAWluB,OACd,OAAOkuB,EAET,GAAIC,GAAgD,mBAArBA,EAC7B,OAAOA,EAAiBD,GAE1B,MACME,GADY,IAAIl/B,OAAOm/B,WACKC,gBAAgBJ,EAAY,aACxD/9B,EAAW,GAAGlC,UAAUmgC,EAAgB5yB,KAAKkU,iBAAiB,MACpE,IAAK,MAAM7gB,KAAWsB,EAAU,CAC9B,MAAMo+B,EAAc1/B,EAAQC,SAASC,cACrC,IAAKzC,OAAO4D,KAAKu8B,GAAW/b,SAAS6d,GAAc,CACjD1/B,EAAQoa,SACR,QACF,CACA,MAAMulB,EAAgB,GAAGvgC,UAAUY,EAAQ0B,YACrCk+B,EAAoB,GAAGxgC,OAAOw+B,EAAU,MAAQ,GAAIA,EAAU8B,IAAgB,IACpF,IAAK,MAAMl9B,KAAam9B,EACjBtC,GAAiB76B,EAAWo9B,IAC/B5/B,EAAQ4B,gBAAgBY,EAAUvC,SAGxC,CACA,OAAOs/B,EAAgB5yB,KAAKkyB,SAC9B,CA2HmCgB,CAAaZ,EAAKxe,KAAK6E,QAAQsY,UAAWnd,KAAK6E,QAAQ0Y,YAAciB,CACtG,CACA,wBAAAV,CAAyBU,GACvB,OAAO3hB,GAAQ2hB,EAAK,CAACxe,MACvB,CACA,qBAAA0e,CAAsBn/B,EAASk/B,GAC7B,GAAIze,KAAK6E,QAAQhY,KAGf,OAFA4xB,EAAgBL,UAAY,QAC5BK,EAAgB3J,OAAOv1B,GAGzBk/B,EAAgBE,YAAcp/B,EAAQo/B,WACxC,EAeF,MACMU,GAAwB,IAAI/oB,IAAI,CAAC,WAAY,YAAa,eAC1DgpB,GAAoB,OAEpBC,GAAoB,OACpBC,GAAyB,iBACzBC,GAAiB,SACjBC,GAAmB,gBACnBC,GAAgB,QAChBC,GAAgB,QAahBC,GAAgB,CACpBC,KAAM,OACNC,IAAK,MACLC,MAAO/jB,KAAU,OAAS,QAC1BgkB,OAAQ,SACRC,KAAMjkB,KAAU,QAAU,QAEtBkkB,GAAY,CAChBhD,UAAWtC,GACXuF,WAAW,EACXnyB,SAAU,kBACVoyB,WAAW,EACXC,YAAa,GACbC,MAAO,EACPvwB,mBAAoB,CAAC,MAAO,QAAS,SAAU,QAC/CnD,MAAM,EACN7E,OAAQ,CAAC,EAAG,GACZtJ,UAAW,MACXszB,aAAc,KACdsL,UAAU,EACVC,WAAY,KACZxjB,UAAU,EACVyjB,SAAU,+GACVgD,MAAO,GACP5e,QAAS,eAEL6e,GAAgB,CACpBtD,UAAW,SACXiD,UAAW,UACXnyB,SAAU,mBACVoyB,UAAW,2BACXC,YAAa,oBACbC,MAAO,kBACPvwB,mBAAoB,QACpBnD,KAAM,UACN7E,OAAQ,0BACRtJ,UAAW,oBACXszB,aAAc,yBACdsL,SAAU,UACVC,WAAY,kBACZxjB,SAAU,mBACVyjB,SAAU,SACVgD,MAAO,4BACP5e,QAAS,UAOX,MAAM8e,WAAgBhc,GACpB,WAAAP,CAAY5kB,EAASukB,GACnB,QAAsB,IAAX,EACT,MAAM,IAAIU,UAAU,+DAEtBG,MAAMplB,EAASukB,GAGf9D,KAAK2gB,YAAa,EAClB3gB,KAAK4gB,SAAW,EAChB5gB,KAAK6gB,WAAa,KAClB7gB,KAAK8gB,eAAiB,CAAC,EACvB9gB,KAAKmS,QAAU,KACfnS,KAAK+gB,iBAAmB,KACxB/gB,KAAKghB,YAAc,KAGnBhhB,KAAKihB,IAAM,KACXjhB,KAAKkhB,gBACAlhB,KAAK6E,QAAQ9K,UAChBiG,KAAKmhB,WAET,CAGA,kBAAWzd,GACT,OAAOyc,EACT,CACA,sBAAWxc,GACT,OAAO8c,EACT,CACA,eAAWlkB,GACT,MAxGW,SAyGb,CAGA,MAAA6kB,GACEphB,KAAK2gB,YAAa,CACpB,CACA,OAAAU,GACErhB,KAAK2gB,YAAa,CACpB,CACA,aAAAW,GACEthB,KAAK2gB,YAAc3gB,KAAK2gB,UAC1B,CACA,MAAAhZ,GACO3H,KAAK2gB,aAGV3gB,KAAK8gB,eAAeS,OAASvhB,KAAK8gB,eAAeS,MAC7CvhB,KAAK2P,WACP3P,KAAKwhB,SAGPxhB,KAAKyhB,SACP,CACA,OAAA1c,GACEmI,aAAalN,KAAK4gB,UAClBrgB,GAAaC,IAAIR,KAAK4E,SAAS5J,QAAQykB,IAAiBC,GAAkB1f,KAAK0hB,mBAC3E1hB,KAAK4E,SAASpJ,aAAa,2BAC7BwE,KAAK4E,SAASxjB,aAAa,QAAS4e,KAAK4E,SAASpJ,aAAa,2BAEjEwE,KAAK2hB,iBACLhd,MAAMI,SACR,CACA,IAAA8K,GACE,GAAoC,SAAhC7P,KAAK4E,SAAS7jB,MAAMgxB,QACtB,MAAM,IAAInO,MAAM,uCAElB,IAAM5D,KAAK4hB,mBAAoB5hB,KAAK2gB,WAClC,OAEF,MAAMnH,EAAYjZ,GAAaqB,QAAQ5B,KAAK4E,SAAU5E,KAAKmE,YAAYqB,UAlItD,SAoIXqc,GADapmB,GAAeuE,KAAK4E,WACL5E,KAAK4E,SAAS9kB,cAAcwF,iBAAiBd,SAASwb,KAAK4E,UAC7F,GAAI4U,EAAUxX,mBAAqB6f,EACjC,OAIF7hB,KAAK2hB,iBACL,MAAMV,EAAMjhB,KAAK8hB,iBACjB9hB,KAAK4E,SAASxjB,aAAa,mBAAoB6/B,EAAIzlB,aAAa,OAChE,MAAM,UACJ6kB,GACErgB,KAAK6E,QAYT,GAXK7E,KAAK4E,SAAS9kB,cAAcwF,gBAAgBd,SAASwb,KAAKihB,OAC7DZ,EAAUvL,OAAOmM,GACjB1gB,GAAaqB,QAAQ5B,KAAK4E,SAAU5E,KAAKmE,YAAYqB,UAhJpC,cAkJnBxF,KAAKmS,QAAUnS,KAAKwS,cAAcyO,GAClCA,EAAI5lB,UAAU5E,IAAI8oB,IAMd,iBAAkBl6B,SAASC,gBAC7B,IAAK,MAAM/F,IAAW,GAAGZ,UAAU0G,SAAS6G,KAAK6Z,UAC/CxF,GAAac,GAAG9hB,EAAS,YAAaqc,IAU1CoE,KAAKmF,gBAPY,KACf5E,GAAaqB,QAAQ5B,KAAK4E,SAAU5E,KAAKmE,YAAYqB,UAhKrC,WAiKQ,IAApBxF,KAAK6gB,YACP7gB,KAAKwhB,SAEPxhB,KAAK6gB,YAAa,CAAK,GAEK7gB,KAAKihB,IAAKjhB,KAAKgO,cAC/C,CACA,IAAA4B,GACE,GAAK5P,KAAK2P,aAGQpP,GAAaqB,QAAQ5B,KAAK4E,SAAU5E,KAAKmE,YAAYqB,UA/KtD,SAgLHxD,iBAAd,CAQA,GALYhC,KAAK8hB,iBACbzmB,UAAU1B,OAAO4lB,IAIjB,iBAAkBl6B,SAASC,gBAC7B,IAAK,MAAM/F,IAAW,GAAGZ,UAAU0G,SAAS6G,KAAK6Z,UAC/CxF,GAAaC,IAAIjhB,EAAS,YAAaqc,IAG3CoE,KAAK8gB,eAA4B,OAAI,EACrC9gB,KAAK8gB,eAAelB,KAAiB,EACrC5f,KAAK8gB,eAAenB,KAAiB,EACrC3f,KAAK6gB,WAAa,KAYlB7gB,KAAKmF,gBAVY,KACXnF,KAAK+hB,yBAGJ/hB,KAAK6gB,YACR7gB,KAAK2hB,iBAEP3hB,KAAK4E,SAASzjB,gBAAgB,oBAC9Bof,GAAaqB,QAAQ5B,KAAK4E,SAAU5E,KAAKmE,YAAYqB,UAzMpC,WAyM8D,GAEnDxF,KAAKihB,IAAKjhB,KAAKgO,cA1B7C,CA2BF,CACA,MAAAjjB,GACMiV,KAAKmS,SACPnS,KAAKmS,QAAQpnB,QAEjB,CAGA,cAAA62B,GACE,OAAO9gB,QAAQd,KAAKgiB,YACtB,CACA,cAAAF,GAIE,OAHK9hB,KAAKihB,MACRjhB,KAAKihB,IAAMjhB,KAAKiiB,kBAAkBjiB,KAAKghB,aAAehhB,KAAKkiB,2BAEtDliB,KAAKihB,GACd,CACA,iBAAAgB,CAAkB7E,GAChB,MAAM6D,EAAMjhB,KAAKmiB,oBAAoB/E,GAASc,SAG9C,IAAK+C,EACH,OAAO,KAETA,EAAI5lB,UAAU1B,OAAO2lB,GAAmBC,IAExC0B,EAAI5lB,UAAU5E,IAAI,MAAMuJ,KAAKmE,YAAY5H,aACzC,MAAM6lB,EAvuGKC,KACb,GACEA,GAAUlgC,KAAKmgC,MA/BH,IA+BSngC,KAAKogC,gBACnBl9B,SAASm9B,eAAeH,IACjC,OAAOA,CAAM,EAmuGGI,CAAOziB,KAAKmE,YAAY5H,MAAM1c,WAK5C,OAJAohC,EAAI7/B,aAAa,KAAMghC,GACnBpiB,KAAKgO,eACPiT,EAAI5lB,UAAU5E,IAAI6oB,IAEb2B,CACT,CACA,UAAAyB,CAAWtF,GACTpd,KAAKghB,YAAc5D,EACfpd,KAAK2P,aACP3P,KAAK2hB,iBACL3hB,KAAK6P,OAET,CACA,mBAAAsS,CAAoB/E,GAYlB,OAXIpd,KAAK+gB,iBACP/gB,KAAK+gB,iBAAiB/C,cAAcZ,GAEpCpd,KAAK+gB,iBAAmB,IAAInD,GAAgB,IACvC5d,KAAK6E,QAGRuY,UACAC,WAAYrd,KAAK8d,yBAAyB9d,KAAK6E,QAAQyb,eAGpDtgB,KAAK+gB,gBACd,CACA,sBAAAmB,GACE,MAAO,CACL,CAAC1C,IAAyBxf,KAAKgiB,YAEnC,CACA,SAAAA,GACE,OAAOhiB,KAAK8d,yBAAyB9d,KAAK6E,QAAQ2b,QAAUxgB,KAAK4E,SAASpJ,aAAa,yBACzF,CAGA,4BAAAmnB,CAA6BvjB,GAC3B,OAAOY,KAAKmE,YAAYmB,oBAAoBlG,EAAMW,eAAgBC,KAAK4iB,qBACzE,CACA,WAAA5U,GACE,OAAOhO,KAAK6E,QAAQub,WAAapgB,KAAKihB,KAAOjhB,KAAKihB,IAAI5lB,UAAU7W,SAAS86B,GAC3E,CACA,QAAA3P,GACE,OAAO3P,KAAKihB,KAAOjhB,KAAKihB,IAAI5lB,UAAU7W,SAAS+6B,GACjD,CACA,aAAA/M,CAAcyO,GACZ,MAAMviC,EAAYme,GAAQmD,KAAK6E,QAAQnmB,UAAW,CAACshB,KAAMihB,EAAKjhB,KAAK4E,WAC7Die,EAAahD,GAAcnhC,EAAU+lB,eAC3C,OAAO,GAAoBzE,KAAK4E,SAAUqc,EAAKjhB,KAAK4S,iBAAiBiQ,GACvE,CACA,UAAA7P,GACE,MAAM,OACJhrB,GACEgY,KAAK6E,QACT,MAAsB,iBAAX7c,EACFA,EAAO9F,MAAM,KAAKY,KAAInF,GAAS4f,OAAOgQ,SAAS5vB,EAAO,MAEzC,mBAAXqK,EACFirB,GAAcjrB,EAAOirB,EAAYjT,KAAK4E,UAExC5c,CACT,CACA,wBAAA81B,CAAyBU,GACvB,OAAO3hB,GAAQ2hB,EAAK,CAACxe,KAAK4E,UAC5B,CACA,gBAAAgO,CAAiBiQ,GACf,MAAM3P,EAAwB,CAC5Bx0B,UAAWmkC,EACXzsB,UAAW,CAAC,CACV9V,KAAM,OACNmB,QAAS,CACPuO,mBAAoBgQ,KAAK6E,QAAQ7U,qBAElC,CACD1P,KAAM,SACNmB,QAAS,CACPuG,OAAQgY,KAAKgT,eAEd,CACD1yB,KAAM,kBACNmB,QAAS,CACPwM,SAAU+R,KAAK6E,QAAQ5W,WAExB,CACD3N,KAAM,QACNmB,QAAS,CACPlC,QAAS,IAAIygB,KAAKmE,YAAY5H,eAE/B,CACDjc,KAAM,kBACNC,SAAS,EACTC,MAAO,aACPC,GAAI4J,IAGF2V,KAAK8hB,iBAAiB1gC,aAAa,wBAAyBiJ,EAAK1J,MAAMjC,UAAU,KAIvF,MAAO,IACFw0B,KACArW,GAAQmD,KAAK6E,QAAQmN,aAAc,CAACkB,IAE3C,CACA,aAAAgO,GACE,MAAM4B,EAAW9iB,KAAK6E,QAAQjD,QAAQ1f,MAAM,KAC5C,IAAK,MAAM0f,KAAWkhB,EACpB,GAAgB,UAAZlhB,EACFrB,GAAac,GAAGrB,KAAK4E,SAAU5E,KAAKmE,YAAYqB,UAjVlC,SAiV4DxF,KAAK6E,QAAQ9K,UAAUqF,IAC/EY,KAAK2iB,6BAA6BvjB,GAC1CuI,QAAQ,SAEb,GA3VU,WA2VN/F,EAA4B,CACrC,MAAMmhB,EAAUnhB,IAAY+d,GAAgB3f,KAAKmE,YAAYqB,UAnV5C,cAmV0ExF,KAAKmE,YAAYqB,UArV5F,WAsVVwd,EAAWphB,IAAY+d,GAAgB3f,KAAKmE,YAAYqB,UAnV7C,cAmV2ExF,KAAKmE,YAAYqB,UArV5F,YAsVjBjF,GAAac,GAAGrB,KAAK4E,SAAUme,EAAS/iB,KAAK6E,QAAQ9K,UAAUqF,IAC7D,MAAMkU,EAAUtT,KAAK2iB,6BAA6BvjB,GAClDkU,EAAQwN,eAA8B,YAAf1hB,EAAMqB,KAAqBmf,GAAgBD,KAAiB,EACnFrM,EAAQmO,QAAQ,IAElBlhB,GAAac,GAAGrB,KAAK4E,SAAUoe,EAAUhjB,KAAK6E,QAAQ9K,UAAUqF,IAC9D,MAAMkU,EAAUtT,KAAK2iB,6BAA6BvjB,GAClDkU,EAAQwN,eAA8B,aAAf1hB,EAAMqB,KAAsBmf,GAAgBD,IAAiBrM,EAAQ1O,SAASpgB,SAAS4a,EAAMU,eACpHwT,EAAQkO,QAAQ,GAEpB,CAEFxhB,KAAK0hB,kBAAoB,KACnB1hB,KAAK4E,UACP5E,KAAK4P,MACP,EAEFrP,GAAac,GAAGrB,KAAK4E,SAAS5J,QAAQykB,IAAiBC,GAAkB1f,KAAK0hB,kBAChF,CACA,SAAAP,GACE,MAAMX,EAAQxgB,KAAK4E,SAASpJ,aAAa,SACpCglB,IAGAxgB,KAAK4E,SAASpJ,aAAa,eAAkBwE,KAAK4E,SAAS+Z,YAAYhZ,QAC1E3F,KAAK4E,SAASxjB,aAAa,aAAco/B,GAE3CxgB,KAAK4E,SAASxjB,aAAa,yBAA0Bo/B,GACrDxgB,KAAK4E,SAASzjB,gBAAgB,SAChC,CACA,MAAAsgC,GACMzhB,KAAK2P,YAAc3P,KAAK6gB,WAC1B7gB,KAAK6gB,YAAa,GAGpB7gB,KAAK6gB,YAAa,EAClB7gB,KAAKijB,aAAY,KACXjjB,KAAK6gB,YACP7gB,KAAK6P,MACP,GACC7P,KAAK6E,QAAQ0b,MAAM1Q,MACxB,CACA,MAAA2R,GACMxhB,KAAK+hB,yBAGT/hB,KAAK6gB,YAAa,EAClB7gB,KAAKijB,aAAY,KACVjjB,KAAK6gB,YACR7gB,KAAK4P,MACP,GACC5P,KAAK6E,QAAQ0b,MAAM3Q,MACxB,CACA,WAAAqT,CAAYrlB,EAASslB,GACnBhW,aAAalN,KAAK4gB,UAClB5gB,KAAK4gB,SAAW/iB,WAAWD,EAASslB,EACtC,CACA,oBAAAnB,GACE,OAAO/kC,OAAOmiB,OAAOa,KAAK8gB,gBAAgB1f,UAAS,EACrD,CACA,UAAAyC,CAAWC,GACT,MAAMqf,EAAiBngB,GAAYG,kBAAkBnD,KAAK4E,UAC1D,IAAK,MAAMwe,KAAiBpmC,OAAO4D,KAAKuiC,GAClC9D,GAAsB1oB,IAAIysB,WACrBD,EAAeC,GAU1B,OAPAtf,EAAS,IACJqf,KACmB,iBAAXrf,GAAuBA,EAASA,EAAS,CAAC,GAEvDA,EAAS9D,KAAK+D,gBAAgBD,GAC9BA,EAAS9D,KAAKgE,kBAAkBF,GAChC9D,KAAKiE,iBAAiBH,GACfA,CACT,CACA,iBAAAE,CAAkBF,GAchB,OAbAA,EAAOuc,WAAiC,IAArBvc,EAAOuc,UAAsBh7B,SAAS6G,KAAOwO,GAAWoJ,EAAOuc,WACtD,iBAAjBvc,EAAOyc,QAChBzc,EAAOyc,MAAQ,CACb1Q,KAAM/L,EAAOyc,MACb3Q,KAAM9L,EAAOyc,QAGW,iBAAjBzc,EAAO0c,QAChB1c,EAAO0c,MAAQ1c,EAAO0c,MAAM3gC,YAEA,iBAAnBikB,EAAOsZ,UAChBtZ,EAAOsZ,QAAUtZ,EAAOsZ,QAAQv9B,YAE3BikB,CACT,CACA,kBAAA8e,GACE,MAAM9e,EAAS,CAAC,EAChB,IAAK,MAAOhnB,EAAKa,KAAUX,OAAOmkB,QAAQnB,KAAK6E,SACzC7E,KAAKmE,YAAYT,QAAQ5mB,KAASa,IACpCmmB,EAAOhnB,GAAOa,GASlB,OANAmmB,EAAO/J,UAAW,EAClB+J,EAAOlC,QAAU,SAKVkC,CACT,CACA,cAAA6d,GACM3hB,KAAKmS,UACPnS,KAAKmS,QAAQnZ,UACbgH,KAAKmS,QAAU,MAEbnS,KAAKihB,MACPjhB,KAAKihB,IAAItnB,SACTqG,KAAKihB,IAAM,KAEf,CAGA,sBAAOxkB,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAOq2B,GAAQpb,oBAAoBtF,KAAM8D,GAC/C,GAAsB,iBAAXA,EAAX,CAGA,QAA4B,IAAjBzZ,EAAKyZ,GACd,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,IAJL,CAKF,GACF,EAOF3H,GAAmBukB,IAcnB,MACM2C,GAAiB,kBACjBC,GAAmB,gBACnBC,GAAY,IACb7C,GAAQhd,QACX0Z,QAAS,GACTp1B,OAAQ,CAAC,EAAG,GACZtJ,UAAW,QACX8+B,SAAU,8IACV5b,QAAS,SAEL4hB,GAAgB,IACjB9C,GAAQ/c,YACXyZ,QAAS,kCAOX,MAAMqG,WAAgB/C,GAEpB,kBAAWhd,GACT,OAAO6f,EACT,CACA,sBAAW5f,GACT,OAAO6f,EACT,CACA,eAAWjnB,GACT,MA7BW,SA8Bb,CAGA,cAAAqlB,GACE,OAAO5hB,KAAKgiB,aAAehiB,KAAK0jB,aAClC,CAGA,sBAAAxB,GACE,MAAO,CACL,CAACmB,IAAiBrjB,KAAKgiB,YACvB,CAACsB,IAAmBtjB,KAAK0jB,cAE7B,CACA,WAAAA,GACE,OAAO1jB,KAAK8d,yBAAyB9d,KAAK6E,QAAQuY,QACpD,CAGA,sBAAO3gB,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAOo5B,GAAQne,oBAAoBtF,KAAM8D,GAC/C,GAAsB,iBAAXA,EAAX,CAGA,QAA4B,IAAjBzZ,EAAKyZ,GACd,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,IAJL,CAKF,GACF,EAOF3H,GAAmBsnB,IAcnB,MAEME,GAAc,gBAEdC,GAAiB,WAAWD,KAC5BE,GAAc,QAAQF,KACtBG,GAAwB,OAAOH,cAE/BI,GAAsB,SAEtBC,GAAwB,SAExBC,GAAqB,YAGrBC,GAAsB,GAAGD,mBAA+CA,uBAGxEE,GAAY,CAChBn8B,OAAQ,KAERo8B,WAAY,eACZC,cAAc,EACd93B,OAAQ,KACR+3B,UAAW,CAAC,GAAK,GAAK,IAElBC,GAAgB,CACpBv8B,OAAQ,gBAERo8B,WAAY,SACZC,aAAc,UACd93B,OAAQ,UACR+3B,UAAW,SAOb,MAAME,WAAkB9f,GACtB,WAAAP,CAAY5kB,EAASukB,GACnBa,MAAMplB,EAASukB,GAGf9D,KAAKykB,aAAe,IAAIvzB,IACxB8O,KAAK0kB,oBAAsB,IAAIxzB,IAC/B8O,KAAK2kB,aAA6D,YAA9C1/B,iBAAiB+a,KAAK4E,UAAU5Y,UAA0B,KAAOgU,KAAK4E,SAC1F5E,KAAK4kB,cAAgB,KACrB5kB,KAAK6kB,UAAY,KACjB7kB,KAAK8kB,oBAAsB,CACzBC,gBAAiB,EACjBC,gBAAiB,GAEnBhlB,KAAKilB,SACP,CAGA,kBAAWvhB,GACT,OAAOygB,EACT,CACA,sBAAWxgB,GACT,OAAO4gB,EACT,CACA,eAAWhoB,GACT,MAhEW,WAiEb,CAGA,OAAA0oB,GACEjlB,KAAKklB,mCACLllB,KAAKmlB,2BACDnlB,KAAK6kB,UACP7kB,KAAK6kB,UAAUO,aAEfplB,KAAK6kB,UAAY7kB,KAAKqlB,kBAExB,IAAK,MAAMC,KAAWtlB,KAAK0kB,oBAAoBvlB,SAC7Ca,KAAK6kB,UAAUU,QAAQD,EAE3B,CACA,OAAAvgB,GACE/E,KAAK6kB,UAAUO,aACfzgB,MAAMI,SACR,CAGA,iBAAAf,CAAkBF,GAShB,OAPAA,EAAOvX,OAASmO,GAAWoJ,EAAOvX,SAAWlH,SAAS6G,KAGtD4X,EAAOsgB,WAAatgB,EAAO9b,OAAS,GAAG8b,EAAO9b,oBAAsB8b,EAAOsgB,WAC3C,iBAArBtgB,EAAOwgB,YAChBxgB,EAAOwgB,UAAYxgB,EAAOwgB,UAAUpiC,MAAM,KAAKY,KAAInF,GAAS4f,OAAOC,WAAW7f,MAEzEmmB,CACT,CACA,wBAAAqhB,GACOnlB,KAAK6E,QAAQwf,eAKlB9jB,GAAaC,IAAIR,KAAK6E,QAAQtY,OAAQs3B,IACtCtjB,GAAac,GAAGrB,KAAK6E,QAAQtY,OAAQs3B,GAAaG,IAAuB5kB,IACvE,MAAMomB,EAAoBxlB,KAAK0kB,oBAAoBvnC,IAAIiiB,EAAM7S,OAAOtB,MACpE,GAAIu6B,EAAmB,CACrBpmB,EAAMkD,iBACN,MAAM3G,EAAOqE,KAAK2kB,cAAgB/kC,OAC5BmE,EAASyhC,EAAkBnhC,UAAY2b,KAAK4E,SAASvgB,UAC3D,GAAIsX,EAAK8pB,SAKP,YAJA9pB,EAAK8pB,SAAS,CACZ9jC,IAAKoC,EACL2hC,SAAU,WAMd/pB,EAAKlQ,UAAY1H,CACnB,KAEJ,CACA,eAAAshC,GACE,MAAM5jC,EAAU,CACdka,KAAMqE,KAAK2kB,aACXL,UAAWtkB,KAAK6E,QAAQyf,UACxBF,WAAYpkB,KAAK6E,QAAQuf,YAE3B,OAAO,IAAIuB,sBAAqBxkB,GAAWnB,KAAK4lB,kBAAkBzkB,IAAU1f,EAC9E,CAGA,iBAAAmkC,CAAkBzkB,GAChB,MAAM0kB,EAAgBlI,GAAS3d,KAAKykB,aAAatnC,IAAI,IAAIwgC,EAAMpxB,OAAO4N,MAChEub,EAAWiI,IACf3d,KAAK8kB,oBAAoBC,gBAAkBpH,EAAMpxB,OAAOlI,UACxD2b,KAAK8lB,SAASD,EAAclI,GAAO,EAE/BqH,GAAmBhlB,KAAK2kB,cAAgBt/B,SAASC,iBAAiBmG,UAClEs6B,EAAkBf,GAAmBhlB,KAAK8kB,oBAAoBE,gBACpEhlB,KAAK8kB,oBAAoBE,gBAAkBA,EAC3C,IAAK,MAAMrH,KAASxc,EAAS,CAC3B,IAAKwc,EAAMqI,eAAgB,CACzBhmB,KAAK4kB,cAAgB,KACrB5kB,KAAKimB,kBAAkBJ,EAAclI,IACrC,QACF,CACA,MAAMuI,EAA2BvI,EAAMpxB,OAAOlI,WAAa2b,KAAK8kB,oBAAoBC,gBAEpF,GAAIgB,GAAmBG,GAGrB,GAFAxQ,EAASiI,IAEJqH,EACH,YAMCe,GAAoBG,GACvBxQ,EAASiI,EAEb,CACF,CACA,gCAAAuH,GACEllB,KAAKykB,aAAe,IAAIvzB,IACxB8O,KAAK0kB,oBAAsB,IAAIxzB,IAC/B,MAAMi1B,EAActgB,GAAe1T,KAAK6xB,GAAuBhkB,KAAK6E,QAAQtY,QAC5E,IAAK,MAAM65B,KAAUD,EAAa,CAEhC,IAAKC,EAAOn7B,MAAQiQ,GAAWkrB,GAC7B,SAEF,MAAMZ,EAAoB3f,GAAeC,QAAQugB,UAAUD,EAAOn7B,MAAO+U,KAAK4E,UAG1EjK,GAAU6qB,KACZxlB,KAAKykB,aAAa1yB,IAAIs0B,UAAUD,EAAOn7B,MAAOm7B,GAC9CpmB,KAAK0kB,oBAAoB3yB,IAAIq0B,EAAOn7B,KAAMu6B,GAE9C,CACF,CACA,QAAAM,CAASv5B,GACHyT,KAAK4kB,gBAAkBr4B,IAG3ByT,KAAKimB,kBAAkBjmB,KAAK6E,QAAQtY,QACpCyT,KAAK4kB,cAAgBr4B,EACrBA,EAAO8O,UAAU5E,IAAIstB,IACrB/jB,KAAKsmB,iBAAiB/5B,GACtBgU,GAAaqB,QAAQ5B,KAAK4E,SAAUgf,GAAgB,CAClD9jB,cAAevT,IAEnB,CACA,gBAAA+5B,CAAiB/5B,GAEf,GAAIA,EAAO8O,UAAU7W,SA9LQ,iBA+L3BqhB,GAAeC,QArLc,mBAqLsBvZ,EAAOyO,QAtLtC,cAsLkEK,UAAU5E,IAAIstB,SAGtG,IAAK,MAAMwC,KAAa1gB,GAAeI,QAAQ1Z,EA9LnB,qBAiM1B,IAAK,MAAMxJ,KAAQ8iB,GAAeM,KAAKogB,EAAWrC,IAChDnhC,EAAKsY,UAAU5E,IAAIstB,GAGzB,CACA,iBAAAkC,CAAkBxhC,GAChBA,EAAO4W,UAAU1B,OAAOoqB,IACxB,MAAMyC,EAAc3gB,GAAe1T,KAAK,GAAG6xB,MAAyBD,KAAuBt/B,GAC3F,IAAK,MAAM9E,KAAQ6mC,EACjB7mC,EAAK0b,UAAU1B,OAAOoqB,GAE1B,CAGA,sBAAOtnB,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAOm6B,GAAUlf,oBAAoBtF,KAAM8D,GACjD,GAAsB,iBAAXA,EAAX,CAGA,QAAqB/K,IAAjB1O,EAAKyZ,IAAyBA,EAAOrC,WAAW,MAAmB,gBAAXqC,EAC1D,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,IAJL,CAKF,GACF,EAOFvD,GAAac,GAAGzhB,OAAQkkC,IAAuB,KAC7C,IAAK,MAAM2C,KAAO5gB,GAAe1T,KApOT,0BAqOtBqyB,GAAUlf,oBAAoBmhB,EAChC,IAOFtqB,GAAmBqoB,IAcnB,MAEMkC,GAAc,UACdC,GAAe,OAAOD,KACtBE,GAAiB,SAASF,KAC1BG,GAAe,OAAOH,KACtBI,GAAgB,QAAQJ,KACxBK,GAAuB,QAAQL,KAC/BM,GAAgB,UAAUN,KAC1BO,GAAsB,OAAOP,KAC7BQ,GAAiB,YACjBC,GAAkB,aAClBC,GAAe,UACfC,GAAiB,YACjBC,GAAW,OACXC,GAAU,MACVC,GAAoB,SACpBC,GAAoB,OACpBC,GAAoB,OAEpBC,GAA2B,mBAE3BC,GAA+B,QAAQD,MAIvCE,GAAuB,2EACvBC,GAAsB,YAFOF,uBAAiDA,mBAA6CA,OAE/EC,KAC5CE,GAA8B,IAAIP,8BAA6CA,+BAA8CA,4BAMnI,MAAMQ,WAAYtjB,GAChB,WAAAP,CAAY5kB,GACVolB,MAAMplB,GACNygB,KAAKoS,QAAUpS,KAAK4E,SAAS5J,QAdN,uCAelBgF,KAAKoS,UAOVpS,KAAKioB,sBAAsBjoB,KAAKoS,QAASpS,KAAKkoB,gBAC9C3nB,GAAac,GAAGrB,KAAK4E,SAAUoiB,IAAe5nB,GAASY,KAAK6M,SAASzN,KACvE,CAGA,eAAW7C,GACT,MAnDW,KAoDb,CAGA,IAAAsT,GAEE,MAAMsY,EAAYnoB,KAAK4E,SACvB,GAAI5E,KAAKooB,cAAcD,GACrB,OAIF,MAAME,EAASroB,KAAKsoB,iBACdC,EAAYF,EAAS9nB,GAAaqB,QAAQymB,EAAQ1B,GAAc,CACpE7mB,cAAeqoB,IACZ,KACa5nB,GAAaqB,QAAQumB,EAAWtB,GAAc,CAC9D/mB,cAAeuoB,IAEHrmB,kBAAoBumB,GAAaA,EAAUvmB,mBAGzDhC,KAAKwoB,YAAYH,EAAQF,GACzBnoB,KAAKyoB,UAAUN,EAAWE,GAC5B,CAGA,SAAAI,CAAUlpC,EAASmpC,GACZnpC,IAGLA,EAAQ8b,UAAU5E,IAAI+wB,IACtBxnB,KAAKyoB,UAAU5iB,GAAec,uBAAuBpnB,IAcrDygB,KAAKmF,gBAZY,KACsB,QAAjC5lB,EAAQic,aAAa,SAIzBjc,EAAQ4B,gBAAgB,YACxB5B,EAAQ6B,aAAa,iBAAiB,GACtC4e,KAAK2oB,gBAAgBppC,GAAS,GAC9BghB,GAAaqB,QAAQriB,EAASunC,GAAe,CAC3ChnB,cAAe4oB,KAPfnpC,EAAQ8b,UAAU5E,IAAIixB,GAQtB,GAE0BnoC,EAASA,EAAQ8b,UAAU7W,SAASijC,KACpE,CACA,WAAAe,CAAYjpC,EAASmpC,GACdnpC,IAGLA,EAAQ8b,UAAU1B,OAAO6tB,IACzBjoC,EAAQq7B,OACR5a,KAAKwoB,YAAY3iB,GAAec,uBAAuBpnB,IAcvDygB,KAAKmF,gBAZY,KACsB,QAAjC5lB,EAAQic,aAAa,SAIzBjc,EAAQ6B,aAAa,iBAAiB,GACtC7B,EAAQ6B,aAAa,WAAY,MACjC4e,KAAK2oB,gBAAgBppC,GAAS,GAC9BghB,GAAaqB,QAAQriB,EAASqnC,GAAgB,CAC5C9mB,cAAe4oB,KAPfnpC,EAAQ8b,UAAU1B,OAAO+tB,GAQzB,GAE0BnoC,EAASA,EAAQ8b,UAAU7W,SAASijC,KACpE,CACA,QAAA5a,CAASzN,GACP,IAAK,CAAC8nB,GAAgBC,GAAiBC,GAAcC,GAAgBC,GAAUC,IAASnmB,SAAShC,EAAMtiB,KACrG,OAEFsiB,EAAM0U,kBACN1U,EAAMkD,iBACN,MAAMyD,EAAW/F,KAAKkoB,eAAe/hC,QAAO5G,IAAY2b,GAAW3b,KACnE,IAAIqpC,EACJ,GAAI,CAACtB,GAAUC,IAASnmB,SAAShC,EAAMtiB,KACrC8rC,EAAoB7iB,EAAS3G,EAAMtiB,MAAQwqC,GAAW,EAAIvhB,EAASrV,OAAS,OACvE,CACL,MAAM8c,EAAS,CAAC2Z,GAAiBE,IAAgBjmB,SAAShC,EAAMtiB,KAChE8rC,EAAoB9qB,GAAqBiI,EAAU3G,EAAM7S,OAAQihB,GAAQ,EAC3E,CACIob,IACFA,EAAkBnW,MAAM,CACtBoW,eAAe,IAEjBb,GAAI1iB,oBAAoBsjB,GAAmB/Y,OAE/C,CACA,YAAAqY,GAEE,OAAOriB,GAAe1T,KAAK21B,GAAqB9nB,KAAKoS,QACvD,CACA,cAAAkW,GACE,OAAOtoB,KAAKkoB,eAAe/1B,MAAKzN,GAASsb,KAAKooB,cAAc1jC,MAAW,IACzE,CACA,qBAAAujC,CAAsBxjC,EAAQshB,GAC5B/F,KAAK8oB,yBAAyBrkC,EAAQ,OAAQ,WAC9C,IAAK,MAAMC,KAASqhB,EAClB/F,KAAK+oB,6BAA6BrkC,EAEtC,CACA,4BAAAqkC,CAA6BrkC,GAC3BA,EAAQsb,KAAKgpB,iBAAiBtkC,GAC9B,MAAMukC,EAAWjpB,KAAKooB,cAAc1jC,GAC9BwkC,EAAYlpB,KAAKmpB,iBAAiBzkC,GACxCA,EAAMtD,aAAa,gBAAiB6nC,GAChCC,IAAcxkC,GAChBsb,KAAK8oB,yBAAyBI,EAAW,OAAQ,gBAE9CD,GACHvkC,EAAMtD,aAAa,WAAY,MAEjC4e,KAAK8oB,yBAAyBpkC,EAAO,OAAQ,OAG7Csb,KAAKopB,mCAAmC1kC,EAC1C,CACA,kCAAA0kC,CAAmC1kC,GACjC,MAAM6H,EAASsZ,GAAec,uBAAuBjiB,GAChD6H,IAGLyT,KAAK8oB,yBAAyBv8B,EAAQ,OAAQ,YAC1C7H,EAAMyV,IACR6F,KAAK8oB,yBAAyBv8B,EAAQ,kBAAmB,GAAG7H,EAAMyV,MAEtE,CACA,eAAAwuB,CAAgBppC,EAAS8pC,GACvB,MAAMH,EAAYlpB,KAAKmpB,iBAAiB5pC,GACxC,IAAK2pC,EAAU7tB,UAAU7W,SApKN,YAqKjB,OAEF,MAAMmjB,EAAS,CAAC5N,EAAUoa,KACxB,MAAM50B,EAAUsmB,GAAeC,QAAQ/L,EAAUmvB,GAC7C3pC,GACFA,EAAQ8b,UAAUsM,OAAOwM,EAAWkV,EACtC,EAEF1hB,EAAOggB,GAA0BH,IACjC7f,EA5K2B,iBA4KI+f,IAC/BwB,EAAU9nC,aAAa,gBAAiBioC,EAC1C,CACA,wBAAAP,CAAyBvpC,EAASwC,EAAWpE,GACtC4B,EAAQgc,aAAaxZ,IACxBxC,EAAQ6B,aAAaW,EAAWpE,EAEpC,CACA,aAAAyqC,CAAc9Y,GACZ,OAAOA,EAAKjU,UAAU7W,SAASgjC,GACjC,CAGA,gBAAAwB,CAAiB1Z,GACf,OAAOA,EAAKtJ,QAAQ8hB,IAAuBxY,EAAOzJ,GAAeC,QAAQgiB,GAAqBxY,EAChG,CAGA,gBAAA6Z,CAAiB7Z,GACf,OAAOA,EAAKtU,QA5LO,gCA4LoBsU,CACzC,CAGA,sBAAO7S,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAO29B,GAAI1iB,oBAAoBtF,MACrC,GAAsB,iBAAX8D,EAAX,CAGA,QAAqB/K,IAAjB1O,EAAKyZ,IAAyBA,EAAOrC,WAAW,MAAmB,gBAAXqC,EAC1D,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,IAJL,CAKF,GACF,EAOFvD,GAAac,GAAGhc,SAAU0hC,GAAsBc,IAAsB,SAAUzoB,GAC1E,CAAC,IAAK,QAAQgC,SAASpB,KAAKiH,UAC9B7H,EAAMkD,iBAEJpH,GAAW8E,OAGfgoB,GAAI1iB,oBAAoBtF,MAAM6P,MAChC,IAKAtP,GAAac,GAAGzhB,OAAQqnC,IAAqB,KAC3C,IAAK,MAAM1nC,KAAWsmB,GAAe1T,KAAK41B,IACxCC,GAAI1iB,oBAAoB/lB,EAC1B,IAMF4c,GAAmB6rB,IAcnB,MAEMhjB,GAAY,YACZskB,GAAkB,YAAYtkB,KAC9BukB,GAAiB,WAAWvkB,KAC5BwkB,GAAgB,UAAUxkB,KAC1BykB,GAAiB,WAAWzkB,KAC5B0kB,GAAa,OAAO1kB,KACpB2kB,GAAe,SAAS3kB,KACxB4kB,GAAa,OAAO5kB,KACpB6kB,GAAc,QAAQ7kB,KAEtB8kB,GAAkB,OAClBC,GAAkB,OAClBC,GAAqB,UACrBrmB,GAAc,CAClByc,UAAW,UACX6J,SAAU,UACV1J,MAAO,UAEH7c,GAAU,CACd0c,WAAW,EACX6J,UAAU,EACV1J,MAAO,KAOT,MAAM2J,WAAcxlB,GAClB,WAAAP,CAAY5kB,EAASukB,GACnBa,MAAMplB,EAASukB,GACf9D,KAAK4gB,SAAW,KAChB5gB,KAAKmqB,sBAAuB,EAC5BnqB,KAAKoqB,yBAA0B,EAC/BpqB,KAAKkhB,eACP,CAGA,kBAAWxd,GACT,OAAOA,EACT,CACA,sBAAWC,GACT,OAAOA,EACT,CACA,eAAWpH,GACT,MA/CS,OAgDX,CAGA,IAAAsT,GACoBtP,GAAaqB,QAAQ5B,KAAK4E,SAAUglB,IACxC5nB,mBAGdhC,KAAKqqB,gBACDrqB,KAAK6E,QAAQub,WACfpgB,KAAK4E,SAASvJ,UAAU5E,IA/CN,QAsDpBuJ,KAAK4E,SAASvJ,UAAU1B,OAAOmwB,IAC/BjuB,GAAOmE,KAAK4E,UACZ5E,KAAK4E,SAASvJ,UAAU5E,IAAIszB,GAAiBC,IAC7ChqB,KAAKmF,gBARY,KACfnF,KAAK4E,SAASvJ,UAAU1B,OAAOqwB,IAC/BzpB,GAAaqB,QAAQ5B,KAAK4E,SAAUilB,IACpC7pB,KAAKsqB,oBAAoB,GAKGtqB,KAAK4E,SAAU5E,KAAK6E,QAAQub,WAC5D,CACA,IAAAxQ,GACO5P,KAAKuqB,YAGQhqB,GAAaqB,QAAQ5B,KAAK4E,SAAU8kB,IACxC1nB,mBAQdhC,KAAK4E,SAASvJ,UAAU5E,IAAIuzB,IAC5BhqB,KAAKmF,gBANY,KACfnF,KAAK4E,SAASvJ,UAAU5E,IAAIqzB,IAC5B9pB,KAAK4E,SAASvJ,UAAU1B,OAAOqwB,GAAoBD,IACnDxpB,GAAaqB,QAAQ5B,KAAK4E,SAAU+kB,GAAa,GAGrB3pB,KAAK4E,SAAU5E,KAAK6E,QAAQub,YAC5D,CACA,OAAArb,GACE/E,KAAKqqB,gBACDrqB,KAAKuqB,WACPvqB,KAAK4E,SAASvJ,UAAU1B,OAAOowB,IAEjCplB,MAAMI,SACR,CACA,OAAAwlB,GACE,OAAOvqB,KAAK4E,SAASvJ,UAAU7W,SAASulC,GAC1C,CAIA,kBAAAO,GACOtqB,KAAK6E,QAAQolB,WAGdjqB,KAAKmqB,sBAAwBnqB,KAAKoqB,0BAGtCpqB,KAAK4gB,SAAW/iB,YAAW,KACzBmC,KAAK4P,MAAM,GACV5P,KAAK6E,QAAQ0b,QAClB,CACA,cAAAiK,CAAeprB,EAAOqrB,GACpB,OAAQrrB,EAAMqB,MACZ,IAAK,YACL,IAAK,WAEDT,KAAKmqB,qBAAuBM,EAC5B,MAEJ,IAAK,UACL,IAAK,WAEDzqB,KAAKoqB,wBAA0BK,EAIrC,GAAIA,EAEF,YADAzqB,KAAKqqB,gBAGP,MAAM5c,EAAcrO,EAAMU,cACtBE,KAAK4E,WAAa6I,GAAezN,KAAK4E,SAASpgB,SAASipB,IAG5DzN,KAAKsqB,oBACP,CACA,aAAApJ,GACE3gB,GAAac,GAAGrB,KAAK4E,SAAU0kB,IAAiBlqB,GAASY,KAAKwqB,eAAeprB,GAAO,KACpFmB,GAAac,GAAGrB,KAAK4E,SAAU2kB,IAAgBnqB,GAASY,KAAKwqB,eAAeprB,GAAO,KACnFmB,GAAac,GAAGrB,KAAK4E,SAAU4kB,IAAepqB,GAASY,KAAKwqB,eAAeprB,GAAO,KAClFmB,GAAac,GAAGrB,KAAK4E,SAAU6kB,IAAgBrqB,GAASY,KAAKwqB,eAAeprB,GAAO,IACrF,CACA,aAAAirB,GACEnd,aAAalN,KAAK4gB,UAClB5gB,KAAK4gB,SAAW,IAClB,CAGA,sBAAOnkB,CAAgBqH,GACrB,OAAO9D,KAAKwH,MAAK,WACf,MAAMnd,EAAO6/B,GAAM5kB,oBAAoBtF,KAAM8D,GAC7C,GAAsB,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjBzZ,EAAKyZ,GACd,MAAM,IAAIU,UAAU,oBAAoBV,MAE1CzZ,EAAKyZ,GAAQ9D,KACf,CACF,GACF,ECr0IK,SAAS0qB,GAAcruB,GACD,WAAvBhX,SAASuX,WAAyBP,IACjChX,SAASyF,iBAAiB,mBAAoBuR,EACrD,CDy0IAwK,GAAqBqjB,IAMrB/tB,GAAmB+tB,IEpyInBQ,IAzCA,WAC2B,GAAGt4B,MAAM5U,KAChC6H,SAAS+a,iBAAiB,+BAETtd,KAAI,SAAU6nC,GAC/B,OAAO,IAAI,GAAkBA,EAAkB,CAC7CpK,MAAO,CAAE1Q,KAAM,IAAKD,KAAM,MAE9B,GACF,IAiCA8a,IA5BA,WACYrlC,SAASm9B,eAAe,mBAC9B13B,iBAAiB,SAAS,WAC5BzF,SAAS6G,KAAKT,UAAY,EAC1BpG,SAASC,gBAAgBmG,UAAY,CACvC,GACF,IAuBAi/B,IArBA,WACE,IAAIE,EAAMvlC,SAASm9B,eAAe,mBAC9BqI,EAASxlC,SACVylC,uBAAuB,aAAa,GACpCxnC,wBACH1D,OAAOkL,iBAAiB,UAAU,WAC5BkV,KAAK+qB,UAAY/qB,KAAKgrB,SAAWhrB,KAAKgrB,QAAUH,EAAOjtC,OACzDgtC,EAAI7pC,MAAMgxB,QAAU,QAEpB6Y,EAAI7pC,MAAMgxB,QAAU,OAEtB/R,KAAK+qB,UAAY/qB,KAAKgrB,OACxB,GACF,IAUAprC,OAAOqrC,UAAY","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
CommandDescriptionOptionsExamples
lsList files and directories.-l: Long format listing.
-a: Include hidden files.
ls -l
displays files and directories with detailed information.

ls -a shows all files and directories, including hidden ones.
cdChange directory.N/Acd /path/to/directory
changes the current directory to the specified path.
pwdPrint current working directory.N/Apwd
displays the current working directory.
mkdirCreate a new directory.N/Amkdir my_directory
creates a new directory named \"my_directory\".
rmRemove files and directories.-r: Remove directories recursively.
-f: Force removal without confirmation.
rm file.txt
deletes the file named \"file.txt\".
rm -r my_directory
deletes the directory \"my_directory\" and its contents.
rm -f file.txt
forcefully deletes the file \"file.txt\" without confirmation.
cpCopy files and directories.-r: Copy directories recursively.cp -r directory destination
copies the directory \"directory\" and its contents to the specified destination.
cp file.txt destination
copies the file \"file.txt\" to the specified destination.
mvMove/rename files and directories.N/Amv file.txt new_name.txt
renames the file \"file.txt\" to \"new_name.txt\".
mv file.txt directory
moves the file \"file.txt\" to the specified directory.
findSearch for files and directories.-name: Search by filename.find /path/to/search -name “*.txt”
searches for all files with the extension “.txt” in the specified directory.
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-``; + + title = item.querySelector(".admonition-title") + title.insertAdjacentHTML("beforeend", collapseButton); + thisButton = document.getElementById(buttonID); + + // Add click handlers for the button + admonition title (if admonition) + admonitionTitle = document.querySelector(`#${toggleID} > .admonition-title`) + if (admonitionTitle) { + // If an admonition, then make the whole title block clickable + admonitionTitle.addEventListener('click', toggleClickHandler); + admonitionTitle.dataset.target = toggleID + admonitionTitle.dataset.button = buttonID + } else { + // If not an admonition then we'll listen for the button click + thisButton.addEventListener('click', toggleClickHandler); + } + + // Now hide the item for this toggle button unless explicitly noted to show + if (!item.classList.contains("toggle-shown")) { + toggleHidden(thisButton); + } + } else { + // If not an admonition, wrap the block in a
block + // Define the structure of the details block and insert it as a sibling + var detailsBlock = ` +
+ + ${toggleChevron} + ${toggleHintShow} + +
`; + item.insertAdjacentHTML("beforebegin", detailsBlock); + + // Now move the toggle-able content inside of the details block + details = item.previousElementSibling + details.appendChild(item) + item.classList.add("toggle-details__container") + + // Set up a click trigger to change the text as needed + details.addEventListener('click', (click) => { + let parent = click.target.parentElement; + if (parent.tagName.toLowerCase() == "details") { + summary = parent.querySelector("summary"); + details = parent; + } else { + summary = parent; + details = parent.parentElement; + } + // Update the inner text for the proper hint + if (details.open) { + summary.querySelector("span.toggle-details__summary-text").innerText = toggleHintShow; + } else { + summary.querySelector("span.toggle-details__summary-text").innerText = toggleHintHide; + } + + }); + + // If we have a toggle-shown class, open details block should be open + if (item.classList.contains("toggle-shown")) { + details.click(); + } + } + }) +}; + +// This should simply add / remove the collapsed class and change the button text +var toggleHidden = (button) => { + target = button.dataset['target'] + var itemToToggle = document.getElementById(target); + if (itemToToggle.classList.contains("toggle-hidden")) { + itemToToggle.classList.remove("toggle-hidden"); + button.classList.remove("toggle-button-hidden"); + } else { + itemToToggle.classList.add("toggle-hidden"); + button.classList.add("toggle-button-hidden"); + } +} + +var toggleClickHandler = (click) => { + // Be cause the admonition title is clickable and extends to the whole admonition + // We only look for a click event on this title to trigger the toggle. + + if (click.target.classList.contains("admonition-title")) { + button = click.target.querySelector(".toggle-button"); + } else if (click.target.classList.contains("tb-icon")) { + // We've clicked the icon and need to search up one parent for the button + button = click.target.parentElement; + } else if (click.target.tagName == "polyline") { + // We've clicked the SVG elements inside the button, need to up 2 layers + button = click.target.parentElement.parentElement; + } else if (click.target.classList.contains("toggle-button")) { + // We've clicked the button itself and so don't need to do anything + button = click.target; + } else { + console.log(`[togglebutton]: Couldn't find button for ${click.target}`) + } + target = document.getElementById(button.dataset['button']); + toggleHidden(target); +} + +// If we want to blanket-add toggle classes to certain cells +var addToggleToSelector = () => { + const selector = ""; + if (selector.length > 0) { + document.querySelectorAll(selector).forEach((item) => { + item.classList.add("toggle"); + }) + } +} + +// Helper function to run when the DOM is finished +const sphinxToggleRunWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} +sphinxToggleRunWhenDOMLoaded(addToggleToSelector) +sphinxToggleRunWhenDOMLoaded(initToggleItems) + +/** Toggle details blocks to be open when printing */ +if (toggleOpenOnPrint == "true") { + window.addEventListener("beforeprint", () => { + // Open the details + document.querySelectorAll("details.toggle-details").forEach((el) => { + el.dataset["togglestatus"] = el.open; + el.open = true; + }); + + // Open the admonitions + document.querySelectorAll(".admonition.toggle.toggle-hidden").forEach((el) => { + console.log(el); + el.querySelector("button.toggle-button").click(); + el.dataset["toggle_after_print"] = "true"; + }); + }); + window.addEventListener("afterprint", () => { + // Re-close the details that were closed + document.querySelectorAll("details.toggle-details").forEach((el) => { + el.open = el.dataset["togglestatus"] == "true"; + delete el.dataset["togglestatus"]; + }); + + // Re-close the admonition toggle buttons + document.querySelectorAll(".admonition.toggle").forEach((el) => { + if (el.dataset["toggle_after_print"] == "true") { + el.querySelector("button.toggle-button").click(); + delete el.dataset["toggle_after_print"]; + } + }); + }); +} diff --git a/_static/vendor/fontawesome/6.5.2/LICENSE.txt b/_static/vendor/fontawesome/6.5.2/LICENSE.txt new file mode 100644 index 000000000..e69c5e39a --- /dev/null +++ b/_static/vendor/fontawesome/6.5.2/LICENSE.txt @@ -0,0 +1,165 @@ +Fonticons, Inc. (https://fontawesome.com) + +-------------------------------------------------------------------------------- + +Font Awesome Free License + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license/free. + +-------------------------------------------------------------------------------- + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) + +The Font Awesome Free download is licensed under a Creative Commons +Attribution 4.0 International License and applies to all icons packaged +as SVG and JS file types. + +-------------------------------------------------------------------------------- + +# Fonts: SIL OFL 1.1 License + +In the Font Awesome Free download, the SIL OFL license applies to all icons +packaged as web and desktop font files. + +Copyright (c) 2024 Fonticons, Inc. (https://fontawesome.com) +with Reserved Font Name: "Font Awesome". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +SIL OPEN FONT LICENSE +Version 1.1 - 26 February 2007 + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting — in part or in whole — any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +-------------------------------------------------------------------------------- + +# Code: MIT License (https://opensource.org/licenses/MIT) + +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +Copyright 2024 Fonticons, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +# Attribution + +Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +-------------------------------------------------------------------------------- + +# Brand Icons + +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/_static/vendor/fontawesome/6.5.2/css/all.min.css b/_static/vendor/fontawesome/6.5.2/css/all.min.css new file mode 100644 index 000000000..628b2ccdf --- /dev/null +++ b/_static/vendor/fontawesome/6.5.2/css/all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:Font Awesome\ 6 Free}.fa-brands,.fab{font-family:Font Awesome\ 6 Brands}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);line-height:inherit;position:absolute;text-align:center;width:var(--fa-li-width,2em)}.fa-border{border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}24%,8%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}24%,8%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-display:block;font-family:Font Awesome\ 6 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-display:block;font-family:Font Awesome\ 6 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-display:block;font-family:Font Awesome\ 6 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-display:block;font-family:Font Awesome\ 5 Brands;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-display:block;font-family:Font Awesome\ 5 Free;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-display:block;font-family:Font Awesome\ 5 Free;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/_static/vendor/fontawesome/6.5.2/js/all.min.js b/_static/vendor/fontawesome/6.5.2/js/all.min.js new file mode 100644 index 000000000..de4b034e5 --- /dev/null +++ b/_static/vendor/fontawesome/6.5.2/js/all.min.js @@ -0,0 +1,2 @@ +/*! For license information please see all.min.js.LICENSE.txt */ +!function(){"use strict";var c={},l={};try{"undefined"!=typeof window&&(c=window),"undefined"!=typeof document&&(l=document)}catch(c){}var s=void 0===(v=(c.navigator||{}).userAgent)?"":v,a=c,z=l;function e(c,l){var s,a=Object.keys(c);return Object.getOwnPropertySymbols&&(s=Object.getOwnPropertySymbols(c),l&&(s=s.filter((function(l){return Object.getOwnPropertyDescriptor(c,l).enumerable}))),a.push.apply(a,s)),a}function H(c){for(var l=1;lc.length)&&(l=c.length);for(var s=0,a=new Array(l);sc.length)&&(l=c.length);for(var s=0,a=new Array(l);sc.length)&&(l=c.length);for(var s=0,a=new Array(l);sc.length)&&(l=c.length);for(var s=0,a=new Array(l);s>>0;s--;)l[s]=c[s];return l}function lc(c){return c.classList?cc(c.classList):(c.getAttribute("class")||"").split(" ").filter((function(c){return c}))}function sc(c){return"".concat(c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function ac(c){return Object.keys(c||{}).reduce((function(l,s){return l+"".concat(s,": ").concat(c[s].trim(),";")}),"")}function zc(c){return c.size!==K.size||c.x!==K.x||c.y!==K.y||c.rotate!==K.rotate||c.flipX||c.flipY}function ec(){var c,l,s=d,a=B.cssPrefix,z=B.replacementClass,e=':host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Solid";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Regular";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Light";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Thin";--fa-font-duotone:normal 900 1em/1 "Font Awesome 6 Duotone";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-light:normal 300 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-thin:normal 100 1em/1 "Font Awesome 6 Sharp";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}svg:not(:host).svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible;box-sizing:content-box}.svg-inline--fa{display:var(--fa-display,inline-block);height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-2xs{vertical-align:.1em}.svg-inline--fa.fa-xs{vertical-align:0}.svg-inline--fa.fa-sm{vertical-align:-.0714285705em}.svg-inline--fa.fa-lg{vertical-align:-.2em}.svg-inline--fa.fa-xl{vertical-align:-.25em}.svg-inline--fa.fa-2xl{vertical-align:-.3125em}.svg-inline--fa.fa-pull-left{margin-right:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-pull-right{margin-left:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-li{width:var(--fa-li-width,2em);top:.25em}.svg-inline--fa.fa-fw{width:var(--fa-fw-width,1.25em)}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:var(--fa-counter-background-color,#ff253a);border-radius:var(--fa-counter-border-radius,1em);box-sizing:border-box;color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);max-width:var(--fa-counter-max-width,5em);min-width:var(--fa-counter-min-width,1.5em);overflow:hidden;padding:var(--fa-counter-padding,.25em .5em);right:var(--fa-right,0);text-overflow:ellipsis;top:var(--fa-top,0);-webkit-transform:scale(var(--fa-counter-scale,.25));transform:scale(var(--fa-counter-scale,.25));-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:var(--fa-bottom,0);right:var(--fa-right,0);top:auto;-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:var(--fa-bottom,0);left:var(--fa-left,0);right:auto;top:auto;-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{top:var(--fa-top,0);right:var(--fa-right,0);-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:var(--fa-left,0);right:auto;top:var(--fa-top,0);-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:top left;transform-origin:top left}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.0833333337em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.0714285718em;vertical-align:.0535714295em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.0416666682em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width,2em) * -1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}100%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}100%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}24%,8%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}100%,40%{-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}24%,8%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}100%,40%{-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;vertical-align:middle;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;z-index:var(--fa-stack-z-index,auto)}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-sr-only,.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fa-sr-only-focusable:not(:focus),.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor);opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fa-duotone.fa-inverse,.fad.fa-inverse{color:var(--fa-inverse,#fff)}';return"fa"===a&&z===s||(c=new RegExp("\\.".concat("fa","\\-"),"g"),l=new RegExp("\\--".concat("fa","\\-"),"g"),s=new RegExp("\\.".concat(s),"g"),e=e.replace(c,".".concat(a,"-")).replace(l,"--".concat(a,"-")).replace(s,".".concat(z))),e}var Hc=!1;function tc(){B.autoAddCss&&!Hc&&(function(c){if(c&&L){var l=o.createElement("style");l.setAttribute("type","text/css"),l.innerHTML=c;for(var s=o.head.childNodes,a=null,z=s.length-1;-1").concat(z.map(nc).join(""),"")}function ic(c,l,s){if(c&&c[l]&&c[l][s])return{prefix:l,iconName:s,icon:c[l][s]}}function mc(c,l,s,a){for(var z,e,H=Object.keys(c),t=H.length,V=void 0!==a?oc(l,a):l,r=void 0===s?(z=1,c[H[0]]):(z=0,s);z +{# Load FontAwesome icons #} +{% macro head_pre_icons() %} + + + + +{% endmacro %} + +{% macro head_pre_assets() %} + + + + +{% endmacro %} + +{% macro head_js_preload() %} + + + + +{% endmacro %} + +{% macro body_post() %} + + + +{% endmacro %} \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 000000000..370515643 --- /dev/null +++ b/genindex.html @@ -0,0 +1,615 @@ + + + + + + + + + + Index — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ + +

Index

+ +
+ +
+ + +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..960bb69bc --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + diff --git a/notebooks/basics/basics_overview.html b/notebooks/basics/basics_overview.html new file mode 100644 index 000000000..62b30f89f --- /dev/null +++ b/notebooks/basics/basics_overview.html @@ -0,0 +1,755 @@ + + + + + + + + + + + Basics — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Basics

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Basics#

+

The CESM Model is developed around a structured workflow. The first step of this workflow is to set up your workspace, which is usually a one-time task. After setting up your workspace, a basic CESM simulation can be run with only four commands. This section will cover these steps and enable you to complete your first CESM run.

+
+

Workflow Elements#

+
+
    +
  • Set up workspace (one time setup)

    +
      +
    • Download the CESM code

    • +
    • Create or Locate an Input Data Root Directory

    • +
    • Possibly Porting if not on a setup machine

    • +
    +
  • +
  • Creating, Running and Reviewing a Case

    +
      +
    • Create a new case

    • +
    • Invoke case.setup

    • +
    • Build the executable with case.build

    • +
    • Run the model with case.submit

    • +
    • Review output data

    • +
    +
  • +
+
+
+

Setting up your environment#

+

Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded. Please refer to the NCAR supercomputer section under Resources to make sure you are setting up your environment properly.

+

YOU SHOULD ENSURE YOU CHECK THIS EVERY TIME YOU ARE BUILDING A NEW CASE

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow.html b/notebooks/basics/cesm_workflow.html new file mode 100644 index 000000000..752e9b83f --- /dev/null +++ b/notebooks/basics/cesm_workflow.html @@ -0,0 +1,743 @@ + + + + + + + + + + + CESM Workflow — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

CESM Workflow

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

CESM Workflow#

+

CESM has been designed to be easy to use. Once you have downloaded the CESM code, a CESM case can be run with a set of 4 commands.

+

Note: In CESM jargon, a case refers to a specific instance of a model simulation.

+
+
    +
  1. Create a new case using create_newcase

  2. +
  3. Set up the case by invoking case.setup

  4. +
  5. Build the executable using case.build

  6. +
  7. Run your case using case.submit

  8. +
+
+

The following sections will go into more detail about these 4 commands and also provide information about how to check your job status or create a clone of a previous case.

+
+

More information#

+

More detailed information on the CESM2 Workflow is documented in the following links and can be read in detail at a later time.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow/case_build.html b/notebooks/basics/cesm_workflow/case_build.html new file mode 100644 index 000000000..e24c5e77b --- /dev/null +++ b/notebooks/basics/cesm_workflow/case_build.html @@ -0,0 +1,875 @@ + + + + + + + + + + + Case Build — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Case Build

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Case Build#

+

After a new case is setup, the tool that builds the new case by compiling the code is case.build. This tool is located in the $CASEROOT directory.

+

Running this script results in the following actions:

+
    +
  • Checks and creates final component namelists

  • +
  • Builds individual model component libraries

  • +
  • Builds the final CESM model executable

  • +
+

CESM case.build +

Figure: Detailed view of the location of case.build

+

For the current tutorial on derecho, the paths are:

+
    +
  • $SRCROOT = /glade/u/home/$USER/code/my_cesm_code

  • +
  • $CASEROOT = /glade/u/home/$USER/cases/$CASE

  • +
  • $EXEROOT =/glade/derecho/scratch/$USER/$CASE/bld

  • +
  • $RUNDIR =/glade/derecho/scratch/$USER/$CASE/run

  • +
+
+

Command Syntax#

+
+

You should still be in the CASEROOT directory after running case.setup

+
cd /glade/u/home/$USER/cases/CASE
+
+
+
+

Example case.build command:

+
qcmd -- ./case.build
+
+
+
+

NOTE: Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.

+
+
+ Click here for example output +
+
Building case in directory /glade/u/home/$USER/cases/b1850.basics
+sharedlib_only is False
+model_only is False
+Generating component namelists as part of build
+- Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.pop.ro.0301-01-01-00000
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.mosart.r.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cpl.r.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.pop.r.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cam.r.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cice.r.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cam.rs.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.clm2.r.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cam.i.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.cism.r.0301-01-01-00000.nc
+Staging file /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/b.e20.B1850.f19_g17.release_cesm2_1_0.020.ww3.r.0301-01-01-00000
+Creating component namelists
+Calling /glade/u/home/$USER/my_cesm_code/components/cam//cime_config/buildnml
+...calling cam buildcpp to set build time options
+CAM namelist copy: file1 /glade/u/home/$USER/cases/b1850.basics/Buildconf/camconf/atm_in file2 /glade/derecho/scratch/$USER/b1850.basics/run/atm_in
+Calling /glade/u/home/$USER/my_cesm_code/components/clm//cime_config/buildnml
+Calling /glade/u/home/$USER/my_cesm_code/components/cice//cime_config/buildnml
+...buildnml calling cice buildcpp to set build time options
+Calling /glade/u/home/$USER/my_cesm_code/components/pop//cime_config/buildnml
+... buildnml: calling pop buildcpp to set build time options
+given is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2666.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2667.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2668.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2675.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2676.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2677.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2678.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2679.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2680.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2681.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2682.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2683.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2684.
+Calling /glade/u/home/$USER/my_cesm_code/components/mosart//cime_config/buildnml
+Running /glade/u/home/$USER/my_cesm_code/components/cism//cime_config/buildnml
+Calling /glade/u/home/$USER/my_cesm_code/components/ww3//cime_config/buildnml
+Calling /glade/u/home/$USER/my_cesm_code/cime/src/components/stub_comps/sesp/cime_config/buildnml
+Calling /glade/u/home/$USER/my_cesm_code/cime/src/drivers/mct/cime_config/buildnml
+Finished creating component namelists
+Building gptl with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/gptl.bldlog.240606-134217
+Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.gptl
+Component gptl build complete with 2 warnings
+Building mct with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/mct.bldlog.240606-134217
+Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.mct
+Component mct build complete with 55 warnings
+Building pio with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/pio.bldlog.240606-134217
+Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.pio
+Component pio build complete with 28 warnings
+Building csm_share with output to file /glade/derecho/scratch/$USER/b1850.basics/bld/csm_share.bldlog.240606-134217
+Calling /glade/u/home/$USER/my_cesm_code/cime/src/build_scripts/buildlib.csm_share
+Component csm_share build complete with 85 warnings
+- Building clm4_5/clm5_0 Library
+Building lnd with output to /glade/derecho/scratch/$USER/b1850.basics/bld/lnd.bldlog.240606-134217
+
+Component lnd build complete with 292 warnings
+clm built in 109.479993 seconds
+Building atm with output to /glade/derecho/scratch/$USER/b1850.basics/bld/atm.bldlog.240606-134217
+Building ice with output to /glade/derecho/scratch/$USER/b1850.basics/bld/ice.bldlog.240606-134217
+Building ocn with output to /glade/derecho/scratch/$USER/b1850.basics/bld/ocn.bldlog.240606-134217
+Building rof with output to /glade/derecho/scratch/$USER/b1850.basics/bld/rof.bldlog.240606-134217
+Building glc with output to /glade/derecho/scratch/$USER/b1850.basics/bld/glc.bldlog.240606-134217
+Building wav with output to /glade/derecho/scratch/$USER/b1850.basics/bld/wav.bldlog.240606-134217
+Building esp with output to /glade/derecho/scratch/$USER/b1850.basics/bld/esp.bldlog.240606-134217
+Component esp build complete with 1 warnings
+sesp built in 4.413109 seconds
+Component wav build complete with 35 warnings
+ww built in 33.126202 seconds
+Component rof build complete with 14 warnings
+mosart built in 33.278138 seconds
+Component ice build complete with 74 warnings
+cice built in 51.958399 seconds
+Component ocn build complete with 207 warnings
+pop built in 86.837194 seconds
+Component atm build complete with 528 warnings
+cam built in 105.142718 seconds
+Component glc build complete with 150 warnings
+cism built in 133.173952 seconds
+Building cesm with output to /glade/derecho/scratch/$USER/b1850.basics/bld/cesm.bldlog.240606-134217
+Component cesm exe build complete with 27 warnings
+Time spent not building: 130.716460 sec
+Time spent building: 389.249592 sec
+MODEL BUILD HAS FINISHED SUCCESSFULLY
+
+
+
+
+

Notes:

+
    +
  • Notice the ./ before any command run in the CASEROOT.

  • +
  • On NCAR HPC machines you must call the case.build using qcmd because it compiles the model on a compute node rather than a login node. This reduces the load on login nodes and prevents a timeout while you are building the model.

  • +
  • The output tells you if it was successful at the end: MODEL BUILD HAS FINISHED SUCCESSFULLY

  • +
+
+
+

Tips#

+
    +
  • To completely rebuild a case, run ./case.build --clean-all first before building the model.

  • +
  • If you want to make any source code modifications in SourceMods, do this before building the model. We will cover SourceMods in a later section.

  • +
  • If you want to make any modifications to env_build.xml, do this before building the model.

  • +
  • If any input data is missing the build will abort but provide a list of missing files. To acquire missing data run ./check_input_data --download. This will download the required data and put it in the inputdata directory defined by the XML variable DIN_LOC_ROOT. After you have done these steps you can re-run the case.build script.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow/case_setup.html b/notebooks/basics/cesm_workflow/case_setup.html new file mode 100644 index 000000000..0b1c8e85d --- /dev/null +++ b/notebooks/basics/cesm_workflow/case_setup.html @@ -0,0 +1,782 @@ + + + + + + + + + + + Case Setup — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Case Setup

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Case Setup#

+

After a new case is created, the tool that sets up the new case is case.setup. This tool is located in the $CASEROOT directory.

+

After running case.setup the following actions occur:

+
    +
  • The $RUNDIR and $EXEROOT directories are created as shown on the figure.

  • +
+

CESM case.setup +

Figure: Detailed view of the location of case.setup

+

For the current tutorial on derecho, the paths are:

+
    +
  • $SRCROOT = /glade/u/home/$USER/code/my_cesm_code

  • +
  • $CASEROOT = /glade/u/home/$USER/cases/$CASE

  • +
  • $EXEROOT =/glade/derecho/scratch/$USER/$CASE/bld

  • +
  • $RUNDIR =/glade/derecho/scratch/$USER/$CASE/run

  • +
+

Note that other files and directories are created at case.setup. This will be covered in more detail in later sections (i.e. Namelist modifications)

+
    +
  • user_nl_xxx files, where the user can customize component namelist files

  • +
  • The case.run and case.st_archive scripts and Macros.make file

  • +
  • Hidden files like env_mach_specific.*

  • +
  • The CaseDocs directory, which should not be edited

  • +
+
+

Command Syntax#

+
+

Go to the $CASEROOT directory

+
cd /glade/u/home/$USER/cases/CASE
+
+
+
+

Example case.setup command:

+
./case.setup
+
+
+
+

NOTE: Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.

+
+
+ Click here for example output +
+
/glade/u/home/$USER/cases/b1850.basics/env_mach_specific.xml already exists, delete to replace
+job is case.run USER_REQUESTED_WALLTIME None USER_REQUESTED_QUEUE None WALLTIME_FORMAT %H:%M:%S
+Creating batch scripts
+Writing case.run script from input template /glade/u/home/$USERrun
+Writing case.st_archive script from input template /glade/u/home/$USER/code/my_cesm_code/cime/config/cesm/machines/template.st_archive
+Creating file case.st_archive
+Creating user_nl_xxx files for components and cpl
+If an old case build already exists, might want to run 'case.build --clean' before building
+You can now run './preview_run' to get more info on how your case will be run
+
+
+
+
+
+

Notes:

+
    +
  • Notice the ./ before any command run in the CASEROOT.

  • +
  • You can run the script name followed by the --h or --help argument to see help documentation for that script and a list of all command line arguments for that script.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow/case_submit.html b/notebooks/basics/cesm_workflow/case_submit.html new file mode 100644 index 000000000..666a6e064 --- /dev/null +++ b/notebooks/basics/cesm_workflow/case_submit.html @@ -0,0 +1,848 @@ + + + + + + + + + + + Case Submit — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Case Submit

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Case Submit#

+

After a new case is built, the tool that submits the experiment to start it running is case.submit. This tool is located in the $CASEROOT directory.

+

Running this script results in the following actions:

+
    +
  • Checking archive and run options

  • +
  • Checking in namelists that need to be rebuilt

  • +
  • Checking input data

  • +
  • Submitting the case.run script to the NCAR HPC batch job scheduler

  • +
  • Submitting the case.st_archive script to archive the model output. This step is dependent on the successful completion of case.run

  • +
+

CESM case.submit +

Figure: Detailed view of the location of case.submit

+

For the current tutorial on derecho, the paths are:

+
    +
  • $SRCROOT = /glade/u/home/$USER/code/my_cesm_code

  • +
  • $CASEROOT = /glade/u/home/$USER/cases/$CASE

  • +
  • $CIME_OUTPUT_ROOT = /glade/derecho/scratch/$USER

  • +
  • $EXEROOT =/glade/derecho/scratch/$USER/$CASE/bld

  • +
  • $RUNDIR =/glade/derecho/scratch/$USER/$CASE/run

  • +
+
+

Command Syntax#

+
+

You should still be in the CASEROOT directory after running case.build

+
cd /glade/u/home/$USER/cases/CASE
+
+
+
+

Example case.submit command:

+
./case.submit
+
+
+
+

NOTE: Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.

+
+
+ Click here for example output +
+
 - Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv
+Creating component namelists
+   Calling /glade/u/home/$USER/my_cesm_code/components/cam//cime_config/buildnml
+CAM namelist copy: file1 /glade/u/home/$USER/cases/b1850.basics/Buildconf/camconf/atm_in file2 /glade/derecho/scratch/$USER/b1850.basics/run/atm_in 
+   Calling /glade/u/home/$USER/my_cesm_code/components/clm//cime_config/buildnml
+   Calling /glade/u/home/$USER/my_cesm_code/components/cice//cime_config/buildnml
+   Calling /glade/u/home/$USER/my_cesm_code/components/pop//cime_config/buildnml
+     given is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2666.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2667.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2668.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2675.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2676.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2677.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2678.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2679.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2680.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2681.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2682.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2683.
+when is deprecated at /glade/u/home/$USER/my_cesm_code/components/pop/bld/build-namelist line 2684.
+   Calling /glade/u/home/$USER/my_cesm_code/components/mosart//cime_config/buildnml
+   Running /glade/u/home/$USER/my_cesm_code/components/cism//cime_config/buildnml 
+   Calling /glade/u/home/$USER/my_cesm_code/components/ww3//cime_config/buildnml
+   Calling /glade/u/home/$USER/my_cesm_code/cime/src/components/stub_comps/sesp/cime_config/buildnml
+   Calling /glade/u/home/$USER/my_cesm_code/cime/src/drivers/mct/cime_config/buildnml
+Finished creating component namelists
+Checking that inputdata is available as part of case submission
+Loading input file list: 'Buildconf/clm.input_data_list'
+Loading input file list: 'Buildconf/cpl.input_data_list'
+Loading input file list: 'Buildconf/pop.input_data_list'
+Loading input file list: 'Buildconf/ww3.input_data_list'
+Loading input file list: 'Buildconf/cice.input_data_list'
+Loading input file list: 'Buildconf/cism.input_data_list'
+Loading input file list: 'Buildconf/mosart.input_data_list'
+Loading input file list: 'Buildconf/cam.input_data_list'
+ - Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv
+ - Prestaging REFCASE (/glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01) to /glade/derecho/scratch/$USER/b1850.basics/run
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.restart
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ice
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.lnd
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.rof
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.atm
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.tavg.5
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.glc
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.ocn.ovf
+Copy rpointer /glade/campaign/cesm/cesmdata/inputdata/cesm2_init/b.e20.B1850.f19_g17.release_cesm2_1_0.020/0301-01-01/rpointer.drv
+Creating component namelists
+Finished creating component namelists
+Check case OK
+submit_jobs case.run
+Submit job case.run
+Submitting job script qsub -q main -l walltime=12:00:00 -A $PROJECT -l job_priority=regular -v ARGS_FOR_SCRIPT='--resubmit' .case.run
+Submitted job id is 4743615.desched1
+Submit job case.st_archive
+Submitting job script qsub -q main -l walltime=0:20:00 -A $PROJECT -l job_priority=regular  -W depend=afterok:4743615.desched1 -v ARGS_FOR_SCRIPT='--resubmit' case.st_archive
+Submitted job id is 4743616.desched1
+Submitted job case.run with id 4743615.desched1
+Submitted job case.st_archive with id 4743616.desched1
+
+
+
+
+

Notes:

+
    +
  • case.submit coordinates all the tasks of running CESM.

  • +
  • case.run is submitted to the batch job scheduler by case.submit. Do not try to submit case.run separately.

  • +
  • CESM runs in the Build/Run Directory.

  • +
  • case.st_archive moves the history files to the archive directory runs only after case.run completes successfully. If a model run was unsuccessful the output remains in the Run Directory.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow/checking_jobs_and_status.html b/notebooks/basics/cesm_workflow/checking_jobs_and_status.html new file mode 100644 index 000000000..78b36fb3a --- /dev/null +++ b/notebooks/basics/cesm_workflow/checking_jobs_and_status.html @@ -0,0 +1,830 @@ + + + + + + + + + + + Checking Your Run — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Checking Your Run#

+
+

Batch Job Scheduler Monitoring#

+

Once CESM has been submitted the status of the run on derecho can be followed through the qstat command. Qstat accesses the information in the Batch Job Scheduler to see the status of all jobs running on derecho. To simplify the list down the -u option can be specified for a particular user.

+
+Result of running qstat with an active job running:

+
qstat -u $USER
+
+
+
+

Output:

+
                                                            Req'd  Req'd   Elap
+Job ID          Username Queue    Jobname    SessID NDS TSK Memory Time  S Time
+--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
+4743615.desche* $USER    cpu      run.b.day*    --    6 768  1410g 12:00 Q   --  
+4743616.desche* $USER    cpu      st_archiv*    --    1   1  235gb 00:20 H   --  
+
+
+
+

Note, there may be a slight delay from submitting CESM until the jobs appear in the queue. Once the jobs have completed they will disappear from the qstat command.

+
+
+

Monitoring Files in the Run and Archive Directories#

+

As the CESM job runs it will update files in Build / Run Directory. +Once the job has completed successfully the archiver will transfer history files to the Archive Directory. +One way to keep track of the progress of the run is to monitor the files in these directories.

+
    +
  • Check the files in the $RUNDIR as the model is running and once it is finished

  • +
  • Check the files in the $DOUT_S_ROOT after case.st_archive runs.

  • +
+
+
+

CaseStatus file#

+

All activities for the case are recorded in the CaseStatus file in the CASEROOT directory. By looking through the file the successful or otherwise outcome of each step of the run can be tracked.

+
+Status of the case recorded in the `$CASEROOT` CaseStatus file:

+
cd /glade/u/home/$USER/cases/CASE
+more CaseStatus
+
+
+
+
+
+ Click here for example output +
+
2024-06-06 13:41:19: case.setup starting 
+ ---------------------------------------------------
+2024-06-06 13:41:22: case.setup success 
+ ---------------------------------------------------
+2024-06-06 13:42:17: case.build starting 
+ ---------------------------------------------------
+CESM version is release-cesm2.1.5
+Processing externals description file : Externals.cfg (/glade/u/home/$USER/my_cesm_code)
+Processing externals description file : Externals_CAM.cfg (/glade/u/home/$USER/my_cesm_code/components/cam)
+Processing externals description file : Externals_CISM.cfg (/glade/u/home/$USER/my_cesm_code/components/cism)
+Processing externals description file : Externals_CLM.cfg (/glade/u/home/$USER/my_cesm_code/components/clm)
+Processing externals description file : Externals_POP.cfg (/glade/u/home/$USER/my_cesm_code/components/pop)
+Checking local status of required & optional components: cam, chem_proc, carma, clubb, cosp2, cice, cime, cism, source_cism, clm, 
+fates, mosart, pop, cvmix, marbl, rtm, ww3, 
+    ./cime
+        clean sandbox, on cime5.6.49
+    ./components/cam
+        clean sandbox, on cam_cesm2_1_rel_60
+    ./components/cam/chem_proc
+        clean sandbox, on tools/proc_atm/chem_proc/release_tags/chem_proc5_0_03_rel
+    ./components/cam/src/physics/carma/base
+        clean sandbox, on carma/release_tags/carma3_49_rel
+    ./components/cam/src/physics/clubb
+        clean sandbox, on vendor_clubb_r8099_n03
+    ./components/cam/src/physics/cosp2/src
+        clean sandbox, on v2.1.4cesm
+    ./components/cice
+        clean sandbox, on cice5_cesm2_1_1_20231220
+    ./components/cism
+        clean sandbox, on cism-release-cesm2.1.2_04
+    ./components/cism/source_cism
+        clean sandbox, on release-cism2.1.04
+    ./components/clm
+        clean sandbox, on release-clm5.0.37
+    ./components/clm/src/fates
+        clean sandbox, on sci.1.30.0_api.8.0.0
+    ./components/mosart
+        clean sandbox, on release-cesm2.0.04
+    ./components/pop
+        clean sandbox, on pop2_cesm2_1_rel_n15
+    ./components/pop/externals/CVMix
+        clean sandbox, on v0.93-beta
+    ./components/pop/externals/MARBL
+        clean sandbox, on cesm2.1-n00
+    ./components/rtm
+        clean sandbox, on release-cesm2.0.04
+    ./components/ww3
+        clean sandbox, on ww3_181001
+2024-06-06 13:50:57: case.build success 
+ ---------------------------------------------------
+2024-06-06 13:53:31: case.submit starting 
+ ---------------------------------------------------
+2024-06-06 13:53:46: case.submit success case.run:4743615.desched1, case.st_archive:4743616.desched1
+ ---------------------------------------------------
+
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow/create_clone.html b/notebooks/basics/cesm_workflow/create_clone.html new file mode 100644 index 000000000..73945731a --- /dev/null +++ b/notebooks/basics/cesm_workflow/create_clone.html @@ -0,0 +1,758 @@ + + + + + + + + + + + Create Clone (Advanced) — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Create Clone (Advanced)

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Create Clone (Advanced)#

+

The tool that clones a new case based on an existing case is create_clone. This tool is located in the $SRCROOT directory under the cime/scripts directory.

+

Things that are copied into the new case are:

+
    +
  • Most env_*.xml settings (not all!)

  • +
  • user_nl_xxx files

  • +
  • Macros

  • +
  • SourceMods

  • +
  • Batch system files

  • +
  • README.case

  • +
+

Things that are not copied into the new case are:

+
    +
  • Logs

  • +
  • Timing files

  • +
+
+

Command Syntax#

+
+

Go to the cime/scripts directory in the CESM code

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+
+
+
+

Example of basic ./create_clone syntax to create CASE2:

+
./create_clone --clone /glade/u/home/$USER/cases/CASE1 --case /glade/u/home/$USER/cases/CASE2
+
+
+
+

Notes:

+
    +
  • Do not use cp or cp -R to copy case directories to new experiments.

  • +
  • Document changes in CaseStatus and README.case to keep track of the changes you make.

  • +
  • If you are making many cases with only a small changes, you can script the steps into a python or shell script of your choice to make the process more automated and less prone to human error.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow/create_newcase.html b/notebooks/basics/cesm_workflow/create_newcase.html new file mode 100644 index 000000000..70a6a02ba --- /dev/null +++ b/notebooks/basics/cesm_workflow/create_newcase.html @@ -0,0 +1,1018 @@ + + + + + + + + + + + Create New Case — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Create New Case

+ +
+ +
+
+ + + + +
+ +
+

Create New Case#

+

The tool that generates a new case is create_newcase. This tool is located in the $SRCROOT directory under the cime/scripts directory.

+

After running create_newcase, a $CASEROOT directory is created. The directory $CASEROOT contains the scripts needed for the following steps (case.setup, case.build and case.submit)

+

CESM create_newcase +

Figure: Detailed view of the location of create_newcase

+

For the current tutorial on derecho, the paths are:

+
    +
  • $SRCROOT = /glade/u/home/$USER/code/my_cesm_code

  • +
  • $CASEROOT = /glade/u/home/$USER/cases/$CASE +

  • +
+
+
+

Command Syntax#

+
+

Go to the cime/scripts directory in the CESM code

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+
+
+
+

Example of basic ./create_newcase syntax:

+
./create_newcase --case /glade/u/home/$USER/cases/CASE --res RES --compset COMPSET
+
+
+
+

NOTE: Do not enter the example above at the command line. You will create your first case in the Exercise at the end of this section.

+
+
+ Click here for example output +
+
Compset longname is 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+Compset specification file is /glade/u/home/$USER/code/cesm2.1.1/cime/../cime_config/config_compsets.xml
+Compset forcing is 1850
+Com forcing is Biogeochemistry intercomponent  with diagnostic CO2
+ATM component is CAM cam6 physics:
+LND component is clm5.0:BGC (vert. resol. CN and methane) with prognostic crop:
+ICE component is Sea ICE (cice) model version 5
+OCN component is POP2 EcosystemAbiotic DIC/DIC14
+ROF component is MOSART: MOdel for Scale Adaptive River Transport
+GLC component is cism2 (default, higher-order, can run in parallel):cism ice evolution turned off (this is the standard configuration unless you're explicitly interested in ice evolution):
+WAV component is Wave Watch
+ESP component is 
+Pes     specification file is /glade/u/home/$USER/code/cesm2.1.1/cime/../cime_config/config_pes.xml
+Compset specific settings: name is RUN_STARTDATE and value is 0001-01-01
+Compset specific settings: name is RUN_REFDATE and value is 0301-01-01
+Compset specific settings: name is RUN_TYPE and value is hybrid
+Compset specific settings: name is RUN_REFCASE and value is b.e20.B1850.f19_g17.release_cesm2_1_0.020
+Compset specific settings: name is CLM_NAMELIST_OPTS and value is use_init_interp=.true.
+Machine is derecho
+Pes setting: grid match    is a%1.9x2.5.+l%1.9x2.5.+oi%gx1 
+Pes setting: machine match is derecho 
+Pes setting: compset_match is CAM.+CLM.+CICE.+POP.+ 
+Pes setting: grid          is a%1.9x2.5_l%1.9x2.5_oi%gx1v7_r%r05_g%gland4_w%ww3a_m%gx1v7 
+Pes setting: compset       is 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD 
+Pes setting: tasks       is {'NTASKS_ATM': 288, 'NTASKS_ICE': 108, 'NTASKS_CPL': 288, 'NTASKS_LND': 144, 'NTASKS_WAV': 36, 'NTASKS_ROF': 40, 'NTASKS_OCN': 288, 'NTASKS_GLC': 36} 
+Pes setting: threads     is {'NTHRDS_ICE': 1, 'NTHRDS_ATM': 1, 'NTHRDS_ROF': 1, 'NTHRDS_LND': 1, 'NTHRDS_WAV': 1, 'NTHRDS_OCN': 1, 'NTHRDS_CPL': 1, 'NTHRDS_GLC': 1} 
+Pes setting: rootpe      is {'ROOTPE_OCN': 288, 'ROOTPE_LND': 0, 'ROOTPE_ATM': 0, 'ROOTPE_ICE': 144, 'ROOTPE_WAV': 252, 'ROOTPE_CPL': 0, 'ROOTPE_ROF': 0, 'ROOTPE_GLC': 0} 
+Pes setting: pstrid      is {} 
+Pes other settings: {}
+Pes comments: about 12ypd expected
+ Compset is: 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD 
+ Grid is: a%1.9x2.5_l%1.9x2.5_oi%gx1v7_r%r05_g%gland4_w%ww3a_m%gx1v7 
+ Components in compset are: ['cam', 'clm', 'cice', 'pop', 'mosart', 'cism', 'ww3', 'sesp', 'drv', 'dart'] 
+
+This is a CESM scientifically supported compset at this resolution.
+
+Using project from .cesm_proj: P93300641
+No charge_account info available, using value from PROJECT
+Using project from .cime/config: P93300641
+cesm model version found: cesm2.1_tutorial2022
+Batch_system_type is pbs
+job is case.run USER_REQUESTED_WALLTIME None USER_REQUESTED_QUEUE None WALLTIME_FORMAT %H:%M:%S
+job is case.st_archive USER_REQUESTED_WALLTIME None USER_REQUESTED_QUEUE None WALLTIME_FORMAT %H:%M:%S
+ Creating Case directory /glade/u/home/$USER/cases/b1850.basics
+
+
+
+
+
+

Notes:

+
    +
  • For all user scripts you can run the script name followed by the --h or --help argument to see help documentation for that script and a list of all command line arguments for that script.

  • +
  • Double dashes -- are required with command line arguments

  • +
+
+
+
+

Command Arguments#

+

Create New Case Command Image

+
+

Casename#

+

--case is the argument that specifies the name and location of the case being created. In the example above, the casename is CASE and the location of the case is /glade/u/home/$USER/cases/. Note that if a path preceding the casename is not specified, then the case is created as a subdirectory of the $CIMEROOT/scripts directory.

+
    +
  • The path /glade/u/home/$USER/cases/CASE is your workspace CASEROOT, as described in the workspaces section.

  • +
+

In this tutorial we will use fairly simple names for the cases you create, build, and run. However, most CESM experiments have much longer casenames that provide information about the experiment at a glance. Knowing the CESM case naming conventions will help you navigate CESM community experiments. Information about the CESM naming is available at:

+
+
+

Resolution#

+

--res is the argument that specifies the model resolution or grid. In the example above, the resolution is RES. Each model resolution can be specified with the --res argument by its alias or its full long name. However, the long name conventions are generally quite lengthy, so it is useful if you become familiar with using the alias version. Because the atmosphere and land share a grid and the ocean and sea ice share a grid only two grids are specified by the alias using the following format: atm/lnd_ocn/ice.

+

Create New Case Resolution Image

+
+

CESM2 Supported Grid Definitions#

+

Link for CESM Supported Grids: +
+http://www.cesm.ucar.edu/models/cesm2/config/grids.html

+
+Cime Tool for listing configurations:

+
CIMEROOT/scripts/query_config --grids --long
+
+
+
+
+ Click here for example output +
+
    =========================================
+    GRID naming convention
+    =========================================
+    The notation for the grid longname is
+        a%name_l%name_oi%name_r%name_m%mask_g%name_w%name
+    where
+        a% => atm, l% => lnd, oi% => ocn/ice, r% => river, m% => mask, g% => glc, w% => wav
+
+    Supported out of the box grid configurations are given via alias specification in
+    the file "config_grids.xml". Each grid alias can also be associated  with the
+    following optional attributes
+
+    compset       (Regular expression for compset matches that are required for this grid)
+    not_compset   (Regular expression for compset matches that are not permitted this grid)
+
+    Using the alias and the optional "compset" and "not_compset" attributes a grid longname is created
+    Note that the mask is for information only - and is not an attribute of the grid
+    By default, if the mask is not specified below, it will be set to the ocnice grid
+    And if there is no ocnice grid (such as for single column, the mask is null since it does not mean anything)
+   
+     -------------------------------------------------------------
+            default component grids:
+
+     component         compset       value 
+     -------------------------------------------------------------
+     atm      SATM              null      
+     lnd      SLND              null      
+     ocnice   SOCN              null      
+     rof      SROF              null      
+     rof      DWAV              rx1       
+     rof      RTM               r05       
+     rof      MOSART            r05       
+     rof      DROF              rx1       
+     rof      DROF%CPLHIST      r05       
+     rof      XROF              r05       
+     glc      SGLC              null      
+     glc      CISM1             gland5UM  
+     glc      CISM2             gland4    
+     glc      XGLC              gland4    
+     wav      SWAV              null      
+     wav      DWAV              ww3a      
+     wav      WW3               ww3a      
+     wav      XWAV              ww3a      
+     -------------------------------------------------------------
+
+     alias: g16_g16 (only for compsets that are DATM.+DROF )
+       non-default grids are: atm:gx1v6  lnd:gx1v6  ocnice:gx1v6  
+    
+       gx1v6 is displaced Greenland pole v6 1-deg grid: with domain file(s): 
+       $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v6.090206.nc (only for grid match: atm|lnd)
+       $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v6.090206.nc (only for grid match: ocnice) 
+
+     alias: g17_g17 (only for compsets that are DATM.+DROF )
+       non-default grids are: atm:gx1v7  lnd:gx1v7  ocnice:gx1v7  
+    
+       gx1v7 is displaced Greenland pole 1-deg grid with Caspian as a land feature: with domain file(s): 
+       $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v7.151008.nc (only for grid match: atm|lnd)
+       $DIN_LOC_ROOT/share/domains/domain.ocn.gx1v7.151008.nc (only for grid match: ocnice) 
+
+...
+
+
+
+
+
+
+
+

Compset#

+

--compset is the argument that specifies the component set. In the example above, the compset is COMPSET. The compset specifies the component models and if they are active or not, forcing scenarios, and physics options for the models. As above, the --compset can be specified by its alias or its full long name. However, the long name conventions are generally quite lengthy, so it is useful if you become familiar with using the alias version.

+

Create New Case Compset Image

+

Note:

+
    +
  • Compsets are defined by different model components (active or data) and cime.

  • +
  • Some compsets are scientifically supported and/or tested, while some are only defined. The CESM project will not provide comprehensive support for compsets that are only defined.

  • +
  • Compsets determine which grid is required.

  • +
+
+

CESM2 Supported Compsets#

+

Link for CESM2 Supported Compsets: +
+http://www.cesm.ucar.edu/models/cesm2/config/compsets.html

+
+Cime Tool for listing configurations:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./query_config --compsets
+
+
+
+
+ Click here for example output +
+
Active component: allactive
+       --------------------------------------
+       Compset Alias: Compset Long Name 
+       --------------------------------------
+   B1850                : 1850_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   B1850cmip6           : 1850_CAM60_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BMH6kcmip6           : midH_CAM60_CLM50%BGC_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BLIG127kcmip6        : 127ka_CAM60_CLM50%BGC_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BCO2x4cmip6          : 1850_CAM60%4xCO2_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   B1PCTcmip6           : 1850_CAM60%1PCT_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BW1850               : 1850_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BW1850cmip6          : 1850_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWsc1850             : 1850_CAM60%WCSC_CLM50%BGC-CROP_CICE_POP2%ECO_MOSART_CISM2%NOEVOLVE_WW3
+   BWsc1850smyle        : 1850_CAM60%WCSC%SMYLE_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BWscHIST             : HIST_CAM60%WCSC_CLM50%BGC-CROP_CICE_POP2%ECO_MOSART_CISM2%NOEVOLVE_WW3
+   BWCO2x4cmip6         : 1850_CAM60%WCTS%4xCO2_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BW1PCTcmip6          : 1850_CAM60%WCTS%1PCT_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWmaCO2x4cmip6       : 1850_CAM60%WCCM%4xCO2_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWma1PCTcmip6        : 1850_CAM60%WCCM%1PCT_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP126cmip6        : SSP126_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP245cmip6        : SSP245_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP370cmip6        : SSP370_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP585cmip6        : SSP585_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP534oscmip6      : SSP534_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP126             : SSP126_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP245             : SSP245_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP370             : SSP370_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP585             : SSP585_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP534os           : SSP534_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWHIST               : HIST_CAM60%WCTS_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP585extcmip6     : SSP585EXT_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWSSP534osextcmip6   : SSP534EXT_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWHISTcmip6          : HIST_CAM60%WCTS_CLM50%BGC-CROP-CMIP6WACCMDECK_CICE%CMIP6_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWma1850             : 1850_CAM60%WCCM_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BWmaHIST             : HIST_CAM60%WCCM_CLM50%BGC-CROP_CICE_POP2%ECO%NDEP_MOSART_CISM2%NOEVOLVE_WW3
+   BHIST                : HIST_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BHISTcmip6           : HIST_CAM60_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BHISTsmbb            : HIST_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BSSP370smbb          : SSP370_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BSSP370smbbext       : SSP370EXT_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BSSP245smbb          : SSP245_CAM60%SMBB_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BC5L45BGC            : 2000_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV
+   B1850L45BGCR         : 1850_CAM60_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV
+   B1850C5L45BGC        : 1850_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV
+   BSSP585              : SSP585_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BSSP126              : SSP126_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BSSP245              : SSP245_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BSSP370              : SSP370_CAM60_CLM50%BGC-CROP_CICE_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+   BSSP585cmip6         : SSP585_CAM60_CLM50%BGC-CROP-CMIP6DECK_CICE%CMIP6_POP2%ECO%ABIO-DIC_MOSART_CISM2%NOEVOLVE_WW3_BGC%BDRD
+
+...
+
+
+
+
+
+
+
+

Machines#

+

The argument --mach is not required on CESM supported machines, but is required on other machines

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workflow/model_output.html b/notebooks/basics/cesm_workflow/model_output.html new file mode 100644 index 000000000..34752bc9d --- /dev/null +++ b/notebooks/basics/cesm_workflow/model_output.html @@ -0,0 +1,713 @@ + + + + + + + + + + + Model Output — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Model Output

+ +
+
+ +
+
+
+ + + + +
+ +
+

Model Output#

+

If the model run is successful, the CESM netcdf output history files are automatically moved to a short term archive ($DOUT_S_ROOT) by case.st_archive.

+

Case Submit Image

+

For the current tutorial on derecho, the paths are:

+
    +
  • $SRCROOT = /glade/u/home/$USER/code/my_cesm_code

  • +
  • $CASEROOT = /glade/u/home/$USER/cases/$CASE

  • +
  • $EXEROOT =/glade/derecho/scratch/$USER/$CASE/bld

  • +
  • $RUNDIR =/glade/derecho/scratch/$USER/$CASE/run

  • +
  • $DOUT_S_ROOT =/glade/derecho/scratch/$USER/archive/$CASE

  • +
+

Notes:

+
    +
  • If a model run was unsuccessful the output remains in the Run Directory ($RUNDIR) and the short term archive is not created.

  • +
  • Both $RUNDIR and $DOUT_S_ROOT are in the NCAR HPC scratch space. This space is scrubbed and files deleted after a number of days. Thus, it is a good idea to move your model output files from the short term archive to a more permanent location as soon as you are able.

  • +
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/cesm_workspaces.html b/notebooks/basics/cesm_workspaces.html new file mode 100644 index 000000000..9543c012d --- /dev/null +++ b/notebooks/basics/cesm_workspaces.html @@ -0,0 +1,790 @@ + + + + + + + + + + + Workspaces — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Workspaces

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Workspaces#

+

Utilizing the CESM model requires knowledge of the locations of the different parts of the model. The CESM model consists of five main directory tree areas that make up the CESM Workspace.

+

One of the key elements of the Tutorial will be learning where each of these workspace elements are located and how to use them to setup, build, run and analyze the output of model simulations.

+

There are 5 main directories (see figure, below) you will need to navigate:

+
    +
  1. The path to your CESM source code. This is referred to as $SRCROOT (or $CESMCODE) and contains the $CIMEROOT.

  2. +
  3. The path to the input data, referred to as $CESMDATA.

  4. +
  5. The path to your experiment case directories. This is referred to as $CASEROOT.

  6. +
  7. The path to your build and run directories, referred to as the $EXEROOT and $RUNDIR, respectively.

  8. +
  9. The path to your archived model output, referred to as $DOUT_S_ROOT.

  10. +
+

We will investigate these in more detail in the remainder of the Tutorial.

+

Note on Terminology

+
    +
  • Paths are the directions to the location of different pieces of your workspace.

  • +
  • Roots are saved paths that point to a specific piece of the model.

  • +
+
+

Workspace Overview#

+

CESM workspace +

Figure: Overview of the CESM2 Workspace Directories

+

For the current tutorial on derecho, the paths are:

+
    +
  • $SRCROOT = /glade/u/home/$USER/code/my_cesm_code

  • +
  • $DIN_LOC_ROOT = /glade/campaign/cesm/cesmdata/cseg/inputdata

  • +
  • $CASEROOT = /glade/u/home/$USER/cases/$CASE

  • +
  • $CIME_OUTPUT_ROOT = /glade/derecho/scratch/$USER

  • +
  • $EXEROOT =/glade/derecho/scratch/$USER/$CASE/bld

  • +
  • $RUNDIR =/glade/derecho/scratch/$USER/$CASE/run

  • +
  • $DOUT_S_ROOT =/glade/derecho/scratch/$USER/archive/$CASE

  • +
+

Each of these directories contains sub-directories. You will need to learn to navigate between these directories.

+
+
+
+

Setting your workspaces#

+

You will need to create a directory for the CESM Code and a directory when you will keep all your cases. +In the CESM jargon, a case refers to a specific instance of a model simulation.

+
    +
  • Create CESM Code Directory

    +
  • +
+

Create a workspace location where you can put your CESM code on the derecho glade file system. In all exercises in this tutorial $USER is a placeholder and you should use your NCAR HPC login name when completing the exercise.

+
+
cd /glade/u/home/$USER
+mkdir code
+
+
+
    +
  • Create Cases Workspace Location

    +
  • +
+

Create a workspace location where all your cases from this tutorial will be located on the derecho glade file system.

+
+
cd /glade/u/home/$USER
+mkdir cases
+
+
+
+
    +
  • Other Workspace Locations

    +
  • +
+

The INPUTDATA directory does not need to be set up directly on NCAR HPC as these data are in a common directory.

+

We will not directly set up your Build/Run or Archive workspace locations. These directories will be automatically created when you create a CESM case.

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/code/cesm_code_explore.html b/notebooks/basics/code/cesm_code_explore.html new file mode 100644 index 000000000..d3b15ac09 --- /dev/null +++ b/notebooks/basics/code/cesm_code_explore.html @@ -0,0 +1,917 @@ + + + + + + + + + + + Explore CESM Code — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Explore CESM Code#

+

Having downloaded the CESM Code component to your workspace we are now going to briefly locate and explore the different code directories within it. To get some familiarity with this area we are going to use the terminal window to explore the directories illustrated below this top level location. Specifically in this exercise we will:

+
    +
  • Step 1. Locate your CESM Code area on the glade file system.

  • +
  • Step 2. Examine the CIME Directory area.

  • +
  • Step 3. Examine the Model Components area.

  • +
  • Step 4. Look at the Community Atmosphere Model (CAM) Component Model.

  • +
+

CESM directories +

Figure: Detailed view of the CESM2 Code Directory

+

For the current tutorial on derecho, the paths are:

+
    +
  • $SRCROOT = /glade/u/home/$USER/code/my_cesm_code

  • +
+
+

Step 1. Locate Your Code Workspace Area#

+

Returning to your terminal window we will now locate your $SRCROOT location on the NCAR HPC file system.

+
+Locate your current directory:
+
pwd
+
+
+
+

Expected output:

+
/glade/u/home/$USER/code/my_cesm_code
+
+
+
+

If you have not done anything since the last exercise then you will already be in the $SRCROOT location. If your output doesn’t match the path above, then change the current directory to your Workspace Code directory:

+
cd /glade/u/home/$USER/code/my_cesm_code
+
+
+
+

List the contents of the Workspace Code directory with the ls long option:

+
ls -l
+
+
+
+

Expected output:

+
total 2119
+-rw-r--r--  1 $USER ncar 2116708 Jun  3 15:46 ChangeLog
+-rw-r--r--  1 $USER ncar    2433 Jun  3 15:46 ChangeLog_template
+drwxr-xr-x 10 $USER ncar    4096 Jun  4 09:32 cime
+drwxr-xr-x  4 $USER ncar    4096 Jun  3 15:46 cime_config
+drwxr-xr-x 10 $USER ncar    4096 Jun  4 09:32 components
+-rwxr-xr-x  1 $USER ncar    2475 Jun  3 15:46 describe_version
+drwxr-xr-x  3 $USER ncar    4096 Jun  3 15:46 doc
+-rw-r--r--  1 $USER ncar    1409 Jun  3 15:46 Externals.cfg
+-rw-r--r--  1 $USER ncar    5498 Jun  3 15:46 LICENSE.txt
+drwxr-xr-x  5 $USER ncar    4096 Jun  3 15:46 manage_externals
+-rw-r--r--  1 $USER ncar    8904 Jun  3 15:46 README.rst
+
+
+
+
+

If the output of these commands does not match for your CESM Workspace then you will need to ask for help in configuring them. This area will be used for the remainder of the Tutorial so it is important to get this step right.

+
+
+

Step 2. Examine the CIME Directory#

+

In your terminal window we will now move to the CIME directory and examine the contents. Remember that CIME is the Common Infrastructure for Modeling the Earth. It is a python-based framework that integrates the various components of the CESM into a single modeling framework. The CIME Scripts directory will be the location where you will start the Workflow of creating a new case through the rest of the Tutorial.

+
+Change into the CIME Directory:
+
cd cime
+
+
+
+

List the contents of the CIME Directory:

+
ls -l
+
+
+
+

Expected output:

+
total 648
+-rw-r--r-- 1 $USER ncar 618865 Jun  4 09:32 ChangeLog
+-rw-r--r-- 1 $USER ncar    421 Jun  4 09:32 ChangeLog_template
+-rw-r--r-- 1 $USER ncar   4000 Jun  4 09:32 CMakeLists.txt
+drwxr-xr-x 5 $USER ncar   4096 Jun  4 09:32 config
+-rw-r--r-- 1 $USER ncar   4670 Jun  4 09:32 CONTRIBUTING.md
+drwxr-xr-x 3 $USER ncar   4096 Jun  4 09:32 doc
+-rw-r--r-- 1 $USER ncar    444 Jun  4 09:32 index.html
+-rw-r--r-- 1 $USER ncar   2461 Jun  4 09:32 LICENSE.TXT
+-rw-r--r-- 1 $USER ncar   1747 Jun  4 09:32 README.md
+drwxr-xr-x 7 $USER ncar   4096 Jun  4 09:32 scripts
+drwxr-xr-x 8 $USER ncar   4096 Jun  4 09:32 src
+drwxr-xr-x 7 $USER ncar   4096 Jun  4 09:32 tools
+drwxr-xr-x 3 $USER ncar   4096 Jun  4 09:32 utils
+
+
+
+

Change into the CIME Scripts directory:

+
cd scripts
+
+
+
+

List the contents of the CIME Scripts directory:

+
ls -l
+
+
+
+

Expected output:

+
total 101
+-rwxr-xr-x 1 $USER ncar  5128 Jun  4 09:32 create_clone
+-rwxr-xr-x 1 $USER ncar 11117 Jun  4 09:32 create_newcase
+-rwxr-xr-x 1 $USER ncar 29859 Jun  4 09:32 create_test
+drwxr-xr-x 2 $USER ncar  4096 Jun  4 09:32 data_assimilation
+drwxr-xr-x 4 $USER ncar  4096 Jun  4 09:32 fortran_unit_testing
+drwxr-xr-x 3 $USER ncar  4096 Jun  4 09:32 lib
+-rwxr-xr-x 1 $USER ncar 14663 Jun  4 09:32 query_config
+-rwxr-xr-x 1 $USER ncar  9067 Jun  4 09:32 query_testlists
+drwxr-xr-x 5 $USER ncar  4096 Jun  4 09:32 tests
+drwxr-xr-x 3 $USER ncar  4096 Jun  4 09:32 Tools
+
+
+
+
+
+
+

Step 3. Examine the CESM Components Area#

+

In your terminal window we will now move to the Components Directory and examine the contents of the individual sub models.

+

CESM directories +

Figure: CESM2 Code Components

+
+Change back to the Code Workspace Location:
+
cd /glade/u/home/$USER/code/my_cesm_code
+
+
+

OR +Alternatively, you can use the cd ../.. to move up two levels in the directory hierarchy.

+
cd ../..
+
+
+
+

Change into the Components area of the Code Workspace:

+
cd components
+
+
+
+

List the contents of the Components Directory:

+
ls -l
+
+
+
+

Expected Output:

+
total 8
+drwxr-xr-x 12 $USER ncar 4096 Jun  4 09:34 cam
+drwxr-xr-x  7 $USER ncar 4096 Jun  4 09:32 cice
+drwxr-xr-x 14 $USER ncar 4096 Jun  4 09:32 cism
+drwxr-xr-x 12 $USER ncar 4096 Jun  4 09:31 clm
+drwxr-xr-x  6 $USER ncar 4096 Jun  4 09:31 mosart
+drwxr-xr-x 15 $USER ncar 4096 Jun  4 09:32 pop
+drwxr-xr-x  6 $USER ncar 4096 Jun  4 09:32 rtm
+drwxr-xr-x  6 $USER ncar 4096 Jun  4 09:31 ww3
+
+
+
+
+

Step 4. Look at the Community Atmosphere Model (CAM) Component Model#

+

As a final task in this exercise we are going to have a quick look at the Community Atmosphere Model (CAM) component model. At this point we are just exploring the Workspace.

+
+Change into the CAM Directory of the Components area:
+
cd cam
+
+
+
+

List the contents of the CAM Directory:

+
ls -l
+
+
+
+

Expected Output:

+
total 26
+drwxr-xr-x  6 $USER ncar 4096 Jun  4 09:32 bld
+drwxr-xr-x 10 $USER ncar 4096 Jun  4 09:34 chem_proc
+drwxr-xr-x  4 $USER ncar 4096 Jun  4 09:32 cime_config
+-rw-r--r--  1 $USER ncar 7501 Jun  4 09:32 CODE_OF_CONDUCT.md
+drwxr-xr-x  2 $USER ncar 4096 Jun  4 09:32 doc
+-rw-r--r--  1 $USER ncar  685 Jun  4 09:32 Externals_CAM.cfg
+-rw-r--r--  1 $USER ncar 1155 Jun  4 09:32 Externals.cfg
+drwxr-xr-x  5 $USER ncar 4096 Jun  4 09:32 manage_externals
+-rw-r--r--  1 $USER ncar 1925 Jun  4 09:32 README_EXTERNALS
+-rw-r--r--  1 $USER ncar  282 Jun  4 09:32 README.md
+drwxr-xr-x 11 $USER ncar 4096 Jun  4 09:32 src
+drwxr-xr-x  4 $USER ncar 4096 Jun  4 09:32 test
+drwxr-xr-x 11 $USER ncar 4096 Jun  4 09:32 tools
+
+
+
+

Congratulations, you have now completed the CESM code exploration exercises!!

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/code/git_download_cesm.html b/notebooks/basics/code/git_download_cesm.html new file mode 100644 index 000000000..cef1f8dc5 --- /dev/null +++ b/notebooks/basics/code/git_download_cesm.html @@ -0,0 +1,880 @@ + + + + + + + + + + + Download CESM — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Download CESM#

+

You are going to download the CESM code from github into your own personal CESM workspace. Follow the three steps, below, to setup your CESM Code workspace.

+
+We will use the CESM release version `release-cesm2.1.5` for use in this tutorial.

+

Downloading the CESM code is an important step as this will be the code workspace we will be using throughout the rest of the Tutorial. If you have problems here please ask for help.

+
+

Step 1: Create CESM Code Directory#

+

Create a workspace location where you can put your CESM code on the derecho glade file system. In all exercises in this tutorial $USER is a placeholder and you should use your NCAR HPC login name when completing the exercise.

+
+
cd /glade/u/home/$USER
+mkdir code
+
+
+
+
+

Step 2. Download CESM Code with Git Clone#

+

First we will change into the Code Workspace location then we will use the git clone command to download the CESM code.

+
+Change the current directory to the code workspace directory:
+
cd /glade/u/home/$USER/code
+
+
+
+

Download the cesm code to your code workspace directory as my_cesm_code:

+
git clone https://github.com/ESCOMP/CESM.git my_cesm_code
+cd my_cesm_code
+git checkout release-cesm2.1.5
+
+
+

Note that while we named the downloaded code my_cesm_code, you can name it anything you want and for future downloads outside this tutorial it can be helpful to label the code for the release you are using for your experiments.

+
+
+ Click here for example output +
Note: switching to 'release-cesm2.1.5'.
+
+You are in 'detached HEAD' state. You can look around, make experimental
+changes and commit them, and you can discard any commits you make in this
+state without impacting any branches by switching back to a branch.
+
+If you want to create a new branch to retain commits you create, you may
+do so (now or later) by using -c with the switch command. Example:
+
+  git switch -c <new-branch-name>
+
+Or undo this operation with:
+
+  git switch -
+
+Turn off this advice by setting config variable advice.detachedHead to false
+
+HEAD is now at 7a6c5b0 Update for cesm2.1.5-rc.01
+
+
+
+
+
+

Versions#

+

One thing you will need to determine is what version of the CESM code you should use. Some things to consider when making that decision include:

+
    +
  • What versions of the code are supported scientifically or technically?

  • +
  • Things you may want to consider are what sort of model features do you need and what versions of the model are these available in?

  • +
  • If you want to compare your sensitivity experiment against a community experiment (e.g. CESM2-LE) then you should use the same version of the code.

  • +
+

More information can be found on the CESM Models website.

+
+

If you want to check which other release versions are available, you can use the command:

+
git tag --list 'release-cesm2*'    
+
+
+
+
+ Click here for example output +
+
release-cesm2.0.0
+release-cesm2.0.1
+release-cesm2.1.0
+release-cesm2.1.1
+release-cesm2.1.2
+release-cesm2.1.3
+release-cesm2.1.4
+release-cesm2.1.5
+release-cesm2.2.0
+release-cesm2.2.1
+release-cesm2.2.2
+
+
+
+
+
+
+
+
+

Step 3. Download the Component Models with checkout_externals#

+

The CESM code downloaded with the branch tain the previous step does not include all of the code and support for the component models. These are developed and maintained in other Github repositories. To include all of the component models into your code workspace you need to download them as an additional step. The checkout_externals tool is located in manage_externals directory in the my_cesm_code code directory.

+
+Exercise: Run the `checkout_externals` command to download all the component models:
+
cd /glade/u/home/$USER/code/my_cesm_code
+./manage_externals/checkout_externals
+
+
+
+*Note: If you get a message about accepting a certificate permanently or temporarily, accept the certificate permanently. If you do not get this message, do not worry, you are still on track! +
+
+
+ Click here for example output +
+
where `$USER` will be replaced by your user name
+
+
+
Processing externals description file : Externals.cfg (/glade/u/home/$USER/code/my_cesm_code)
+Checking local status of required & optional components: cam, cice, cime, cism, clm, mosart, pop, rtm, ww3, 
+Checking out externals: cime, cam, Processing externals description file : Externals_CAM.cfg (/glade/u/home/$USER/code/my_cesm_code/components/cam)
+Checking out externals: chem_proc, carma, clubb, cosp2, 
+cice, cism, Processing externals description file : Externals_CISM.cfg (/glade/u/home/$USER/code/my_cesm_code/components/cism)
+Checking out externals: source_cism, 
+clm, Processing externals description file : Externals_CLM.cfg (/glade/u/home/$USER/code/my_cesm_code/components/clm)
+Checking out externals: fates, ptclm, 
+mosart, pop, Processing externals description file : Externals_POP.cfg (/glade/u/home/$USER/code/my_cesm_code/components/pop)
+Checking out externals: cvmix, marbl, 
+rtm, ww3, 
+
+
+
+
+
    +
  • The path /glade/u/home/$USER/code/my_cesm_code is your workspace $SRCROOT, as described in the workspaces section.

  • +
+

Congratulations, you have now downloaded the CESM code component of your workspace!!

+
+Evaluate your understanding +

You downloaded the CESM code with the instructions above. In which directory is the CESM code? How do you navigate to that directory?

+
+
+
+Click here for the solution
+If you download CESM with the instructions above, the CESM code is located in: +
/glade/u/home/$USER/code/my_cesm_code
+
+
+

To navigate to that directory, use the UNIX command cd:

+
cd /glade/u/home/$USER/code/my_cesm_code
+
+
+

If you are not familiar with UNIX commands, please review the UNIX chapter of this documentation.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/code_overview.html b/notebooks/basics/code_overview.html new file mode 100644 index 000000000..fe94391d1 --- /dev/null +++ b/notebooks/basics/code_overview.html @@ -0,0 +1,736 @@ + + + + + + + + + + + CESM code — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

CESM code

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

CESM code#

+

Before you can start running the CESM model you must first download CESM from Github and set up your Workspace. This exercise is estimated to take around 30-60 minutes, depending on your previous experience with NCAR HPC and Github.

+
+

Learning Objectives#

+
+
    +
  • Download CESM to your workspace with Git commands.

  • +
  • Explore your CESM workspace for CESM Code.

  • +
+

If you are unfamiliar with logging into NCAR HPC resources, please go back to this section to learn more about logging into derecho.

+

Github and Git software are used as development and management tools for supporting and distributing CESM. This tutorial is not intended to be a Github or Git software tutorial, so we will provide the basic git commands needed to download CESM. If you want to learn more about using these tools go to this section.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/exercises/examine_history_B1850.html b/notebooks/basics/exercises/examine_history_B1850.html new file mode 100644 index 000000000..221fced5d --- /dev/null +++ b/notebooks/basics/exercises/examine_history_B1850.html @@ -0,0 +1,827 @@ + + + + + + + + + + + Examine History Files — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Examine History Files#

+

Having successfully completed your first month of the new CESM B1850 case you will now examine the history files that have been transfered to the Archive directory. You will be using the NetCDF viewer ncview to look at the monthly average values for the single month. For this exercise you will be looking at the output from the Community Atmospheric Model (CAM) component of CESM, however the ncview tool can be applied to other components such as the Community Land Model (CLM). In this exercise we will:

+
    +
  • Step 1. Explore the b1850.basics Archive directory.

  • +
  • Step 2. Open the b1850.basics cam h0 in ncview.

  • +
  • Step 3. Examine Average Monthly Surface Temperature.

  • +
  • Step 4. Examine Average Monthly Precipitation.

  • +
+
+

Step 1. Explore the b1850.basics Archive directory#

+

The short term archive directory has a range of model component directories along with the restart (rest) and logs directories. First change directory into the archive directory and then list the contents of the restart and logs directories.

+
+Change into the b1850.basics short term archive directory:

+
cd /glade/derecho/scratch/$USER/archive/b1850.basics
+
+
+
+

List the logs directory:

+
ls -l logs
+
+
+
+

This is where all the log files from the model run are kept.

+

List the logs directory:

+
ls -l rest/0001-02-01-00000
+
+
+
+

These are the files that CESM will use to restart the model.

+
+
+

Step 2. Open the CAM h0 monthly history file#

+

You will now use ncview to look at the b1850.basics case CAM monthly average values for the single month you ran.

+

If you are unfamiliar with ncview you can learn more at this link.

+

Note: you must load the ncview module to your environment. If you loaded the tutorial .profile or .tcshrc file it should already be loaded. Check that it is in your environment.

+
module list
+
+
+

If you don’t see ncview in the list of modules, you can load it by doing:

+
module load ncview
+
+
+
+Change into the CAM history directory:

+
cd atm/hist
+
+
+
+

List the files in the directory:

+
ls -l
+
+
+
+

There should be a single file, b1850.basics.cam.h0.0001-01.nc.

+

Open the file using ncview:

+
ncview b1850.basics.cam.h0.0001-01.nc &
+
+
+

If your X11 environment is correctly set up then the ncview tool should appear as shown below on the left. Note the & at the end of the command. This puts the command into the background allowing other tasks to be run from the derecho terminal window. The view on the right shows the ncview application once the Surface Temperature variable has been selected.

+
+

NCView App Window +

Figure: NCView App Window

+
+
+

Step 3. Examine Average Monthly Surface Temperature#

+

Using ncview with the b1850.basics January 0001 CAM monthly average values file loaded, examine the Surface Temperature variable. Update the color palette used to plot values and change the size of the plot.

+
+Select the Surface Temperature Variable:

+

Click on the (244) 2d vars button shown above. This will pull up a list of all 2d vars on the b1850.basics January 0001 CAM history file. This is a long list but it is in alphabetical order. You are looking for the TS variable.
+

+

Change the color selection from detail to bright:

+

Click on the color button marked with detail. This will change the color selection to 3gauss. Clicking again will change this to ssec and finally bright.

+
+

Increase the map plot size:

+

Click on the magnify button marked with M X3. This will change the magnification to “M X4”. Clicking again will change this to “M X5” and finally “M X6”

+
+

NCView TS +

Figure: NCView b1850.basics TS Jan 0001

+

The Surface Temperature variable is in Kelvin. A value of 273.15K represents 0°C and 32°F. There are many options to better view and explore data with ncview. Some of these will come up over the next few days of the tutorial.

+
+
+

Step 4. Examine Average Monthly Precipitation#

+

Using ncview with the b1850.basics January 0001 CAM monthly average values file loaded, examine the the two variables representing Convective Precipitation and Large Scale Precipitation.

+
+Exercise: Select the Convective Precipitation Variable:

+

Click on the “(244) 2d vars” button shown above. Find and select the PRECC variable.
+

+
+

NCView PRECC +

Figure: NCView b1850.basics PRECC Jan 0001

+
+Exercise: Select the Convective Precipitation Variable:

+

Click on the “(244) 2d vars” button shown above. Find and select the PRECL variable.

+
+
+

NCView PRECL +

Figure: NCView b1850.basics PRECL Jan 0001

+

Precipitation in the model is recorded in m/s. To convert to mm/day we can multiply the values by 1000 mm in a meter and 86,400 seconds in a day. Can you see the differences in Convective and Large Scale Precipitation?

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/exercises/extra.html b/notebooks/basics/exercises/extra.html new file mode 100644 index 000000000..a8904dd95 --- /dev/null +++ b/notebooks/basics/exercises/extra.html @@ -0,0 +1,788 @@ + + + + + + + + + + + Explore Further — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Explore Further#

+

The focus of this exercise has been to get the model running. We will learn more about how to modify runs in this section, and we will cover details in further sections of this tutorial. For now, if you have extra time, try the following actions to better familiarize yourself with the CESM code.

+
+

Explore the CASE directory#

+
+
cd /glade/u/home/$USER/cases/b1850.basics/
+
+
+

Look around your case directory to become familiar with the structure. Note there are scripts (e.g. case.setup, case.submit, etc.), xml files, etc. We will delve into these in more detail in future sections of the tutorial.

+
+

Check the CaseStatus file#

+

All activities for the case are recorded in the CaseStatus file. By looking through the file the successful or otherwise outcome of each step of the run can be tracked.

+
+
more CaseStatus 
+
+
+
+
+

Check the Job Queue and Project#

+
+
./xmlquery JOB_QUEUE
+./xmlquery PROJECT
+
+
+
+
+
+

Explore the cime/scripts directory#

+
+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts
+
+
+
+

Check the CESM compset definitions#

+
+
./query_config --compsets | more
+
+
+

Note the | more after the command sends the output of the query_config script to the more tool so you can scroll through it more easily. You can use the spacebar to move to the next page and the q key to quit out of the tool.

+
+
+

Check the CESM grid resolutions#

+
+
./query_config --grids --long | more
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/exercises/first_B1850.html b/notebooks/basics/exercises/first_B1850.html new file mode 100644 index 000000000..c845f3629 --- /dev/null +++ b/notebooks/basics/exercises/first_B1850.html @@ -0,0 +1,801 @@ + + + + + + + + + + + Your first CESM run — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Your first CESM run

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Your first CESM run#

+
+Exercise: Run a basic, out-of-the-box (that is, no user changes are implemented) CESM experiment

+

Create a case called b1850.basics using the compset B1850 at f19_g17 resolution.

+

Check the status of the run after submitting.

+
+
+
+ Click here for hints +

Is my workspace set up?

+

Did you already create a cases directory where you will put all new cases

+
cd /glade/u/home/$USER
+mkdir cases
+
+
+

Did you create a new case?

+

You can create a new case with the command:

+
./create_newcase --case /glade/u/home/$USER/cases/CASE --res RES --compset COMPSET
+
+
+

Make sure you use the correct information for the CASE, RES, and COMPSET inputs.

+

Did you set up the case?

+

You can invoke case set up as follows:

+
./case.setup
+
+
+

How do I compile?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+

How do I check my job status?

+

You can check job status using the command:

+
qstat -u $USER
+
+
+
+
+
+
+Click here for the solution
+

Create a new case b1850.basics with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts
+./create_newcase --case /glade/u/home/$USER/cases/b1850.basics --res f19_g17 --compset B1850
+
+
+

Case setup:

+
cd /glade/u/home/$USER/cases/b1850.basics 
+./case.setup
+
+
+

Do not make any other changes since we are running an out-of-the-box simulation.

+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+

Remember that qcmd is used on derecho only.

+

Check the status:

+
qstat -u $USER
+
+
+

When the run is completed, look into the archive directory for: +b1850.basics.

+

Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/b1850.basics
+ls 
+
+
+
+
+
+

Test your understanding#

+
    +
  • Did your run complete successfully?

  • +
  • What sorts of files did you get as output?

  • +
  • How long did the run go for?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/exercises/review_questions.html b/notebooks/basics/exercises/review_questions.html new file mode 100644 index 000000000..c167c89da --- /dev/null +++ b/notebooks/basics/exercises/review_questions.html @@ -0,0 +1,778 @@ + + + + + + + + + + + Review Questions — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Review Questions

+ +
+
+ +
+
+
+ + + + +
+ +
+

Review Questions#

+

If time allows here are some review questions to go back over the material in the Introduction and Basics sections.

+
+Question 1: What is the CESM Workspace? How many separate directory areas are there?

+
+
+Click here for the solution
+

The CESM model consists of five main directory tree areas that make up the CESM Workspace. The individual directories represent different elements including the source code, your experiment cases, the area where the model runs, the location of input data, and the location where the output data from the model will be archived for later use.

+
+
+
+Question 2: Where is the CESM Code Development Managed?

+
+
+Click here for the solution
+

The CESM Project is hosted on Github under under the Earth System Community Modeling Portal (ESCOMP) which is managed by the University Corporation for Atmospheric Research (UCAR). Code can be directly downloaded from Github using Git commands.

+
+
+
+Question 3: Where do you find the create_newcase command? What does it do?

+
+
+Click here for the solution
+

The create_newcase script is located in the CIME Scripts Directory. The create_newcase script creates a new case in your CASE Directory. The command takes the new casename, compset, and resolution as values.

+
+
+
+Question 4: What are the three commands required to start running a new case?

+
+
+
+Click here for the solution
+

After create_newcase you need to change to the new case directory where you need to run case.setup, case.build and case.submit. As an additional step you can run the script preview_namelists.

+
+
+
+Question 5: How can you monitor your CESM submission while it is running?

+
+
+
+Click here for the solution
+

There are three main ways to monitor your CESM job while it is running. The first is with the qstat command, the second is with the build/run directory files, and the last is with the archive directory files.

+
+
+
+Question 6: What is the main way to understand how a CESM simulation ran?

+
+
+
+Click here for the solution
+

The main output from your CESM job is the history files. These can be specified to output the status of the component models at various levels of detail and for different time averaging periods.

+
+
+
+Question 7: What is an XML file? What is it used for in the Case Directory?

+
+
+
+Click here for the solution
+

The XML files are Markup Language files that contain variables used by the CESM scripts. In the Case Directory there are seven xml files:

+
    +
  • env_archive.xml specifies rules for short-term archival script case.st_archive

  • +
  • env_batch.xml set by create_newcase to define batch specific settings used by script case.submit

  • +
  • env_build.xml specifies build information used by script case.build

  • +
  • env_case.xml set by create_newcase and cannot be modified

  • +
  • env_mach_pes.xml specifies PE layout of components used by script case.run

  • +
  • env_mach_specific.xml specifies machine specific information used by script case.build

  • +
  • env_run.xml sets run time information (such as length of run, frequency of +restarts, …) User interacts with this file most frequently

  • +
+
+
+
+Question 8: What are the main ways to investigate and modify XML values in the Case Directory?

+
+
+
+Click here for the solution
+

While the values in XML files can be modified directly with an editor, CESM provides tools for querying and changing values. The xmlquery and xmlchange tools ensure that the values found and updated are valid for the files they belong to and that any changes made are recorded in the CaseStatus file in the CASE Directory.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/exercises/second_B1850.html b/notebooks/basics/exercises/second_B1850.html new file mode 100644 index 000000000..b99c08c28 --- /dev/null +++ b/notebooks/basics/exercises/second_B1850.html @@ -0,0 +1,787 @@ + + + + + + + + + + + Extending your run — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Extending your run

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Extending your run#

+
+Exercise: Run the same case, but for longer

+

The default value for a new case run length is 5 days. The run length is set by the XML variables STOP_OPTION and STOP_N. As the 5 days is too short to produce a monthly history file we will change these to run for a single month. In the next section you will learn more about xml files, but for now we will just provide the commands.

+

From your CASE directory, extend the run b1850.basics with the command:

+
./xmlchange STOP_OPTION=nmonths
+./xmlchange STOP_N=1
+
+
+

After you have changed these variables, submit the job again and check its status.

+
+
+
+ Click here for hints +

Submit:

+
./case.submit
+
+
+

Check the Status:

+
qstat -u $USER
+
+
+

List the contents of the Run directory

+
ls -lt /glade/derecho/scratch/$USER/b1850.basics/run
+
+
+
+
+
+
+Click here for the solution
+

Go to your b1850.basics case directory:

+
cd /glade/u/home/$USER/cases/b1850.basics
+
+
+

Changing xml files:

+
./xmlchange STOP_OPTION=nmonths
+./xmlchange STOP_N=1
+
+
+

Do not make any other changes since we are running an out-of-the-box simulation.

+

Submit:

+
./case.submit
+
+
+

Check the job status:

+
qstat -u $USER
+
+
+

When the run is completed, look into the archive directory for: +b1850.basics.

+

Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/b1850.basics
+ls 
+
+
+
+
+
+

Test your understanding#

+
    +
  • Did your run complete successfully?

  • +
  • What sorts of files did you get as output and how are these different from before?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/basics/exercises_overview.html b/notebooks/basics/exercises_overview.html new file mode 100644 index 000000000..664370a54 --- /dev/null +++ b/notebooks/basics/exercises_overview.html @@ -0,0 +1,742 @@ + + + + + + + + + + + Exercise Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise Overview

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Exercise Overview#

+
+

Learning Goals:#

+
    +
  • The student will successfully set up and run their first (short) CESM simulation.

  • +
  • This lab exercise is designed to build off the one-time setup section and uses the CESM workflow information presented.

  • +
+
+
+

Exercise overview:#

+

By then end of this exercise you will have:

+
    +
  • created, setup, updated, built, run, and examined the output of a standard B1850 control case

  • +
+

You should not proceed in working on this exercise until you have successfully set up your workspaces and downloaded the CESM code. You must have have a cases directory and have successfully downloaded CESM using git to begin this exercise.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/bgc/bgc.html b/notebooks/challenge/bgc/bgc.html new file mode 100644 index 000000000..f1d3a2820 --- /dev/null +++ b/notebooks/challenge/bgc/bgc.html @@ -0,0 +1,851 @@ + + + + + + + + + + + Biogeochemistry — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Biogeochemistry#

+
+

Biogeochemistry in CESM#

+

Biogeochemistry features have been available since CESM1.0 and are on by default in CESM2.0.

+

Three components of CESM have biogeochemistry features:

+

CAM

+
    +
  • CO\(_{2}\) constituents in CAM that use the land and ocean fluxes of CO\(_{2}\) as surface boundary conditions.

  • +
  • CAM passes CO\(_{2}\) to the coupler for land and ocean flux computations.

  • +
  • The CO\(_{2}\) consitutients are coupled with radiation computations.

  • +
+

POP

+
    +
  • Includes the MARBL ecosystem library in CESM2.0

  • +
+

CLM

+
    +
  • Features covered elsewhere [LINK]

  • +
+
+
+

Coupled BGC Compsets#

+

Terminology

+
    +
  • BGC CO\(_{2}\): what is used by surface components

  • +
  • RAD CO\(_{2}\): what is used by the atmospheric radiative code

  • +
  • Diagnostic CO\(_{2}\): prescribed atmospheric CO\(_{2}\) concentrations. (E.g. constant, read from file, 1% ramp, etc.)

  • +
  • Prognostic CO\(_{2}\): predicted atmospheric CO\(_{2}\) concentrations. Atmospheric consitutent is computed from surface CO\(_{2}\) fluxes.

  • +
+

B1850, BHIST

+
    +
  • Compset long name has BCG%BDRD

  • +
  • Coupled model, BGC & RAD CO\(_{2}\) are diagnostic

  • +
+

B1850_BPRP, BHIST_BPRP

+
    +
  • Shortnames introduced in CESM2.1.1

  • +
  • Compset long name has BGC%BPRP

  • +
  • Coupled model, BGC & RAD CO\(_{2}\) are prognostic

  • +
+
+
+

Ocean Specific BGC Compsets#

+

C1850ECO

+
    +
  • Ocean alone, 1850 aerosols, normal year forcing

  • +
+

G1850ECO

+
    +
  • Ocean and sea ice, 1850 aerosols, normal year forcing

  • +
+

G1850ECOIAF

+
    +
  • Ocean and sea ice, 1850 aerosols, interannually varying forcing

  • +
+

These can be found by using the following command in the same directory as create_newcase

+
./query_config --compsets pop
+
+
+
+
+

BGC Initial Conditions#

+

Coupled BDRD compsets

+
    +
  • BDRD is default RUN_REFCASE set for f09_g17 or f19_g17 resolution experiments

  • +
  • Provided initial conditions were spun-up with f09_g17 resolution model. Note that the carbon cycle is not as well balanced in f19_g17 resolution experiments as it is with f09_g17 resolution.

  • +
+

Coupled BPRP compsets

+
    +
  • PBRP is the default RUN_REFCASE set for f09_g17

  • +
+

Ocean alone or Ocean-ice compsets

+
    +
  • Initial conditions are provided but are not spun up.

  • +
+
+
+

BGC env*xml variables#

+

CCSM_BGC

+
    +
  • Controls which CO\(_{2}\) fields are exchanged between CESM components.

  • +
+

bgc_settings

+

Figure: CCSM_BGC settings.

+
    +
  • CO2A: land only or ocean only runs.

  • +
  • CO2B: atmosphere-land runs. Ocean and fossil fuel CO\(_{2}\) fluxes are read for m a file.

  • +
  • CO2C: fully coupled runs.

  • +
+

CCSM_CO2_PPMV

+
    +
  • Constant CO\(_{2}\) reference value used in some configurations.

  • +
+

OCN_CO2_TYPE or LND_CO2_TYPE

+
    +
  • Controls CO\(_{2}\) used by ocean and land components.

  • +
  • Constant, prognistic, diagnostic.

  • +
+

OCN_TRACER_MODULES

+
    +
  • Controls which ocean tracers are used.

  • +
  • Ocean ecosystem model is called ecosys.

  • +
+
+
+

BGC units and sign conventions#

+

bgc_units

+

Figure: BGC units and sign conventions.

+
    +
  • CAM variables CO2, CO2_LND, CO2_OCN, CO2_FF all have units of (kg CO2)/(kg dry air). Note that these are not typical units for carbon cycle modelers. To convert to ppmv multipy by 1.0e6*28.966/44.0 . 28.966 is the molecular weight of dry air and 44.0 is the molecular weight of CO\(_{2}\).

  • +
+
    +
  • Same quantity in different CESM component output has: different names, different units, different sign conventions (for fluxes).

  • +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/bgc/bgc_exercise_1.html b/notebooks/challenge/bgc/bgc_exercise_1.html new file mode 100644 index 000000000..e5eba78dc --- /dev/null +++ b/notebooks/challenge/bgc/bgc_exercise_1.html @@ -0,0 +1,748 @@ + + + + + + + + + + + 1: Set up a BGC case — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

1: Set up a BGC case

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

1: Set up a BGC case#

+

We will create two different cases and compare the case directories. We want to check if the differences make sense. You will NOT run the model in this challenge exercise.

+
+Exercise: Set up a BGC control case

+

Create a case called b_1850 using the compset B1850 at f19_g17 resolution.

+

Create a case called b_1850_bprp using the compset B1850_BPRP at f19_g17 resolution.

+
    +
  • What happens when you run create_newcase? Follow the instructions to get this working, but don’t do it for real unless you know what you’re doing.

  • +
+

Run case.setup and preview_namelists for each case.

+
    +
  • What changes occur when the carbon cycle is made prognostic?

  • +
+
+
+

POP BGC Specific Output#

+

ocn/hist/$CASE.pop.h.ecosys.nday1.????-??-??.nc

+
    +
  • selected ocean ecosys variables at daily resolution

  • +
  • surface flux related, productivity, and functional group vertical integrals.

  • +
+

ocn/hist/$CASE.pop.h.ecosys.nyear1.????.nc

+
    +
  • selected three dimensional ocean ecosys tracer budget terms.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam-chem_waccm/cam-chem_waccm.html b/notebooks/challenge/cam-chem_waccm/cam-chem_waccm.html new file mode 100644 index 000000000..f6fd50d73 --- /dev/null +++ b/notebooks/challenge/cam-chem_waccm/cam-chem_waccm.html @@ -0,0 +1,784 @@ + + + + + + + + + + + Atmospheric chemistry — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Atmospheric chemistry#

+
+

Learning Goals#

+
    +
  • Student will learn about different chemistry (CAM-chem/WACCM) compsets and how to run one.

  • +
  • Student will learn how to modify chemistry and change output settings.

  • +
  • Student will learn how to change emissions.

  • +
+
+
+

CAM-chem and WACCM component sets#

+

The CESM2 components can be combined in numerous ways to carry out various scientific or software experiments. A particular mix of components, along with component-specific configuration and/or namelist settings, is called a component set or compset.

+

WACCM (Whole Atmosphere Community Climate Model) and CAM-chem (Community Atmosphere Model with chemistry) are atmospheric components of CESM, like CAM. They can be run as F and B compsets, as well as with nudged meteorology (for example towards reanalysis). They can be run using various dycores and resolutions. +In contrast to CAM, WACCM and CAM-chem run with different possibilities of chemistry complexity, whereby CAM uses simplified chemistry. CAM and CAM-chem use the same vertical resolution and model top. +Different chemical mechanisms for CAM-chem with more or less complexity have been developed based on the MOZART-TS1 and TS2 (currently the most comprehensive) chemical mechanism. +WACCM has a model top at about 150km and therefore covers the Troposphere, Stratosphere, Mesosphere and Lower-Thermosphere. The most comprehensive WACCM mechanism is therefore called the TSMLT chemical mechanism. +WACCM can also run with Middle Atmosphere (MA) chemistry (e.g., FWmaHIST, which includes very simplified chemistry in the troposphere, and with Specified Chemistry (e.g., FWscHIST), similar to the CAM chemistry.

+
+
+

CAM-chem and WACCM tested F component sets#

+

In CESM2.2 only the CAM-chem F compsets have been scientifically tested and no PI-control or transient history simulation has been scientifically validated. In contrast, WACCM has been used for CMIP6 simulations. +Two different nudging approaches exist using CAM-chem and WACCM, both using MERRA2 or GEOS5 meteorological analysis fields. The nudged approach is the recommended approach that uses meteorological fields (U, V, T) on CESM model levels. +The older specified dynamics (SD) approach requires the model to run on the vertical MERRA2 grids.

+

An overview of different compsets can be found in the diagrams below.

+

CAMChem tested F compsets

+

Figure 1: CAM-chem tested F compsets.

+

WACCM scientifically supported F compsets

+

Figure 2: WACCM scientifically supported F compsets.

+

WACCM tested F compsets

+

Figure 3: WACCM tested F compsets.

+
+

Overview of the Challenge Exercises for CAM-chem/WACCM#

+

Start running one control case and choose between two options:

+

a) Run a CAM-chem compset with TS1 chemistry, historical SSTs and 0.9x1.25 degrees horizontal resolution
+b) Run a WACCM with TSMLT1 chemistry, historical SSTs and 0.9x1.25 degrees horizontal resolution

+

Once a control case has been configured and run, perform two test cases - one changing chemistry and one changing emissions.

+
+
+

Finding more information CAM-chem and WACCM#

+

More explanation (and some more options) can be found in the docs:
+https://wiki.ucar.edu/display/camchem/Home
+https://www.cesm.ucar.edu/models/cesm2/config/compsets.html
+https://ncar.github.io/CAM/doc/build/html/users_guide/atmospheric-configurations.html

+

Discussion board:
+CAM-chem: https://bb.cgd.ucar.edu/cesm/forums/cam-chem.154/
+WACCM: https://bb.cgd.ucar.edu/cesm/forums/waccm.155/

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam-chem_waccm/exercise_1.html b/notebooks/challenge/cam-chem_waccm/exercise_1.html new file mode 100644 index 000000000..bb67a2026 --- /dev/null +++ b/notebooks/challenge/cam-chem_waccm/exercise_1.html @@ -0,0 +1,855 @@ + + + + + + + + + + + 1: Control case: running with chemistry — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

1: Control case: running with chemistry

+ +
+
+ +
+
+
+ + + + +
+ +
+

1: Control case: running with chemistry#

+
+Exercise 1: Run a present-day compset that includes chemistry

+

Create, configure, build and run a case for one of these following configurations:

+
    +
  • CAM-chem: f.e21.FCHIST.f09_f09_mg17.tutorial.test1 with the FCHIST compset; or

  • +
  • WACCM: f.e21.FWHIST.f09_f09_mg17.tutorial.test1 with the FWHIST compset.

  • +
+

Run a simulation for 5 days, with daily instantaneous output of the variables: ‘PS’,’Z3’,’T’,’U’,’V’,’O3’. +You are also welcome to output your own additional variables. +Remember, F compsets have data ocean and data sea ice. +Check your model output in your run directory.

+
+
+
+ Click here for hints +
+

How do I output daily instantaneous variables?

+
    +
  • Modify history stream 2 with namelist variable fincl2

  • +
  • Use namelist variables: nhtfrq, mfilt

  • +
  • For more information, look at the chapter:
    +NAMELIST MODIFICATIONS -> Changing CAM namelist options

  • +
  • The default set up for these namelist variables can be found in CaseDocs/atm_in

  • +
+

What is the resolution for FCHIST and FWHIST?

+
    +
  • Use resolution: f09_f09_mg17

  • +
+

Important! Check the newly generated namelist prior run

+

ls CaseDocs/*

+

atm_in +atm_modelio.nml +chem_mech.doc +chem_mech.in +cism.config +cism_in +cpl_modelio.nml +docn_in ice_in +docn.streams.txt.prescribed +drv_flds_in +drv_in +esp_modelio.nml +glc_modelio.nml +ice_modelio.nml +lnd_in +lnd_modelio.nml +mosart_in +ocn_modelio.nml +rof_modelio.nml +seq_maps.rc +wav_modelio.nml

+
    +
  • atm_in: atmospheric namelist variables

  • +
  • chem_mech.in: chemical mechanism file

  • +
  • drv_flds_in: dry deposition variables, MEGAN variables (if used)

  • +
  • lnd_in: land namelist variables

  • +
  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Use the following commands
+for CAM-chem:

+
set CASENAME = f.e21.FCHIST.f09_f09_mg17.tutorial.test1
+set CASEDIR = /glade/u/home/$USER/cases/$CASENAME
+set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET = FCHIST
+set RESOLUTION = f09_f09_mg17
+
+
+

or for WACCM

+
set CASENAME = f.e21.FWHIST.f09_f09_mg17.tutorial.test1
+set CASEDIR = /glade/u/home/$USER/cases/$CASENAME
+set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET = FWHIST
+set RESOLUTION = f09_f09_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET
+
+
+

You may need to add --project "UESM0013" when creating a new case.

+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the tutorial project number UESM0013

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

From within the case directory, invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Build

+

Perform an initial build within the case directory

+
qcmd -- ./case.build
+
+
+

namelists (atm_in, ice_in, lnd_in, docn_in) will appear in the CaseDocs +subdirectory, as well as in your $rundir

+

# Customize namelists

+

Edit the file user_nl_cam. First open the CaseDocs/atm_in and find the lines for avgflag_pertap, mfilt, nhtfrq and copy and paste them into user_nl_cam. Then make changes to those lines in user_nl_cam and add a line to write out a second history file, fincl2. The namelist lines should look something like:

+
&cam_history_nl
+ avgflag_pertape = 'A','I','A','A','A','A','A','A','I'
+ mfilt          = 1,30,365,240,240,480,365,73,30
+ nhtfrq         = 0,-24,-24,-3,-1,1,-24,-120,-240
+ fincl2         = 'PS','Z3','T','U','V','O3'
+/
+
+
+

You can do this with a text editor.

+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Submit:

+
./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the run files and history files.

+

(1) Find your model output in your run directory ($run_dir) after finished:

+
ls /glade/derecho/scratch/$USER/$CASENAME/run
+
+
+

rundir example

+

(2) Check that your archive directory on derecho (the path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

(3) Look at the contents of the h1 files using ncdump.

+
ncdump –h f.e21.FCHIST.f09_f09_mg17.tutorial.test1.cam.h1.1995-01-01-00000.nc
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam-chem_waccm/exercise_2.html b/notebooks/challenge/cam-chem_waccm/exercise_2.html new file mode 100644 index 000000000..d94904281 --- /dev/null +++ b/notebooks/challenge/cam-chem_waccm/exercise_2.html @@ -0,0 +1,868 @@ + + + + + + + + + + + 2: Test case: changing the chemistry — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

2: Test case: changing the chemistry

+ +
+
+ +
+
+
+ + + + +
+ +
+

2: Test case: changing the chemistry#

+
+Exercise 2: Building the model with new chemistry

+

Create, configure, build a new case as done in exercise 1, for one of these following configurations:

+
    +
  • CAM-chem: f.e21.FCHIST.f09_f09_mg17.tutorial.test2 with the FCHIST compset; or

  • +
  • WACCM: f.e21.FWHIST.f09_f09_mg17.tutorial.test2 with the FWHIST compset.

  • +
+

Set up this simulation to run for 5 days, with daily instantaneous output of the variables: ‘PS’,’Z3’,’T’,’U’,’V’,’O3’.

+

To change the chemistry, copy your chemistry preprocessor file chem_mech.in from CaseDocs to your case directory as my_chem_mech.in and change reaction rate for the O1D reaction with O2 to 1.65e-12. Point the simulation to your new mechanism file using CAM_CONFIG_OPTS and re-build and submit. Once the simulation is complete, compare the 5th day output to the results from exercise 1.

+

Extra information:

+

The chemistry preprocessor generates CAM Fortran source code to solve chemistry. The input is an ASCII file listing chemical reactions and rates. The chemistry preprocessor input file used in your previous run is in your +$CASEROOT/CaseDocs/chem_mech.in

+

An example of a simple chemistry mechanism file content can be seen below: +chemistry mechanism example

+

Additional input files for default chemical mechanisms are in each source code subdirectory for mechanisms under: +$SRCROOT/components/cam/src/chemistry/pp_* +(i.e. pp_waccm_tsmlt_mam4). You do not need to change these additional files for this exercise.

+

Below is an overview of the different types of reactions and rates that can be defined in the mechanism file. +chemistry preprocessor options example

+
+
+
+ Click here for hints +
+

Creating a new chemistry input file

+
less CaseDocs/chem_mech.in
+cp CaseDocs/chem_mech.in my_chem_mech.in
+
+
+

Open your copied new chemistry mechanism file with a text editor and change the reaction rate:

+

chemistry ozone reaction

+

How to tell CESM to read your new chemistry mechanism file

+
    +
  • First look at the CAM_CONFIG_OPTS default setting for CAM-chem
    +./xmlquery CAM_CONFIG_OPTS
    +CAM_CONFIG_OPTS: -phys cam6 -chem trop_strat_mam4_vbs -age_of_air_trcs
    +(note this will be different for WACCM)

  • +
  • Use xmlchange to append a pointer to your user mechanism:
    +./xmlchange --append CAM_CONFIG_OPTS="--usr_mech_infile `pwd`/my_chem_mech.in"

  • +
  • Check the CAM_CONFIG_OPTS has been changed
    +./xmlquery CAM_CONFIG_OPTS
    +CAM_CONFIG_OPTS: -phys cam6 -chem trop_strat_mam4_vbs -age_of_air_trcs --usr_mech_infile /glade/u/home/$USER/cases/$CASENAME/my_chem_mech.in

  • +
  • When an important xml variable like CAM_CONFIG_OPTS is changed, resetting the setup is needed. You will need to reset the case setup, and rebuild before submitting. (Note that in general, you only need to reset or clean build when a message shows up in the command prompt stating to reset or clean build).

  • +
+
+
+
+
+Click here for the solution +
+

# Set environment variables
+Use the commands
+for CAM-chem

+
set CASENAME = f.e21.FCHIST.f09_f09_mg17.tutorial.test2
+set CASEDIR = /glade/u/home/$USER/cases/$CASENAME
+set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET = FCHIST
+set RESOLUTION = f09_f09_mg17
+
+
+

or for WACCM

+
set CASENAME = f.e21.FWHIST.f09_f09_mg17.tutorial.test2
+set CASEDIR = /glade/u/home/$USER/cases/$CASENAME
+set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET = FWHIST
+set RESOLUTION = f09_f09_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET
+
+
+

You may need to add --project "UESM0013" when creating a new case.

+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

From within the case directory, invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Build

+

Perform an initial build within the case directory

+
qcmd -- ./case.build
+
+
+

namelists (atm_in, ice_in, lnd_in, docn_in) will appear in the CaseDocs +subdirectory, as well as in your $rundir

+

# Customize namelists

+

As before, edit the file user_nl_cam. First open the CaseDocs/atm_in and find the lines for avgflag_pertap, mfilt, nhtfrq and copy and paste them into user_nl_cam. Then make changes to those lines in user_nl_cam and add a line to write out a second history file, fincl2. The namelist lines should look something like:

+
&cam_history_nl
+ avgflag_pertape = 'A','I','A','A','A','A','A','A','I'
+ mfilt          = 1,30,365,240,240,480,365,73,30
+ nhtfrq         = 0,-24,-24,-3,-1,1,-24,-120,-240
+ fincl2         = 'PS','Z3','T','U','V','O3'
+/
+
+
+

You can do this with a text editor.

+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Change the chemistry

+

Copy the default mechanism to your own user defined file

+
cp CaseDocs/chem_mech.in my_chem_mech.in
+
+
+

Open your mechanism file with a text editor (e.g. nedit) and change the reaction rate for O1D with O2

+
nedit my_chem_mech.in &
+
+
+
In CAM-chem
+
+
+

chemistry ozone reaction

+
In WACCM:
+
+
+

chemistry ozone reaction

+

Append a pointer in the to the user mechanism:

+
./xmlchange --append CAM_CONFIG_OPTS="--usr_mech_infile `pwd`/my_chem_mech.in"
+
+
+

# Re-build the model

+
./case.setup --reset
+./case.build --clean
+qcmd -- ./case.build
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Submit:

+
./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the run files and history files.

+

(1) Find your model output in your run directory ($run_dir) after finished:

+
ls /glade/derecho/scratch/$USER/$CASENAME/run
+
+
+

(2) Check that your archive directory on derecho (the path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

(3) Look at the contents of the h1 files using ncdump.

+
ncdump –h f.e21.FCHIST.f09_f09_mg17.tutorial.test2.cam.h1.1995-01-01-00000.nc
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam-chem_waccm/exercise_3.html b/notebooks/challenge/cam-chem_waccm/exercise_3.html new file mode 100644 index 000000000..10ff33458 --- /dev/null +++ b/notebooks/challenge/cam-chem_waccm/exercise_3.html @@ -0,0 +1,942 @@ + + + + + + + + + + + 3: Test case: changing the emissions — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

3: Test case: changing the emissions

+ +
+
+ +
+
+
+ + + + +
+ +
+

3: Test case: changing the emissions#

+
+Exercise 3: Using different emissions

+

Create, configure, build a new case as done in exercise 1 or 2, for one of these following configurations:

+
    +
  • CAM-chem: f.e21.FCHIST.f09_f09_mg17.tutorial.test3 with the FCHIST compset; or

  • +
  • WACCM: f.e21.FWHIST.f09_f09_mg17.tutorial.test3 with the FWHIST compset.

  • +
+

Set up this simulation to run for 5 days, with daily instantaneous output of the variables: ‘PS’,’Z3’,’T’,’U’,’V’,’O3’.

+

Change the namelist variables to use daily fire emissions from QFED. This will also require a change of model STARTDATE. Once the simulation is complete, compare the 5th day output to the previous results.

+
+
+
+ Click here for hints +
+

Pointing to new emission files

+

Point to new emission files in your user_nl_cam file. Note that you will also need to include pointers to emissions that you are not changing. The namelist variable for emissions is srf_emis_specifier. Copy the whole srf_emis_specifier entry from atm_in to user_nl_cam before editing. Emission files will add up in CESM.

+

The location of qfed fire emissions on glade is described on the wiki: https://wiki.ucar.edu/display/camchem/Emission+Inventories +Search for files with bb in their name, which are fire / biomass burning emissions. Global one degree emissions are usually stored under an ‘f09’ folder.

+

Make sure your model start date is covered by the emissions files +For this model set up will also need to double check the following are available:

+
    +
  • The SST file covers your selected dates (env_run.xml file)

  • +
  • Lower boundary condition file must include your selected dates (atm_in file)

  • +
  • Consider that the initialization file will be for the default 1995. If you don’t change your initialization file, you will need to run your own model spin up.

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables +Use the commands:

+

CAM-chem

+
set CASENAME = f.e21.FCHIST.f09_f09_mg17.tutorial.test3
+set CASEDIR = /glade/u/home/$USER/cases/$CASENAME
+set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET = FCHIST
+set RESOLUTION = f09_f09_mg17
+
+
+

or for WACCM

+
set CASENAME = f.e21.FWHIST.f09_f09_mg17.tutorial.test3
+set CASEDIR = /glade/u/home/$USER/cases/$CASENAME
+set RUNDIR = /glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET = FWHIST
+set RESOLUTION = f09_f09_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET
+
+
+

You may need to add --project "UESM0013" when creating a new case.

+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

From within the case directory, invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Change the dates to cover emission files
+Here, we choose 2010

+
./xmlchange RUN_STARTDATE=2010-01-01
+
+
+

Make sure the sea surface temperature and ice (SSTICE) data file covers your dates of interest

+
./xmlquery SSTICE_DATA_FILENAME
+
+
+

should return:

+
SSTICE_DATA_FILENAME: /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/sst/sst_HadOIBl_bc_0.9x1.25_1850_2017_c180507.nc
+
+
+

# Build

+

Perform an initial build within the case directory

+
qcmd -- ./case.build
+
+
+

namelists (atm_in, ice_in, lnd_in, docn_in) will appear in the CaseDocs +subdirectory, as well as in your $rundir

+

# Customize namelists

+

As before, edit the file user_nl_cam. First open the CaseDocs/atm_in and find the lines for avgflag_pertap, mfilt, nhtfrq and copy and paste them into user_nl_cam. Then make changes to those lines in user_nl_cam and add a line to write out a second history file, fincl2. The namelist lines should look something like:

+
&cam_history_nl
+ avgflag_pertape = 'A','I','A','A','A','A','A','A','I'
+ mfilt          = 1,30,365,240,240,480,365,73,30
+ nhtfrq         = 0,-24,-24,-3,-1,1,-24,-120,-240
+ fincl2         = 'PS','Z3','T','U','V','O3'
+/
+
+
+

You can do this with a text editor.

+

# Add in different emissions +Also add in the namelist pointers to emission files, replacing the fire emissions (every file with ‘bb’ in the name) with qfed files found at /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/

+
&chem_inparm
+ srf_emis_specifier		= 'BENZENE -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_BENZENE_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'BENZENE -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_BENZENE_0.9x1.25_mol_2000_2022.nc',
+         'BIGALK -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_BIGALK_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'BIGALK -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_BIGALK_0.9x1.25_mol_2000_2022.nc',
+         'BIGENE -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_BIGENE_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'BIGENE -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_BIGENE_0.9x1.25_mol_2000_2022.nc',
+         'C2H2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H2_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'C2H2 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H2_0.9x1.25_mol_2000_2022.nc',
+         'C2H4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'C2H4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H4_0.9x1.25_mol_2000_2022.nc',
+         'C2H4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H4_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'C2H5OH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H5OH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'C2H5OH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H5OH_0.9x1.25_mol_2000_2022.nc',
+         'C2H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H6_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'C2H6 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C2H6_0.9x1.25_mol_2000_2022.nc',
+         'C2H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C2H6_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'C3H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H6_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'C3H6 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C3H6_0.9x1.25_mol_2000_2022.nc',
+         'C3H6 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H6_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'C3H8 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H8_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'C3H8 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_C3H8_0.9x1.25_mol_2000_2022.nc',
+         'C3H8 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_C3H8_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'CH2O -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH2O_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'CH2O -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH2O_0.9x1.25_mol_2000_2022.nc',
+         'CH3CHO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3CHO_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'CH3CHO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3CHO_0.9x1.25_mol_2000_2022.nc',
+         'CH3CN -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3CN_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'CH3CN -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3CN_0.9x1.25_mol_2000_2022.nc',
+         'CH3COCH3 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3COCH3_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'CH3COCH3 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3COCH3_0.9x1.25_mol_2000_2022.nc',
+         'CH3COCHO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3COCHO_0.9x1.25_mol_2000_2022.nc',
+         'CH3COOH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3COOH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'CH3COOH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3COOH_0.9x1.25_mol_2000_2022.nc',
+         'CH3OH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CH3OH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'CH3OH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CH3OH_0.9x1.25_mol_2000_2022.nc',
+         'CO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CO_anthro_surface_1750-2015_0.9x1.25_c20180504.nc',
+         'CO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_CO_0.9x1.25_mol_2000_2022.nc',
+         'CO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_CO_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'E90 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions_E90global_surface_1750-2100_0.9x1.25_c20170322.nc',
+         'GLYALD -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_GLYALD_0.9x1.25_mol_2000_2022.nc',
+         'HCN -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_HCN_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'HCN -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_HCN_0.9x1.25_mol_2000_2022.nc',
+         'HCOOH -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_HCOOH_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'HCOOH -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_HCOOH_0.9x1.25_mol_2000_2022.nc',
+         'ISOP -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_ISOP_0.9x1.25_mol_2000_2022.nc',
+         'IVOC -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_IVOC_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'IVOC -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_IVOC_0.9x1.25_mol_2000_2022.nc',
+         'MEK -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_MEK_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'MEK -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_MEK_0.9x1.25_mol_2000_2022.nc',
+         'MTERP -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_TERPENES_0.9x1.25_mol_2000_2022.nc ',
+         'NH3 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NH3_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'NH3 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_NH3_0.9x1.25_mol_2000_2022.nc ',
+         'NH3 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NH3_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'NO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NO_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'NO -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_NO_0.9x1.25_mol_2000_2022.nc ',
+         'NO -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_NO_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'SVOC -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SVOC_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'SVOC -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_SVOC_0.9x1.25_mol_2000_2022.nc ',
+         'TOLUENE -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_TOLUENE_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'TOLUENE -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_TOLUENE_0.9x1.25_mol_2000_2022.nc ',
+         'XYLENES -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_XYLENES_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'XYLENES -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_XYLENES_0.9x1.25_mol_2000_2022.nc ',
+         'bc_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_bc_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'bc_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_bc_a4_0.9x1.25_mol_2000_2022.nc ',
+         'DMS -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_DMS_0.9x1.25_mol_2000_2022.nc ',
+         'DMS -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_DMS_other_surface_1750-2015_0.9x1.25_c20170322.nc',
+         'num_a1 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_num_so4_a1_0.9x1.25_mol_2000_2022.nc ',
+         'num_a1 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_so4_a1_anthro-ag-ship_surface_1750-2015_0.9x1.25_c20170616.nc',
+         'num_a2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_so4_a2_anthro-res_surface_1750-2015_0.9x1.25_c20170616.nc',
+         'num_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_num_bc_a4_0.9x1.25_mol_2000_2022.nc ',
+         'num_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_bc_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'num_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_pom_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'num_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_num_pom_a4_0.9x1.25_mol_2000_2022.nc ',
+         'pom_a4 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_pom_a4_anthro_surface_1750-2015_0.9x1.25_c20170608.nc',
+         'pom_a4 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_pom_a4_0.9x1.25_mol_2000_2022.nc ',
+         'SO2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SO2_anthro-ag-ship-res_surface_1750-2015_0.9x1.25_c20170616.nc',
+         'SO2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SO2_anthro-ene_surface_1750-2015_0.9x1.25_c20170616.nc',
+         'SO2 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_SO2_0.9x1.25_mol_2000_2022.nc',
+         'so4_a1 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a1_anthro-ag-ship_surface_1750-2015_0.9x1.25_c20170616.nc',
+         'so4_a1 -> /glade/campaign/acom/MUSICA/emis/qfed/qfed2.5_finn/f09/qfed.emis_so4_a1_0.9x1.25_mol_2000_2022.nc ',
+         'so4_a2 -> /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a2_anthro-res_surface_1750-2015_0.9x1.25_c20170616.nc'
+/
+
+
+

# Lower boundary condition file check

+

Make sure the LBC files cover your dates of interest. In CaseDocs/atm_in you should see:

+
 flbc_file              = '/glade/campaign/cesm/cesmdata/cseg/inputdata/atm/waccm/lb/LBC_1750-2014_CMIP6_0p5degLat_c170126.nc'
+
+
+

# Initialization files for your new startdate

+

Note: Below are initialization files for 2010. For scientifically valid simulations you need to point to an initialization file for the start date you choose. If one is not available, you will need to spin up the model.

+

For CAM-chem: +atmospheric initialization files are redefined in user_nl_cam

+
&cam_initfiles_nl
+ ncdata         = '/glade/campaign/cesm/acom/acom-climate/tilmes/inputdata/init/camchem/FCnudged_MAM4_f09.carma_trop_strat09.aqchem.2001_2020.cam.i.2010-01-01-00000.nc'
+/
+
+
+

For WACCM: +atmospheric initialization files are redefined in user_nl_cam

+
&cam_initfiles_nl
+ ncdata         = '/glade/campaign/cesm/acom/acom-climate/tilmes/inputdata/init/waccm/f.e21.FWHISTBgcCrop.f09_f09_mg17.CMIP6-AMIP-WACCM.001.cam.i.2010-01-01-00000.nc'
+/
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Submit:

+
./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the run files and history files.

+

(1) Find your model output in your run directory ($run_dir) after finished:

+
ls /glade/derecho/scratch/$USER/$CASENAME/run
+
+
+

(2) Check that your archive directory on derecho (the path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

(3) Look at the contents of the h1 files using ncdump.

+
ncdump –h f.e21.FCHIST.f09_f09_mg17.tutorial.test3.cam.h1.2010-01-01-00000.nc
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam-chem_waccm/visualization.html b/notebooks/challenge/cam-chem_waccm/visualization.html new file mode 100644 index 000000000..3026b08d2 --- /dev/null +++ b/notebooks/challenge/cam-chem_waccm/visualization.html @@ -0,0 +1,722 @@ + + + + + + + + + + + 4: Visualization option with GEOV — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

4: Visualization option with GEOV

+ +
+
+ +
+
+
+ + + + +
+ +
+

4: Visualization option with GEOV#

+
+Visualization with GEOV

+

CESM history files are in standard netCDF format, and may be analyzed with standard +analysis tools, including Matlab, Python, IDL, NCL, and NCO and ncview.

+

GEOV is an IDL-based viewer with a graphical user interface (GUI) for geophysical history files created by NCAR’s CAM, WACCM and MOZART models. GEOV can be downloaded from the WACCM webpage
+http://www.cesm.ucar.edu/working_groups/Whole-Atmosphere/code-release.html
+It is useful for quick viewing and comparisons.

+

#To use GEOV on derecho/casper:

+

Add the idl module:
+module load idl

+

Then go to the location of GEOV and start it

+
cd /glade/u/home/fvitt/geov4.8e
+idl geov
+
+
+

Then you can use the GEOV interface to find files and explore the model output. Some examples of using the GEOV interface are below:

+

GEOV opening

+

Figure 1: Example using GEOV to browse to a file to open.

+

GEOV 2 files

+

Figure 2: Example using GEOV to plot surface layer ozone for two files.

+

GEOV difference

+

Figure 3: Example using GEOV to look at zonal average difference in model ozone (left).

+

If you quit GEOV, you will need to type exit to also exit IDL.

+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam/cam.html b/notebooks/challenge/cam/cam.html new file mode 100644 index 000000000..d9d690a26 --- /dev/null +++ b/notebooks/challenge/cam/cam.html @@ -0,0 +1,812 @@ + + + + + + + + + + + Atmosphere — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Atmosphere#

+
+

Learning Goals#

+
    +
  • Student will learn what a F compset is, the types of forcing available to run one, and how to run one.

  • +
  • Student will learn how to modify datasets using nco operators.

  • +
+
+
+

What is a F compset ?#

+

The CESM2 components can be combined in numerous ways to carry out various scientific or software experiments. A particular mix of components, along with component-specific configuration and/or namelist settings is called a component set or compset.

+

In the previous chapter, we have run experiments with the B compset. In this chapter we will run the experiments with the F compset. +The F compsets use prescribed ocean (observed sea-surface temperature data) and prescribed sea-ice (observed sea-ice thickness and area)

+
    +
  • F2000climo uses climatological forcings from around year 2000

  • +
  • F2010climo uses climatological forcings from around year 2010

  • +
  • FHIST use time varying forcing

  • +
+

B compsets versus F compsets

+

Figure: Differences between a F and a B compset.

+
+
+

Overview of CAM Challenge Exercises#

+

Start running a control case with the compset F2000climo

+

Then choose one or more exercises to try:

+
    +
  • Use historical SSTs/forcings instead of fixed (compset change)

  • +
  • Try running starting 1850 with spun-up pre-industrial model

  • +
  • Increase orographic height over the western US (dataset change)

  • +
  • Modify sea surface temperature in the tropics

  • +
  • Increase the triggering threshold for deep convection over land (code change–simple)

  • +
  • Add a (fake) physics parameterization (code change–advanced) +Compare your test exercise(s) to your control

  • +
+
+
+

Finding more information about compsets#

+

If you want to run a different configuration from what you’ve learned here, it is important to learn how to find and/or modify a compset.

+

The tool query compsets allows you to find more information about the available. This tool is located in the same directory as create_newcase in /glade/u/home/$USER/code/my_cesm_code/cime/scripts/:

+

The command is:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./query_config --compsets
+
+
+
+Evaluate your understanding +

Using the tool above and/or web searches below, find a CESM compset with an active atmosphere version cam6.0, that uses historical forcing data including sea surface temperatures. If you find several candidates, look at the components option and/or webpage to decide. Is it scientifically validated? For what resolutions?

+
+
+
+Click here for the solution
+

The command gives a list of all the compsets available, and what components are included.

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./query_config --compsets
+
+
+

This can show exactly what you ran before, and what is possible. To narrow down your choices:

+
  ./query_config --compsets | grep -i hist
+
+
+
+
+

If you want to build your own, you can see all your options, perhaps modify one of the above with changes

+
./query_config --components
+
+
+

More explanation about compsets can be found in the docs?|: +https://www.cesm.ucar.edu/models/cesm2/config/compsets.html

+

There are a number of atmospheric models which can run within CESM. While CAM is the basic atmospheric model within CESM, there are several models with significant extensions to CAM which may also be run within CESM. The available atmospheric models in CESM2 are:

+
    +
  • CAM: Community Atmosphere Model

  • +
  • CAM-chem: Community Atmosphere Model with Chemistry

  • +
  • WACCM: Whole Atmosphere Community Climate Model

  • +
  • WACCM-X: Whole Atmosphere Community Climate Model with thermosphere and ionosphere extension

  • +
+

https://ncar.github.io/CAM/doc/build/html/users_guide/atmospheric-configurations.html

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam/exercise_1.html b/notebooks/challenge/cam/exercise_1.html new file mode 100644 index 000000000..4c03b34d4 --- /dev/null +++ b/notebooks/challenge/cam/exercise_1.html @@ -0,0 +1,855 @@ + + + + + + + + + + + 1: Control case: F2000climo — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

1: Control case: F2000climo

+ +
+
+ +
+
+
+ + + + +
+ +
+

1: Control case: F2000climo#

+
+Exercise: Customize your CAM history files

+

Create, configure, build and run a case called f2000_control with the F2000climo compset (data ocean and climatological forcings from around year 2000).

+

Run for 5 days, with 3-hourly instantaneous output of the variables: TS, PS, Z500, U850, U200, T850, T500, T200, CLDLOW, PRECT, LHFLX, SHFLX, FLNT, FLNS. +You are also welcome to output your own variables

+

About the resolution for F2000climo?

+
    +
  • Supported resolution for this compset is: f09_f09_mg17 (i.e. 1 degree)

  • +
  • During the tutorial, we recommend to use : f19_f19_mg17 (i.e. 2 degree) because it will be faster.

  • +
+
+
+
+ Click here for hints +
+

How do I output 3 hourly instantaneous variables?

+
    +
  • Use namelist variables: nhtfrq, mfilt, fincl.

  • +
  • For more information, look at the chapter:
    +NAMELIST MODIFICATIONS -> Customize CAM output

  • +
+

What is the resolution for F2000climo?

+
    +
  • Supported resolution for this compset is: f09_f09_mg17 (i.e. 1 degree)

  • +
  • During the tutorial, we recommend to use : f19_f19_mg17 (i.e. 2 degree) because it will be faster.

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

For tcsh users

+
set CASENAME=f2000_control
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=F2000climo
+set RESOLUTION=f19_f19_mg17
+
+
+

For bash users

+
export CASENAME=f2000_control
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=F2000climo
+export RESOLUTION=f19_f19_mg17
+
+
+

# Make a case directory

+

If needed create a directory cases into your home directory:

+
mkdir /glade/u/home/$USER/cases/
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013. You should use the project number given for this tutorial.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Customize namelists

+

Edit the file user_nl_cam and add the lines:

+
nhtfrq(2) = -3
+mfilt(2) = 240
+fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'
+
+
+

You can do this with a text editor. Alternatively, you can use the echo command:

+
echo "nhtfrq(2) = -3">> user_nl_cam    
+echo "mfilt(2) = 240">> user_nl_cam
+echo "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'">> user_nl_cam
+echo "">> user_nl_cam    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

(2) Look at the contents of the h1 files using ncdump.

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ncdump -h f2000_control.cam.h1.0001-01-01-00000.nc
+
+
+
    +
  • The file should contain the instantaneous output in the file h1 for the variables:

  • +
+
        float FLNS(time, lat, lon) ;
+                FLNS:Sampling_Sequence = "rad_lwsw" ;
+                FLNS:units = "W/m2" ;
+                FLNS:long_name = "Net longwave flux at surface" ;
+        float FLNT(time, lat, lon) ;
+                FLNT:Sampling_Sequence = "rad_lwsw" ;
+                FLNT:units = "W/m2" ;
+                FLNT:long_name = "Net longwave flux at top of model" ;
+        float LHFLX(time, lat, lon) ;
+                LHFLX:units = "W/m2" ;
+                LHFLX:long_name = "Surface latent heat flux" ;
+        float PRECT(time, lat, lon) ;
+                PRECT:units = "m/s" ;
+                PRECT:long_name = "Total (convective and large-scale) precipitation rate (liq + ice)" ;
+        float PS(time, lat, lon) ;
+                PS:units = "Pa" ;
+                PS:long_name = "Surface pressure" ;
+        float SHFLX(time, lat, lon) ;
+                SHFLX:units = "W/m2" ;
+                SHFLX:long_name = "Surface sensible heat flux" ;
+        float T850(time, lat, lon) ;
+                T850:units = "K" ;
+                T850:long_name = "Temperature at 850 mbar pressure surface" ;
+        float TS(time, lat, lon) ;
+                TS:units = "K" ;
+                TS:long_name = "Surface temperature (radiative)" ;
+        float U850(time, lat, lon) ;
+                U850:units = "m/s" ;
+                U850:long_name = "Zonal wind at 850 mbar pressure surface" ;
+
+
+

Note that these variables have no cell_methods attribute becasue the output is instantaneous.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam/exercise_2.html b/notebooks/challenge/cam/exercise_2.html new file mode 100644 index 000000000..027569a5a --- /dev/null +++ b/notebooks/challenge/cam/exercise_2.html @@ -0,0 +1,848 @@ + + + + + + + + + + + 2: Historical compset: FHIST — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

2: Historical compset: FHIST

+ +
+
+ +
+
+
+ + + + +
+ +
+

2: Historical compset: FHIST#

+

CAM is capable of running over historical periods with time-varying sea surface temperatures (SSTs) as well as anthropogenic and natural forcings. This is called the AMIP protocol.

+
+

For more information about the AMIP protocol and the HadSST data sets

+
+Exercise: Customize your CAM history files

+

Create, configure, build and run a case called fhist with the compset FHIST at the resolution f09_f09_mg17 using the same history file output as in the control. +Run for 5 days.

+
    +
  • How can you check that there is a difference between the set up of this and your control?

  • +
  • How can you check that it is running the way you intended: using ssts & ghg forcings from time-varying, historical files?

  • +
  • What year is the model running?

  • +
+
+
+
+ Click here for hints +
+

How do I output 3 hourly instantaneous variables?

+
    +
  • Use namelist variables: nhtfrq, mfilt, fincl.

  • +
  • For more information, look at the chapter:
    +NAMELIST MODIFICATIONS -> Customize CAM output

  • +
+

I am getting an error: This compset and grid combination is untested in CESM

+
    +
  • overide this error by adding --run-unsupported to the create_newcase command

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

tcsh user

+
set CASENAME=fhist
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=FHIST
+set RESOLUTION=f19_f19_mg17
+
+
+

bash user

+
export CASENAME=fhist
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=FHIST
+export RESOLUTION=f19_f19_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --run-unsupported
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013. You should use the project number given for this tutorial.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Customize namelists

+

Edit the file user_nl_cam and add the lines:

+
nhtfrq(2) = -3
+mfilt(2) = 240
+fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'
+
+
+

You can do this with a text editor. Alternatively, you can use the echo command:

+
echo "nhtfrq(2) = -3">> user_nl_cam    
+echo "mfilt(2) = 240">> user_nl_cam
+echo "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'">> user_nl_cam
+echo "">> user_nl_cam    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

Note that by default the starting year for a FHIST compset is 1950 instead of the year 0001 with a F2000climo compset.

+

(2) Look at the contents of the h1 files using ncdump.

+
    +
  • The file should contain the instantaneous output in the file h1 for the variables:

  • +
+
        float FLNS(time, lat, lon) ;
+                FLNS:Sampling_Sequence = "rad_lwsw" ;
+                FLNS:units = "W/m2" ;
+                FLNS:long_name = "Net longwave flux at surface" ;
+        float FLNT(time, lat, lon) ;
+                FLNT:Sampling_Sequence = "rad_lwsw" ;
+                FLNT:units = "W/m2" ;
+                FLNT:long_name = "Net longwave flux at top of model" ;
+        float LHFLX(time, lat, lon) ;
+                LHFLX:units = "W/m2" ;
+                LHFLX:long_name = "Surface latent heat flux" ;
+        float PRECT(time, lat, lon) ;
+                PRECT:units = "m/s" ;
+                PRECT:long_name = "Total (convective and large-scale) precipitation rate (liq + ice)" ;
+        float PS(time, lat, lon) ;
+                PS:units = "Pa" ;
+                PS:long_name = "Surface pressure" ;
+        float SHFLX(time, lat, lon) ;
+                SHFLX:units = "W/m2" ;
+                SHFLX:long_name = "Surface sensible heat flux" ;
+        float T850(time, lat, lon) ;
+                T850:units = "K" ;
+                T850:long_name = "Temperature at 850 mbar pressure surface" ;
+        float TS(time, lat, lon) ;
+                TS:units = "K" ;
+                TS:long_name = "Surface temperature (radiative)" ;
+        float U850(time, lat, lon) ;
+                U850:units = "m/s" ;
+                U850:long_name = "Zonal wind at 850 mbar pressure surface" ;
+
+
+

Note that these variables have no cell_methods attribute becasue the output is instantaneous.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam/exercise_3.html b/notebooks/challenge/cam/exercise_3.html new file mode 100644 index 000000000..57c4b4bca --- /dev/null +++ b/notebooks/challenge/cam/exercise_3.html @@ -0,0 +1,866 @@ + + + + + + + + + + + 3: Starting FHIST from spunup state in 1850 — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

3: Starting FHIST from spunup state in 1850

+ +
+
+ +
+
+
+ + + + +
+ +
+

3: Starting FHIST from spunup state in 1850#

+

By default the FHIST starts from a default initial condition in 1979, but you can start from another year and use initial conditions coming from a previous run.

+
+Exercise: Customize your CAM history files

+

Create, configure, build and run a case called fhist.1850 with the compset FHIST at the resolution f09_f09_mg17 using the same history file output as in the control.

+
    +
  • Use initialization datasets from a previous case.
    For instance, use the data from the run: b.e21.B1850.f19_g17.CMIP6-piControl-2deg.001 at year 321

  • +
  • Start model in 1850.

  • +
  • Run for 5 days.

  • +
+

Check your solution:

+
    +
  • How can you check that there is a difference between the set up of this and your control?

  • +
  • How can you check that it is running the way you intended: using ssts & ghg forcings from time-varying, historical files?

  • +
  • What year is the model running?

  • +
+
+
+
+ Click here for hints +
+

How do I start my run using initialization datasets from a previous run?

+
    +
  • Look at chapter Modifify the run type. In that chapter, you learned different ways to start up the model, and how to use initial conditions/restart files from a different case to start up a hybrid case. Use that method for the current exercise.

  • +
  • Data from spun-up model runs can be found in inputdata (DIN_LOC_ROOT) .

  • +
+

How do I start my run in 1850?

+
    +
  • Look at the description of the xml variable RUN_STARTDATE

  • +
+

How do I output 3 hourly instantaneous variables?

+
    +
  • Use namelist variables: nhtfrq, mfilt, fincl.

  • +
  • For more information, look at the chapter:
    +NAMELIST MODIFICATIONS -> Customize CAM output

  • +
+

I am getting an error: This compset and grid combination is untested in CESM

+
    +
  • overide this error by adding --run-unsupported to the create_newcase command

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

tcsh

+
set CASENAME=fhist.1850
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=FHIST
+set RESOLUTION=f19_f19_mg17
+
+
+

bash

+
export CASENAME=fhist.1850
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=FHIST
+export RESOLUTION=f19_f19_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --run-unsupported
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Customize namelists

+

Edit the file user_nl_cam and add the lines:

+
nhtfrq(2) = -3
+mfilt(2) = 240
+fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'
+
+
+

You can do this with a text editor. Alternatively, you can use the echo command:

+
echo "nhtfrq(2) = -3">> user_nl_cam    
+echo "mfilt(2) = 240">> user_nl_cam
+echo "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'">> user_nl_cam
+echo "">> user_nl_cam    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# change starting date and ref case

+
./xmlchange RUN_STARTDATE=1850-01-01  
+./xmlchange RUN_REFCASE=b.e21.B1850.f19_g17.CMIP6-piControl-2deg.001
+./xmlchange RUN_REFDATE=0321-01-01
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

Notice that the start year is 1850.

+

(2) Look at the contents of the h1 files using ncdump.

+
    +
  • The file should contain the instantaneous output in the file h1 for the variables:

  • +
+
        float FLNS(time, lat, lon) ;
+                FLNS:Sampling_Sequence = "rad_lwsw" ;
+                FLNS:units = "W/m2" ;
+                FLNS:long_name = "Net longwave flux at surface" ;
+        float FLNT(time, lat, lon) ;
+                FLNT:Sampling_Sequence = "rad_lwsw" ;
+                FLNT:units = "W/m2" ;
+                FLNT:long_name = "Net longwave flux at top of model" ;
+        float LHFLX(time, lat, lon) ;
+                LHFLX:units = "W/m2" ;
+                LHFLX:long_name = "Surface latent heat flux" ;
+        float PRECT(time, lat, lon) ;
+                PRECT:units = "m/s" ;
+                PRECT:long_name = "Total (convective and large-scale) precipitation rate (liq + ice)" ;
+        float PS(time, lat, lon) ;
+                PS:units = "Pa" ;
+                PS:long_name = "Surface pressure" ;
+        float SHFLX(time, lat, lon) ;
+                SHFLX:units = "W/m2" ;
+                SHFLX:long_name = "Surface sensible heat flux" ;
+        float T850(time, lat, lon) ;
+                T850:units = "K" ;
+                T850:long_name = "Temperature at 850 mbar pressure surface" ;
+        float TS(time, lat, lon) ;
+                TS:units = "K" ;
+                TS:long_name = "Surface temperature (radiative)" ;
+        float U850(time, lat, lon) ;
+                U850:units = "m/s" ;
+                U850:long_name = "Zonal wind at 850 mbar pressure surface" ;
+
+
+

Note that these variables have no cell_methods attribute becasue the output is instantaneous.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam/exercise_4.html b/notebooks/challenge/cam/exercise_4.html new file mode 100644 index 000000000..251a5bc86 --- /dev/null +++ b/notebooks/challenge/cam/exercise_4.html @@ -0,0 +1,877 @@ + + + + + + + + + + + 4: Increase orographic height over the western US — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

4: Increase orographic height over the western US

+ +
+
+ +
+
+
+ + + + +
+ +
+

4: Increase orographic height over the western US#

+

Change input boundary datasets by increasing surface geopotential height by 50% in the western USA

+
+Exercise: Increase orographic height over the western US

+

Create a case similar to control case but change input boundary datasets by increasing surface geopotential height by 50% in the western USA.

+

Increase orographic height over the western US

+

Figure: Increase orographic height over the western US.

+

Create, configure, build and run a case called f2000.topo with the compset F2000climo at the resolution f09_f09_mg17 using the same history file output as in the control. Change the topography input datasets +Run for 5 days.

+
+
+
+ Click here for hints +
+

How do I output 3 hourly instantaneous variables?

+
    +
  • Use namelist variables: nhtfrq, mfilt, fincl.

  • +
  • For more information, look at the chapter:
    +NAMELIST MODIFICATIONS -> Customize CAM output

  • +
+

Where do I change the topography dataset?

+
    +
  • Look at the namelist definition for the variable bnd_topo

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

tcsh user

+
set CASENAME=f2000.topo
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=F2000climo
+set RESOLUTION=f19_f19_mg17
+
+
+

bash user

+
export CASENAME=f2000.topo
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=F2000climo
+export RESOLUTION=f19_f19_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET 
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013. You should use the project number given for this tutorial.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Modify orography

+

Copy the topography file into your case directory and modify it over there.

+

Here we use the nco operators but feel free to use any other tool that you familiar with.

+
cd $CASEDIR
+cp \
+/glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/topo/fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.nc   .
+
+ncap2 -O -s 'lat2d[lat,lon]=lat ; lon2d[lat,lon]=lon'  \
+-s 'omask=(lat2d >= 30. && lat2d <= 50.) && (lon2d >= 235. && lon2d <= 260.)' \
+-s 'PHIS=(PHIS*(1.+omask*0.5))' \
+fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.nc  \
+fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc
+
+
+

# Visualize your modification to orography

+

You could create a file diff_topo.nc with the differences of topography ncdiffand then visualize the that file with ncview. You also welcome to use your own tools to visualize your mods to orography.

+
    +
  • Create a file diff_topo.nc with the differences in topographic:

  • +
+
ncdiff \
+fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.nc \
+fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc \
+diff_topo.nc
+
+
+
    +
  • Look at the diff_topo.nc with ncview:

  • +
+
ncview diff_topo.nc
+
+
+

Increase orographic height over the western US

+

Figure: View the increase in orographic height over the western US with ncview.

+

# Customize namelists

+

Edit the file user_nl_cam and add the lines:

+
nhtfrq(2) = -3
+mfilt(2) = 240
+fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'
+bnd_topo = '$CASEDIR/fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc'
+
+
+

You can do this with a text editor. Alternatively, you can use the echo command:

+
echo "nhtfrq(2) = -3">> user_nl_cam    
+echo "mfilt(2) = 240">> user_nl_cam
+echo "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'">> user_nl_cam
+echo "bnd_topo = '$CASEDIR/fv_1.9x2.5_nc3000_Nsw084_Nrs016_Co120_Fi001_ZR_GRNL_031819.topo50.nc' " >> user_nl_cam
+echo "">> user_nl_cam    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

(2) Look at the contents of the h1 files using ncdump.

+
    +
  • The file should contain the instantaneous output in the file h1 for the variables:

  • +
+
        float FLNS(time, lat, lon) ;
+                FLNS:Sampling_Sequence = "rad_lwsw" ;
+                FLNS:units = "W/m2" ;
+                FLNS:long_name = "Net longwave flux at surface" ;
+        float FLNT(time, lat, lon) ;
+                FLNT:Sampling_Sequence = "rad_lwsw" ;
+                FLNT:units = "W/m2" ;
+                FLNT:long_name = "Net longwave flux at top of model" ;
+        float LHFLX(time, lat, lon) ;
+                LHFLX:units = "W/m2" ;
+                LHFLX:long_name = "Surface latent heat flux" ;
+        float PRECT(time, lat, lon) ;
+                PRECT:units = "m/s" ;
+                PRECT:long_name = "Total (convective and large-scale) precipitation rate (liq + ice)" ;
+        float PS(time, lat, lon) ;
+                PS:units = "Pa" ;
+                PS:long_name = "Surface pressure" ;
+        float SHFLX(time, lat, lon) ;
+                SHFLX:units = "W/m2" ;
+                SHFLX:long_name = "Surface sensible heat flux" ;
+        float T850(time, lat, lon) ;
+                T850:units = "K" ;
+                T850:long_name = "Temperature at 850 mbar pressure surface" ;
+        float TS(time, lat, lon) ;
+                TS:units = "K" ;
+                TS:long_name = "Surface temperature (radiative)" ;
+        float U850(time, lat, lon) ;
+                U850:units = "m/s" ;
+                U850:long_name = "Zonal wind at 850 mbar pressure surface" ;
+
+
+

Note that these variables have no cell_methods attribute becasue the output is instantaneous.

+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam/exercise_5.html b/notebooks/challenge/cam/exercise_5.html new file mode 100644 index 000000000..c35e4794b --- /dev/null +++ b/notebooks/challenge/cam/exercise_5.html @@ -0,0 +1,877 @@ + + + + + + + + + + + 5: Modify sea surface temperature in the tropics — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

5: Modify sea surface temperature in the tropics

+ +
+
+ +
+
+
+ + + + +
+ +
+

5: Modify sea surface temperature in the tropics#

+

Change input boundary datasets (Sea Surface Temperature) by increasing its value by 2K in the tropical Central Pacific.

+
+Exercise: Modify sea surface temperature in the tropics

+

Create a case similar to control case but change input boundary datasets (Sea Surface Temperature) by increasing its value by 2K in the tropical Central Pacific.

+

Increase orographic height over the western US

+

Figure: Increase orographic height over the western US.

+

Create, configure, build and run a case called f2000.sst with the compset F2000climo at the resolution f09_f09_mg17 using the same history file output as in the control. Change the SST input datasets +Run for 5 days.

+
+
+
+ Click here for hints +
+

How do I output 3 hourly instantaneous variables?

+
    +
  • Use namelist variables: nhtfrq, mfilt, fincl.

  • +
  • For more information, look at the chapter:
    +NAMELIST MODIFICATIONS -> Customize CAM output

  • +
+

Where do I change the SST dataset?

+
    +
  • Look at the xml variable SSTICE_DATA_FILENAME

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

tcsh user

+
set CASENAME=f2000.sst
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=F2000climo
+set RESOLUTION=f19_f19_mg17
+
+
+

bash user

+
export CASENAME=f2000.sst
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=F2000climo
+export RESOLUTION=f19_f19_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET 
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013. You should use the project number given for this tutorial.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

# Modify orography

+

Copy the SST file into your case directory and modify it over there.

+

Here we use the nco operators but feel free to use any other tool that you familiar with.

+
cd $CASEDIR
+cp /glade/campaign/cesm/cesmdata/cseg/inputdata/atm/cam/sst/sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc .
+
+ncap2 -O -s 'lat2d[lat,lon]=lat ; lon2d[lat,lon]=lon' \
+   -s 'omask=(lat2d >= -10. && lat2d <= 10.) && (lon2d >= 180. && lon2d <= 240.)'\
+   -s 'SST_cpl=(SST_cpl+omask*2.)' sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc \
+   sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc.warmtcp.nc
+
+
+

# Visualize your modification to orography

+

You could create a file diff_sst.nc with the differences of SST ncdiffand then visualize the that file with ncview. You also welcome to use your own tools to visualize your mods to orography.

+
    +
  • Create a file diff_sst.nc with the differences in SSTs:

  • +
+
ncdiff \
+sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc \
+sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc.warmtcp.nc \
+diff_sst.nc
+
+
+
    +
  • Look at the diff_sst.nc with ncview:

  • +
+
ncview diff_sst.nc
+
+
+

Increase orographic height over the western US

+

Figure: View the increase in orographic height over the western US with ncview.

+

# Point to the new SST file

+
./xmlchange SSTICE_DATA_FILENAME="$CASEDIR/sst_HadOIBl_bc_1.9x2.5_2000climo_c180511.nc.warmtcp.nc"
+
+
+

# Customize namelists

+

Edit the file user_nl_cam and add the lines:

+
nhtfrq(2) = -3
+mfilt(2) = 240
+fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'
+
+
+

You can do this with a text editor. Alternatively, you can use the echo command:

+
echo "nhtfrq(2) = -3">> user_nl_cam    
+echo "mfilt(2) = 240">> user_nl_cam
+echo "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'">> user_nl_cam
+echo "">> user_nl_cam    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

(2) Look at the contents of the h1 files using ncdump.

+
    +
  • The file should contain the instantaneous output in the file h1 for the variables:

  • +
+
        float FLNS(time, lat, lon) ;
+                FLNS:Sampling_Sequence = "rad_lwsw" ;
+                FLNS:units = "W/m2" ;
+                FLNS:long_name = "Net longwave flux at surface" ;
+        float FLNT(time, lat, lon) ;
+                FLNT:Sampling_Sequence = "rad_lwsw" ;
+                FLNT:units = "W/m2" ;
+                FLNT:long_name = "Net longwave flux at top of model" ;
+        float LHFLX(time, lat, lon) ;
+                LHFLX:units = "W/m2" ;
+                LHFLX:long_name = "Surface latent heat flux" ;
+        float PRECT(time, lat, lon) ;
+                PRECT:units = "m/s" ;
+                PRECT:long_name = "Total (convective and large-scale) precipitation rate (liq + ice)" ;
+        float PS(time, lat, lon) ;
+                PS:units = "Pa" ;
+                PS:long_name = "Surface pressure" ;
+        float SHFLX(time, lat, lon) ;
+                SHFLX:units = "W/m2" ;
+                SHFLX:long_name = "Surface sensible heat flux" ;
+        float T850(time, lat, lon) ;
+                T850:units = "K" ;
+                T850:long_name = "Temperature at 850 mbar pressure surface" ;
+        float TS(time, lat, lon) ;
+                TS:units = "K" ;
+                TS:long_name = "Surface temperature (radiative)" ;
+        float U850(time, lat, lon) ;
+                U850:units = "m/s" ;
+                U850:long_name = "Zonal wind at 850 mbar pressure surface" ;
+
+
+

Note that these variables have no cell_methods attribute becasue the output is instantaneous.

+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cam/exercise_6.html b/notebooks/challenge/cam/exercise_6.html new file mode 100644 index 000000000..db557040f --- /dev/null +++ b/notebooks/challenge/cam/exercise_6.html @@ -0,0 +1,887 @@ + + + + + + + + + + + 6: Adjust threshold for deep convection over land — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

6: Adjust threshold for deep convection over land

+ +
+
+ +
+
+
+ + + + +
+ +
+

6: Adjust threshold for deep convection over land#

+

The purpose of this exercise is to add a code change to the deep convection to delay the initiation of convection. This is done by increasing the minimum required convective available potential energy (CAPE) to initiate convection over land.

+
+Exercise: Effects of delaying the initiation of convection

+

Create a case similar to control case but add code to delay the initiation of convection over land by increasing the minimum required convective available potential energy (CAPE) to initiate convection.

+

Increase orographic height over the western US

+

Figure: CAPE.

+

Create, configure, build and run a case called f2000.cape with the compset F2000climo at the resolution f09_f09_mg17 using the same history file output as in the control.
+Run for 5 days.

+
+
+
+ Click here for hints +
+

How do I output 3 hourly instantaneous variables?

+
    +
  • Use namelist variables: nhtfrq, mfilt, fincl.

  • +
  • For more information, look at the chapter:
    +NAMELIST MODIFICATIONS -> Customize CAM output

  • +
+

Where do I change threshold for CAPE?

+
    +
  • Look for the file zm_conv.F90 into the cesm code

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

Tcsh user

+
set CASENAME=f2000.cape
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=F2000climo
+set RESOLUTION=f19_f19_mg17
+
+
+

bash user

+
export CASENAME=f2000.cape
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=F2000climo
+export RESOLUTION=f19_f19_mg17
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET 
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013. You should use the project number given for this tutorial.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+
+

# Modify code

+
    +
  • copy zm_conv.F90 into the SourceMods/src.cam directory and modify it

  • +
+
cp /glade/u/home/$USER/code/my_cesm_code/components/cam/src/physics/cam/zm_conv.F90 SourceMods/src.cam
+
+
+
    +
  • In the subroutine zm_convr

  • +
+

Replace the code:

+
if (cape(i) > capelmt) then 
+ lengath = lengath + 1 
+ ideep(lengath) = i 
+ end if
+
+
+

by

+
if (landfrac(i) > 0.5_r8) then
+    capelmt_mask = 10._r8*capelmt
+else
+    capelmt_mask = capelmt
+end if
+
+if (cape(i) > capelmt_mask) then 
+    lengath = lengath + 1 
+    deep(lengath) = i 
+end if
+
+write(iulog,*) 'HELLO WORLD'
+
+
+
+
    +
  • Near the top of subroutine zm_convr:

  • +
+

Add the line

+
real(r8) :: capelmt_mask
+
+
+

right after:

+
real(r8) pblt(pcols) 	
+
+
+

# Customize namelists

+

Edit the file user_nl_cam and add the lines:

+
nhtfrq(2) = -3
+mfilt(2) = 240
+fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'
+
+
+

You can do this with a text editor. Alternatively, you can use the echo command:

+
echo "nhtfrq(2) = -3">> user_nl_cam    
+echo "mfilt(2) = 240">> user_nl_cam
+echo "fincl2 = 'TS:I','PS:I', 'U850:I','T850:I','PRECT:I','LHFLX:I','SHFLX:I','FLNT:I','FLNS:I'">> user_nl_cam
+echo "">> user_nl_cam    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+

If needed, change the run length. If you want to run 5 days, you don’t have to do this, as 5 days is the default.

+
./xmlchange STOP_N=5,STOP_OPTION=ndays
+
+
+

# Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is only 5-day, there should be no monthly file (h0)

+

(2) Look at the contents of the h1 files using ncdump.

+
    +
  • The file should contain the instantaneous output in the file h1 for the variables:

  • +
+
        float FLNS(time, lat, lon) ;
+                FLNS:Sampling_Sequence = "rad_lwsw" ;
+                FLNS:units = "W/m2" ;
+                FLNS:long_name = "Net longwave flux at surface" ;
+        float FLNT(time, lat, lon) ;
+                FLNT:Sampling_Sequence = "rad_lwsw" ;
+                FLNT:units = "W/m2" ;
+                FLNT:long_name = "Net longwave flux at top of model" ;
+        float LHFLX(time, lat, lon) ;
+                LHFLX:units = "W/m2" ;
+                LHFLX:long_name = "Surface latent heat flux" ;
+        float PRECT(time, lat, lon) ;
+                PRECT:units = "m/s" ;
+                PRECT:long_name = "Total (convective and large-scale) precipitation rate (liq + ice)" ;
+        float PS(time, lat, lon) ;
+                PS:units = "Pa" ;
+                PS:long_name = "Surface pressure" ;
+        float SHFLX(time, lat, lon) ;
+                SHFLX:units = "W/m2" ;
+                SHFLX:long_name = "Surface sensible heat flux" ;
+        float T850(time, lat, lon) ;
+                T850:units = "K" ;
+                T850:long_name = "Temperature at 850 mbar pressure surface" ;
+        float TS(time, lat, lon) ;
+                TS:units = "K" ;
+                TS:long_name = "Surface temperature (radiative)" ;
+        float U850(time, lat, lon) ;
+                U850:units = "m/s" ;
+                U850:long_name = "Zonal wind at 850 mbar pressure surface" ;
+
+
+

Note that these variables have no cell_methods attribute becasue the output is instantaneous.

+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/challenge.html b/notebooks/challenge/challenge.html new file mode 100644 index 000000000..af6379f31 --- /dev/null +++ b/notebooks/challenge/challenge.html @@ -0,0 +1,705 @@ + + + + + + + + + + + Challenge Exercises — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Challenge Exercises

+ +
+
+ +
+
+
+ + + + +
+ +
+

Challenge Exercises#

+

This section of the CESM tutorial is designed to test your understanding of the CESM model that you have learned about in previous sections.

+

We provide challenge exercises for the individual model components for you to test yourself.

+

Feel free to try all the challenge exercises or just the one(s) that are relevant for the CESM components of interest to you.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cice/cice.html b/notebooks/challenge/cice/cice.html new file mode 100644 index 000000000..4c92fadc1 --- /dev/null +++ b/notebooks/challenge/cice/cice.html @@ -0,0 +1,820 @@ + + + + + + + + + + + Sea Ice — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Sea Ice#

+

The sea ice component of CESM is CICE. This is developed by the CICE Consortium. Note that CESM2 uses CICE version 5. In version 6 of CICE, the vertical thermodynamics was separated into a submodule known as Icepack. CICE6 will be the sea ice component in CESM3.

+

It can be useful for people interested in sea ice science to run simulations with only active sea ice and ocean components and atmospheric forcing. In this exercise, you will learn how to run one of these ice-ocean simulations.

+

This exercise was created by David Bailey and Alice DuVivier.

+
+

Learning Goals#

+
    +
  • Student will learn what a G compset is, the types of forcing available to run one, and how to run one.

  • +
  • Student will learn how to make a namelist modification that changes snow albedo and compare results with a control experiment.

  • +
  • Student will learn how to make a source code modification that changes the conductivity through snow (ksno) and compare results with a control experiment.

  • +
+
+
+

Exercise Details#

+
    +
  • This exercise uses the same code base as the rest of the tutorial.

  • +
  • You will be using the G compset at the T62_g37 resolution.

  • +
  • You will run a control simulation and two experimental simulations. Each simulation will be run for one year.

  • +
  • You will use simple, command line netcdf tools to evaluate how the experiments differ from the control simulation.

  • +
+
+
+

Useful CICE references#

+
+
+

What is a G case?#

+

The G compset has active and coupled ocean and sea-ice components. The G compset requires boundary forcing from the atmosphere. The G compset is forced with atmospheric data that does not change interactively as the ocean and sea-ice evolve in time. The land and land ice are not active during a G compset experiment run and the runoff is specified.

+

gcase

+

Figure: G Compset definition.

+
+
+

G Compset forcing data#

+

There are two types of temporal forcing for G compsets:

+
    +
  • Normal Year Forcing (NYF) is 12 months of atmospheric data (like a climatology) that repeats every year. NYF is the default forcing.

  • +
  • Interannual varying forcing (GIAF) is forcing that varies by year over the time period (1948-2017).

  • +
+

There are two datasets that can be used for G compsets:

+ +

In these exercises we will use the CORE NYF.

+
+
+

Post processing and viewing your output#

+

You will use ncview and NCO operator tools to evaluate how the experiments differ from the control simulation.

+

These modules should already be loaded into your environment, so verify that they are in your environment and it not load them using the NCAR HPC modules.

+
module list
+
+
+

If they are not listed, then you can load the modules:

+
module load ncview
+module load nco
+
+
+
    +
  1. You can create an annual average of the first year’s data for each simulationg using the ncra (netCDF averager) command from the netCDF operators package (NCO).

  2. +
+
ncra $OUTPUT_DIR/*.cice.h.*nc $CASENAME.cice.h.0001.nc
+
+
+
    +
  1. Create a file that contains differences between each of the experiments and the control simulation

  2. +
+
ncdiff $CASENAME.cice.h.0001.nc $CONTROLCASE.cice.h.0001.nc $CASENAME_diff.nc
+
+
+
    +
  1. Examine variables within each annual mean and the difference files using ncview

  2. +
+
ncview $CASENAME_diff.nc
+
+
+
    +
  1. You can also look at other monthly-mean outputs or component log files.

  2. +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cice/cice_exercise_1.html b/notebooks/challenge/cice/cice_exercise_1.html new file mode 100644 index 000000000..d91c22df1 --- /dev/null +++ b/notebooks/challenge/cice/cice_exercise_1.html @@ -0,0 +1,813 @@ + + + + + + + + + + + 1: Control case — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

1: Control case

+ +
+
+ +
+
+
+ + + + +
+ +
+

1: Control case#

+

NOTE: Building the control case for the CICE challenge exercises is idential to building the control case in the POP challenge exercises. If you have already completed the POP challenge exercises you can skip this step.

+
+Exercise: Run a control case

+

Create a case called g_control using the compset G at T62_g37 resolution.

+

Set the run length to 1 year.

+

Build and run the model. Since this is a control case, we want to build it “out of the box” without any modifications.

+
+
+
+ Click here for hints +
+

How do I compile? +

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+
+

How do I control the output? +

+

Use namelist variables: histfreq, histfreq_n, and f_var.

+
histfreq = 'm','d','x','x','x'
+histfreq_n = 1,1,1,1,1
+
+f_aice = 'mdxxx'
+f_hi = 'mdxxx'
+
+
+
+

CICE History +

+

How do I check my solution? +

+

When your run is completed, go to the archive directory.

+

(1) Check that your archive directory contains the files:

+
    +
  • h files

  • +
+
g_control.cice.h.0001-01.nc
+
+
+
    +
  • h1 files

  • +
+
g_control.cice.h1.0001-01-01.nc
+g_control.cice.h1.0001-01-02.nc
+
+
+
+

(2) Compare the contents of the h and h1 files using ncdump.

+
ncdump -h g_control.cice.h.0001-01.nc
+ncdump -h g_control.cice.h1.0001-01-01.nc
+
+
+
+

Look at the sizes of the files.

+
ls -l g_control.cice.h.0001-01.nc
+ls -l g_control.cice.h1.0001*.nc
+
+
+
+
+
+
+Click here for the solution
+

Create a new case g_control with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case /glade/u/home/$USER/cases/g_control  --compset G --res T62_g37 
+
+
+
+

Case setup:

+
cd ~/cases/g_control 
+./case.setup
+
+
+
+

Change the run length:

+
./xmlchange STOP_N=1,STOP_OPTION=nyears
+
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +g_control.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/g_control/ice/hist
+
+ls 
+
+
+
+

(2) Compare the contents of the h and h1 files using ncdump.

+

(3) Check the number of timesteps / files for the h and the h1 files.

+
    +
  • h1 has 31 time samples / files.

  • +
  • Check the size of the files

  • +
+
du –ks –h /glade/derecho/scratch/$USER/archive/g_control/ice/hist/*
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cice/cice_exercise_2.html b/notebooks/challenge/cice/cice_exercise_2.html new file mode 100644 index 000000000..bfdff899c --- /dev/null +++ b/notebooks/challenge/cice/cice_exercise_2.html @@ -0,0 +1,844 @@ + + + + + + + + + + + 2: Tune the albedo — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

2: Tune the albedo

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

2: Tune the albedo#

+

One of the most common changes to the cice model involves changing the albedo of the snow on the surface of the sea ice using the delta-Eddington radiation scheme. To tune the albedo, you must actually change the inherent optical properties of the snow, bare ice, or ponds.

+

Here we will experiment with changing the snow properties using the r_snw parameter.

+

r_snw specifies the number of standard deviations away from the base optical properties of the shortwave radiative transfer code. r_snw is used to determine the non-melting snow grain radius using the following equation:

+
+\[ + {rsnw}_{nonmelt} = 500 - r_{snw} * 250 +\]
+

This is in microns \((\mu m)\) and rsnw_nonmelt has a minimum value of 100 and a maximum value of rsnw_mlt. As can be seen, when r_snw is larger then there is a lower value of rsnw_nonmelt. When rsnw_nonmelt is lower then the albedos are higher and vice versa. This is because smaller grains lead to higher albedos. Hence the sign of r_snw is positive for higher albedos and negative for lower albedos.

+

The figure below shows how this works. The x-axis is temperature and the y-axis is effective snow grain radius.

+

rsnw

+

Figure: r_snw parameter plot.

+
+Exercise: Change snow albedo

+

Create a case called g_snowalbedo by cloning the control experiment case.

+

Verify that the run length is set to 1 year.

+

In user_nl_cice make the following modifications:r_snw = 2.0.

+

Build and run the model for one year.

+

Provide info about how to compare the simulations using ncview/ncdiff, etc.

+
+
+
+ Click here for hints +

How do I compile?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+
+

How do I control the output?

+

Use namelist variables: histfreq,histfreq_n, and f_var.

+

Look at the online documentation for these variables.

+

How do I check my solution?

+

When your run is completed, go to the archive directory.

+

(1) Check that your archive directory contains the files:

+
    +
  • h files

  • +
+
g_snowalbedo.cice.h.0001-01.nc
+
+
+
    +
  • h1 files

  • +
+
g_snowalbedo.cice.h1.0001-01-01-00000.nc
+g_snowalbedo.cice.h1.0001-02-01-00000.nc
+
+
+
+

(2) Compare the contents of the h and h1 files using ncdump.

+
ncdump -h g_snowalbedo.cice.h.0001-01-01-00000.nc
+ncdump -h g_snowalbedo.cice.h1.0001-01-01-00000.nc
+
+
+
+
+
+
+Click here for the solution
+

Clone a new case g_snowalbedo from your control experiment with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_clone --case /glade/u/home/$USER/cases/g_snowalbedo --clone /glade/u/home/$USER/cases/g_control
+
+
+
+

Case setup:

+
cd /glade/u/home/$USER/cases/g_snowalbedo
+./case.setup
+
+
+
+

Verify that the run length is 1 year:

+
./xmlquery STOP_N
+./xmlquery STOP_OPTION
+
+
+
+

Edit the file user_nl_cice and add the lines:

+
 r_snw = 2.0
+
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +g_snowalbedo.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/g_snowalbedo/ice/hist
+ls 
+
+
+
+

(2) Compare to control run:

+
ncdiff g_snowalbedo.cice.h.0001-01.nc /glade/derecho/scratch/$USER/archive/g_control/ice/hist/g_control.cice.h.0001-01.nc g_diff.nc
+
+ncview g_diff.nc
+
+
+
+
+
+

Test your understanding#

+
    +
  • What changes do you see from the control case with an increased snow albedo? Try other values of r_snw.

  • +
  • What time of year did you start your run and which season do you expect to see the biggest impact for shortwave changes?

  • +
  • How did changes in the Arctic vs. the Antarctic compare?

  • +
  • Are the modified r_snw values physically realistic? Why or why not? Why do you think this parameter is sometimes used to tune ESMs?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cice/cice_exercise_3.html b/notebooks/challenge/cice/cice_exercise_3.html new file mode 100644 index 000000000..c79b6ec80 --- /dev/null +++ b/notebooks/challenge/cice/cice_exercise_3.html @@ -0,0 +1,848 @@ + + + + + + + + + + + 3: Modify the snow conductivity — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

3: Modify the snow conductivity

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

3: Modify the snow conductivity#

+

One of the more sensitive sea ice parameters is the snow thermal conductivity or ksno parameter (Urrego-Blanco et al. 2016). Thermal conductivity determines the ability of the snow to conduct heat through it.

+
+\[ +F_{cond} = - k_{sno} * dT / dz +\]
+

Here you will see how this impacts a simulation by multiplying this value by a factor of three. In this version of the CICE model, this is actually a hard coded parameter in a Fortran module. It was found that this parameter was important enough that it was included in the namelist in future versions of CICE.

+
+Exercise 3: Something with source code

+

Create a case (clone) called g_ksno using the compset G at T62_g37 resolution.

+

Set the run length to 1 year.

+

Go to the main source directory under /glade/u/home/$USER/code/my_cesm_code/components/cice/src and search for the variable ksno.

+

Copy the source module from the main CESM code directory into $CASE/SourceMods/src.cice.

+

Edit the fortran code in SourceMods/src.cice.

+

Find the variable “ksno” and change this to 0.9.

+

Build and run the model for one year.

+

Provide info about how to compare the simulations using ncview/ncdiff, etc.

+
+
+ Click here for hints +

How do I compile?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+
+

How do I control the output?

+

Use namelist variables: histfreq,histfreq_n, and f_var.

+

Look at the online documentation for these variables.

+

How do I check my solution?

+

When your run is completed, go to the archive directory.

+

(1) Check that your archive directory contains the files:

+
    +
  • h files

  • +
+
g_ksno.cice.h.0001-01.nc
+
+
+
    +
  • h1 files

  • +
+
g_ksno.cice.h1.0001-01-01-00000.nc
+g_ksno.cice.h1.0001-02-01-00000.nc
+
+
+
+

(2) Compare the contents of the h and h1 files using ncdump.

+
ncdump -h g_ksno.cice.h.0001-01-01-00000.nc
+ncdump -h g_ksno.cice.h1.0001-01-01-00000.nc
+
+
+
+
+
+
+Click here for the solution
+

Clone a new case g_ksno from your control experiment with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_clone --case /glade/u/home/$USER/cases/g_ksno --clone /glade/u/home/$USER/cases/g_control
+
+
+
+

Case setup:

+
cd /glade/u/home/$USER/cases/g_ksno
+./case.setup
+
+
+
+

Verify that the run length is 1 year:

+
./xmlquery STOP_N
+./xmlquery STOP_OPTION
+
+
+
+

Copy the file from the $CODEROOT directory:

+
cp /glade/u/home/$USER/code/my_cesm_code/components/cice/src/drivers/cesm/ice_constants.F90 /glade/u/home/$USER/cases/g_ksno/SourceMods/src.cice
+
+vi /glade/u/home/$USER/cases/g_ksno/SourceMods/src.cice/ice_constants.F90
+
+
+
+

Change the following line to a value of 0.90_dbl_kind:

+
      ksno   = 0.30_dbl_kind  ,&! thermal conductivity of snow  (W/m/deg)
+
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +g_ksno.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/g_ksno/ice/hist
+ls 
+
+
+
+

(2) Compare to control run:

+
ncdiff g_ksno.cice.h.0001-01.nc /glade/derecho/scratch/$USER/archive/g_control/ice/hist/g_control.cice.h.0001-01.nc g_diff.nc
+
+ncview g_diff.nc
+
+
+
+
+
+

Test your understanding#

+
    +
  • What changes do you see in the ice state from the control case with increased thermal conductivity? Are these changes in line with what you expect?

  • +
  • How did changes in the Arctic vs. the Antarctic compare?

  • +
  • How does the magnitude of the changes compare to the snow albedo changes done in exercise 2? Do these results agree with those of Urrego-Blanco et al. 2016?

  • +
  • Are the modified ksno values physically realistic? Why or why not? Could you imagine this being used as a tuning parameter for ESMs?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cism/cism.html b/notebooks/challenge/cism/cism.html new file mode 100644 index 000000000..fc9c8cddc --- /dev/null +++ b/notebooks/challenge/cism/cism.html @@ -0,0 +1,768 @@ + + + + + + + + + + + Land Ice — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Land Ice

+ +
+ +
+
+ + + + +
+ +
+

Land Ice#

+

The land ice component of CESM is the Community Ice Sheet Model (CISM). Running CESM with a fully evolving ice sheet and 2-way coupling is relatively new and is not the default CESM fully-coupled setup.

+

However, it can be useful for people interested in land ice science to investigate the impact of atmospheric forcing on the ice sheet. In this exercise, you will learn how to evolve CISM in an uncoupled configuration using an existing CESM forcing dataset.

+

This exercise was created by Gunter Leguy and Kate Thayer-Calder.

+
+

Learning Goals#

+
    +
  • Student will learn what a T compset is, the types of forcing available to run one, and how to run one.

  • +
  • Student will learn how to make XML variable modifications to force CISM with forcing data from an existing run.

  • +
  • Student will learn how to look at 2D and time series CISM history datasets.

  • +
  • Student will learn how to compute the sea level change due ice sheet evolution.

  • +
+
+
+

Exercise Details#

+
    +
  • This exercise uses the same codebase as the rest of the tutorial.

  • +
  • You will be using the T compset at the f19_g17_gl4 resolution.

  • +
  • You will run an experimental simulation for 86 years.

  • +
  • You will then use jupyter notebooks to look at your simulation.

  • +
+
+
+

Useful CISM references#

+
+
+

What is a T case?#

+

The CESM T compset runs only the ice sheet component (here CISM). Within a T compset case, CISM can run in Evolve or Non-Evolve mode and is forced by output from a previous CESM run. A “plain” T compset (like T1850) runs CISM in Non-Evolve mode and a “TG” compset (like T1850G) runs CISM in Evolve mode. All other components of a T compset are stubs. Before running a T compset, you must have coupler history files from a previous run that included CLM (version 4.5 or later). You can run with either existing forcing data or with your own forcing data.
+Typically, coupler history files for CISM are yearly averages downscaled onto the CISM grid. For now, downscaled variables include surface temperature and glacier ice flux available at each elevation class. (In the future, ocean data will also be available.)

+

Tcase

+

Figure: TG compset definition.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cism/cism_exercise_1.html b/notebooks/challenge/cism/cism_exercise_1.html new file mode 100644 index 000000000..6fa425f21 --- /dev/null +++ b/notebooks/challenge/cism/cism_exercise_1.html @@ -0,0 +1,804 @@ + + + + + + + + + + + CISM Challenge Exercise — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

CISM Challenge Exercise

+ +
+
+ +
+
+
+ + + + +
+ +
+

CISM Challenge Exercise#

+

In this challenge, you will set up and run a T compset forced with existing output from a B compset simulation (fully coupled climate simulation with no evolving ice sheet). The experiment will force the Greenland ice sheet (GrIS) with atmospheric forcing spanning 2015-2100 that were created from a 2 degree fully-coupled SSP5-8.5 scenario experiment.

+

WARNING
+The forcing data you will use in this exercise has not been scientifically validated yet, or ever been looked at carefully. You are entering the world of research that we deal with daily at NCAR :).

+
+Step 1: Create your T compset experiment

+

Create a case called T_GrIS_SSP585_2015_2100 using the compset T1850G at f19_g17_gl4 resolution.

+

Note 1: The 2 deg grid we are using in this exercise is not scientifically validated.
+Note 2: In the new version of CESM, the compset names will be different and T1850G is replaced by T1850Gg (evolving GrIS) and the grid resolution f19_g17_gl4 will be replaced by f19_g17_gris4.
+Note 3: The grid resolution for this case and the forcing data are both f19_g17_gl4. For a T compset, the forcing data and experiment must be at the same grid resolution.

+

Step 2: Make the changes to the case XML variables

+

Note 1: The run length is 86 years.
+Note 2: The forcing data for this case can be found here: /glade/u/home/gunterl/workshops/CESM-Tutorial/data/cpl_SSP585

+

Step 3: Build and run the model

+
+
+
+ Click here for hints +

How to I create a case a case that is not scientifically supported?

+

You need to add the option

+
--run-unsupported
+
+
+

at the end of your call to ./create_newcase

+

How do I make changes to case xml variables?

+

Make your changes to xml variables using the command:

+
./xmlchange
+
+
+

How do I compile?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+
+
+
+
+Click here for the solution
+

Create a new case T_GrIS_SSP585_2015_2100 with the command:

+
cd /glade/campaign/cesm/development/cross-wg/tutorial/release-cesm2.1.5/cime/scripts
+./create_newcase --case ~/cases/T_GrIS_SSP585_2015_2100  --compset T1850G  --res f19_g17_gl4 --run-unsupported
+
+
+

Case setup:

+
cd ~/cases/T_GrIS_SSP585_2015_2100
+./case.setup
+
+
+

Change the run length:

+
./xmlchange STOP_N=86,STOP_OPTION=nyears
+
+
+

If you are completing this exercise outside of the tutorial, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=main,PROJECT=UESM0013
+
+
+

Modify the case XML variables:

+
./xmlchange DLND_CPLHIST_DIR=/glade/u/home/gunterl/workshops/CESM-Tutorial/data/cpl_SSP585
+./xmlchange DLND_CPLHIST_CASE=b.e21.BSSP585cmip6.f19_g17.CMIP6-SSP5-8.5.001
+./xmlchange DLND_CPLHIST_YR_START=2015
+./xmlchange DLND_CPLHIST_YR_END=2100
+./xmlchange RUN_STARTDATE=2015-01-01
+./xmlchange DLND_CPLHIST_YR_ALIGN=2015
+
+
+

Confirm that you have set up the paths and file names correctly by running:

+
./preview_namelists
+
+
+

and examine the generated file,

+
CaseDocs/dlnd.streams.txt.sno.cplhist
+
+
+

Set up the environment variable for qcmd. If using tcsh or csh:

+
setenv PBS_ACCOUNT UESM0013
+
+
+

and for bash:

+
export PBS_ACCOUNT=UESM0013
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+

If you see errors saying the dlnd forcing files are missing or unable to be downloaded since they lives outside of the input_data_root, then you may need to copy all of the forcing files into your case run directory.

+
cp /glade/u/home/gunterl/workshops/CESM-Tutorial/data/cpl_SSP5/* /glade/scratch/derecho/[username]/T_GrIS_SSP585_2015_2100/run/
+
+
+

And then submit the run again. +When the run is completed, look into the archive directory for: +T_GrIS_SSP585_2015_2100.

+

(1) Check your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/T_GrIS_SSP585_2015_2100/glc/hist
+ls 
+
+
+

(2) Take a look at the contents of a file using ncdump.

+
ncdump -h T_GrIS_SSP585_2015_2100.cism.h.2016-01-01-00000.nc
+
+
+

You will notice that CISM outputs are written yearly (by default) even though the time step is 0.1 year. Changes in ice sheet variables that are typically looked at (such as changes in ice mass or ice thickness) will be captured at this output frequency.

+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cism/cism_exercise_2.html b/notebooks/challenge/cism/cism_exercise_2.html new file mode 100644 index 000000000..597c2c592 --- /dev/null +++ b/notebooks/challenge/cism/cism_exercise_2.html @@ -0,0 +1,1168 @@ + + + + + + + + + + + Looking at the simulation — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Looking at the simulation#

+

Here we will plot a few diagnostics to see what happens to the ice sheet during the simulation. We will focus on comparing the last time slice to the first time slice.

+

First, and for convenience, we will rename the first output file corresponding to year 2015.

+
+

Find your history output on derecho (descibed above as well):

+cd /glade/derecho/scratch/$USER/archive/T_GrIS_SSP585_2015_2100/glc/hist
+ls

+

Rename the initial_hist file to the start date and time:

+

mv T_GrIS_SSP585_2015_2100.cism.initial_hist.2015-01-01-00000.nc T_GrIS_SSP585_2015_2100.cism.h.2015-01-01-00000.nc

+
+

Loading packages#

+
+
+
#import xarray as xr   
+import numpy as np      
+import matplotlib as mpl
+import matplotlib.pyplot as plt             
+import matplotlib.colors as mplc
+import matplotlib.cm as mcm
+from netCDF4 import Dataset
+import netCDF4
+
+# to display figures in notebook after executing the code.
+%matplotlib inline  
+
+
+
+
+
+
+

Set your user name#

+
+
+
User = ''
+
+
+
+
+
+
+

Set the 2 years you would like to compare#

+
+
+
year1 = '2016'
+year2 = '2101'
+
+
+
+
+
+
+

Defining the path and filenames#

+
+
+
# Defining the path
+path_to_file = '/glade/derecho/scratch/' + User + '/archive/T_GrIS_SSP585_2015_2100/glc/hist/'
+
+# Defining the files to compare
+file1 = path_to_file + 'T_GrIS_SSP585_2015_2100.cism.h.' + year1 + '-01-01-00000.nc'
+file2 = path_to_file + 'T_GrIS_SSP585_2015_2100.cism.h.' + year2 + '-01-01-00000.nc'
+
+# Loading the data
+ncfile = Dataset(file1,'r')
+thk1 = np.squeeze(ncfile.variables["thk"][0,:,:])        # ice thickness
+artm1 = np.squeeze(ncfile.variables["artm"][0,:,:])      # air temperature
+smb1 = np.squeeze(ncfile.variables["smb"][0,:,:])/1000.  # surface mass balance, switching the units from mm/yr w.e. to m/yr w.e
+ncfile.close()
+
+ncfile = Dataset(file2,'r')
+thk2 = np.squeeze(ncfile.variables["thk"][0,:,:])
+artm2 = np.squeeze(ncfile.variables["artm"][0,:,:])
+smb2 = np.squeeze(ncfile.variables["smb"][0,:,:])/1000.    # switching the units from mm/yr w.e. to m/yr w.e
+ncfile.close()
+
+# Computing the differences in the different variables
+diff_thk  = thk2 - thk1    # thickness difference
+diff_artm = artm2 - artm1  # air temperature difference
+diff_smb  = smb2 - smb1    # SMB difference
+
+
+
+
+
+
+

Looking at 2D plots#

+

Note: +In these plots, you can adjust the range of the colorbars by adjusting the “vmin” and “vmax” values of each subplot.

+
+

Air temperature#

+
+
+
labelsize=15
+
+my_cmap = mcm.get_cmap('Spectral_r')
+
+
+fig, ax = plt.subplots(1, 3, sharey=True, figsize=[21, 9])
+
+
+# Plotting air temperature for year1
+
+vmin = -20
+vmax = 20
+
+last_panel0 = ax[0].imshow(artm1, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title0 = 'Air temperature (deg C), ' + year1 
+ax[0].set_title(title0, fontsize=labelsize)
+
+fig.subplots_adjust(right=0.8)
+
+pos = ax[0].get_position()
+cax = fig.add_axes([0.32, pos.y0, 0.015, pos.y1 - pos.y0])
+cbar = fig.colorbar(last_panel0,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+cbar.ax.get_yaxis().labelpad = 15
+
+
+
+# Plotting air temperature for year2
+
+last_panel1 = ax[1].imshow(artm2, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title1 = 'Air temperature (deg C), ' + year2 
+
+ax[1].set_title(title1, fontsize=labelsize)
+
+pos = ax[1].get_position()
+cax = fig.add_axes([0.56, pos.y0, 0.015, pos.y1 - pos.y0])
+cbar = fig.colorbar(last_panel1,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+cbar.ax.get_yaxis().labelpad = 15
+
+
+
+# Plotting the difference in air temperature
+
+
+vmin = -15
+vmax = 15
+
+last_panel2 = ax[2].imshow(diff_artm, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title2 = 'Difference (deg C), ' + year2 + '-' + year1 
+ax[2].set_title(title2, fontsize=labelsize)
+pos = ax[2].get_position()
+cax = fig.add_axes([0.8, pos.y0, 0.015, pos.y1 - pos.y0])
+cbar = fig.colorbar(last_panel2,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+
+
+for i in range(len(ax)):
+    ax[i].invert_yaxis()
+    ax[i].set_xlabel('')
+    ax[i].set_ylabel('')
+    ax[i].set_xticklabels('')
+    ax[i].set_yticklabels('')
+    ax[i].set_xticks([])
+    ax[i].set_yticks([])
+
+
+
+
+../../../_images/a9c31dcbdc46b7741ccba9cf1c77e876cfa663c218434ffb3081171289102baf.png +
+
+
+
+

Surface mass balance#

+
+
+
labelsize=15
+
+my_cmap = mcm.get_cmap('Spectral_r')
+
+
+fig, ax = plt.subplots(1, 3, sharey=True, figsize=[21, 9])
+
+
+# Plotting SMB for year1
+
+vmin = -4
+vmax = 4
+
+last_panel0 = ax[0].imshow(smb1, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title0 = 'SMB (m/yr w.e), ' + year1 
+
+ax[0].set_title(title0, fontsize=labelsize)
+
+
+fig.subplots_adjust(right=0.8)
+
+pos = ax[0].get_position()
+cax = fig.add_axes([0.32, pos.y0, 0.015, pos.y1 - pos.y0])
+
+cbar = fig.colorbar(last_panel0,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+
+cbar.ax.get_yaxis().labelpad = 15
+
+
+
+# Plotting SMB for year2
+
+last_panel1 = ax[1].imshow(smb2, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title1 = 'SMB (m/yr w.e), ' + year2 
+
+ax[1].set_title(title1, fontsize=labelsize)
+pos = ax[1].get_position()
+cax = fig.add_axes([0.56, pos.y0, 0.015, pos.y1 - pos.y0])
+cbar = fig.colorbar(last_panel1,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+cbar.ax.get_yaxis().labelpad = 15
+
+
+
+# Plotting the difference in SMB
+
+
+vmin = -3
+vmax = 3
+
+last_panel2 = ax[2].imshow(diff_smb, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title2 = 'Difference (m/yr w.e), ' + year2 + '-' + year1 
+
+ax[2].set_title(title2, fontsize=labelsize)
+
+
+pos = ax[2].get_position()
+cax = fig.add_axes([0.8, pos.y0, 0.015, pos.y1 - pos.y0])
+cbar = fig.colorbar(last_panel2,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+
+
+for i in range(len(ax)):
+    ax[i].invert_yaxis()
+    ax[i].set_xlabel('')
+    ax[i].set_ylabel('')
+    ax[i].set_xticklabels('')
+    ax[i].set_yticklabels('')
+    ax[i].set_xticks([])
+    ax[i].set_yticks([])
+
+
+
+
+../../../_images/19e7e1d8c86213c1e67fd671db564e5bc11031544651f28121af9fd5edf24d5e.png +
+
+
+
+

Ice Thickness#

+
+
+
labelsize=15
+my_cmap = mcm.get_cmap('Spectral_r')
+
+
+fig, ax = plt.subplots(1, 3, sharey=True, figsize=[21, 9])
+
+# Plotting thickness for year1
+
+vmin = 0
+vmax = 3500
+
+last_panel0 = ax[0].imshow(thk1, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title0 = 'Ice thickness (m), ' + year1 
+ax[0].set_title(title0, fontsize=labelsize)
+
+fig.subplots_adjust(right=0.8)
+
+pos = ax[0].get_position()
+cax = fig.add_axes([0.32, pos.y0, 0.015, pos.y1 - pos.y0])
+
+cbar = fig.colorbar(last_panel0,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+
+cbar.ax.get_yaxis().labelpad = 15
+
+
+
+# Plotting thickness for year2
+
+last_panel1 = ax[1].imshow(thk2, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title1 = 'Ice thickness (m), ' + year2 
+
+ax[1].set_title(title1, fontsize=labelsize)
+
+pos = ax[1].get_position()
+cax = fig.add_axes([0.56, pos.y0, 0.015, pos.y1 - pos.y0])
+cbar = fig.colorbar(last_panel1,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+cbar.ax.get_yaxis().labelpad = 15
+
+
+
+# Plotting the difference in ice thickness
+
+vmin = -300
+vmax = 300
+
+last_panel2 = ax[2].imshow(diff_thk, vmin=vmin, vmax=vmax,
+                       cmap=my_cmap)
+
+title2 = 'Difference (m), ' + year2 + '-' + year1 
+
+ax[2].set_title(title2, fontsize=labelsize)
+pos = ax[2].get_position()
+cax = fig.add_axes([0.8, pos.y0, 0.015, pos.y1 - pos.y0])
+cbar = fig.colorbar(last_panel2,cax=cax)
+cbar.ax.tick_params(labelsize=labelsize)
+
+
+for i in range(len(ax)):
+    ax[i].invert_yaxis()
+    ax[i].set_xlabel('')
+    ax[i].set_ylabel('')
+    ax[i].set_xticklabels('')
+    ax[i].set_yticklabels('')
+    ax[i].set_xticks([])
+    ax[i].set_yticks([])
+
+
+
+
+../../../_images/d9bdf37c00b9c590f5d56178f24912181493a22d6ab3f0daa70560ddcb068767.png +
+
+
+
+
+

Looking at time series#

+

Each output history file contains a few scalars that give information about the state of the ice sheet. Here we are going to look at:

+
    +
  • the grounded ice area

  • +
  • the ice mass

  • +
  • the ice mass above flotation

  • +
+
+ Combining all time for each scalar in a single time series file

+

While we could create an array using python for each scalar by looping through every single file, it is convenient to extract them in their own file using nco. +To do this we will use the command “ncrcat”

+

On derecho:

+
module load nco
+
+
+

For mass

+
ncrcat -v imass T_GrIS_SSP585_2015_2100.cism.h.*.nc mass.nc
+
+
+

For grounded ice area

+
ncrcat -v iareag T_GrIS_SSP585_2015_2100.cism.h.*.nc area_ground.nc
+
+
+

Now we can look at the time series evolution

+
+
+
# Loading the variables
+file_mass = path_to_file + "mass.nc"
+file_areag = path_to_file + "area_ground.nc"
+
+ncfile = Dataset(file_mass,'r')
+mass = ncfile.variables["imass"][:]
+time_mass = ncfile.variables["time"][:]
+ncfile.close()
+
+ncfile = Dataset(file_areag,'r')
+area = ncfile.variables["iareag"][:]
+time_area = ncfile.variables["time"][:]
+ncfile.close()
+
+
+
+
+
+
+
labelsize=15
+
+timemin = 2015
+timemax = 2101
+
+color = 'black'
+line = '-'
+
+plt.figure(figsize=(12,5))
+
+# Plotting the Ice mass evolution time series
+
+plt.subplot(121)
+plt.plot(time_mass, mass, line, ms=3, mfc=color, color=color)
+plt.xlim([timemin, timemax])
+plt.xlabel('Time (yr)', multialignment='center',fontsize=labelsize)
+plt.title('Ice mass evolution (kg)',fontsize=labelsize)
+
+
+# Plotting the Ice area evolution time series
+
+plt.subplot(122)
+plt.plot(time_area, area, line, ms=3, mfc=color, color=color)
+plt.xlim([timemin, timemax])
+plt.xlabel('Time (yr)', multialignment='center',fontsize=labelsize)
+plt.title('Ice area evolution (m2)',fontsize=labelsize)
+
+
+
+
+
Text(0.5, 1.0, 'Ice area evolution (m2)')
+
+
+../../../_images/d5e9aa2b789d8cba96db4711ac132bc332b8449f7f2d6306c8ba66bb9aaa23b4.png +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/cism/cism_exercise_3.html b/notebooks/challenge/cism/cism_exercise_3.html new file mode 100644 index 000000000..2dc45fa2a --- /dev/null +++ b/notebooks/challenge/cism/cism_exercise_3.html @@ -0,0 +1,802 @@ + + + + + + + + + + + Computing ice sheet related sea level change from a CISM simulation — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Computing ice sheet related sea level change from a CISM simulation

+ +
+
+ +
+
+
+ + + + +
+ + + + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/clm_ctsm/clm_ctsm.html b/notebooks/challenge/clm_ctsm/clm_ctsm.html new file mode 100644 index 000000000..b219eb79f --- /dev/null +++ b/notebooks/challenge/clm_ctsm/clm_ctsm.html @@ -0,0 +1,800 @@ + + + + + + + + + + + Land — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Land#

+

The land component of CESM is the Community Land Model (CLM), also refered to as the Community Terrestrial Systems Model (CTSM).

+

It can be useful for people interested in land science to run simulations with only an active land components and atmospheric forcing. In this exercise, you will learn how to run one of these land-only simulations.

+

This exercise was created by Peter Lawrence, Erik Kluzek and Alice DuVivier.

+
+

Learning Goals#

+
    +
  • Student will learn what a I compset is, the types of forcing available to run one, and how to run one.

  • +
  • Student will learn how to run a case with satellite phenology and one with prognostic crops and compare the two experiments.

  • +
  • Learn what inputs CLM needs and what they look like.

  • +
+
+
+

Exercise Details#

+
    +
  • This exercise uses the same code base as the rest of the tutorial.

  • +
  • You will be using the I2000Clm50Sp and IHistClm50BgcCrop compsets at the f09_g17_gl4 resolution.

  • +
  • You will run a control simulation and two experimental simulations.

  • +
  • You will modify netcdf input files.

  • +
  • You will use simple, command line netcdf tools to evaluate how the experiments differ from the control simulation.

  • +
+
+
+

Useful CLM references#

+
+
+

What is an I case?#

+

The I compset has active clm with a data atmosphere. The sea ice, ocean, atmosphere, and wave models are not active. There are two types of options for I compsets:

+
    +
  • SP: Satellite Phenology

  • +
  • BGC: Biogeochemistry

  • +
+

We will use the Satellite Phenology option for our control case.

+

icase

+

Figure: I2000 compset definition.

+
+
+

Post processing and viewing your output#

+

You will use ncview and NCO operator tools to evaluate how the experiments differ from the control simulation.

+

These tools will need to be loaded into your environment using the NCAR HPC modules.

+
    +
  1. You can create an annual average of the first year’s data for each simulationg using the ncra (netCDF averager) command from the netCDF operators package (NCO).

  2. +
+
ncra $OUTPUT_DIR/*.clm.*nc $CASENAME.cln.h.0001.nc
+
+
+
    +
  1. Create a file that contains differences between each of the experiments and the control simulation

  2. +
+
ncdiff i.day5.b.clm2.XXX.nc /glade/derecho/scratch/$user/archive/i.day5.a/lnd/hist/i.day5.a.clm2.XXX.nc i_diff.nc
+
+
+
    +
  1. Examine variables within each annual mean and the difference files using ncview

  2. +
+
ncview i_diff.nc
+
+
+
    +
  1. You can also look at other monthly-mean outputs or component log files.

  2. +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/clm_ctsm/clm_exercise_1.html b/notebooks/challenge/clm_ctsm/clm_exercise_1.html new file mode 100644 index 000000000..37962295a --- /dev/null +++ b/notebooks/challenge/clm_ctsm/clm_exercise_1.html @@ -0,0 +1,752 @@ + + + + + + + + + + + 1: Control case — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

1: Control case

+ +
+
+ +
+
+
+ + + + +
+ +
+

1: Control case#

+
+Exercise: Run a control case

+

Create a case called i.day5.a using the compset I2000Clm50Sp at f09_g17_gl4 resolution.

+

Set the run length to 5 days.

+

Build and run the model. Since this is a control case, we want to build it “out of the box” without any modifications.

+
+
+
+Click here for the solution
+

Create a new case i.day5.a with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts
+./create_newcase --case ~/cases/i.day5.a --compset I2000Clm50Sp --res f09_g17_gl4 --run-unsupported
+
+
+
+

Case setup:

+
cd ~/cases/i.day5.a 
+./case.setup
+
+
+
+

Change the clm namelist using user_nl_clm by adding the following lines:

+
hist_nhtfrq = -24
+hist_mfilt = 6
+
+
+
+

Check the namelist by running:

+
./preview_namelists
+
+
+
+

If needed, change job queue, account number, or wallclock time. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force,JOB_WALLCLOCK_TIME=0:15:00
+
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +i.day5.a.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/i.day5.a/lnd/hist
+
+ls 
+
+
+
+

(2) Look at the output using ncview

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/clm_ctsm/clm_exercise_2.html b/notebooks/challenge/clm_ctsm/clm_exercise_2.html new file mode 100644 index 000000000..32ddb73da --- /dev/null +++ b/notebooks/challenge/clm_ctsm/clm_exercise_2.html @@ -0,0 +1,807 @@ + + + + + + + + + + + 2: Use the BGC model — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

2: Use the BGC model

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

2: Use the BGC model#

+

We can use a different I compset: IHistClm50BgcCrop. This experiment is a 20th century transient run using GSWP3v1 and the biogeochemistry model including crops.

+

icase

+

Figure: IHIST compset definition.

+
+Exercise: Run an experimental case with prognostic BGC

+

Create a case called i.day5.b using the compset IHistClm50BgcCrop at f09_g17_gl4 resolution.

+

Set the run length to 5 days.

+

Build and run the model.

+
+
+Click here for the solution
+

Create a new case i.day5.b :

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts
+./create_newcase --case ~/cases/i.day5.b --compset IHistClm50BgcCrop --res f09_g17_gl4 --run-unsupported
+
+
+
+

Case setup:

+
cd ~/cases/i.day5.b
+./case.setup
+
+
+
+

Note differences between this case and the control case:

+
diff env_run.xml ../i.day5.a/env_run.xml
+
+
+
+

Change the clm namelist using user_nl_clm by adding the following lines:

+
hist_nhtfrq = -24
+hist_mfilt = 6
+
+
+
+

Check the namelist by running:

+
./preview_namelists
+
+
+
+

If needed, change job queue, account number, or wallclock time. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force,JOB_WALLCLOCK_TIME=0:15:00
+
+
+
+

Build case:

+
qcmd -- ./case.build
+
+
+
+

Compare the namelists from the two experiments:

+
diff CaseDocs/lnd_in ../i.day5.a/CaseDocs/lnd_in
+
+
+
+

Submit case:

+
./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +i.day5.b.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/i.day5.b/lnd/hist
+
+ls 
+
+
+
+

(2) Compare to control run:

+
ncdiff -v TLAI i.day5.b.clm2.XXX.nc /glade/derecho/scratch/$USER/archive/i.day5.a/lnd/hist/i.day5.a.clm2.XXX.nc i_diff.nc
+
+ncview i_diff.nc
+
+
+
+
+
+

Test your understanding#

+
    +
  • What changes do you see from the control case with the prognostic BGC?

  • +
  • … OTHERS?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/clm_ctsm/clm_exercise_3.html b/notebooks/challenge/clm_ctsm/clm_exercise_3.html new file mode 100644 index 000000000..b081c31ea --- /dev/null +++ b/notebooks/challenge/clm_ctsm/clm_exercise_3.html @@ -0,0 +1,820 @@ + + + + + + + + + + + 3: Modify input data — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

3: Modify input data

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

3: Modify input data#

+

We can modify the input to CLM by changing one of the plant functional type properties. We will then compare these results with the control experiment.

+

Note that you will need to change a netcdf file for this exercise. Because netcdf are in binary format you will need a type of script or interperter to read the file and write it out again. (e.g. ferret, IDL, NCL, NCO, Perl, Python, Matlab, Yorick). Below in the solution we will show how to do this using NCO.

+

NOTE: For any tasks other than setting up, building, submitting cases you should probably do these tasks on the Data Visualization Cluster - casper, and not on the derecho login nodes.

+
+Exercise: Run an experimental case

+

Create a case called i.day5.a_pft using the compset I2000Clm50Sp at f09_g17_gl4 resolution.

+

Look at variable “rholvis” in the forcing file using ncview or ncdump –v rholvis. This is the visible leaf reflectance for every pft. Modify the rholvis parameter to . +/glade/campaign/cesm/cesmdata/cseg/inputdata/lnd/clm2/paramdata/clm5_params.c171117.nc

+

Set the run length to 5 days.

+

Build and run the model.

+
+
+Click here for the solution
+

Create a clone from the control experiment i.day5.a_pft :

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts
+./create_clone --case ~/cases/i.day5.a_pft --clone ~/cases/i.day5.a
+
+
+
+

Modify the rholvis parameter in the physiology file:

+
cd /glade/derecho/scratch/$USER
+cp /glade/campaign/cesm/cesmdata/cseg/inputdata/lnd/clm2/paramdata/clm5_params.c171117.nc .
+chmod u+w clm5_params.c171117.nc
+cp clm5_params.c171117.nc clm5_params.c171117.new.nc
+ncap2 -A -v -s 'rholvis(4)=0.4' clm5_params.c171117.nc clm5_params.c171117.new.nc
+
+
+
+

Check the new rholvis parameter to be sure the modification worked:

+
ncdump -v rholvis clm5_params.c171117.new.nc
+# and compare it to the original file
+ncdiff clm5_params.c171117.nc clm5_params.c171117.new.nc ncdiff.nc
+ncdump -v rholvis ncdiff.nc
+
+
+
+

Case setup:

+
cd ~/cases/i.day5.a_pft
+./case.setup
+
+
+
+

Change the clm namelist using user_nl_clm to point at the modified file. Add the following line:

+
paramfile = '/glade/derecho/scratch/$USER/clm5_params.c171117.new.nc' 
+
+
+
+

Check the namelist by running:

+
./preview_namelists
+
+
+
+

If needed, change job queue, account number, or wallclock time. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force,JOB_WALLCLOCK_TIME=0:15:00
+
+
+
+

Build case:

+
qcmd -- ./case.build
+
+
+
+

Compare the namelists from the two experiments:

+
diff CaseDocs/lnd_in ../i.day5.a/CaseDocs/lnd_in
+
+
+
+

Submit case:

+
./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +i.day5.a.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/i.day5.a_pft/lnd/hist
+
+ls 
+
+
+
+

(2) Compare to control run:

+
ncdiff i.day5.a_pft.clm2.XXX.nc /glade/derecho/scratch/$USER/archive/i.day5.a/lnd/hist/i.day5.a.clm2.XXX.nc i_diff.nc
+
+ncview i_diff.nc
+
+
+
+
+

Test your understanding#

+
    +
  • How did rholvis change (increase/decrease)? Given this, what do you expect the model response to be?

  • +
  • What changes do you see from the control case with the modified rholvis parameter?

  • +
  • … OTHERS?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/mom/mom_exercise_5.html b/notebooks/challenge/mom/mom_exercise_5.html new file mode 100644 index 000000000..794a8b051 --- /dev/null +++ b/notebooks/challenge/mom/mom_exercise_5.html @@ -0,0 +1,841 @@ + + + + + + + + + + + 5: Control case using MOM6 — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

5: Control case using MOM6

+ +
+ +
+
+ + + + +
+ +
+

5: Control case using MOM6#

+
+We will use a different CESM tag (cesm2_3_beta17) for this exercise.
+
+

Download CESM (tag cesm2_3_beta17)#

+

If needed, revisit the Download CESM section before executing the following steps.

+
+

Git Clone#

+
+Change the current directory to the code workspace directory:
+
cd /glade/u/home/$USER/code
+
+
+
+

Download the cesm code to your code workspace directory as cesm2_3_beta17:

+
git clone https://github.com/ESCOMP/CESM.git cesm2_3_beta17
+cd cesm2_3_beta17
+git checkout cesm2_3_beta17
+
+
+
+
+
+

Download the Component Models with checkout_externals#

+

MOM6 is still an optional component in this version of CESM. Therefore, we need to run the checkout_externals command with the -o (optional) argument to download the required and optional component models:

+
+
cd /glade/u/home/$USER/code/cesm2_3_beta17
+./manage_externals/checkout_externals -o
+
+
+
+

*Note: If you get a message about accepting a certificate permanently or temporarily, accept the certificate permanently. If you do not get this message, do not worry, you are still on track!

+

Congratulations, you have now downloaded the cesm2_3_beta17 tag on your workspace!!

+
+
+
+

Exercise#

+
+Run a JRA-forced MOM6 control case

+

Create a case called gmom_jra.run_length using the compset GMOM_JRA at TL319_t232 resolution.

+

Set the run length to 5 year.

+

Build and run the model. Since this is a control case, we want to build it “out of the box” without any modifications.

+
+
+
+ Click here for hints +

How do I check the composets with MOM6?

+

Go to CESM2.2.0 Component Sets Definitions and look for “MOM” using the “Search” box.

+

How do I compile?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+
+

How do I check my solution?

+

When your run is completed, go to the archive directory.

+

(1) Check that your archive directory contains files mom6.h.z, mom6.h.sfc, etc

+

(2) Compare the contents of the h.z and h.sfc files using ncdump.

+
ncdump -h gmom_jra.run_length.mom6.h.z.0005-12.nc
+ncdump -h gmom_jra.run_length.mom6.h.sfc.0005-12.nc
+
+
+

(3) Look at the sizes of the files.

+
+
+
+
+Click here for the solution
+

Create a new case gmom_jra.run_length with the command:

+
cd /glade/u/home/$USER/code/cesm2_3_beta17/cime/scripts/
+./create_newcase --case /glade/u/home/$USER/cases/gmom_jra.run_length --compset GMOM_JRA --res TL319_t232 
+
+
+
+

Case setup:

+
cd ~/cases/gmom_jra.run_length 
+./case.setup
+
+
+
+

Change the run length:

+
./xmlchange STOP_N=5,STOP_OPTION=nyears
+
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +gmom_jra.run_length.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/gmom_jra.run_length/ocn/hist
+
+ls 
+
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/paleo/exercise_1.html b/notebooks/challenge/paleo/exercise_1.html new file mode 100644 index 000000000..dc70e8257 --- /dev/null +++ b/notebooks/challenge/paleo/exercise_1.html @@ -0,0 +1,807 @@ + + + + + + + + + + + 1: Preindustrial control case — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

1: Preindustrial control case

+ +
+
+ +
+
+
+ + + + +
+ +
+

1: Preindustrial control case#

+
+Exercise: Run a preindustrial control simulation

+

Create, configure, build and run a fully coupled preindustrial case called b.e21.B1850.f19_g17.piControl.001 following CESM naming conventions.

+

Run for 1 year.

+
+
+
+ Click here for hints +
+

What is the compset for fully coupled preindustrial?

+
    +
  • B1850

  • +
+

What is the resolution for B1850?

+
    +
  • Use resolution f19_g17 for fast throughput

  • +
+

Which XML variable should you change to tell the model to run for one year?

+
    +
  • Use STOP_OPTION and STOP_N

  • +
+

How to check if each XML variable is modified correctly?

+
    +
  • Use xmlquery -p

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

For tcsh users

+
set CASENAME=b.e21.B1850.f19_g17.piControl.001
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=B1850
+set RESOLUTION=f19_g17
+set PROJECT=UESM0013
+
+
+

Note: You should use the project number given for this tutorial.

+

For bash users

+
export CASENAME=b.e21.B1850.f19_g17.piControl.001
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=B1850
+export RESOLUTION=f19_g17
+export PROJECT=UESM0013
+
+
+

Note: You should use the project number given for this tutorial.

+

# Make a case directory

+

If needed create a directory cases into your home directory:

+
mkdir /glade/u/home/$USER/cases/
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --project $PROJECT
+
+
+

# Change the job queue

+

If needed, change job queue.
+For instance, to run in the queue main.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=main
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+
./xmlchange STOP_N=1,STOP_OPTION=nyears
+
+
+

# Build and submit

+
qcmd -A $PROJECT -- ./case.build
+./case.submit
+
+
+
+

# Check on your run

+

After submitting the job, use qstat -u $USER to check the status of your job. +It may take ~16 minutes to finish the one-year simulation.

+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is one-year, there should be 12 monthly files (h0) for each model component.

+

Success! Now let’s look back into the past…

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/paleo/exercise_2.html b/notebooks/challenge/paleo/exercise_2.html new file mode 100644 index 000000000..d194dcbd4 --- /dev/null +++ b/notebooks/challenge/paleo/exercise_2.html @@ -0,0 +1,883 @@ + + + + + + + + + + + 2: mid-Holocene case — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

2: mid-Holocene case

+ +
+
+ +
+
+
+ + + + +
+ +
+

2: mid-Holocene case#

+

The Holocene Epoch started ~11,700 before present (11.7 ka BP) and is the current period of geologic time.

+

Although humans were already well established before the Holocene, this period of time is also referred to as the Anthropocene Epoch because its primary characteristic is the global changes caused by human activity.

+

The Holocene is an interglacial period, marked by receding ice sheets and rising greenhouse gases that were accompanied by changes in the Earth’s orbit around the Sun.

+

Today, we will use CESM to investigate influence of Holocene orbital forcing on climate.

+
+Exercise: Run a mid-Holocene simulation with orbital forcing

+

Create, configure, build and run a fully coupled mid-Holocene (~6 ka BP) case called b.e21.B1850.f19_g17.midHolocene.001 following CESM naming conventions.

+

Run for 1 year.

+

Compare and visualize differences between preindustrial and mid-Holocene runs using NCO and Ncview.

+
+
+
+ Click here for hints +
+

What is the compset for fully coupled mid-Holocene run?

+
    +
  • Use B1850 and modify preindustrial orbital configuration (no mid-Holocene compset available)

  • +
+

What is the resolution for B1850?

+
    +
  • Use resolution f19_g17 for fast throughput

  • +
+

What was the orbital configuration 6 ka BP?

+
    +
  • According to Table 1 of Otto-Bliesner et al., (2017), Eccentricity = 0.018682, Obliquity (degrees) = 24.105, Perihelion = 0.87 (for simplicity, we don’t consider the other forcings here, i.e., CO2)

  • +
+

How to modify orbital configuration in CESM world?

+
    +
  • Edit user_nl_cpl

  • +
  • orb_mode = 'fixed_parameters'

  • +
  • orb_eccen = 0.018682

  • +
  • orb_obliq = 24.105

  • +
  • orb_mvelp = 0.87

  • +
+
+
+
+
+Click here for the solution
+

# Set environment variables

+

Set environment variables with the commands:

+

For tcsh users

+
set CASENAME=b.e21.B1850.f19_g17.midHolocene.001
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=B1850
+set RESOLUTION=f19_g17
+set PROJECT=UESM0013
+
+
+

You should use the project number given for this tutorial.

+

For bash users

+
export CASENAME=b.e21.B1850.f19_g17.midHolocene.001
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=B1850
+export RESOLUTION=f19_g17
+export PROJECT=UESM0013
+
+
+

You should use the project number given for this tutorial.

+

# Make a case directory

+

If needed create a directory cases into your home directory:

+
mkdir /glade/u/home/$USER/cases/
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --project $PROJECT
+
+
+

# Change the job queue

+

If needed, change job queue.
+For instance, to run in the queue main.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=main
+
+
+

This step can be redone at anytime in the process.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+
./xmlchange STOP_N=1,STOP_OPTION=nyears
+
+
+

# Add the following to user_nl_cpl

+
orb_mode = 'fixed_parameters' 
+ orb_eccen = 0.018682
+ orb_obliq = 24.105
+ orb_mvelp = 0.87
+
+
+

# Build and submit

+
qcmd -A $PROJECT -- ./case.build
+./case.submit
+
+
+
+

# Validate your simulation setup

+

(1) If you want to check the log file, cpl.log.xxx, in the Run Directory (when model is still running) or in your Storage Directory (when the simulation and archiving have finished).

+

Note: The less command in Linux is a terminal pager program used to view (but not change) the contents of a text file one screen at a time. It is particularly useful for large files, as it does not need to read the entire file before starting, hence it loads large files faster than editors like vi or emacs.

+

To skip to the bottom of the file, press <shift> + g +To stop viewing the contents of the file with less, press q.

+
less /glade/derecho/scratch/$USER/$CASENAME/run/cpl.log.* 
+less /glade/derecho/scratch/$USER/archive/$CASENAME/logs/cpl.log.*.gz 
+
+
+

Alternatively, use the real-time monitoring mode with less that you can activate with the +F (forward) option. Now, new lines will be continuously displayed as they are added to the file during the run. +To exit forward mode and revert to the standard interactive mode of less, press <ctrl> + C.

+
less +F /glade/derecho/scratch/$USER/$CASENAME/run/cpl.log.* 
+
+
+

(2) Type /orb_params to search, you should see the following

+
 (shr_orb_params) Calculate characteristics of the orbit:
+ (shr_orb_params) Calculate orbit for year:     -4050
+ (shr_orb_params) ------ Computed Orbital Parameters ------
+ (shr_orb_params) Eccentricity      =   1.868182E-02
+ (shr_orb_params) Obliquity (deg)   =   2.410538E+01
+ (shr_orb_params) Obliquity (rad)   =   4.207183E-01
+ (shr_orb_params) Long of perh(deg) =   8.696128E-01
+ (shr_orb_params) Long of perh(rad) =   3.156770E+00
+ (shr_orb_params) Long at v.e.(rad) =  -5.751115E-04
+
+
+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is one-year, there should be 12 monthly files (h0) for each model component.

+
+
+
+
+ Click here to visualize results +
+

# Use Ncview to visualize solar insolation

+

Earth’s orbital configuration influences incoming solar insolation. +Take a look at the SOLIN CAM variable for August in the pre-industrial and mid-Holocene runs.

+
module load ncview
+cd /glade/derecho/scratch/$USER/archive
+ncview b.e21.B1850.f19_g17.piControl.001/atm/hist/b.e21.B1850.f19_g17.piControl.001.cam.h0.0001-08.nc b.e21.B1850.f19_g17.midHolocene.001/atm/hist/b.e21.B1850.f19_g17.midHolocene.001.cam.h0.0001-08.nc
+
+
+

Using the right arrow button in the Ncview window, you can toggle between pre-industrial and mid-Holocene August SOLIN and other variables.

+

A few side notes on comparing pre-industrial and mid-Holocene runs:

+
    +
  • Changes in Earth’s orbit alter the length of months or seasons over time, this is referred to as the ‘paleo calendar effect’

  • +
  • This means that the modern fixed-length definition of months do not apply when the Earth traversed different portions of its orbit

  • +
  • Tools exist to adjust monthly CESM output to account for the ‘paleo calendar effect’

  • +
  • See PaleoCalAdjust tool from Bartlein & Shafer et al. (2019) for more information

  • +
  • For simplicity, we assume in this exercise that the definition of months is the same for the pre-industrial and mid-Holocene

  • +
+

Now, let’s take a look at the differences between the two cases more clearly using NCO.

+
module load nco
+cd /glade/derecho/scratch/$USER/archive
+ncdiff b.e21.B1850.f19_g17.piControl.001/atm/hist/b.e21.B1850.f19_g17.midHolocene.001.cam.h0.0001-08.nc b.e21.B1850.f19_g17.piControl.001/atm/hist/b.e21.B1850.f19_g17.piControl.001.cam.h0.0001-08.nc diff_MH-PI_0001-08.nc 
+ncview diff_MH-PI_0001-08.nc 
+
+
+

Note: Running ncdiff this way will place diff_MH-PI_0001-08.nc in your archive directory. You may use mv to move diff_MH-PI_0001-08.nc to another directory.

+

# Questions for reflection:

+
    +
  • Which orbital parameters are different at the middle Holocene (6 ka BP)?

  • +
  • How does the orbital parameter impact the top-of-atmosphere shortwave radiation (solar insolation) during summertime in the Northern Hemisphere?

  • +
  • Do the results look correct? You can compare your results with Figure 3b of Otto-Bliesner et al., (2017)

  • +
  • What other aspects of climate are different between the mid-Holocene and pre-industrial runs?

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/paleo/exercise_3.html b/notebooks/challenge/paleo/exercise_3.html new file mode 100644 index 000000000..d6c6abb69 --- /dev/null +++ b/notebooks/challenge/paleo/exercise_3.html @@ -0,0 +1,923 @@ + + + + + + + + + + + 3: Water isotope tracers in CESM — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

3: Water isotope tracers in CESM

+ +
+
+ +
+
+
+ + + + +
+ +
+

3: Water isotope tracers in CESM#

+
+Exercise: Run a preindustrial simulation with water isotope tracers

+

Download (git clone) isotope-enabled CESM1.3 (iCESM1.3; code available here), as the version of CESM used in this tutorial does not include water isotope capabilities.

+

Create, configure, build and run a fully coupled preindustrial case called b.e13.B1850.f19_g16.piControl.001 following CESM naming conventions including water isotope tracers.

+

Run for 1 year.

+
+
+
+ Click here for hints +
+

What is the resolution for B1850?

+
    +
  • Use resolution f19_g16 for fast throughput

  • +
+

Which XML variable should you change to tell the model to run for one year?

+
    +
  • Use STOP_OPTION and STOP_N

  • +
+

How to check if each XML variable is modified correctly?

+
    +
  • Use xmlquery -p

  • +
+
+
+
+
+Click here for the solution
+

# Download iCESM1.3 code

+
cd /glade/u/home/$USER/code 
+git clone https://github.com/NCAR/iCESM1.3_iHESP_hires iCESM1.3_iHESP_hires 
+cd iCESM1.3_iHESP_hires 
+./manage_externals/checkout_externals 
+
+
+

# Set environment variables

+

Set environment variables with the commands:

+

For tcsh users

+
set CASENAME=b.e13.B1850C5.f19_g16.piControl.001
+set CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+set RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+set COMPSET=B1850C5
+set RESOLUTION=f19_g16
+set PROJECT=UESM0013
+
+
+

Note: You should use the project number given for this tutorial.

+

For bash users

+
export CASENAME=b.e13.B1850C5.f19_g16.piControl.001
+export CASEDIR=/glade/u/home/$USER/cases/$CASENAME
+export RUNDIR=/glade/derecho/scratch/$USER/$CASENAME/run
+export COMPSET=B1850C5
+export RESOLUTION=f19_g16
+export PROJECT=UESM0013
+
+
+

Note: You should use the project number given for this tutorial.

+

# Make a case directory

+

If needed create a directory cases into your home directory:

+
mkdir /glade/u/home/$USER/cases/
+
+
+

# Create a new case

+

Create a new case with the command create_newcase:

+
cd /glade/u/home/$USER/code/iCESM1.3_iHESP_hires/cime/scripts/
+./create_newcase --case $CASEDIR --res $RESOLUTION --compset $COMPSET --project $PROJECT --run-unsupported 
+
+
+

# Change the job queue

+

If needed, change job queue.
+For instance, to run in the queue main.

+
cd $CASEDIR
+./xmlchange JOB_QUEUE=main
+
+
+

This step can be redone at anytime in the process before running case.submit.

+

# Setup

+

Invoke case.setup with the command:

+
cd $CASEDIR
+./case.setup    
+
+
+

You build the namelists with the command:

+
./preview_namelists
+
+
+

This step is optional as the script preview_namelists is automatically called by case.build and case.submit. But it is nice to check that your changes made their way into:

+
$CASEDIR/CaseDocs/atm_in
+
+
+

# Set run length

+
./xmlchange STOP_N=1,STOP_OPTION=nyears
+
+
+

# Build the run

+
qcmd -A $PROJECT -- ./case.build
+
+
+

# Which namelist variables enable water isotope tracers?

+
    +
  • Notice that the steps to set up this isotope-enabled preindustrial simulation are very similar to a preindustrial simulation without isotopes (e.g., Paleo Exercise 1)

  • +
  • In iCESM1.3, it is assumed you will run with water isotope tracers so each compset include isotope settings by default

  • +
  • Use ./xmlquery to explore how FLDS_WISO, CAM_CONFIG_OPTS, and OCN_TRACER_MODULES differ between this iCESM1.3 case and that of Exercise 1

  • +
  • Also, take a look at namelist settings for each CESM component with variables that contain wiso in $CASEDIR/Buildconf

  • +
+

# Submit the run

+
./case.submit
+
+
+
+

# Check on your run

+

After submitting the job, use qstat -u $USER to check the status of your job.

+

# Check your solution

+

When the run is completed, look at the history files into the archive directory.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ls 
+
+
+

As your run is one-year, there should be 12 monthly files (h0) for each model component.

+

Success! Let’s plot the results.

+
+
+
+
+ Click here to visualize results +
+

————— Option 1 —————

+

# Use NCO to calculate the oxygen isotopic composition of precipitation

+

The ratio of heavy (\(^{18}\text{O}\)) to light (\(^{16}\text{O}\))) isotopes are most commonly expressed relative to a standard in delta (δ) notation:

+
+\[ \delta^{18}\text{O} = \frac{R_{\text{sample}} - R_{\text{std}}}{R_{\text{std}}} \times 1000‰ \]
+

where

+
    +
  • \(R_{\text{sample}}\) = ratio of \(^{18}\text{O}\) to \(^{16}\text{O}\) in sample

  • +
  • \(R_{\text{std}}\) = ratio of \(^{18}\text{O}\) to \(^{16}\text{O}\) in a standard

  • +
+

Thus, the \(\delta^{18}\text{O}\) of a sample which is identical to the standard would be 0‰, positive values indicate a greater proportion of \(^{18}\text{O}\) than the standard, and negative values indicate a lower proportion of \(^{18}\text{O}\) .

+

In isotope-enabled CESM, the relative abundances of \(^{16}\text{O}\) and \(^{18}\text{O}\) are already adjusted to their naturally occurring global abundances (99.757% and 0.205%, respectively), so we do not include \(R_{\text{std}}\) in the calculation of \(\delta^{18}\text{O}\). Rather, isotope variables in CESM are expressed in delta (δ) notation as:

+
+\[ \delta^{18}O = (\frac{\text{PRECRC_H218Or} + \text{PRECSC_H218Os} + \text{PRECRL_H218OR} + \text{PRECSL_H218OS}}{\text{PRECRC_H216Or} + \text{PRECSC_H216Os} + \text{PRECRL_H216OR} + \text{PRECSL_H216OS}} - 1) \times 1000‰ \]
+
    +
  • Use ncdump /glade/derecho/scratch/$USER/$CASENAME/atm/hist/$CASENAME.cam.h0.0001-01.nc | less to check the definition of each isotope variable above

  • +
  • For example, search for PRECRC_H218Or using /PRECRC_H218Or + <enter>)

  • +
+

To calculate the δ18O of precipitation from the simulation using NCO,

+
cd /glade/derecho/scratch/$USER/archive/$CASENAME/atm/hist
+ncap2 -s 'd18Op=((PRECRC_H218Or+PRECSC_H218Os+PRECRL_H218OR+PRECSL_H218OS)/(PRECRC_H216Or+PRECSC_H216Os+PRECRL_H216OR+PRECSL_H216OS) - 1)*1000.' -v $CASENAME.cam.h0.0001-12.nc d18Op.$CASENAME.cam.h0.0001-12.nc 
+
+
+

# Use Ncview to visualize precipitation \(\delta^{18}\text{O}\)

+

Earth’s orbital configuration influences incoming solar insolation. +Take a look at the d18Op variable we calculated for 1 month in the pre-industrial run.

+
module load ncview
+ncview d18Op.$CASENAME.cam.h0.0001-12.nc 
+
+
+

————— Option 2 —————

+

# Use Python to calculate and plot the oxygen isotopic composition of precipitation

+

The following Python code will produce a plot of precipitation δ18O for 1 month.

+
import xarray as xr 
+import numpy as np 
+import matplotlib.pyplot as plt 
+import cartopy.crs as ccrs 
+from cartopy.util import add_cyclic_point 
+
+def calculate_d18Op(ds): 
+    # Compute precipitation δ18O with iCESM output 
+    
+    # Parameters 
+    # ds: xarray.Dataset contains necessary variables 
+    
+    # Returns 
+    # ds: xarray.Dataset with δ18O added 
+    
+    # convective & large-scale rain and snow, respectively 
+    p16O = ds.PRECRC_H216Or + ds.PRECSC_H216Os + ds.PRECRL_H216OR + ds.PRECSL_H216OS 
+    p18O = ds.PRECRC_H218Or + ds.PRECSC_H218Os + ds.PRECRL_H218OR + ds.PRECSL_H218OS 
+    
+    # avoid dividing by small number here 
+    p18O = p18O.where(p16O > 1.E-18, 1.E-18) 
+    p16O = p16O.where(p16O > 1.E-18, 1.E-18) 
+    d18O = (p18O / p16O - 1.0) * 1000.0 
+    
+    ds['p16O'] = p16O 
+    ds['p18O'] = p18O 
+    ds['d18O'] = d18O 
+    return ds 
+
+# Read in monthly file 
+case = 'b.e13.B1850C5.f19_g16.piControl.001' 
+file = '/glade/derecho/scratch/macarew/archive/'+case+'/atm/hist/'+case+'.cam.h0.0001-12.nc' 
+ds = xr.open_mfdataset(file, parallel=True, 
+                       data_vars='minimal', 
+                       coords='minimal', 
+                       compat='override') 
+
+# Call function to add preciptation d18O to dataset 
+ds = calculate_d18Op(ds) 
+
+fig, ax = plt.subplots( 
+    nrows=1, ncols=1, 
+    figsize=(6, 2), 
+    subplot_kw={'projection': ccrs.Robinson(central_longitude=210)}, 
+    constrained_layout=True) 
+
+d18O_new, lon_new = add_cyclic_point(ds.d18O[0,:,:], ds.lon) 
+
+# Plot model results using contourf 
+p0 = ax.contourf(lon_new, ds.lat, d18O_new, 
+                 levels=np.linspace(-30, 0, 16), extend='both', 
+                 transform=ccrs.PlateCarree()) 
+
+plt.colorbar(p0, ax=ax) 
+ax.set_title('Dec δ18Op of PI') 
+ax.coastlines(linewidth=0.5) 
+
+
+

————— Questions for reflection —————

+
    +
  • Do you notice any spatial patterns in precipitation \(\delta^{18}\text{O}\)?

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/paleo/paleo.html b/notebooks/challenge/paleo/paleo.html new file mode 100644 index 000000000..05ad0f11f --- /dev/null +++ b/notebooks/challenge/paleo/paleo.html @@ -0,0 +1,763 @@ + + + + + + + + + + + Paleo — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Paleo

+ +
+ +
+
+ + + + +
+ +
+

Paleo#

+

Paleoclimatology is the study of ancient climate variability and change, before the availability of instrumental records.

+

Paleoclimatology relies on a combination of physical, biological, and chemical proxies of past environmental and climate change, such as glacial ice, tree rings, sediments, corals, and cave mineral deposits.

+

CESM is widely used for paleoclimate studies.

+

CESM simulations of past climates are a tool to better understand and interpret proxy reconstructions and to evaluate CESM skill in simulating out-of-sample climate states.

+

Many proxy reconstructions are made using measurements of isotopic ratios in natural archives.

+

A version of CESM with the capability to simulate hydrogen and oxygen isotope ratios in the water cycle (isotope-enabled CESM) is commonly used in paleoclimate studies to provide more direct signals of comparison with proxies.

+
+

Learning Goals#

+
    +
  • Student will learn how to modify Earth’s orbital configuration in CESM for a simple paleoclimate experiment.

  • +
  • Student will learn how to validate that the orbital modification is implemented properly.

  • +
  • Student will learn how to quickly compare differences in paleo and preindustrial CESM runs using NCO and Ncview.

  • +
  • Student will learn how to run a preindustrial isotope-enabled CESM experiment and plot precipitation δ18O.

  • +
+
+
+

Exercise 1-2 Details#

+
    +
  • This exercise uses the same code base as the rest of the tutorial.

  • +
  • You will be using the B1850 compset at the f19_g17 resolution.

  • +
  • You will run a preindustrial control simulation and a simple mid-Holocene simulation.

  • +
+
+
+

Exercise 3 Details#

+
    +
  • This exercise uses a different code base from the rest of the tutorial (isotope-enabled CESM1.3).

  • +
  • You will be using the B1850C5 compset at the f19_g16 resolution.

  • +
  • You will run a preindustrial simulation with water isotope tracers.

  • +
+

Water isotope partitioning

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/pop/pop.html b/notebooks/challenge/pop/pop.html new file mode 100644 index 000000000..9b461b77e --- /dev/null +++ b/notebooks/challenge/pop/pop.html @@ -0,0 +1,821 @@ + + + + + + + + + + + Ocean — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Ocean#

+

The default ocean component of CESM is the Parallel Ocean Program (POP). This will change in CESM3, where the default ocean component will be the Modular Ocean Model version 6 (MOM6). You will have the option to run a case using MOM6 in the last challenge exercise.

+

It can be helpful for people interested in ocean science to run simulations with only active sea ice and ocean components and atmospheric forcing. This exercise will teach you how to run one of these ice-ocean simulations.

+

This exercise was created by Gustavo Marques.

+
+

Learning Goals#

+
    +
  • Student will learn what a G compset is, the types of forcing available to run one, and how to run one.

  • +
  • Student will learn how to make a namelist modification that turns off the overflow parameterization and compare results with a control experiment.

  • +
  • Student will learn how to make a source code modification that changes zonal wind stress and compare results with a control experiment.

  • +
  • Student will learn what a G1850ECO compset is and compare it to the G compset.

  • +
  • Student will learn how to run a G compset using MOM6.

  • +
+
+
+

Exercise Details#

+
    +
  • All exercises except the last one (“5 - Control case using MOM6”) use the same code base as the rest of the tutorial.

  • +
  • You will be using the G compset at the T62_g37 resolution (or TL319_t232 when using MOM6).

  • +
  • You will run a control simulation and three experimental simulations. Each simulation will be run for one year.

  • +
  • You will then use ‘ncview’ (http://meteora.ucsd.edu/~pierce/ncview_home_page.html) to evaluate how the experiments differ from the control simulation.

  • +
+
+
+

Useful POP references#

+
+
+

Useful MOM6 references#

+
+
+

What is a G case?#

+

The G compset has active and coupled ocean and sea-ice components. The G compset requires boundary forcing from the atmosphere. The G compset is forced with atmospheric data that does not change interactively as the ocean and sea-ice evolve in time. The land and land ice are not active during a G compset experiment and the runoff is specified.

+

gcase

+

Figure: G compset definition.

+
+
+

G Compset forcing data#

+

There are two types of temporal forcing for G compsets:

+
    +
  • Normal Year Forcing (NYF) is 12 months of atmospheric data (like a climatology) that repeats every year. NYF is the default forcing.

  • +
  • Interannual varying forcing (GIAF) is forcing that varies by year over the time period (1948-2017).

  • +
+

There are two datasets that can be used for G compsets:

+ +

In these exercises we will use the CORE NYF.

+
+
+

Post processing and viewing your output#

+
    +
  1. You can create an annual average of the first year’s data for each simulationg using the ncra (netCDF averager) command from the netCDF operators package (NCO).

  2. +
+
ncra $OUTPUT_DIR/*.pop.h.0001*nc $CASENAME.pop.h.0001.nc
+
+
+
    +
  1. Create a file that contains differences between each of the experiments and the control simulation

  2. +
+
ncdiff $CASENAME.pop.h.0001.nc $CONTROLCASE.pop.h.0001.nc $CASENAME_diff.nc
+
+
+
    +
  1. Examine variables within each annual mean and the difference files using ncview

  2. +
+
ncview $CASENAME_diff.nc
+
+
+
    +
  1. You can also look at other monthly-mean outputs or component log files.

  2. +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/pop/pop_exercise_1.html b/notebooks/challenge/pop/pop_exercise_1.html new file mode 100644 index 000000000..f8a3fa444 --- /dev/null +++ b/notebooks/challenge/pop/pop_exercise_1.html @@ -0,0 +1,773 @@ + + + + + + + + + + + 1: Control case — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

1: Control case

+ +
+
+ +
+
+
+ + + + +
+ +
+

1: Control case#

+

NOTE: Building the control case for the POP challenge exercises is idential to building the control case in the CICE challenge exercises. If you have already completed the CICE challenge exercises you can skip this step.

+
+Exercise: Run a control case

+

Create a case called g_control using the compset G at T62_g37 resolution.

+

Set the run length to 1 year.

+

Build and run the model. Since this is a control case, we want to build it “out of the box” without any modifications.

+
+
+
+ Click here for hints +

How do I compile?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+

How do I control the output?

+

Check the following links:

+ +

How do I check my solution?

+

When your run is completed, go to the archive directory.

+

(1) Check that your archive directory contains files pop.h., pop.h.nday1, etc

+

(2) Compare the contents of the h and h.nday1 files using ncdump.

+
ncdump -h gpop.pop.h.0001-01-01-00000.nc
+ncdump -h gpop.pop.h.nday1.0001-01-01-00000.nc
+
+
+

(3) Look at the sizes of the files.

+
+
+
+
+Click here for the solution
+

Create a new case g_control with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case /glade/u/home/$USER/cases/g_control  --compset G --res T62_g37 
+
+
+
+

Case setup:

+
cd ~/cases/g_control 
+./case.setup
+
+
+
+

Change the run length:

+
./xmlchange STOP_N=1,STOP_OPTION=nyears
+
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

When the run is completed, look into the archive directory for: +g_control.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/g_control/ocn/hist
+
+ls 
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/pop/pop_exercise_2.html b/notebooks/challenge/pop/pop_exercise_2.html new file mode 100644 index 000000000..e2c3720d2 --- /dev/null +++ b/notebooks/challenge/pop/pop_exercise_2.html @@ -0,0 +1,800 @@ + + + + + + + + + + + 2: Turn off parameterization — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

2: Turn off parameterization

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

2: Turn off parameterization#

+

Oceanic overflows are dense currents originating in semienclosed basins or continental shelves. They contribute to the formation of abyssal waters and play a crucial role in large-scale ocean circulation. When these dense currents flow down the continental slope, they undergo intense mixing with the surrounding (ambient) ocean waters, causing significant changes in their density and transport (see figure below). However, these mixing processes occur on scales that are smaller than what ocean climate models can accurately capture, leading to poor simulations of deep waters and deep western boundary currents. To improve the representation of overflows some ocean climate models rely on overflow paramterizations, such as the one developed for the POP model (check this report for additional information).

+

overflows

+

Figure: Physical processes acting in overflows (from Legg et al., 2009)

+
+Exercise: Turn off overflow parameterization

+

Create a case called g_overflows by cloning the control experiment case.

+

Verify that the run length is set to 1 year.

+

In user_nl_pop make the following modifications:overflows_on = .false. and overflows_interactive = .false.

+

Build and run the model for one year.

+

Compare the simulations using ncview/ncdiff, etc.

+
+
+
+ Click here for hints +

How do I compile and run?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+

You can run with the command:

+
./case.submit
+
+
+

How do I check the lenght of the run?

+

Use xmlquery to search for the variables that control the run length

+
+
+
+
+Click here for the solution
+

Clone a new case g_overflows from your control experiment with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_clone --case /glade/u/home/$USER/cases/g_overflows --clone /glade/u/home/$USER/cases/g_control
+
+
+

Case setup:

+
cd /glade/u/home/$USER/cases/g_overflows
+./case.setup
+
+
+

Verify that the run length is 1 year:

+
./xmlquery STOP_N
+./xmlquery STOP_OPTION
+
+
+

Edit the file user_nl_pop and add the lines:

+
 overflows_on = .false.
+ overflows_interactive = .false.
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+

When the run is completed, look into the archive directory for: +g_overflows.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/g_overflows/ocn/hist
+ls 
+
+
+
+
+
+

Test your understanding#

+
    +
  • What variables do you expect to change when you turn off the overflow parameterization?

  • +
  • What variables show a difference between this experiment and the control difference? How different are they?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/pop/pop_exercise_3.html b/notebooks/challenge/pop/pop_exercise_3.html new file mode 100644 index 000000000..f489fa200 --- /dev/null +++ b/notebooks/challenge/pop/pop_exercise_3.html @@ -0,0 +1,800 @@ + + + + + + + + + + + 3: Modify wind stress — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

3: Modify wind stress

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

3: Modify wind stress#

+

Wind stress plays a critical role in driving ocean currents and is a key factor in shaping the overall patterns of large-scale ocean circulation and, consequentialy, the climate. Further details on how wind stress affects the ocean circulation are discussed in this manuscript.

+
+Exercise: Increase zonal wind stress

+

Create a case called g_windstress by cloning the control experiment case.

+

Verify that the run length is set to 1 year.

+

Modify the subroutine rotate_wind_stress in forcing_coupled.F90 to increase the first (x) component of the wind stress by 25%.

+

Build and run the model for one year.

+

Compare the simulations using ncview/ncdiff, etc.

+
+
+
+ Click here for hints +

How do I compile and run?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+

You can run with the command:

+
./case.submit
+
+
+

How do I check the lenght of the run?

+

Use xmlquery to search for the variables that control the run length

+
+
+
+Click here for the solution
+

Clone a new case g_windstress from your control experiment with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_clone --case /glade/u/home/$USER/cases/g_windstress --clone /glade/u/home/$USER/cases/g_control
+
+
+

Case setup:

+
cd /glade/u/home/$USER/cases/g_windstress
+./case.setup
+
+
+

Verify that the run length is 1 year:

+
./xmlquery STOP_N
+./xmlquery STOP_OPTION
+
+
+

Copy the forcing_coupled.F90 file from the control case to the ocean SourceMods.

+
cp /glade/u/home/$USER/code/my_cesm_code/components/pop/source/forcing_coupled.F90 /glade/u/home/$USER/cases/g_windstress/SourceMods/src.pop
+
+
+

Edit the file forcing_coupled.F90 in the rotate_wind_stress routine after SMFT(:,:,1,:) is defined:

+
 SMFT(:,:,1,:) = SMFT(:,:,1,:) * 1.25
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+

When the run is completed, look into the archive directory for: +g_windstress.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$user/archive/g_windstress/ocn/hist
+ls 
+
+
+
+
+

Test your understanding#

+
    +
  • What are the impacts of increased zonal wind stress?

  • +
  • Where do you thinkt he impacts would be largest in the ocean?

  • +
  • How do you think the changes would compare if you increased meridional wind stress?

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/challenge/pop/pop_exercise_4.html b/notebooks/challenge/pop/pop_exercise_4.html new file mode 100644 index 000000000..5de2870b5 --- /dev/null +++ b/notebooks/challenge/pop/pop_exercise_4.html @@ -0,0 +1,759 @@ + + + + + + + + + + + 4: Turn on the ecosystem — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

4: Turn on the ecosystem

+ +
+
+ +
+
+
+ + + + +
+ +
+

4: Turn on the ecosystem#

+

You can also explore setting up a similar case but using the G1850ECO component set. Note how this differs from the previous G component set we used in Exercise 1.

+

gcase

+

Figure: G1850ECO compset definition.

+
+Exercise: Run a control case

+

Create a case called g_eco1850 using the compset G1850ECO at T62_g37 resolution.

+

Set the run length to 1 year.

+

Build and run the model. Since this is a control case, we want to build it “out of the box” without any modifications.

+
+
+
+ Click here for hints +

How do I compile and run?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+

You can run with the command:

+
./case.submit
+
+
+

How do I check the lenght of the run?

+

Use xmlquery to search for the variables that control the run length

+
+
+
+Click here for the solution
+

Create a new case G1850ECO with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case /glade/u/home/$USER/cases/G1850ECO  --compset G1850ECO --res T62_g37
+
+
+

Case setup:

+
cd /glade/u/home/$USER/cases/G1850ECO 
+./case.setup
+
+
+

Change the run length:

+
./xmlchange STOP_N=1,STOP_OPTION=nyears
+
+
+

If needed, change job queue +and account number. +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+

When the run is completed, look into the archive directory for: +G1850ECO.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/G1850ECO/ocn/hist
+ls 
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/additional/additional.html b/notebooks/diagnostics/additional/additional.html new file mode 100644 index 000000000..6e4fee5b4 --- /dev/null +++ b/notebooks/diagnostics/additional/additional.html @@ -0,0 +1,706 @@ + + + + + + + + + + + Additional Topics — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Additional Topics

+ +
+
+ +
+
+
+ + + + +
+ +
+

Additional Topics#

+

This section provides other information about how to use CESM output including:

+
    +
  • The difference between timeseries and history files

  • +
  • The Climate Variabilty and Diagnostics Package (CVDP)

  • +
  • Links to different analysis tools and resources used by CESM developers and users

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/additional/adf.html b/notebooks/diagnostics/additional/adf.html new file mode 100644 index 000000000..e586a412a --- /dev/null +++ b/notebooks/diagnostics/additional/adf.html @@ -0,0 +1,743 @@ + + + + + + + + + + + ADF — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

ADF

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

ADF#

+
+

Learning Goals#

+
    +
  • Enter learning goals here.

  • +
+
+
+
+

Subsection 1#

+

Info here

+
+
+
+

Subsection 2#

+

Info here

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/additional/analysis_tools.html b/notebooks/diagnostics/additional/analysis_tools.html new file mode 100644 index 000000000..c96d3c5d5 --- /dev/null +++ b/notebooks/diagnostics/additional/analysis_tools.html @@ -0,0 +1,828 @@ + + + + + + + + + + + CESM analysis tools — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

CESM analysis tools#

+

We have provided some information about tools the CESM users and developers use for analysis of model simulations below. This list is not comprehensive and is intended to provide you with information to start your searches.

+
+

Analysis Software#

+

Many data analysis and visualization software packages are freely available for use on CISL-managed resources. These packages include some developed and supported by NCAR and CISL. Some of these resources are open source while others require licences.

+

Some of these packages include:

+
    +
  • Numerous python packages

  • +
  • Interactive Data Language (IDL)

  • +
  • MATLAB

  • +
  • NCAR Command Language (NCL)

  • +
+
+
+

Python#

+

Python is an open source, general-purpose programming language.

+

Python is known for:

+
    +
  • having a wide range of applications and packages available. There is a huge user base and rougly ~1 gazillion online tutorials.

  • +
  • active development in packages related to the geosciences.

  • +
+

Python is becoming the dominant language for CESM developers and users, so most of the active development of tools for the CESM project at large are done in this language. We provide more detailed information below about some of the tools available for python users on NCAR computing assets.

+
+

Jupyter Hub#

+

The JupyterHub deployment that CISL manages allows “push-button” access to NCAR’s supercomputing resource cluster of nodes used for data analysis and visualization, machine learning, and deep learning.

+

JupyterHub gives users the ability to create, save, and share Jupyter Notebooks through the JupyterLab interface and to run interactive, web-based analysis, visualization and compute jobs on derecho and casper.

+

Information about getting started with JupyterHub on NCAR computing resources, environments, and documentation is avaiable at the website below.

+
+
+

Earth System Data Science initiative (ESDS)#

+

ESDS is an NCAR initiative that seeks to foster a collaborative, open, inclusive community for Earth Science data analysis. ESDS promotes deeper collaboration centered on analytics, improving our capacity to deliver impactful, actionable, reproducible science and serve the university community by transforming how geoscientists synthesize and extract information from large, diverse data sets.

+

More information, including FAQs and a blog with examples can be found at the website below.

+
+
+

Project Pythia#

+

If you are new to Python and its application to the geosciences, then starting with Project Pythia is a good first step. Project Pythia is the education working group for Pangeo and is an educational resource for the entire geoscience community. Together these initiatives are helping geoscientists make sense of huge volumes of numerical scientific data using tools that facilitate open, reproducible science, and building an inclusive community of practice around these goals.

+
+
+

GeoCAT#

+

The Geoscience Community Analysis Toolkit (GeoCAT) is a software engineering effort at NCAR. GeoCAT aims to create scalable data analysis and visualization tools for Earth System Science data to serve the geosciences community in the scientific Python ecosystem. GeoCAT tools are built upon the cornerstone technologies in the Pangeo stack such as Xarray, Dask, and Jupyter Notebooks. In addition, some of the functionalities in the GeoCAT stack are inspired/reimplemented from NCL.

+
+
+

MetPy#

+

MetPy is a collection of tools in Python for reading, visualizing, and performing calculations with weather data. The website below has information about getting started as well as examples and a reference guide.

+
+
+
+

NCAR Command Language (NCL)#

+

NCL is an open source tool developed at NCAR that is free to download and use. It can be run at the command line in interactive mode or as a batch mode. While once a widely used language for CESM developers and users, NCL is now in a maintenence stage and is no longer in development. Much of the active development is now being done with python tools.

+

NCL is known for:

+
    +
  • easy input/output use with netCDF, Grib, Grib2, shapefiles, ascii, and binary files.

  • +
  • good graphics that are very flexible.

  • +
  • functions tailored to the geosciences community.

  • +
  • a central website with 1000+ examples. There are also mini language and processing manuals.

  • +
+
+
+

Panopoly#

+

Panopoly is a graphic user interface (GUI) application that allows the user to quickly view data in a number of file formats. Panopoly is similar to ncview, but it’s more powerful. Panopoly works with files in netCDF, HDF, or GRIB format (among others). It also allows the user to perform simple calculations, apply masks, and quickly create spatial or line plots.

+

The Panopoly website provies more documentation, including How-To’s and demonstration videos.

+
+
+

Image Magick#

+

ImageMagick is a free suite of software that that can be used to display, manipulate, or compare images. It works with a wide range of file types (ps, pdf, png, gif, jpg, etc.). It can also be used to create movies. You can also alter an image at the command line. There are many options available when converting images, and more information can be found at the website below.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/additional/cvdp.html b/notebooks/diagnostics/additional/cvdp.html new file mode 100644 index 000000000..ecea0eb47 --- /dev/null +++ b/notebooks/diagnostics/additional/cvdp.html @@ -0,0 +1,711 @@ + + + + + + + + + + + CVDP — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

CVDP

+ +
+
+ +
+
+
+ + + + +
+ +
+

CVDP#

+

CVDP Image +

Figure: ENSO spatial composite metric from CVDP output showing different generations of CSM/CCSM/CESM.

+

The Climate Variability Diagnostics Package (CVDP) developed by NSF-NCAR’s Climate Analysis Section is an automated analysis tool and data repository +for assessing modes of climate variability and trends in models and observations. Time series, spatial patterns and power spectra are displayed +graphically via webpages and saved as NetCDF files for later use. The package can be applied to individual model simulations (style 1) or to +initial condition Large Ensembles (style 2). Both styles provide quantitative metrics comparing models and observations; style 2 also includes +ensemble mean (i.e., forced response) and ensemble spread (i.e., internal variability) diagnostics. Several detrending options are provided, +including linear, quadratic, 30-year high-pass filter and removal of the ensemble mean (in the case of Large Ensembles). All diagnostics and +metrics are fully documented with references to the peer-reviewed literature.

+

Examples of CVDP output:

+

CMIP6 Historical+SSP585 Comparison

+

CESM2-Large Ensemble Comparison

+

See the CVDP Documention page for instructions on how to run the CVDP.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/additional/large_ensembles.html b/notebooks/diagnostics/additional/large_ensembles.html new file mode 100644 index 000000000..7bf83068f --- /dev/null +++ b/notebooks/diagnostics/additional/large_ensembles.html @@ -0,0 +1,725 @@ + + + + + + + + + + + Large Ensembles — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Large Ensembles

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Large Ensembles#

+
+

Learning Goals#

+
    +
  • Enter learning goals here.

  • +
+
+
+
+

Subsection 1#

+

Info here

+
+
+
+

Subsection 2#

+

Info here

+
+
+ + + + +
+ + + + + + +
+ +
+
+
+ +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/additional/postprocessing.html b/notebooks/diagnostics/additional/postprocessing.html new file mode 100644 index 000000000..5e4158aed --- /dev/null +++ b/notebooks/diagnostics/additional/postprocessing.html @@ -0,0 +1,730 @@ + + + + + + + + + + + Postprocessing data — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Postprocessing data

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Postprocessing data#

+

A wide range of tools exist for postprocessing and analyzing data with techniques and methods exist. One of the first things you have to decide is how to store your files.

+

In the diagnostics notebooks we have have provided examples of how to use both history files and timeseries files, described below.

+
+

History vs. Timeseries files#

+

When you run the CESM model the default output is history files, or files for a single timestep that include all variables for a given component and time frequency. However, most CESM community experiment data will be provided as timeseries files, or files that are a single variable over many timesteps. It is important you understand how to use both types of files, and for you to know that for some tasks (e.g. debugging) you should be using history files instead of timeseries files. However, it is much more efficient to store timeseries files because the overall size is smaller once the files have been processed into timeseries format.

+

The current recommendation is to use the new CUPiD diagnostics system to convert CESM history files into time series. You can try it yourself on CESM tutorial simulation data by running through the CUPiD Notebook under the diagnostics section.

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/additional/uxarray.html b/notebooks/diagnostics/additional/uxarray.html new file mode 100644 index 000000000..8e315b06b --- /dev/null +++ b/notebooks/diagnostics/additional/uxarray.html @@ -0,0 +1,1590 @@ + + + + + + + + + + + UXarray — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

UXarray#

+

UXarray is a Python package that was created to support scalable data analysis and visualization functionality on high-resolution unstructured grids. It is built around the UGRID conventions and provides Xarray-styled functionality for working directly with unstructured grids.

+

UXarray is the product of a collaborative effort between Project Raijin, funded by an NSF EarthCube award between NSF NCAR and The Pennsylvania State University, and the SEATS project, funded by DOE.

+
+

Learning Goals#

+

With this notebook, we aim to:

+
    +
  1. Clarify why UXarray can be useful

  2. +
  3. Provide self-learning resources about UXarray

  4. +
  5. How to access UXarray?

  6. +
  7. Give you a sense of how simple I/O and visualization with UXarray can be

  8. +
+
+
+
+

1. Why UXarray?#

+

UXarray can simplify your workflows with unstructured grids because it:

+
    +
  • Enables significant data analysis and visualization functionality to be executed directly on unstructured grids

  • +
  • Adheres to the UGRID specifications for compatibility across a variety of mesh formats

  • +
  • Provides a single interface for supporting a variety of unstructured grid formats including UGRID, MPAS, SCRIP, and Exodus

  • +
  • Inherits from Xarray, providing simplified data using familiar (Xarray-like) data structures and operations

  • +
  • Brings standardization to unstructured mesh support for climate data analysis and visualization

  • +
  • Builds on optimized data structures and algorithms for handling large and complex unstructured datasets

  • +
  • Supports enhanced interoperability and community collaboration

  • +
+
+
+
+

2. UXarray Resources#

+

The following are some UXarray resources that you can leverage to further learn about UXarray, get started with it, see demonstrations of its analysis and visualization capabilities, and learn how to contribute to it:

+
+

UXarray Documentation Website#

+

The UXarray documentation website is the to-go place for you to access fundamental information about the tool such as:

+ +
+
+

UXArray’s Project Pythia Cookbook#

+

This cookbook is a comprehensive showcase of workflows & techniques for visualizing Unstructured Grids using UXarray with its several notebooks.

+

These notebooks can be executed online, without locally setting them up, with the help of the Binder interface provided.

+
+
+
+

3. How to access UXarray?#

+

In addition to installing UXarray locally by following the instructions in the above Installation guide, if you are a user of the NSF NCAR’s HPC clusters, you can access UXarray via the NPL-2024a (or a newer version) conda environment.

+
+
+

4. Minimal UXarray visualization#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel is minimum NPL-2024a. This should be the default kernel, but if it is not, click on that button and select NPL-2024a or a newer version.

+
+

Data paths#

+
+
+
# Set your username here:
+username = "PUT_USER_NAME_HERE"
+
+# Here we point to an imaginary location for a ne30x8 directory
+monthly_output_path = f"/glade/derecho/scratch/{username}/ne30x8_dir/"
+
+grid_filename = "ne30x8_np4_SCRIP.nc"
+data_filename = "ne30x8_220105.nc"
+
+
+
+
+
+
+

UXarray Code#

+
+
+
import uxarray as ux
+
+
+
+
+
+
+
uxds_ne30x8 = ux.open_dataset(base_path + grid_filename, base_path + data_filename)
+
+
+
+
+
+
+
# Let's examine the grid:
+uxds_ne30x8.uxgrid
+
+
+
+
+
<uxarray.Grid>
+Original Grid Type: Scrip
+Grid Dimensions:
+  * n_node: 1184802
+  * n_edge: 2601516
+  * n_face: 710858
+  * n_max_face_nodes: 10
+  * two: 2
+  * n_nodes_per_face: (710858,)
+Grid Coordinates (Spherical):
+  * node_lon: (1184802,)
+  * node_lat: (1184802,)
+  * face_lon: (710858,)
+  * face_lat: (710858,)
+Grid Coordinates (Cartesian):
+Grid Connectivity Variables:
+  * face_node_connectivity: (710858, 10)
+  * edge_node_connectivity: (2601516, 2)
+Grid Descriptor Variables:
+
+
+
+
+
+
+
# Visualization
+clim = (uxds_ne30x8['soilw'][0].values.min(), uxds_ne30x8['soilw'][0].values.max()) # colorbar limits
+uxds_ne30x8['soilw'][0].plot.rasterize(method='polygon', dynamic=True, clim=clim)
+
+
+
+
+
/glade/u/home/oero/conda-envs/uxarray-dask/lib/python3.12/site-packages/uxarray/grid/geometry.py:95: UserWarning: Converting to a GeoDataFrame with over 1,000,000 faces may take some time.
+  warnings.warn(
+
+
+
+
+
+
+
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/cam/advanced_cam.html b/notebooks/diagnostics/cam/advanced_cam.html new file mode 100644 index 000000000..cc25873ed --- /dev/null +++ b/notebooks/diagnostics/cam/advanced_cam.html @@ -0,0 +1,899 @@ + + + + + + + + + + + Advanced Plotting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Advanced Plotting

+ +
+ +
+
+ + + + +
+ +
+

Advanced Plotting#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023b. This should be the default kernel, but if it is not, click on that button and select NPL 2023b.

+
+

This activity was developed primarily by Cecile Hannay and Jesse Nusbaumer.

+
+
+

Exercise 1: CAM-SE output analysis#

+

Examples of simple analysis and plotting that can be done with CAM-SE output on the native cubed-sphere grid.

+
+
+
from pathlib import Path
+import xarray as xr
+import numpy as np
+import matplotlib.pyplot as plt
+import cartopy.crs as ccrs
+
+
+
+
+
+
+
def make_map(data, lon, lat,):
+    """This function plots data on a Mollweide projection map.
+
+    The data is transformed to the projection using Cartopy's `transform_points` method.
+
+    The plot is made by triangulation of the points, producing output very similar to `pcolormesh`,
+    but with triangles instead of rectangles used to make the image.
+    """
+    dataproj = ccrs.PlateCarree() # assumes data is lat/lon
+    plotproj = ccrs.Mollweide()   # output projection 
+    # set up figure / axes object, set to be global, add coastlines
+    fig, ax = plt.subplots(figsize=(6,3), subplot_kw={'projection':plotproj})
+    ax.set_global()
+    ax.coastlines(linewidth=0.2)
+    # this figures out the transformation between (lon,lat) and the specified projection
+    tcoords = plotproj.transform_points(dataproj, lon.values, lat.values) # working with the projection
+    xi=tcoords[:,0] != np.inf  # there can be bad points set to infinity, but we'll ignore them
+    assert xi.shape[0] == tcoords.shape[0], f"Something wrong with shapes should be the same: {xi.shape = }, {tcoords.shape = }"
+    tc=tcoords[xi,:]
+    datai=data.values[xi]  # convert to numpy array, then subset
+    # Use tripcolor --> triangluates the data to make the plot
+    # rasterized=True reduces the file size (necessary for high-resolution for reasonable file size)
+    # keep output as "img" to make specifying colorbar easy
+    img = ax.tripcolor(tc[:,0],tc[:,1], datai, shading='gouraud', rasterized=True)
+    cbar = fig.colorbar(img, ax=ax, shrink=0.4)
+    return fig, ax
+
+
+
+
+
+
+

Input data#

+

In the following cell, specify the data source.

+

location_of_hfiles is a path object that points to the directory where data files should be. +search_pattern specifies what pattern to look for inside that directory.

+

SIMPLIFICATION If you want to just provide a path to a file, simply specify it by commenting (with #) the lines above “# WE need lat and lon”, and replace with:

+
fil = "/path/to/your/data/file.nc"
+ds = xr.open_dataset(fil)
+
+
+
+
+

Parameters#

+

Specify the name of the variable to be analyzed with variable_name.

+

To change the units of the variable, specify scale_factor and provide the new units string as units. Otherwise, just set scale_factor and units:

+
scale_factor = 1
+units = ds["variable_name"].attrs["units"]
+
+
+
+
+
location_of_hfiles = Path("/glade/campaign/cesm/tutorial/tutorial_2023_archive/cam-se/")
+search_pattern = "f.cam6_3_112.FMTHIST_v0c.ne30.non-ogw-ubcT-effgw0.7_taubgnd2.5.001.cam.h3.2003-01-01-00000.nc"
+
+fils = sorted(location_of_hfiles.glob(search_pattern))
+if len(fils) == 1:
+    ds = xr.open_dataset(fils[0])
+else:
+    print(f"Just so you konw, there are {len(fils)} files about to be loaded.")
+    ds = xr.open_mfdataset(fils)
+
+# We need lat and lon:
+lat = ds['lat']
+lon = ds['lon']
+
+# Choose what variables to plot,
+# in this example we are going to combine the
+# convective and stratiform precipitation into
+# a single, total precipitation variable
+convective_precip_name = "PRECC"
+stratiform_precip_name = "PRECL"
+
+# If needed, select scale factor and new units:
+scale_factor = 86400. * 1000. # m/s -> mm/day
+units = "mm/day"
+
+cp_data = scale_factor * ds[convective_precip_name]
+st_data = scale_factor * ds[stratiform_precip_name]
+cp_data.attrs['units'] = units
+st_data.attrs['units'] = units
+
+# Sum the two precip variables to get total precip
+data = cp_data + st_data
+data
+
+
+
+
+
+
+
# temporal averaging
+# simplest case, just average over time:
+data_avg = data.mean(dim='time')
+data_avg
+
+
+
+
+
+
+
#
+# Global average
+#
+data_global_average = data_avg.weighted(ds['area']).mean()
+print(f"The area-weighted average of the time-mean data is: {data_global_average.item()}")
+
+
+
+
+
+
+
#
+# Regional average using a (logical) rectangle
+#
+west_lon = 110.0
+east_lon = 200.0
+south_lat = -30.0
+north_lat = 30.0
+
+# To reduce to the region, we need to know which indices of ncol dimension are inside the boundary
+
+region_inds = np.argwhere(((lat > south_lat)&(lat < north_lat)&(lon>west_lon)&(lon<east_lon)).values)
+print(f"The number of grid columns inside the specified region is {region_inds.shape[0]}")
+
+# get the area associated with each selected column. Note the region_inds array needs to be flattened to use in isel.
+region_area = ds['area'].isel(ncol=region_inds.flatten())
+# get the data in the region:
+region_data = data_avg.isel(ncol=region_inds.flatten())
+
+data_region_average = region_data.weighted(region_area).mean()
+print(f"The area-weighted average in thee region [{west_lon}E-{east_lon}E, {south_lat}-{north_lat}] is: {data_region_average.item()}")
+
+
+
+
+
+
+
# plot the map of the time average
+# using the function defined above.
+fig1, ax1 = make_map(data_avg, lon, lat,)
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/cam/basics_cam.html b/notebooks/diagnostics/cam/basics_cam.html new file mode 100644 index 000000000..3700af246 --- /dev/null +++ b/notebooks/diagnostics/cam/basics_cam.html @@ -0,0 +1,1344 @@ + + + + + + + + + + + Basic Plotting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Basic Plotting#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023b. This should be the default kernel, but if it is not, click on that button and select NPL 2023b.

+
+

This activity was developed primarily by Cecile Hannay and Jesse Nusbaumer.

+
+

For the atmospheric data, we will look at common variables in the atmospheric diagnostics. This notebook covers 3 basic plotting examples:

+

Exercise 1: Global lat/lon of surface temperature

+

Exercise 2: Zonal mean of short wave cloud forcing

+

Exercise 3: Temperature zonal mean with vertical levels

+

Some of the plotting in these examples are based on the AMWG Diagnostics Framework (ADF) and some are natively from the xarray functionality. xarray will be used for the data I/O, analysis, and some plotting, matplotlib and cartopy will aid in plotting, and numpy for calculations

+
+
+
import os
+
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
+import cftime
+import matplotlib as mpl
+import matplotlib.path as mpath
+import matplotlib.pyplot as plt
+import numpy as np
+import xarray as xr
+from matplotlib.gridspec import GridSpec
+from matplotlib.lines import Line2D
+from mpl_toolkits.axes_grid1 import make_axes_locatable
+
+
+
+
+

The first step is to grab an atmosphere (CAM) history file from your CESM model run

+
+
+
# Set your username here:
+username = "PUT_USER_NAME_HERE"
+
+# Here we point to the archive directory from your b1850.run_length simulation
+monthly_output_path = f"/glade/derecho/scratch/{username}/archive/b1850.run_length/atm/hist"
+
+# If you were unable to successfully run the b1850.run_length simulation, then feel free to use
+# this provided simulation data instead:
+#monthly_output_path = "/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.run_length/atm/hist"
+
+# Name of history file to plot
+file_name = "b1850.run_length.cam.h0.0003-07.nc"
+
+files = os.path.join(monthly_output_path, file_name)
+files
+
+
+
+
+
'/glade/derecho/scratch/PUT_USER_NAME_HERE/archive/b1850.run_length/atm/hist/b1850.run_length.cam.h0.0003-07.nc'
+
+
+
+
+
+
+
ds = xr.open_dataset(files)
+ds
+
+
+
+
+
---------------------------------------------------------------------------
+KeyError                                  Traceback (most recent call last)
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/file_manager.py:211, in CachingFileManager._acquire_with_cache_info(self, needs_lock)
+    210 try:
+--> 211     file = self._cache[self._key]
+    212 except KeyError:
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/lru_cache.py:56, in LRUCache.__getitem__(self, key)
+     55 with self._lock:
+---> 56     value = self._cache[key]
+     57     self._cache.move_to_end(key)
+
+KeyError: [<class 'netCDF4._netCDF4.Dataset'>, ('/glade/derecho/scratch/PUT_USER_NAME_HERE/archive/b1850.run_length/atm/hist/b1850.run_length.cam.h0.0003-07.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False)), 'da467520-dd8b-4048-a691-3445d0f0f93e']
+
+During handling of the above exception, another exception occurred:
+
+FileNotFoundError                         Traceback (most recent call last)
+Cell In[3], line 1
+----> 1 ds = xr.open_dataset(files)
+      2 ds
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/api.py:566, in open_dataset(filename_or_obj, engine, chunks, cache, decode_cf, mask_and_scale, decode_times, decode_timedelta, use_cftime, concat_characters, decode_coords, drop_variables, inline_array, chunked_array_type, from_array_kwargs, backend_kwargs, **kwargs)
+    554 decoders = _resolve_decoders_kwargs(
+    555     decode_cf,
+    556     open_backend_dataset_parameters=backend.open_dataset_parameters,
+   (...)
+    562     decode_coords=decode_coords,
+    563 )
+    565 overwrite_encoded_chunks = kwargs.pop("overwrite_encoded_chunks", None)
+--> 566 backend_ds = backend.open_dataset(
+    567     filename_or_obj,
+    568     drop_variables=drop_variables,
+    569     **decoders,
+    570     **kwargs,
+    571 )
+    572 ds = _dataset_from_backend_dataset(
+    573     backend_ds,
+    574     filename_or_obj,
+   (...)
+    584     **kwargs,
+    585 )
+    586 return ds
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:590, in NetCDF4BackendEntrypoint.open_dataset(self, filename_or_obj, mask_and_scale, decode_times, concat_characters, decode_coords, drop_variables, use_cftime, decode_timedelta, group, mode, format, clobber, diskless, persist, lock, autoclose)
+    569 def open_dataset(  # type: ignore[override]  # allow LSP violation, not supporting **kwargs
+    570     self,
+    571     filename_or_obj: str | os.PathLike[Any] | BufferedIOBase | AbstractDataStore,
+   (...)
+    587     autoclose=False,
+    588 ) -> Dataset:
+    589     filename_or_obj = _normalize_path(filename_or_obj)
+--> 590     store = NetCDF4DataStore.open(
+    591         filename_or_obj,
+    592         mode=mode,
+    593         format=format,
+    594         group=group,
+    595         clobber=clobber,
+    596         diskless=diskless,
+    597         persist=persist,
+    598         lock=lock,
+    599         autoclose=autoclose,
+    600     )
+    602     store_entrypoint = StoreBackendEntrypoint()
+    603     with close_on_error(store):
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:391, in NetCDF4DataStore.open(cls, filename, mode, format, group, clobber, diskless, persist, lock, lock_maker, autoclose)
+    385 kwargs = dict(
+    386     clobber=clobber, diskless=diskless, persist=persist, format=format
+    387 )
+    388 manager = CachingFileManager(
+    389     netCDF4.Dataset, filename, mode=mode, kwargs=kwargs
+    390 )
+--> 391 return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose)
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:338, in NetCDF4DataStore.__init__(self, manager, group, mode, lock, autoclose)
+    336 self._group = group
+    337 self._mode = mode
+--> 338 self.format = self.ds.data_model
+    339 self._filename = self.ds.filepath()
+    340 self.is_remote = is_remote_uri(self._filename)
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:400, in NetCDF4DataStore.ds(self)
+    398 @property
+    399 def ds(self):
+--> 400     return self._acquire()
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:394, in NetCDF4DataStore._acquire(self, needs_lock)
+    393 def _acquire(self, needs_lock=True):
+--> 394     with self._manager.acquire_context(needs_lock) as root:
+    395         ds = _nc4_require_group(root, self._group, self._mode)
+    396     return ds
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/contextlib.py:135, in _GeneratorContextManager.__enter__(self)
+    133 del self.args, self.kwds, self.func
+    134 try:
+--> 135     return next(self.gen)
+    136 except StopIteration:
+    137     raise RuntimeError("generator didn't yield") from None
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/file_manager.py:199, in CachingFileManager.acquire_context(self, needs_lock)
+    196 @contextlib.contextmanager
+    197 def acquire_context(self, needs_lock=True):
+    198     """Context manager for acquiring a file."""
+--> 199     file, cached = self._acquire_with_cache_info(needs_lock)
+    200     try:
+    201         yield file
+
+File /glade/u/apps/opt/conda/envs/npl-2023b/lib/python3.10/site-packages/xarray/backends/file_manager.py:217, in CachingFileManager._acquire_with_cache_info(self, needs_lock)
+    215     kwargs = kwargs.copy()
+    216     kwargs["mode"] = self._mode
+--> 217 file = self._opener(*self._args, **kwargs)
+    218 if self._mode == "w":
+    219     # ensure file doesn't get overridden when opened again
+    220     self._mode = "a"
+
+File src/netCDF4/_netCDF4.pyx:2464, in netCDF4._netCDF4.Dataset.__init__()
+
+File src/netCDF4/_netCDF4.pyx:2027, in netCDF4._netCDF4._ensure_nc_success()
+
+FileNotFoundError: [Errno 2] No such file or directory: '/glade/derecho/scratch/PUT_USER_NAME_HERE/archive/b1850.run_length/atm/hist/b1850.run_length.cam.h0.0003-07.nc'
+
+
+
+
+
+
+

Exercise 1: Make a lat-lon plot of TS#

+

To highlight plotting the variables from the CESM atmosphere (CAM) file, the first example will plot a simple global lat/lon plot of surface temperature TS

+
+

Grab data from first time stamp#

+

NOTE: This dataset has only one time

+
+
+
ts_0 = ds.TS.sel({"time": ds.TS.time.values[0]}).squeeze()
+ts_0
+
+
+
+
+

The next step is to set up the map. Since we are plotting a global lat/lon, we will use the “Plate Carree” projection.

+
+
+
# define the colormap
+cmap = mpl.colormaps["jet"]
+
+# set up the figure with a Plate Carree projection
+fig = plt.figure(figsize=(15, 10))
+
+ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
+
+# Plot the first timeslice of TS
+img = ax.pcolormesh(ds.lon, ds.lat, ts_0, cmap=cmap, transform=ccrs.PlateCarree())
+
+plt.title("Surface Temperature", fontsize=20)
+
+# Set up colorbar
+plt.colorbar(img, orientation="vertical", fraction=0.0242, pad=0.01)
+plt.show()
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

The colorbar limits are set automatically by pcolormesh. How could you change the arguments for the pcolormesh function to set the plotting limits?

+
+
+ Click here for hints +

Choose a maximum temperature of 300K and minimum temperature of 225K.

+
img = ax.pcolormesh(ds.lon, ds.lat, ts_0, vmax=300, vmin=225, cmap=cmap, transform=ccrs.PlateCarree())
+
+
+
+
+
+

Question:

+

How could we change the central longitude?

+
+
+ Click here for hints +The default central longitude is 0. Try setting it to 180. Then try other values from 0-360. +
ax = fig.add_subplot(1,1,1, projection=ccrs.PlateCarree(central_longitude=180))
+
+
+
+
+

A second quick example is for xarray’s built-in plotting which uses the matplotlib and cartopy in the background. xarray makes creating a basic plot fairly simple.

+
+
+
# Xarray native plotting
+
+# Set up figure and axis
+fig, ax = plt.subplots(1, figsize=(20, 10))
+
+# Plot the data straight from the xarray dataset
+ts_0.plot.contourf(cmap="jet", levels=np.arange(220, 321, 5))
+
+plt.show()
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+
+
+

Exercise 2: Zonal plot of SWCF#

+

The second example will plot the short wave cloud forcing (SWCF) zonally.

+

Grab the variable data and mean over the the lon value

+
+
+
ds_swcf = ds.SWCF
+
+# Get all the dataset dimensions
+d = ds_swcf.dims
+
+# Grab all dimensions to mean the lon values from
+davgovr = [dim for dim in d if dim not in ("lev", "lat")]
+
+# Make new dataset of zonal mean values
+ds_swcf_zonal = ds_swcf.mean(dim=davgovr)
+
+# print some values of new zonally-averaged SWCF variable
+ds_swcf_zonal
+
+
+
+
+
+
+
# Create figure and axis
+fig, ax = plt.subplots(1, figsize=(12, 7))
+
+# Set Main title for subplots:
+plt.title("Short Wave Cloud Forcing", fontsize=20)
+
+# Plot value on y-axis and latitude on the x-axis
+ax.plot(ds_swcf_zonal.lat, ds_swcf_zonal, c="goldenrod")
+
+ax.set_xlim(
+    [max([ds_swcf_zonal.lat.min(), -90.0]), min([ds_swcf_zonal.lat.max(), 90.0])]
+)
+
+ax.set_xlabel("Latitude")
+
+plt.show()
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question

+

What code could you add to set a legend for the plot line?

+
+
+ Click here for hints +

enter the following lines after the ax.set_xlabel command and before the plt.show() command.

+
label = ds_swcf.time.values[0].strftime() # -> '0001-02-01 00:00:00'
+line = Line2D([0], [0], label=label,
+                        color="blue")
+                        
+fig.legend(handles=[line],bbox_to_anchor=(-0.15, 0.15, 1.05, .102),loc="right",
+                   borderaxespad=0.0,fontsize=16,frameon=False)
+
+
+
+

Question

+

What else could you label the line legend, if anything?

+
+
+ Click here for hints +

Try setting the label value to something else like your simulation run name, the season or month, etc.

+
label = 'Season '
+
+
+
+

Question

+

How can you change the color on the plot and the legend?

+
+
+ Click here for hints +

To change colors, try a different named color (e.g. “red” or “goldenrod”). You should make sure both the plot and the legend match or your plot won’t make sense.

+
+
+
+Click here for a solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+
+

Exercise 3: Plot of zonal T#

+

This example will plot the 3D zonal mean of temperature T with the pressure as the y-variable and latitude as the x-variable. We are showing you four different ways to make the same plot since each is valuable for plots with pressure on the y-axis and how to format those to get more information from the data.

+
+
+
# Remove all dimensions of length one
+ds_t = ds.T.squeeze()
+ds_t
+
+
+
+
+
+

Plot 1: Natively via xarray#

+

This plot uses the xarray native grids for the plot

+
    +
  • y-axis is increasing with height

  • +
  • y-axis is not in log pressure

  • +
+
+
+
# Average over all dimensions except `lev` and `lat`.
+d = ds_t.dims
+davgovr = [dim for dim in d if dim not in ("lev", "lat")]
+
+DS = ds_t.mean(dim=davgovr)
+DS.transpose("lat", "lev", ...)
+fig, ax = plt.subplots(1, figsize=(20, 10))
+DS.plot.contourf(ax=ax, y="lev", cmap="Spectral_r")
+plt.show()
+
+
+
+
+
+
+Click here for a solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

Plot 2: Quick ADF style#

+

This plot uses the quick style of the AMWG Diagnostics Framework (ADF) packages.

+
    +
  • y-axis is increasing with height

  • +
  • y-axis is not in log pressure

  • +
+
+
+
# Average over all dimensions except `lev` and `lat`.
+d = ds_t.dims
+davgovr = [dim for dim in d if dim not in ("lev", "lat")]
+
+DS = ds_t.mean(dim=davgovr)
+
+lev = DS["lev"]
+lat = DS["lat"]
+mlev, mlat = np.meshgrid(lev, lat)
+
+# Generate zonal plot:
+fig, ax = plt.subplots(1, figsize=(15, 7))
+
+# Create zonal plot with vertical levels
+img = ax.contourf(mlat, mlev, DS.transpose("lat", "lev"), cmap="Spectral_r")
+
+# Format axis and ticks
+ax.set_xlabel("Latitude")
+fig.colorbar(img, ax=ax, location="right")
+
+
+
+
+
+
+Click here for a solution
+

plot example

+

Figure: Plotting solution.

+
+

Questions

+
    +
  • What differences do you see between the ADF quick plot and the xarray native plot?

  • +
  • Why might you want to use one or the other?

  • +
  • Where, vertically, do high pressures occur and what does this mean for where the ground would be located on this plot?

  • +
+
+
+ Click here for hints +

Notice that the colorbar and axes labels are different between the two plots. Also note that the y-axis is going from lower to higher pressure values, but in the real atmosphere the highest pressures are near the surface (so the plot is inverted relative to the actual height of the layers above the Earth’s surface).

+
+
+
+

Plot 3: ADF style with reversed y-axis#

+
    +
  • y-axis is decreasing with height

  • +
  • y-axis is not in log pressure

  • +
+
+
+
# Average over all dimensions except `lev` and `lat`.
+d = ds_t.dims
+davgovr = [dim for dim in d if dim not in ("lev", "lat")]
+
+DS = ds_t.mean(dim=davgovr)
+
+# print(DS.lev.min(),DS.lev.max())
+
+lev = DS["lev"]
+lat = DS["lat"]
+mlev, mlat = np.meshgrid(lev, lat)
+
+# Generate zonal plot:
+fig, ax = plt.subplots(1, figsize=(15, 7))
+
+# Create zonal plot with vertical levels
+img = ax.contourf(mlat, mlev, DS.transpose("lat", "lev"), cmap="Spectral_r")
+
+# Format axis and ticks
+plt.gca().invert_yaxis()
+ax.tick_params(which="minor", length=4, color="r")
+
+# Set up colorbar
+cbar_ax = fig.add_axes([0, 0, 0.1, 0.1])
+posn = ax.get_position()
+
+# Set position and size of colorbar position: [left, bottom, width, height]
+cbar_ax.set_position([posn.x0 + posn.width + 0.005, posn.y0, 0.02, posn.height])
+
+ax.set_xlabel("Latitude")
+fig.colorbar(img, cax=cbar_ax, orientation="vertical")
+
+
+
+
+
+
+Click here for a solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+
    +
  • What differences do you see on the y-axis between the result from Plot 2 and Plot 3?

  • +
+
+
+ Click here for hints +

The plots are mirror images of each other because the y-axis has been flipped. Plot 2 has the highest pressures at the top of the y-axis while Plot 3 has the highest pressures at the bottom of the y-axis.

+
+

Question:

+
    +
  • Where, vertically, do high pressures occur and what does this mean for where the ground would be located on these two figures ?

  • +
+
+
+ Click here for hints +

The highest pressures in the atmosphere occur at the ground where the most atmospheric mass is pressing downward. This means that Plot 2 is oriented so the location where the ground is is the top of the plot, or up. In Plot 3 the orientation is so that the ground would be at the bottom of the plot, or down. Thus Plot 3 is often more intuitive to read because it’s oriented with the way we perceive the atmosphere.

+
+
+
+

Plot 4: Complex ADF style#

+
    +
  • y-axis is decreasing with height

  • +
  • y-axis is in log pressure

  • +
+
+
+
# Average over all dimensions except `lev` and `lat`.
+d = ds_t.dims
+davgovr = [dim for dim in d if dim not in ("lev", "lat")]
+
+DS = ds_t.mean(dim=davgovr)
+
+# print(DS.lev.min(),DS.lev.max())
+
+lev = DS["lev"]
+lat = DS["lat"]
+mlev, mlat = np.meshgrid(lev, lat)
+
+# Generate zonal plot:
+fig, ax = plt.subplots(1, figsize=(15, 7))
+
+# Create zonal plot with vertical levels
+img = ax.contourf(mlat, mlev, DS.transpose("lat", "lev"), cmap="Spectral_r")
+
+# Format axis and ticks
+plt.yscale("log")
+plt.gca().invert_yaxis()
+ax.tick_params(which="minor", length=4, color="r")
+
+# Set up colorbar
+cbar_ax = fig.add_axes([0, 0, 0.1, 0.1])
+posn = ax.get_position()
+
+# Set position and size of colorbar position: [left, bottom, width, height]
+cbar_ax.set_position([posn.x0 + posn.width + 0.005, posn.y0, 0.02, posn.height])
+
+ax.set_xlabel("Latitude")
+fig.colorbar(img, cax=cbar_ax, orientation="vertical")
+
+
+
+
+
+
+Click here for a solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+
    +
  • What differences do you see on the y-axis between the result from Plot 3 and Plot 4?

  • +
+
+
+ Click here for hints +

The plots both have the y-axis oriented so that the highest pressures, or ground, is at the bottom of the plot. But the scale of the y-axis has changed so that in Plot 3 it is logarithmic.

+
+

Question:

+
    +
  • What does that mean in terms of which part of the atmosphere are emphasized?

  • +
+
+
+ Click here for hints +

With the logarithmic y-axis more of the upper atmosphere is shown on the figure. If you wanted to emphasize the boundary layer you might want to change the limits of the figure.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/cam/cam.html b/notebooks/diagnostics/cam/cam.html new file mode 100644 index 000000000..42a04797b --- /dev/null +++ b/notebooks/diagnostics/cam/cam.html @@ -0,0 +1,784 @@ + + + + + + + + + + + Atmosphere — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Atmosphere#

+
+

Basic Plotting#

+
+

Learning Goals#

+
    +
  • Making a lat-lon plot

  • +
  • Making a zonal plot

  • +
  • Making a lat-height plot

  • +
+
+
+

Exercise 1: lat-lon plot#

+

Plot global lat/lon of surface temperature

+
+
+

Exercise 2: Making a zonal plot#

+

Plot zonal mean of short wave cloud forcing

+
+
+

Exercise 3: Making a lat-height plot#

+

Plot temperature zonal mean with vertical levels

+
+
+
+
+

Advanced Plotting#

+
+

Learning Goals#

+
    +
  • analysis of native output

  • +
+
+
+

Exercise 1: CAM-SE output analysis#

+

Examples of simple analysis and plotting that can be done with CAM-SE output on the native cubed-sphere grid.

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/cice/advanced_cice.html b/notebooks/diagnostics/cice/advanced_cice.html new file mode 100644 index 000000000..0ad5486e2 --- /dev/null +++ b/notebooks/diagnostics/cice/advanced_cice.html @@ -0,0 +1,1230 @@ + + + + + + + + + + + Advanced Plotting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Advanced Plotting#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023a. This should be the default kernel, but if it is not, click on that button and select NPL 2023a.

+
+

This activity was developed primarily by David Clemens-Sewall.

+
+

This notebook provides some additional examples of more advanced sea ice fields. Here we introduce the concept of the subgridscale ice thickness distribution (ITD). This means we have a fraction of ice in each grid cell that is binned into thickness categories.

+
+
+
import xarray as xr
+import numpy as np
+import matplotlib.pyplot as plt
+import matplotlib.path as mpath
+from matplotlib.gridspec import GridSpec
+import pop_tools
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
+import os
+
+
+
+
+

For these exercises we will need to import multiple variables, below is an example of one way to do so.

+
+
+
monthly_output_path = "/glade/campaign/cgd/cesm/CESM2-LE/ice/proc/tseries/month_1"
+run_name = "b.e21.BHISTcmip6.f09_g17.LE2-1001.001"
+
+var_names = ['aice',
+             'aicen',
+             'vsnon',
+             'hs',
+             'fsens',
+             'fsens_ai',
+            ]
+
+da_list = []
+
+for var_name in var_names:
+    files = os.path.join(monthly_output_path, var_name,
+                         run_name + ".cice.h." + var_name + ".*")
+    ds_in = xr.open_mfdataset(files)
+    da_list.append(ds_in[var_name])
+    del ds_in
+
+ds = xr.merge(da_list)
+
+del da_list
+
+
+
+
+

The next step is to read in some grid information for the gx1v7 dipole grid used in POP and CICE. We will read in three main variables: tarea, TLAT, and TLON. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Also, we will print the latitude array TLAT to see the metadata.

+
+
+
# get pop grid grid cell areas
+grid = pop_tools.get_grid('POP_gx1v7')
+
+# convert tarea to m^2
+with xr.set_options(keep_attrs=True):
+    grid['TAREA'] = grid['TAREA']/(1e4)
+grid['TAREA'].attrs['units'] = 'm^2'
+
+
+
+
+

We will merge in three main variables: tarea, TLAT, and TLON. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Note that this overwrites the dataset object from above.

+
+
+
ds = xr.merge([ds.drop(['TLAT', 'TLON', 'ULAT', 'ULON']),
+               grid[['TLAT', 'TLONG', 'TAREA']].rename_dims({'nlat':'nj','nlon':'ni'})],
+              compat='identical', combine_attrs='no_conflicts')
+
+
+
+
+
+
+
ds
+
+
+
+
+
+
+

Example 1: Plot per-category ice area#

+

Compare the dataset in this notebook with aice in the basics notebook. Notice that in this case we have an additional category dimension nc. aicen is the per-category ice area fraction. We demonstrate plotting a per-category variable below. We also plot the full sea ice concentration in the final plot.

+
+
+
# make circular boundary for polar stereographic circular plots
+theta = np.linspace(0, 2*np.pi, 100)
+center, radius = [0.5, 0.5], 0.5
+verts = np.vstack([np.sin(theta), np.cos(theta)]).T
+circle = mpath.Path(verts * radius + center)
+
+cmap = plt.cm.get_cmap('Blues_r')  
+
+# create figure with subplots
+fig, axs = plt.subplots(3, 2, figsize=(20,30),
+                       subplot_kw={'projection':ccrs.NorthPolarStereo()})
+axs = np.ravel(axs)
+
+# this creates a subplot for each ITD category
+for i in ds.nc.values:
+    ax = axs[i]
+    ax.set_boundary(circle, transform=ax.transAxes)
+    ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+    ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+    this=ax.pcolormesh(ds['TLONG'],
+                       ds['TLAT'],
+                       ds['aicen'].sel({'time':'1850-02-01 00:00:00',
+                                        'nc':i}).squeeze(),
+                       cmap=cmap,vmax=1,vmin=0,
+                       transform=ccrs.PlateCarree())
+    plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+    ax.set_title('Area Fraction Category ' + str(i+1))
+
+# gridcell mean aice in the final subplot
+ax = axs[-1]
+ax.set_boundary(circle, transform=ax.transAxes)
+ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+this=ax.pcolormesh(ds['TLONG'],
+                   ds['TLAT'],
+                   ds['aice'].sel({'time':'1850-02-01 00:00:00'}).squeeze(),
+                   cmap=cmap,vmax=1,vmin=0,
+                   transform=ccrs.PlateCarree())
+plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+ax.set_title('Sea Ice Concentration')
+
+
+
+
+
+
+Click here for the solution to final two panels
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

How do you get the grid cell total sea ice concentration? In which of the thickness categories is the concentration highest? How does that vary spatially? What does this indicate about the relative importance of different ice thicknesses in different Arctic regions?

+

Note that the default CICE ice thickness categories are:

+
    +
  • Category 1: 0-0.64 m

  • +
  • Category 2: 0.64-1.39 m

  • +
  • Category 3: 1.39-2.47 m

  • +
  • Category 4: 2.47-4.57 m

  • +
  • Category 5: 4.57+ m

  • +
+
+
+ Click here for hints +

You would calculate the grid cell total sea ice concentration by summing up the concentration in each category. In the central Arctic the concentrations are highest in categories 2 and 3, while on the ice margins the concentrations are highest in category 1. The only location with any substantial thick ice (category 5) is the central Arctic. This indicates that different regions’ sea ice are dominated by very different mean sea ice thickness. This will have implications for ice growth/melt and heat fluxes.

+
+
+
+
+

Example 2: Plot per-category snow thickness#

+

Internally, the model actually stores the snow volume for each category, not the thickness. To get the thickness we need to divide vsnon by aicen (the per category area).

+
+
+
ds['hsn'] = ds['vsnon'] / ds['aicen']
+
+
+
+
+
+
+
# Max snow depth for colorbars
+hs_max = 0.5 
+
+# make circular boundary for polar stereographic circular plots
+theta = np.linspace(0, 2*np.pi, 100)
+center, radius = [0.5, 0.5], 0.5
+verts = np.vstack([np.sin(theta), np.cos(theta)]).T
+circle = mpath.Path(verts * radius + center)
+
+cmap = plt.cm.get_cmap('Blues_r')  
+
+
+fig, axs = plt.subplots(3, 2, figsize=(20,30),
+                       subplot_kw={'projection':ccrs.NorthPolarStereo()})
+axs = np.ravel(axs)
+
+for i in ds.nc.values:
+    ax = axs[i]
+    ax.set_boundary(circle, transform=ax.transAxes)
+    ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+    ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+    this=ax.pcolormesh(ds['TLONG'],
+                       ds['TLAT'],
+                       ds['hsn'].sel({'time':'1850-02-01 00:00:00',
+                                        'nc':i}).squeeze(),
+                       cmap=cmap,vmax=hs_max,vmin=0,
+                       transform=ccrs.PlateCarree())
+    plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+    ax.set_title('Snow Depth (m) Category ' + str(i+1))
+
+# gridcell mean snow volume in the final subplot
+ax = axs[-1]
+ax.set_boundary(circle, transform=ax.transAxes)
+ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+this=ax.pcolormesh(ds['TLONG'],
+                   ds['TLAT'],
+                   ds['hs'].sel({'time':'1850-02-01 00:00:00'}).squeeze(),
+                   cmap=cmap,vmax=hs_max,vmin=0,
+                   transform=ccrs.PlateCarree())
+plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+ax.set_title('Average Snow Depth (m)')
+
+
+
+
+
+
+Click here for the solution to final two panels
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

In addition to the per-category snow thickness values we plotted the grid cell mean snow thickness. How do these values compare?

+
+
+ Click here for hints +

The per-category snow thickness can be higher than the grid cell mean (see Category 4 and the grid cell mean). This means the thicker ice tends to have thicker snow, but if the overall concentration of the thick ice categories is small then the mean over the grid call can be lower.

+
+
+
+ +
+
+

Example 4: Remapping a sea ice gridded field#

+

The sea ice and ocean grids usually have a transformation where the grid North Pole is moved into land to avoid instability problems with converging meridians (See Orthogonal Grids - Murray 1996). In the CESM we use the POP dipole and tripole grids and will soon be using the MOM6 tripole grids. While matplotlib can actually use the 2D latitude and longitude fields to make plots, it is sometimes necessary to remap or regrid the data onto a standard latitude-longitude grid. This can be done using the ESMF remapping tools xESMF for python.

+

Let’s first plot the raw field so the dipole grid can be visualized.

+
+
+
aice = ds['aice']
+
+aice
+
+
+
+
+
+
+
fig, ax = plt.subplots(figsize=(12,8))
+ax.set_facecolor('0.5') # Fill in model land by making the axis background whatever color you want
+im1 = ax.pcolormesh(ds.coords['ni'],ds.coords['nj'],aice[0],cmap='Blues_r',vmin=0,vmax=1)
+cbar = plt.colorbar(im1)
+cbar.set_label('Sea Ice Concentration',fontsize=18)
+plt.xticks([]);
+plt.yticks([]);
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

What do you notice about the Northern Hemisphere? What is going on with Greenland? Do you notice anything odd in the Southern Hemisphere?

+
+
+ Click here for hints +

See how the Northern Hemisphere looks weird? Greenland is stretched completely across the top edge of the plot. In contrast, the Southern Hemisphere looks normal.

+
+

Next we will import the xesmf library and create a “destination” grid. This is just a simple one-degree by one-degree latitude longitude grid.

+
+
+
import xesmf as xe
+
+
+
+
+
+
+
# Setting up a target grid to only regrid the sea ice data
+lat=np.arange(-90,90,1.0) 
+lon=np.arange(0,361,1.0)
+#create a meshgrid (2D fields of lats and lons)
+lon2d,lat2d=np.meshgrid(lon,lat) 
+#set up the target grid as an xarray Dataset
+target_grid=xr.Dataset({'lat': (['y', 'x'], lat2d),'lon': (['y', 'x'], lon2d)})
+
+target_grid
+
+
+
+
+

Now we need to create a Dataset. For some reason the regridder does not accept a DataArray.

+
+
+
# Define the dataset and a variable `aice` with dimensions time, nj, and ni. Also, fill the
+# lat and lon arrays from the POPgrid dataset.
+
+ds_siconc_ocean               = xr.Dataset()
+ds_siconc_ocean['aice']     = (('time','nj','ni'),ds['aice'].values)
+ds_siconc_ocean.coords['lat'] = (('nj','ni'),grid['TLAT'].values)
+ds_siconc_ocean.coords['lon'] = (('nj','ni'),grid['TLONG'].values)
+sic_ocean                     = ds_siconc_ocean['aice']
+
+
+
+
+

Next we will use xesmf to regrid from the POP gx1v7 grid to the one degree by one degree regular grid.

+
+
+
#input grid, output grid, method, keyword arguments
+#NOTE: This may throw a "FutureWarning", but feel free to ignore it.
+regridder=xe.Regridder(sic_ocean[0,:,:], target_grid, 'nearest_s2d',periodic=True,reuse_weights=False)
+
+
+
+
+

Now that we have the mapping or regridder we can translate the Xarray Dataset from gx1v7 to a one-degree regular grid.

+
+
+
sic_rg = regridder(sic_ocean)
+
+
+
+
+
+
+
# Plot the first slice of the new dataset.
+fig, ax = plt.subplots(figsize=(12,8))
+ax.set_facecolor('0.5') # Fill in model land by making the axis background whatever color you want
+im4 = ax.pcolormesh(lon,lat,sic_rg[0,:,:],cmap='Blues_r',vmin=0,vmax=1)
+cbar = plt.colorbar(im4)
+cbar.set_label('Sea Ice Concentration [%]',fontsize=18)
+plt.xticks([]);
+plt.yticks([]);
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

What do you notice about the Northern Hemisphere now?

+
+
+ Click here for hints +

See how the Northern Hemisphere looks weird? Greenland is stretched completely across the top edge of the plot. In contrast, the Southern Hemisphere looks normal.

+
+

This data could now be differenced against an observational dataset on a one-degree grid. Additionally, if you wanted to plot the model data using contourf instead of pcolormesh (which is what we used in the rest of these exercises).

+

Now let’s plot the original data with pcolormesh, the regridded data with pcolormesh, and the regridded data with contourf to see how this looks different.

+
+
+
# make circular boundary for polar stereographic circular plots
+theta = np.linspace(0, 2*np.pi, 100)
+center, radius = [0.5, 0.5], 0.5
+verts = np.vstack([np.sin(theta), np.cos(theta)]).T
+circle = mpath.Path(verts * radius + center)
+
+# define the colormap
+cmap = plt.cm.get_cmap('Blues_r')  
+
+# create the figure
+fig = plt.figure(figsize=(20,20))
+
+### make first plot - native grid - using pcolormesh
+ax = fig.add_subplot(1,3,1, projection=ccrs.NorthPolarStereo())
+ax.set_boundary(circle, transform=ax.transAxes)
+ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+
+# sets the latitude / longitude boundaries of the plot
+ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+
+#Plot the first timeslice of aice
+this=ax.pcolormesh(sic_ocean['lon'],
+                   sic_ocean['lat'],
+                   sic_ocean.isel(time=0).squeeze(),
+                   cmap=cmap,vmax=1,vmin=0,
+                   transform=ccrs.PlateCarree())
+plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+plt.title('Native grid and pcolormesh',fontsize=20)
+
+### make second plot - regridded - using pcolormesh
+ax = fig.add_subplot(1,3,2, projection=ccrs.NorthPolarStereo())
+ax.set_boundary(circle, transform=ax.transAxes)
+ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+
+# sets the latitude / longitude boundaries of the plot
+ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+
+#Plot the first timeslice of aice
+this=ax.pcolormesh(lon,
+                   lat,
+                   sic_rg.isel(time=0).squeeze(),
+                   cmap=cmap,vmax=1,vmin=0,
+                   transform=ccrs.PlateCarree())
+plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+plt.title('Regridded and pcolormesh',fontsize=20)
+
+### make third plot - regridded - using contourf
+ax = fig.add_subplot(1,3,3, projection=ccrs.NorthPolarStereo())
+ax.set_boundary(circle, transform=ax.transAxes)
+ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+
+# sets the latitude / longitude boundaries of the plot
+ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+
+#Plot the first timeslice of aice
+this=ax.contourf(lon,
+                   lat,
+                   sic_rg.isel(time=0).squeeze(),
+                   cmap=cmap,levels=[0,0.2,0.4,0.6,0.8,1.0],
+                   transform=ccrs.PlateCarree())
+plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+plt.title('Regridded and pcolormesh',fontsize=20)
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

How does the ice edge compare in the two pcolormesh plots? What’s different in the regridded pcolormesh and contourf plots?

+
+
+ Click here for hints +

The regridded data is more coarse and so the filled gridcells using pcolormesh in the regridded plot (center) are larger than in the native grid (left). The contourf differences are most notable at the ice edge near Russia where you can see clear contour lines. You might have more luck trying the contours on a month in the summer instead of winter.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/cice/basics_cice.html b/notebooks/diagnostics/cice/basics_cice.html new file mode 100644 index 000000000..897708a5c --- /dev/null +++ b/notebooks/diagnostics/cice/basics_cice.html @@ -0,0 +1,1101 @@ + + + + + + + + + + + Basic Plotting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Basic Plotting#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023a. This should be the default kernel, but if it is not, click on that button and select NPL 2023a.

+
+

This activity was developed primarily by David Bailey and Alice DuVivier.

+
+

These are examples of typical variables and plots that we look at in our sea ice diagnostics package. The most current version of the sea ice diagnostics are in the CESM Postprocessing repository. More information can be found here: CESM Postprocessing.

+

The first step is to import the libraries needed to plot the data. Here we will use xarray as a tool to read the netCDF file. We will use numpy for some basic math calculations. For plotting the data we will need matplotlib, pop_tools, geocat and cartopy.

+
+
+
import xarray as xr
+import numpy as np
+import matplotlib.pyplot as plt
+import matplotlib.path as mpath
+from matplotlib.gridspec import GridSpec
+import pop_tools
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
+import nc_time_axis
+import cftime
+import os
+
+
+
+
+
+
+

Exercise 1: Plot Sea Ice Concentration on a polar projection.#

+

Here you will learn about plotting sea ice area and other variables on a polar projection.

+

The first step is to grab sea ice (CICE) history files from your CESM model run

+
+
+
# Set your username here:
+username = "PUT_USER_NAME_HERE"
+
+# Here we point to the archive directory from your b1850.run_length simulation
+monthly_output_path = f"/glade/derecho/scratch/{username}/archive/b1850.run_length/ice/hist"
+
+# If you were unable to successfully run the b1850.run_length simulation, then feel free to use
+# this provided simulation data instead:
+#monthly_output_path = "/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.run_length/ice/hist"
+
+# Name of CESM run
+run_name = "b1850.run_length"
+
+# Create path to all files, including unix wild card for all dates
+files = os.path.join(monthly_output_path, run_name + ".cice.h.*")
+
+# read in files as an xarray dataset:
+ds = xr.open_mfdataset(files)
+
+### For this analysis, choose which variable to keep. Start with `aice` and then later try `hi`
+var_in = 'aice'    # sea ice concentration
+#var_in = 'hi'      # sea ice thickness
+
+var_to_keep = ds[var_in]
+
+print(var_to_keep)
+
+
+
+
+

The next step is to read in some grid information for the gx1v7 dipole grid used in POP and CICE. We will read in three main variables: tarea, TLAT, and TLON. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Also, we will print the longitude array TLONG to see the metadata.

+
+
+
# get pop grid grid cell areas
+grid = pop_tools.get_grid('POP_gx1v7')
+
+# convert tarea to m^2
+with xr.set_options(keep_attrs=True):
+    grid['TAREA'] = grid['TAREA']/(1e4)
+grid['TAREA'].attrs['units'] = 'm^2'
+
+grid
+
+grid['TLONG']
+
+
+
+
+

We will merge in three main variables: TAREA, TLAT, and TLON. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Note that this overwrites the dataset object from above.

+
+
+
ds = xr.merge([var_to_keep.drop(['TLAT', 'TLON', 'ULAT', 'ULON']),
+               grid[['TLAT', 'TLONG', 'TAREA']].rename_dims({'nlat':'nj','nlon':'ni'})],
+              compat='identical', combine_attrs='no_conflicts')
+grid['TLAT']
+
+
+
+
+

The next step is to set up the northern hemisphere polar stereographic projection for plotting the sea ice variable. We start with sea ice concentration aice. We are using a “rainbow” colormap here and cutting off the plot with a circular boundary. Note that we are only plotting the first timeslice of the aice array here.

+
+
+
# make circular boundary for polar stereographic circular plots
+theta = np.linspace(0, 2*np.pi, 100)
+center, radius = [0.5, 0.5], 0.5
+verts = np.vstack([np.sin(theta), np.cos(theta)]).T
+circle = mpath.Path(verts * radius + center)
+
+# define the colormap
+cmap = plt.cm.get_cmap('rainbow')  
+
+# set up the figure with a North Polar Stereographic projection
+fig = plt.figure(figsize=(20,20))
+ax = fig.add_subplot(1,2,1, projection=ccrs.NorthPolarStereo())
+ax.set_boundary(circle, transform=ax.transAxes)
+ax.add_feature(cfeature.LAND,zorder=100,edgecolor='k')
+
+# sets the latitude / longitude boundaries of the plot
+ax.set_extent([0.005, 360, 90, 55], crs=ccrs.PlateCarree())
+
+#Plot the first timeslice of aice
+this=ax.pcolormesh(ds['TLONG'],
+                   ds['TLAT'],
+                   ds[var_in].isel(time=0).squeeze(),
+                   cmap=cmap,vmax=1,vmin=0,
+                   transform=ccrs.PlateCarree())
+plt.colorbar(this,orientation='vertical',fraction=0.04,pad=0.01)
+plt.title('Sea Ice Concentration',fontsize=20)
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Why is the scale from 0-1 for aice?

+
+
+ Click here for hints +

The variable aice is actually ice fraction. To convert it to concentration you would need to multipy it by 100. In the rest of these notebooks we use the ice fraction fairly interchangeably with ice concentration. But if you are plotting these you should check your range and see if the maximum value is 1 or 100 because that’s important for setting colorbar limits.

+
+

Question:

+

What month did you plot above? How could you plot the September ice concentration? (Remember that the monthly files are written at the last timestep of the month, so the June files are written out on July 1 at 00Z).

+
+
+ Click here for hints +

You can check the date plotted by using the following command.

+
ds['aice'].isel(time=0).time
+
+
+
+

You should see that the date is Feb.1 of year 1 at 00Z. Which means it is the January mean sea ice concentration. To plot the September mean sea ice concentration, use the timeslice time=8.

+
+

Question:

+

What do you think of that rainbow colormap? Try other colormaps like viridis, plasma, Blues. Note that if you add the string _r to the colormap name it will reverse the colormap. What is a more intutitive map for plotting sea ice concentration?

+
+
+ Click here for hints +

We think the reversed Blues colormap is more intuitive.

+
cmap = plt.cm.get_cmap('Blues_r') 
+
+
+
+
+

Question:

+

Can you plot the annual mean over the data? What about computing the September mean over the data and plotting that?

+
+
+ Click here for hints +

Try entering the following data to plot in the pcolormesh function.

+
ds['aice'].mean(dim='time').squeeze(),
+
+
+
+
+

Question:

+

You have plotted the sea ice concentration (aice), now try plotting the thickness (hi). Note that the units of thickness are in meters, so think about how you should adjust the colorbar range to be sensible? Note that you will have to change the var_in at the top of this section.

+
+
+ Click here for hints +

After selecting var_in = hi, run through the following cells. Then check different ranges for vmax that might make more sense for the sea ice thickness (e.g. vmax=5)

+
+

Question:

+

All of the previous plots were of the Northern Hemisphere. How would you plot the Southern Hemisphere? How might you want to consider the seasonality if you’re looking at Antarctic sea ice?

+
+
+ Click here for hints +

Use the following to plot the Southern Hemisphere

+
ax = fig.add_subplot(1,2,1, projection=ccrs.SouthPolarStereo())
+
+ax.set_extent([0.005, 360, -90, -55], crs=ccrs.PlateCarree())
+
+
+
+
+
+
+

Exercise 2: Plot a time series of total sea ice area.#

+

The next few steps read in sea ice concentration or (aice) from one of the CESM2 large ensemble historical runs. Note this operation points to multiple files on the campaign file system, so we are using the xarray function open_mfdataset for a multifile dataset. We will also print the aice dataset to get an idea of the metadata and dimensions. Note that we could use the output from the tutorial simulations. However, those runs are very short and thus are not a very interesting timeseries. Instead we will use one of the CESM2 Large Ensemble historical simulations, as described in Rodgers et al. 2021

+
+
+
# First remove the old 'ds' variable:
+del ds
+
+### Here we point to the CESM2-LE datasets on campaign disk
+
+monthly_output_path = "/glade/campaign/cgd/cesm/CESM2-LE/ice/proc/tseries/month_1"
+run_name = "b.e21.BHISTcmip6.f09_g17.LE2-1001.001"
+
+
+
+### For this we will use the sea ice concentration (aice) and ice thickness (hi)
+
+var_names = ['aice',
+             'hi',
+            ]
+
+### This piece of code opens the files and combines them into a single xarray dataset
+
+da_list = []
+
+for var_name in var_names:
+    files = os.path.join(monthly_output_path, var_name,
+                         run_name + ".cice.h." + var_name + ".*")
+    ds_in = xr.open_mfdataset(files)
+    da_list.append(ds_in[var_name])
+    del ds_in
+
+ds = xr.merge(da_list)
+
+del da_list
+
+aice = ds['aice']
+
+print(aice)
+
+
+
+
+

The next step is to read in some grid information for the gx1v7 dipole grid used in POP and CICE. We will read in three main variables: TAREA, TLAT, and TLON. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Also, we will print the area array TAREA to see the metadata.

+
+
+
# get pop grid grid cell areas
+grid = pop_tools.get_grid('POP_gx1v7')
+
+# convert tarea to m^2
+with xr.set_options(keep_attrs=True):
+    grid['TAREA'] = grid['TAREA']/(1e4)
+grid['TAREA'].attrs['units'] = 'm^2'
+
+grid
+
+grid['TAREA']
+
+
+
+
+

We will merge in three main variables: TAREA, TLAT, and TLON. These are the areas of the gridcells along with the latitudes and longitudes of the gridcell centers. Note that this overwrites the dataset object from above.

+
+
+
ds = xr.merge([aice.drop(['TLAT', 'TLON', 'ULAT', 'ULON']),
+               grid[['TLAT', 'TLONG', 'TAREA']].rename_dims({'nlat':'nj','nlon':'ni'})],
+              compat='identical', combine_attrs='no_conflicts')
+grid['TLAT']
+
+
+
+
+

The next step is to compute the ice area in each grid cell by multiplying the grid cell areas by the ice area fraction. Then we subset to just grid cells in the Northern hemisphere (using where). Finally, we sum over all of the grid cells. We can do these operations in a single line:

+
+
+
ds_area = (ds.TAREA*ds.aice).where(ds.TLAT>0).sum(dim=['nj','ni'])
+
+
+
+
+
+
+
ds_area.plot()
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

This plot looks very noisy! Why do you think this is? Hint: you have plotted how many years of monthly mean data? Let’s try just plotting September instead.

+

Question: Why do we use month 10 (ds_area.time.dt.month.isin([10])) to reference September data?

+
+
+
ds_area.sel(time=ds_area.time.dt.month.isin([10])).plot()
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Now let’s plot the observational data on top. The NSIDC Sea Ice Index will be the values we want. These are computed from satellite observations. More information can be found here: Sea Ice Index.

+
+
+
##### Add the data values manually from the datafile.
+##### Create an xarray object with the NSIDC values and the years from 1979 to 2022.
+
+seaice_index = [4.58,4.87,4.44,4.43,4.7,4.11,4.23,4.72,5.64,5.36,4.86,4.55,4.51,5.43,4.58,5.13,4.43,5.62,\
+                4.89,4.3,4.29,4.35,4.59,4.03,4.05,4.39,4.07,4.01,2.82,3.26,3.76,3.34,3.21,2.41,3.78,3.74,\
+                3.42,2.91,3.35,3.35,3.17,2.83,3.47,3.47]
+
+# Convert to m^2
+seaice_index = np.array(seaice_index)
+seaice_index *= 1e12
+
+nsidc_time = [cftime.datetime(y, 10, 15) for y in range(1979,2023)]
+
+nsidc_index = xr.DataArray(data=seaice_index,coords={"time":nsidc_time})
+
+nsidc_index
+
+
+
+
+
+
+
ds_area.sel(time=ds_area.time.dt.month.isin([10])).plot()
+nsidc_index.plot()
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Why do you think the observed (orange) does not perfectly correspond to the model?

+
+
+ Click here for hints +

The model is one of 100 ensemble realizations of the 20th century and evolves independently, meaning each simulation has different weather and that weather will almost certainly be different from the observations. It will not, and should not, exactly match the observations because the climate system is chaotic.

+
+

Question:

+

What do you think you’ll see if you plot the March total area timeseries?

+
+
+ Click here for hints +

March total area.

+
ds_area.sel(time=ds_area.time.dt.month.isin([4])).plot()
+
+
+

This should be higher mean and have a negative, but smaller, trend than the September trend.

+
+

Question:

+

Try computing total ice volume and plotting it.

+
+
+ Click here for hints +

To calculate ice volume, use the variable hi in place of aice. Note that volume is units of \(m^3\). So, you might want to scale the volume by \(1.0e-13\).

+
ds_vol = (ds.TAREA*ds.hi).where(ds.TLAT>0).sum(dim=['nj','ni'])
+
+
+
+

Question:

+

What does the Southern Hemisphere sea ice area and volume look like?

+
+
+ Click here for hints +

To calculate the Southern Hemisphere total area or volume, set the following values so that you only include points where the latitude is less than zero.

+
ds_area = (ds.TAREA*ds.aice).where(ds.TLAT<0).sum(dim=['nj','ni'])
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/cice/cice.html b/notebooks/diagnostics/cice/cice.html new file mode 100644 index 000000000..7589f6cc5 --- /dev/null +++ b/notebooks/diagnostics/cice/cice.html @@ -0,0 +1,808 @@ + + + + + + + + + + + Sea Ice — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Sea Ice#

+
+

Basic Plotting#

+
+

Learning Goals#

+
    +
  • Making polar projection plots

  • +
  • Understanding sea ice variables such as concentration and thickness

  • +
  • Masking and area averaging

  • +
  • Computing total sea ice area or volume

  • +
+
+
+
+

Exercise 1: Making polar projection plots of sea ice concentration.#

+

Here we will use some custom python tools to produce a polar projection plot of sea ice concentration. Some things to try include changing the colormap, plotting sea ice thickness instead of concentration, and changing hemispheres.

+
+
+
+

Exercise 2: Compute total sea ice area and plot versus time.#

+

Here will we learn how to compute the total sea ice area for the northern hemisphere. Then plot this versus time. Some exercises will be plotting the monthly mean sea ice area, plotting just September or March mean sea ice area, or computing sea ice volume and then plotting it.

+
+
+
+
+

Advanced Plotting#

+
+

Learning Goals#

+
    +
  • Using sea ice thickness distribution (ITD) category information

  • +
  • Using sea ice tracers

  • +
  • Remapping sea ice fields.

  • +
+
+
+
+

Exercise 1: Plot per-category ice area#

+

Here you will plot a field that uses the subgridscale ice thickness distribution (ITD) categories.

+
+
+
+

Exercise 2: Plot per-category snow thickness#

+

Here is another example of an ITD related field, the snow thickness. Actual snow thickness is derived from the snow volume (per unit area).

+
+
+ +
+
+

Exercise 4: Remapping or regridding sea ice fields#

+

The ocean and sea ice grids are different in that the North Pole is moved into land. In this exercise +you will learn how to “remap” or “regrid” a sea ice field onto a standard one degree by one degree grid.

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/clm_ctsm/basics_clm.html b/notebooks/diagnostics/clm_ctsm/basics_clm.html new file mode 100644 index 000000000..467f8a8e9 --- /dev/null +++ b/notebooks/diagnostics/clm_ctsm/basics_clm.html @@ -0,0 +1,1385 @@ + + + + + + + + + + + Basic Plotting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Basic Plotting#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023a. This should be the default kernel, but if it is not, click on that button and select NPL 2023a.

+
+

This activity was developed primarily by Will Wieder and Peter Lawrence.

+
+
+

Global Visualizations#

+

These are examples of typical variables and plots that we look at in our land model diagnostics package. You can see examples of output from the land model dagnostics package here. The most current version of the land model diagnostics are in the CESM Postprocessing. More information here: CESM Postprocessing.

+
+
+

Notebook Objectives#

+
    +
  1. Become familiar with Jupyter Notebooks

  2. +
  3. Begin getting acquainted with python packages and their utilities

  4. +
  5. Plot a map and timeseries of global results

  6. +
+
+

History files from CESM are saved in netcdf format (denoted with the .nc file extension), a file format commonly used for storing large, multi-dimensional scientific variables. +Netcdf files are platform independent and self-describing; each file includes metadata that describes the data, including: variables, dimensions, and attributes.

+

The figure below provides a generic example of the data structure in a netcdf file. The dataset illustrated has two variables (temperature and pressure) that have three dimensions. Coordinate data (e.g., latitude, longitude, time) that describe the data are also included.

+

Note that each simulation file has multiple variables. Within each h0 file, most of the variables have three dimensions (lat x lon x time), while a few soil variables (e.g., moisture, temperature) have 4 dimensions (lat x lon x time x depth).

+

Netcdf

+
+

We’ll start by loading some packages

+

The first step is to import the libraries needed to plot the data. Here we will use xarray as a tool to read the netCDF file. We will use numpy for some basic math calculations. For plotting the data we will need matplotlib and cartopy.

+
+
+
# python packages
+import os
+import xarray as xr
+import numpy as np
+import pandas as pd
+
+# resources for plotting
+import matplotlib.pyplot as plt
+import cartopy
+import cartopy.crs as ccrs
+import cftime
+%matplotlib inline
+
+
+
+
+
+

NOTE: This example largely uses features of xarray and +matplotlib packages. We won’t go into the basics +of python or features included in these packages, but there are lots of +resources to help get you started. Some of these are listed below.

+
+ +
+
+
+

1. Reading and formatting data#

+

Note: the drop-down solutions, below, assume you used b1850.run_length output for plotting for this section

+
+

1.1 Point to the data#

+

The first step is to grab land (CTSM) history files from your CESM model run

+

For this example we will use:

+
    +
  • reflected solar radiation (FSR),

  • +
  • incident solar radiation (FSDS), and

  • +
  • exposed leaf area index (ELAI)

  • +
+
+
+
# Set your username here:
+username = "PUT_USER_NAME_HERE"
+
+# Here we point to the archive directory from your b1850.run_length simulation
+monthly_output_path = f"/glade/derecho/scratch/{username}/archive/b1850.run_length/lnd/hist"
+
+# If you were unable to successfully run the b1850.run_length simulation, then feel free to use
+# this provided simulation data instead:
+#monthly_output_path = "/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.run_length/lnd/hist"
+
+# Name of CESM run
+run_name = "b1850.run_length"
+
+# Create path to all files, including unix wild card for all dates
+files = os.path.join(monthly_output_path, run_name + ".clm2.h0.*")
+
+# read in files as an xarray dataset:
+ds = xr.open_mfdataset(files)
+
+
+
+
+

NOTE: These are the raw history files that CTSM writes out.

+

By default, they include grid cell averaged monthly means for different state and flux variables.

+
+ TIP: If you want to look at other variables, the fields variable in the cell below is where you can modify what we're reading off of the CLM history files. +
+
+

Printing information about the dataset is helpful for understanding your data.#

+
    +
  • What dimensions do your data have?

  • +
  • What are the coordinate variables?

  • +
  • What variables are we looking at?

  • +
  • Is there other helpful information, or are there attributes in the dataset we should be aware of?

  • +
+
+
+
# Print information about the dataset
+ds
+
+
+
+
+

You can also print information about the variables in your dataset. The example below prints information about one of the data variables we read in. You can modify this cell to look at some of the other variables in the dataset.

+

What are the units, long name, and dimensions of your data?

+
+
+
ds.FSDS
+
+
+
+
+
+
+
+
+

1.2 Simple Calculations#

+

To begin with we’ll look at albedo that’s simulated by the model.

+

Albedo can be calculated in several different ways, but the calculations use solar radiation terms that are handled within CTSM.

+

Here we’ll look at ‘all sky albedo’, which is the ratio of reflected to incoming solar radiation (FSR/FSDS). +Other intereresting variables might include latent heat flux or gross primary productivity.

+

We will add this as a new variable in the dataset and add appropriate metadata.

+

When doing calculations, it is important to avoid dividing by zero. Use the .where function for this purpose

+
+
+
ds['ASA'] = ds.FSR/ds.FSDS.where(ds.FSDS>0)
+ds['ASA'].attrs['units'] = 'unitless'
+ds['ASA'].attrs['long_name'] = 'All sky albedo'
+ds['ASA']
+
+
+
+
+
+
+
+

2. Plotting#

+
+

2.1 Easy plots using Xarray#

+

To get a first look at the data, we can plot a month of data from the simulation, selecting the month using the .isel function.

+
+ NOTE: The plotting function only works with 1D or 2D data. Our data are 3D (time, lat, lon), so we need to specify a specific value for the other variables. Below, we select a specific time using the isel, leaving the lat and lon dimensions to plot on the x and y axes. +
+
    +
  • We will plot all sky albedo (variable = ASA). Note that we select the variable by specifying our dataset, ds, and the variable.

  • +
  • The plot is for the first year of data (time=slice(0,12))

  • +
  • This plotting function will plot ASA for each simulation in our dataset

  • +
+

More plotting examples are on the xarray web site

+
+
+
ds.ASA.isel(time=slice(0,12)).plot(x='lon',y='lat',col="time", col_wrap=6) ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Why don’t you see the whole globe in some months?

+
+
+

2.2 Calculating differences#

+

We can calculate the differences between the beginning and end of the simulation to see the differences in albedo over the simulation period. The below code:

+
    +
  • Calculates a monthly climatology for the first and last full year of the simulation

  • +
  • Defines the difference as a new variable, dsDiff

  • +
+

We’ll first plot maps of the difference in all sky albedo for each month

+
+
+
dsIni = ds.isel(time=slice(0,12)).groupby('time.month').mean()
+dsFin = ds.isel(time=slice(-16,-4)).groupby('time.month').mean()
+dsDiff = dsFin-dsIni
+dsDiff.ASA.plot(x='lon',y='lat',col="month", col_wrap=6, robust=True) ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Questions:

+
    +
  • How is albedo different at the end of the simulation, relative to the begining of simulation?

  • +
  • Where are the differences the largest?

  • +
  • Are the differences consistent throughout the year?

  • +
  • What’s causing these albedo changes in different regions?

  • +
+
+

Are the differences coming from incoming or reflected radiation?#

+

To find out, we can plot each variable. First we will plot incoming radiation (the denominator in all-sky albedo).

+
+
+
dsDiff.FSDS.plot(x='lon',y='lat',col="month", col_wrap=6, vmax=30.0,vmin=-30.0) ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Questions:

+
    +
  • Do you see any dfferences?

  • +
  • Try plotting reflected radiation (the numerator, FSR). What differences do you see?

  • +
+

Note that you might want to change the minimun (vmin) and maximum (vmax) colorbar values for the plot when you switch between variables

+
+
+

Is exposed leaf area index (ELAI) contributing to the differences in albedo?#

+

Plot the differences in ELAI below.

+
+
+
dsDiff.ELAI.plot(x='lon',y='lat',col="month", col_wrap=6, robust=True) ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Questions:

+
    +
  • What regions are LAI differences the greatest?

  • +
  • What times of year is this true?

  • +
  • Are the regions and times of largest differences the same as the differences in albedo?

  • +
+
+
+
+

2.3 Calculating Time Series#

+

Note: the drop-down solutions, below, assume you used CESM2 Large Ensemble output for plotting for this section

+

As above, the plotting function we use here requires data to be 1D or 2D. Therefore, to plot a time series we either need to select a single point or average over an area.

+
+

2.3.1 Time series at a single point#

+

This example uses .sel, which functions similarly to the .isel function above, to select a single point in the Amazon.

+

What’s the difference between .sel and .isel?

+
    +
  • .sel selects a value of a variable (e.g., latitude of -5)

  • +
  • .isel selects an indexed point of a variable (e.g., the 6th point in the data vector)

  • +
+

In the below examples, we’ll also use subplots to see multiple variables in several panels

+

Also, the next few steps read in land model data from one of the CESM2 large ensemble historical runs. Note this operation points to multiple files on the campaign file system, so we are using the xarray function open_mfdataset for a multifile dataset. We will also print the dataset to get an idea of the metadata and dimensions. Note that we could use the output from the tutorial simulation. However, those runs are very short and thus are not a very interesting timeseries. Instead we can use one of the CESM2 Large Ensemble historical simulations (see Rodgers et al. 2021).

+
+
+
#First remove the old datasets
+del ds
+del dsDiff
+
+### Here we point to the CESM2-LE datasets on campaign disk and 
+### Look at results from a single ensemble member
+
+monthly_output_path = "/glade/campaign/cgd/cesm/CESM2-LE/lnd/proc/tseries/month_1"
+run_name = "b.e21.BHISTcmip6.f09_g17.LE2-1001.001"
+
+var_names = ['FSR','FSDS','ELAI']
+
+### This piece of code opens the files and combines them into a single xarray dataset
+
+da_list = []
+
+for var_name in var_names:
+    files = os.path.join(monthly_output_path, var_name,
+                         run_name + ".clm2.h0." + var_name + ".*")
+    ds_in = xr.open_mfdataset(files)
+    # keep history file attributes:  This only needs to be done once
+    if var_name == 'FSR':
+        da_list.append(ds_in)
+    else:            
+        da_list.append(ds_in[var_name])
+    del ds_in
+
+''' quick fix to adjust time vector for monthly data'''
+def fix_time(ds):  
+    nmonths = len(ds.time)
+    yr0 = ds['time.year'][0].values
+    ds['time'] =xr.cftime_range(str(yr0),periods=nmonths,freq='MS')    
+
+    return ds
+
+ds = fix_time(xr.merge(da_list))
+
+print('-- Your dataset is been opened --')
+
+
+
+
+
+
+
# Print information about the dataset
+ds
+
+
+
+
+
+
+
#Calculate Albedo and add to dataset
+ds['ASA'] = ds.FSR/ds.FSDS.where(ds.FSDS>0)
+ds['ASA'].attrs['units'] = 'unitless'
+ds['ASA'].attrs['long_name'] = 'All sky albedo'
+ds['ASA']
+
+
+
+
+
+
+
point = ds.sel(lon=300, lat=-5, method='nearest')
+point.ASA.plot(x='time') ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Similar to the maps above, there are variations in albedo in the simulation at this location. Let’s add other variables to explore why we see differences at this location.

+
+
+
plt.figure(figsize=(10,6))
+'''this first plot is the same as the one above'''
+plt.subplot(221)
+point.ASA.plot()
+plt.xlabel(None)
+
+'''now we'll look for potential sources of the difference'''
+plt.subplot(222)
+point.ELAI.plot() 
+plt.xlabel(None)
+
+plt.subplot(223)
+point.FSDS.plot() 
+plt.title(None)
+
+plt.subplot(224)
+point.FSR.plot() 
+plt.title(None) ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Questions:

+
    +
  • What variables show differences?

  • +
  • What variables are similar?

  • +
  • How do the differences and similarities help to explain the differences in albedo?

  • +
+
+
+

2.3.2 Global time series#

+

There are many reasons why we may want to calculate globally integrated time series for particular variables. +This requires weighting the values from each grid cell by the total land area of individual grid cells. The example below does this for our dataset.

+
+
+

First calculate the land weights:#

+
    +
  • land area la that is the product of land fraction (fraction of land area in each grid cell) and the total area of the grid cell (which changes by latitude). Units are the same as area.

  • +
  • land weights lw, the fractional weight that each grid makes to the global total, is calculated as the land area of each grid cell divided by the global sum of the land area.

  • +
+

The land weights are shown in the plot below. Note that these are larger near the equator, and smaller at the poles and along the coastline

+
+
+
la = (ds.landfrac*ds.area).isel(time=0).drop(['time']) 
+la = la * 1e6  #converts from land area from km2 to m2 
+la.attrs['units'] = 'm^2'
+lw = la/la.sum()
+lw.plot() ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

Next, calculate and plot a global weighted sum#

+
+

NOTE: You will likely want to calculate global weighted sum for a variety of different variables. For variables that have area-based units (e.g. GPP, gC/m^2/s), you need to use the land area variable when calculating a global sum. Remember to pay attention to the units and apply any necessary conversions! Keep in mind that grid cell area is reported in km^2.

+
+
+
+
dsGlobalWgt = (ds * lw).sum(['lat','lon'])
+
+plt.figure(figsize=(12,5))
+plotVars = ['ASA','FSDS','ELAI','FSR']
+for i in range(len(plotVars)):
+    # First add metadata for plotting
+    dsGlobalWgt[plotVars[i]].attrs['long_name'] = ds[plotVars[i]].attrs['long_name']
+    dsGlobalWgt[plotVars[i]].attrs['units'] = ds[plotVars[i]].attrs['units']
+
+    # then make plots
+    plt.subplot(2,2,(i+1))
+    dsGlobalWgt[plotVars[i]].plot()
+    
+    if i == 0:
+        plt.title('Weighted global sum',loc='left', fontsize='large', fontweight='bold')
+        
+    if i<2:
+        plt.xlabel(None)
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+
+
+

2.4 Calculate an annual weighted mean and create customized plots#

+

Annual averages require a different kind of weighting: the number of days per month. +This example creates python functions that allow you to easily calculate annual averages and create customized plots.

+
+

Python functions: In python, creating a function allows us to use the same calculation numerous times instead of writing the same code repeatedly.

+
+
+

2.4.1 Calculate monthly weights#

+

The below code creates a function weighted_annual_mean to calculate monthly weights. Use this function any time you want to calculate weighted annual means.

+
+
+
# create a function that will calculate an annual mean weighted by days per month
+def weighted_annual_mean(array):
+    mon_day  = xr.DataArray(np.array([31,28,31,30,31,30,31,31,30,31,30,31]), dims=['month'])
+    mon_wgt  = mon_day/mon_day.sum()
+    return (array.rolling(time=12, center=False) # rolling
+            .construct("month") # construct the array
+            .isel(time=slice(11, None, 12)) # slice so that the first element is [1..12], second is [13..24]
+            .dot(mon_wgt, dims=["month"]))
+
+# generate annual means
+for i in range(len(plotVars)):
+    temp = weighted_annual_mean(
+        ds[plotVars[i]].chunk({"time": 12}))
+    
+    if i ==0:
+        dsAnn = temp.to_dataset(name=plotVars[i])
+    else:
+        dsAnn[plotVars[i]] = temp
+
+# Make a simple plot
+dsAnn.isel(time=0).ELAI.plot(x='lon',y='lat',robust=True) ;
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+
dsAnn
+
+
+
+
+
+
+

2.4.2 Customized maps#

+

Creating a function isn’t necessary to plot maps, but this function, which uses python’s cartopy, allows you to make several pretty maps in one figure.

+

Additional examples and information are available on the cartopy website

+

There are two code blocks below. The first block of code defines the function. The second code block creates the plot.

+
+
+
import cartopy.feature as cfeature
+from cartopy.util import add_cyclic_point
+import copy
+
+# Generate a function for making panel plots of maps
+## many of these features are not required, but provide additional control over plotting
+def map_function(da, cb=0, cmap='viridis', panel=None,  ax=None, 
+                 title=None, vmax=None, vmin=None, units=None,nbins=200):
+    '''a function to make one subplot'''
+    wrap_data, wrap_lon = add_cyclic_point(da.values, coord=da.lon)
+
+    if ax is None: ax = plt.gca()
+
+    # define the colormap, including the number of bins
+    cmap = copy.copy(plt.get_cmap(cmap,nbins))
+    im = ax.pcolormesh(wrap_lon,da.lat,wrap_data,
+                   transform=ccrs.PlateCarree(),
+                   vmax=vmax,vmin=vmin,cmap=cmap)
+
+    # set the bounds of your plot
+    ax.set_extent([-180,180,-56,85], crs=ccrs.PlateCarree())
+
+    # add title & panel labels
+    ax.set_title(title,loc='left', fontsize='large', fontweight='bold')
+    ax.annotate(panel, xy=(0.05, 0.90), xycoords=ax.transAxes,
+                ha='center', va='center',fontsize=16)    
+
+    # add plotting features
+    ax.coastlines()
+    ocean = ax.add_feature(
+        cfeature.NaturalEarthFeature('physical','ocean','110m', facecolor='white'))
+    
+    # control colorbars on each plot & their location
+    if cb == 1:
+        cbar = fig.colorbar(im, ax=ax,pad=0.02, fraction = 0.03, orientation='horizontal')
+        cbar.set_label(units,size=12,fontweight='bold')
+    if cb == 2:
+        cbar = fig.colorbar(im, ax=ax,pad=0.02, fraction = 0.05, orientation='vertical')    
+        cbar.set_label(units,size=12)#,weight='bold')
+
+
+
+
+
+
+

Now make the plot!#

+
+
+
i = 0
+fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(13,6), constrained_layout=True,
+                         subplot_kw=dict(projection=ccrs.Robinson()))
+for index, ax in np.ndenumerate(axes):
+    if i == 0:
+        plotData = dsAnn.ELAI.isel(time=slice(-10,None)).mean('time')
+        map_function(plotData, ax=ax,cb=2,
+                     panel='(a)', nbins=10,
+                     vmax=5,vmin=0,
+                     units='Final Annual ELAI')
+    if i == 1:
+        plotData = (dsAnn.ELAI.isel(time=slice(-10,None)).mean('time')- \
+                    dsAnn.ELAI.isel(time=slice(0,10)).mean('time'))
+        map_function(plotData, ax=ax,cb=2,panel='(b)',
+                     units='Annual ELAI Change, Final-Initial',
+                     cmap='bwr',nbins=7,
+                     vmax=0.75,vmin=-0.75)    
+                     
+    i = i+1
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+
+
+

Extra credit challenge#

+

If you have extra time & energy, try running through this notebook with other variables. Interesting options could include:

+
    +
  • Latent heat flux (the sum of FCTR+FCEV+FGEV) or

  • +
  • Gross Primary Production (GPP)

  • +
+
+

HINT: pay attention to units for these challenges.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/clm_ctsm/clm_ctsm.html b/notebooks/diagnostics/clm_ctsm/clm_ctsm.html new file mode 100644 index 000000000..ec9b729a0 --- /dev/null +++ b/notebooks/diagnostics/clm_ctsm/clm_ctsm.html @@ -0,0 +1,734 @@ + + + + + + + + + + + Land — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Land

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Land#

+

This notebook is an introduction to analyzing CLM land model results from a global simulation. It uses results from the case you ran in the 1a Tutorial. We’ve prestaged model results from this simulation and another simulation using a different model configuration in a shared directory. This way, you can get started on analyzing simulations results before your simulations finish running and compare differences caused by model structure.

+
+

Learning Goals#

+
    +
  • Read in global CLM data

  • +
  • Make basic spatial plots

  • +
  • Make basic timeseries plots

  • +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/cupid.html b/notebooks/diagnostics/cupid.html new file mode 100644 index 000000000..30314064d --- /dev/null +++ b/notebooks/diagnostics/cupid.html @@ -0,0 +1,984 @@ + + + + + + + + + + + CUPiD — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

CUPiD

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

CUPiD#

+

The CESM Unified Postprocessing and Diagnostics (CUPiD) package is a new python-based system for running post-processing routines and diagnostics across all CESM components with a common user and developer interface. +This notebook is a chance to try out CUPiD and run its’ time series generation tool on your own model simulation.

+

Note that the underlying python code is very similar to the routines shown in the component-specific diagnostics, which is why we recommend trying those notebooks first. Additional info, including the source code, can be found on Github here.

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is Bash. This should be the default kernel, but if it is not, click on that button and select Bash.

+

CUPiD is currently a command line tool. This means that instead of running python code directly, this notebook will run unix commands CUPiD provides in order to generate the relevant diagnostics. To start, we need to clone CUPiD from Github:

+
+
+
#Delete old CUPiD directory if one exists:
+if [ -d "CUPiD" ]; then
+  rm -rf CUPiD
+fi
+
+#Clone CUPiD source code from Github repo:
+git clone --recurse-submodules https://github.com/NCAR/CUPiD.git
+cd CUPiD #Need to enter CUPiD directory for remaining commands
+
+
+
+
+

We’ll also need to grab some external libraries, which is done the same way as CESM via checkout_externals:

+
+
+
./manage_externals/checkout_externals
+
+
+
+
+

This downloads two additional diagnostics packages that CUPiD will use. One is the AMWG Diagnostics Framework (ADF), which is a command-line tool that can be used to generate CAM diagnostics, and mom6-tools, which is a python package that can be used to analyze MOM6, which is the ocean model that will be used in CESM3 (but for this tutorial we’ll ignore).

+

Next we need to setup the proper python environment using conda/mamba, and activate the cupid-dev environment:

+
+
+
#Load conda to your environment:
+module load conda
+
+#Install 'cupid-dev' environment if it doesn't already exist:
+if ! { conda env list | grep 'cupid-dev'; } >/dev/null 2>&1; then
+  mamba env create -f environments/dev-environment.yml
+fi
+
+#Install 'cupid-analysis' environment if ti doesn't already exist:
+if ! { conda env list | grep 'cupid-analysis'; } >/dev/null 2>&1; then
+  mamba env create -f environments/cupid-analysis.yml
+fi
+
+#Activate CUPiD conda environemnt:
+conda activate cupid-dev
+#NOTE: You may see a red ": 1" message below, but it can be ignored.
+
+#Check that cupid-run can be accessed appropriately:
+which cupid-run
+if [ $? -ne 0 ]; then
+  #If not then use pip to install:
+  pip install -e .
+fi
+
+
+
+
+

CUPiD is controlled via a config YAML file. Here we create a new directory and write the relevant config file for our tutorial simulation. Please note that if your tutorial simulations didn’t finish then you can use the provided simulations instead:

+
+
+
cd examples         #Go to the examples directory
+if ! [ -d "cesm_tutorial" ]; then #Check if CESM tutorial directory already exists.
+  mkdir cesm_tutorial #If not, then make a new directory to hold our config file
+fi 
+cd cesm_tutorial    #Go to newly made CESM tutorial example directory
+cat << EOF > config.yml
+################## SETUP ##################
+
+#NOTE:  CUPiD ocean diagnostics are currently only designed for upcoming MOM6
+#       ocean model, so for this tutorial we will only do example atmosphere,
+#       land, and sea ice diagnostics.
+
+################
+# Data Sources #
+################
+data_sources:
+    # sname is any string used as a nickname for this configuration. It will be
+    ### used as the name of the folder your computed notebooks are put in
+    sname: cesm_tutorial_quick_run
+
+    # run_dir is the path to the folder you want
+    ### all the files associated with this configuration
+    ### to be created in
+    run_dir: .
+
+    # nb_path_root is the path to the folder that cupid will
+    ### look for your template notebooks in. It doesn't have to
+    ### be inside run_dir, or be specific to this project, as
+    ### long as the notebooks are there
+    nb_path_root: ../nblibrary
+
+######################
+# Computation Config #
+######################
+
+computation_config:
+
+    # default_kernel_name is the name of the environment that
+    ### the notebooks in this configuration will be run in by default.
+    ### It must already be installed on your machine. You can also
+    ### specify a different environment than the default for any
+    ### notebook in NOTEBOOK CONFIG
+
+    default_kernel_name: cupid-analysis
+
+############# NOTEBOOK CONFIG #############
+
+############################
+# Notebooks and Parameters #
+############################
+
+# All parameters under global_params get passed to all the notebooks
+
+global_params:
+  CESM_output_dir: /glade/derecho/scratch/${USER}/archive
+  #Uncomment code here if you need a complete CESM tutorial simulation:
+  #CESM_output_dir: /glade/campaign/cesm/tutorial/tutorial_2023_archive
+  lc_kwargs:
+    threads_per_worker: 1
+
+timeseries:
+  # This section of the config file controls the time series generator, which
+  # takes standard CESM history (time-slice) files and converts them into single
+  # variable time series files.
+ 
+  num_procs: 8
+  ts_done: [False]
+  overwrite_ts: [False]
+  ts_output_dir: /glade/derecho/scratch/${USER}/archive
+  case_name: 'b1850.run_length'
+
+  #Variables can either be provided as a list (e.g. ['X', 'Y', 'Z']) or,
+  #if you want to convert everything on the file, by using the ['process_all']
+  #keyword.  For the example below we'll only convert a single variable
+  #from each component.
+
+  atm:
+    vars: ['TREFHT']
+    derive_vars: []
+    hist_str: 'h0'
+    start_years: [1]
+    end_years: [3]
+    level: 'lev'
+
+  lnd:
+    vars: ['ALTMAX']
+    derive_vars: []
+    hist_str: 'h0'
+    start_years: [1]
+    end_years: [3]
+    level: 'lev'
+
+  ocn:
+    vars: [] # Not doing ocean analyses
+    derive_vars: []
+    hist_str: 'h'
+    start_years: [1]
+    end_years: [3]
+    level: 'lev'
+
+  ice:
+    vars: ['hi']
+    derive_vars: []
+    hist_str: 'h'
+    start_years: [1]
+    end_years: [3]
+    level: 'lev'
+
+  glc:
+    vars: ['usurf']
+    derive_vars: []
+    hist_str: 'initial_hist'
+    start_years: [1]
+    end_years: [3]
+    level: 'lev'
+
+#IGNORE EVERYTHING BELOW THIS LINE!
+
+########### JUPYTER BOOK CONFIG ###########
+
+##################################
+# Jupyter Book Table of Contents #
+##################################
+book_toc:
+
+  # See https://jupyterbook.org/en/stable/structure/configure.html for
+  # complete documentation of Jupyter book construction options
+
+  format: jb-book
+
+  # All filenames are notebook filename without the .ipynb, similar to above
+
+  root: infrastructure/index # root is the notebook that will be the homepage for the book
+  parts:
+
+    # Parts group notebooks into different sections in the Jupyter book
+    # table of contents, so you can organize different parts of your project.
+
+#    - caption: Atmosphere
+
+      # Each chapter is the name of one of the notebooks that you executed
+      # in compute_notebooks above, also without .ipynb
+#      chapters:
+#        - file: atm/adf_quick_run
+
+#    - caption: Land
+#      chapters:
+#        - file: lnd/land_comparison
+
+#    - caption: Sea Ice
+#      chapters:
+#        - file: ice/seaice
+
+#####################################
+# Keys for Jupyter Book _config.yml #
+#####################################
+book_config_keys:
+
+  title: CESM Tutorial - CUPiD  # Title of your jupyter book
+
+  # Other keys can be added here, see https://jupyterbook.org/en/stable/customize/config.html
+  ### for many more options   
+EOF
+
+
+
+
+

Now we are ready to run CUPiD!

+
+

Generating time series#

+

One of CUPiD’s currently-working functions is to help convert CESM history files into single-variable time series files, which are required for various different diagnostic systems, as well for submitting to CMIP. Here we can create some time series files from the tutorial simulation using the config file we just created above and the -ts flag.

+
+
+
module load nco #Currently the NetCDF Operators are needed by CUPiD in order to run the time series generator
+cupid-run -ts
+
+
+
+
+

Now let’s check if the time series files were generated successfully, by examining the directory we are writing the time series files to. In the below command replace “COMP” with your components of choice (atm, lnd, ocn, ice, or glc):

+
+
+
ts_data_path="/glade/derecho/scratch/${USER}/archive/COMP/proc/tseries"
+ls $ts_data_path
+
+
+
+
+

Do you see a NetCDF file there? How does the naming convention compare to +standard CESM history output? Now let’s check inside the file:

+
+
+
ncdump -h $ts_data_path/*.nc
+
+
+
+
+

How do these results compare to a standard CESM history file? What is the same? +What is different?

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/diagnostics.html b/notebooks/diagnostics/diagnostics.html new file mode 100644 index 000000000..fe0278039 --- /dev/null +++ b/notebooks/diagnostics/diagnostics.html @@ -0,0 +1,814 @@ + + + + + + + + + + + Diagnostics — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Diagnostics#

+
+

These activities have been tested and updated by Jesse Nusbaumer and Alice DuVivier

+
+

Once the CESM model has been run and the output data has been transfered to the short term archive directory the real job of understanding how the simulation ran and what it means from a scientific perspective begins.

+

By this point you have run a number of simulations and have looked at model output using ncview. In this lab you will go beyond ncview by using Python plotting and analysis methods in Jupyterhub to produce additional diagnostic results. There is also a complete CESM diagnostics system currently under active development called CUPiD that you will get to try out as well, although please note that it is still in its very early stages. Finally, please note that there are many other CESM analysis tools and projects available as well, but not all will be covered here.

+

To start running the Jupyter Notebooks provided for this tutorial, follow the steps below.

+
+

Step 1. Download CESM Tutorial notebooks with Git Clone#

+
+We will use the main branch of the tutorial materials for use in this tutorial.

+

First we will change into the home directory and then we will use the git clone command to download the CESM Tutorial diagnostics notebooks.

+
+Change the current directory to the home directory:
+
cd 
+
+
+
+

Download the cesm code to your code workspace directory as CESM-Tutorial:

+
git clone https://github.com/NCAR/CESM-Tutorial.git CESM-Tutorial
+
+
+
+
+

Step 2. Login to JupyterHub#

+

Go to the JupyterHub website (https://jupyterhub.hpc.ucar.edu/) and click on the “Production” button.

+

JupyterHub

+

This will take you to a page where you enter your username and password. Enter your username as you would for Derecho, but your password will be the following:

+

Derecho password,Duo Pin

+

Where “Duo Pin” is the six numbers you can find in your Duo app under the “UCAR” Account listing. Please note that the comma ( , ) must also be there separating the password from the Duo Pin.

+

JupyterHub Login

+

JupyterHub Login

+

After you do this and click “Sign In” you will be taken to a Server landing page where you will need to start your sever on Jupyterhub.

+

JupyterHub Server

+

Select the “Casper PBS Batch” option in the drop down menu.

+

JupyterHub Casper PBS

+

After selecting “Casper PBS Batch” you need to make other choices to select the right resources. You should use the queue and project account keys specified below. You may also want to request 03:00:00 for your Wall Time so that your server is active for the entire hands-on activity session. Do not change any other selection for this tutorial. If you are doing further analysis of model experiments you may need to change these settings and can find more information in the CISL Documentation about JupyterHub.

+
+For this tutorial you should use the Queue `casper` and Project Account `UESM0013`.

+

JupyterHub Selections

+

You may have to wait a moment or two for your server to start up.

+

JupyterHub Casper PBS

+

Your JupyterHub session is now active and ready to run.

+
+
+

Step 3. Open a Diagnostics Notebook#

+

When your JupyterHub session opens you should be in your home directory on the NCAR HPC. In Step 1 you cloned the “CESM-Tutorial” repository, which has the notebooks you will run in this activity.

+

JupyterHub Main Page

+

To get to the Diagnostics notebooks, double click the following sequence of folders:

+
    +
  1. CESM-Tutorial

  2. +
  3. notebooks

  4. +
  5. diagnostics

  6. +
  7. Click on the folder for the model component that you are interested in running (e.g. cam)

  8. +
  9. Click on the basics.ipynb notebook (see arrow on left, below)

  10. +
+

The final path in your browser url line for the following example should be: +$USER/CESM-Tutorial/notebooks/diagnostics/cam/basics.ipynb

+

JupyterHub Open Notebook

+
+
+

Step 4. Check Your Notebook Kernel#

+

Check your kernel (see arrow in upper right corner, above). It should be either NPL 2023a or NPL 2023b. You should use the specified kernel for any diagnostics you do during the tutorial as it is a default environment available on NCAR HPC and the notebooks here have been tested so that they work with that particular kernel for the analysis environment. We have set the default kernels and specifiy what they should be in each component notebook. However, if you need to change it click on the kernel button and select the correct kernel.

+
+
+

Step 5. Run Jupyter Notebook Cells#

+

To run a Jupyter cell

+
    +
  • Type your command into the cell

  • +
  • To execute the command:

    +
      +
    • Press shift+return

    • +
    +
    + OR +
    + - Select the cell then click the 'play' button at the top of the window (see red arrow, above)
  • +
+

All figures will be rendered in the Jupyter Notebook, so there is no need to open any other window for this portion of the lab activities.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/mom/basics_mom.html b/notebooks/diagnostics/mom/basics_mom.html new file mode 100644 index 000000000..5383c2b3f --- /dev/null +++ b/notebooks/diagnostics/mom/basics_mom.html @@ -0,0 +1,1202 @@ + + + + + + + + + + + Basic Plotting with MOM6 — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Basic Plotting with MOM6#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023a. This should be the default kernel, but if it is not, click on that button and select NPL 2023a.

+
+

This activity was developed by Gustavo Marques.

+
+
+

Setting up the notebook#

+

Here we load modules needed for our analysis

+
+
+
# loading modules
+
+# %load_ext watermark # this is so that in the end we can check which module versions we used
+%load_ext autoreload
+
+import warnings 
+warnings.filterwarnings("ignore")
+
+import datetime
+import glob
+import os
+import warnings
+import dask
+import dask_jobqueue
+import distributed
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+import numpy as np
+import xarray as xr
+from matplotlib import ticker, cm
+from cartopy import crs as ccrs, feature as cfeature
+import cartopy
+
+
+
+
+
+

Setting up the Dask cluster#

+

Remember to:

+
    +
  • change the project number if doing this outside the tutorial

  • +
  • potentially change the walltime depending on what you want to do

  • +
  • check the memory if you are loading a different dataset with different needs

  • +
  • check the number of cores if you are loading a different dataset with different needs

  • +
+
+
+
# Set your username here:
+username = "PUT_USER_NAME_HERE"
+
+if "client" in locals():
+    client.close()
+    del client
+if "cluster" in locals():
+    cluster.close()
+
+cluster = dask_jobqueue.PBSCluster(
+    cores=2,  # The number of cores you want
+    memory="8GB",  # Amount of memory
+    processes=1,  # How many processes
+    queue="casper",  # The type of queue to utilize (/glade/u/apps/dav/opt/usr/bin/execcasper)
+    log_directory=f"/glade/derecho/scratch/{username}/dask/",  # Use your local directory
+    resource_spec="select=1:ncpus=1:mem=8GB",  # Specify resources
+    project="UESM0013",   # Input your project ID here
+    walltime="02:00:00",  # Amount of wall time
+)
+# cluster.adapt(maximum_jobs=24, minimum_jobs=2) # If you want to force everything to be quicker, increase the number of minimum jobs, 
+# # but sometimes then it will take a while until you get them assigned, so it's a trade-off
+cluster.scale(12) # I changed this because currently dask is flaky, this might have to be adjusted during the tutorial
+client = distributed.Client(cluster)
+client
+
+
+
+
+
+
+

MOM6 diag_table and history files#

+

The diagnostics in MOM6 are controlled by the diag_table. To understand how the diag_table works, please click on this link. If you have done the gmom_jra.run_length simulation, you can use a text editor to inspect the default diag_table for this simulation. It’s located at:

+
+

/glade/u/home/$USER/cases/gmom_jra.run_length/CaseDocs/diag_table

+
+

Below is a list of history files for the out-of-the-box MOM6 simulations, including a brief explanation of their purposes. The mom6.h.sfc files contain daily means, while all other history files contain monthly means.

+ +

The following history files include temperature, salinity, velocities, and transports along pre-defined transects. Please refer to the figure below to view the location of some of these transects (the figure is outdated and misses some transects).

+
    +
  • CASENAME.mom6.h.Agulhas_Section.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Barents_Opening.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Bering_Strait.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Davis_Strait.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Denmark_Strait.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Drake_Passage.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.English_Channel.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Fram_Strait.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Florida_Bahamas.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Florida_Bahamas_extended.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Florida_Cuba.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Gibraltar_Strait.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Iceland_Norway.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Indonesian_Throughflow.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Mozambique_Channel.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Pacific_undercurrent.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Taiwan_Luzon.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Windward_Passage.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Robeson_Channel.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Yucatan_Channel.YYYY-MM.nc.????

  • +
  • CASENAME.mom6.h.Bosporus_Strait.YYYY-MM.nc.????

  • +
+

pre-defined sections

+

Figure: Pre-defined sections for transport diagnostics.

+
+
+

Load the data#

+

Note: the drop-down solutions, below, assume you used gmom_jra.run_length output for plotting

+
+
+
# Set your casename here:
+casename = 'gmom_jra.run_length'
+
+# Here we point to the archive directory from your b1850.run_length simulation
+pth = f"/glade/derecho/scratch/{username}/archive/{casename}/ocn/hist/"
+
+# If you were unable to successfully run the b1850.run_length simulation, then feel free to use
+# this provided simulation data instead:
+#pth = f'/glade/campaign/cesm/tutorial/tutorial_2024_archive/{casename}/ocn/hist/'
+
+# Print path to screen
+pth
+
+
+
+
+
+
+
%%time
+# how quick this is depends among other things on the availability of workers on casper
+# you can check progress by clicking on the link for the cluster above which will show you the dask dashboard  
+full_pth = pth + casename + '.mom6.h.native.000?-??.nc'  #also might want to use just some years not all 
+ds_mom = xr.open_mfdataset(full_pth, parallel=True)
+ds_mom = ds_mom.sortby(ds_mom.time)
+tlist = np.asarray([time.replace(year=time.year+1957) for time in ds_mom.time.values]) # this makes sure the time axis is useful
+ds_mom['time'] = tlist
+ds_mom["time"] = ds_mom.indexes["time"].to_datetimeindex()
+ds_mom #print some meta-data to screen
+
+
+
+
+
+
+
+
+

Exercise 1#

+

Means of global Surface Heat Flux and Sea Surface Temperature

+
+
+
%%time
+fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)
+
+ds_mom.hfds.mean('time').plot(robust=True, ax=ax[0])
+ax[0].set_title(r'Surface Heat Flux [W/m$^2$]')
+
+ds_mom.thetao.sel(zl=0, method='nearest').mean('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))
+ax[1].set_title(r'Sea Surface Temperature [$^{\circ}$C]')
+#plt.savefig('basics_plot_1.png', bbox_inches='tight') # uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Can you plot sea surface height (SSH) instead of surface heat flux (SHF)?

+
+
+ Click here for hints +
ds_mom.SSH.mean('time').plot(robust=True, ax=ax[0])
+ax[0].set_title(r'Sea Surface Height (cm)')
+
+
+
+

Question:

+

Can you plot standard deviations instead of means?

+
+
+ Click here for hints +

Replace the .mean function with .std in the plotting call.

+
ds_mom.SHF.std('time').plot(robust=True, ax=ax[0])
+
+ds_mom.thetao.sel(zl=0, method='nearest').std('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))
+
+
+
+
+
+
+

Exercise 2#

+

Let’s create some better-looking plots! Did you notice the x and y axes of the previous plots? They represent the “nominal” longitude (xh) and latitude (yh) of tracer points for labeling the output axes rather than the “true” longitudes and latitudes. MOM6 output is on a curvilinear grid, which means that the grid is not regularly spaced. The true coordinate values are not stored in the mom6.h.native files. Instead, all the horizontal grid information is saved in the mom6.h.ocean_geometry.nc file. Let’s load this file and check its variables.

+
+
+
geo_pth = pth + casename + '.mom6.h.ocean_geometry.nc'  #also might want to use just some years not all 
+hgrid = xr.open_dataset(geo_pth).rename({'lath':'yh','lonh':'xh','latq':'yq','lonq':'xq'}) # rename dimensions to match those in ds_mom
+hgrid
+
+
+
+
+

Variables geolat and geolon are the 2D variables that we need to use, let’s have a look at them.

+
+
+
# learn what geolat and geolon look like 
+fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)
+
+hgrid.geolat.plot(ax=ax[0], levels=np.arange(-90,95,5))
+ax[0].set_title('geolat')
+hgrid.geolon.plot(ax=ax[1], levels=np.arange(-290,90,10))
+ax[1].set_title('geolon')
+#plt.savefig('basics_plot_2.png', bbox_inches='tight') # uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question

+

Can you see the irregularity in geolat? What does the discontinuity in geolon mean?

+
+

1. Make global maps#

+
+
+
%%time
+
+# initiate the figure
+fig = plt.figure(dpi=150, figsize=(12,3))
+
+# add the first subplot
+ax_shf = plt.subplot(1, 2, 1, projection=ccrs.Robinson(central_longitude=300.0))
+
+pc = ax_shf.contourf(hgrid.geolon, hgrid.geolat, ds_mom.hfds.mean('time'),
+                   transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(-120,130,10))
+
+ax_shf.set_global() 
+
+land = ax_shf.add_feature(
+    cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',
+                                        linewidth=0.5,
+                                        edgecolor='black',
+                                        facecolor='darkgray'))
+
+shf_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_shf);
+shf_cbar.set_label(r'[W/m$^{2}$]')
+
+ax_shf.set_title('Surface Heat Flux')
+
+# add the second subplot
+ax_sst = plt.subplot(1, 2, 2, projection=ccrs.Robinson(central_longitude=300.0))
+
+pc = ax_sst.contourf(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0).mean('time'),
+                   transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(0,32,1))
+
+ax_sst.set_global() 
+
+land = ax_sst.add_feature(
+    cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',
+                                        linewidth=0.5,
+                                        edgecolor='black',
+                                        facecolor='darkgray'))
+
+sst_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_sst);
+sst_cbar.set_label(r'[$^{\circ}$C]')
+ax_sst.set_title('Sea Surface Temperature')
+
+#plt.savefig('basics_plot_3.png', bbox_inches='tight') # uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

2. Make regional map over continental US#

+
+
+
# define the extent of the map
+lonW = -140
+lonE = -40
+latS = 15
+latN = 65
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+
+
+
+
+
# what does sea surface temperature around the US look like? (i.e. where would you like to go swimming..)
+fig = plt.figure(figsize=(11, 8.5))
+ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())
+ax.set_title('')
+gl = ax.gridlines(
+    draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'
+)
+ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())
+ax.coastlines(resolution=res, color='black')
+ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')
+ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');
+tdat = ax.pcolormesh(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0, time=10), cmap='RdYlBu_r')
+plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1)
+#plt.savefig('basics_plot_4.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

3. Make regional map over the Pacific#

+

There’s an awful lot of not-ocean over the continental US. Let’s look at the Pacific instead.

+
+
+
# define the extent of the map
+lonW = -180
+lonE = -60
+latS = -30
+latN = 30
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+
+
+
+
+
fig = plt.figure(figsize=(11, 8.5))
+ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())
+ax.set_title('SST')
+gl = ax.gridlines(
+    draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'
+)
+ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())
+ax.coastlines(resolution=res, color='black')
+ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')
+ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');
+tdat = ax.pcolormesh(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0, time=10), cmap='RdYlBu_r', vmin=15, vmax=31)
+cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))
+cbar.set_label(r'[$^{\circ}$C]')
+#plt.savefig('basics_plot_5.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

4. Plotting contours#

+

The figures above use pcolormesh to plot, but we can also use contourf to make filled contours.

+
+
+
# define the extent of the map
+lonW = -180
+lonE = -60
+latS = -30
+latN = 30
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+
+
+
+
+
fig = plt.figure(figsize=(11, 8.5))
+ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())
+ax.set_title('SST')
+gl = ax.gridlines(
+    draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'
+)
+ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())
+ax.coastlines(resolution=res, color='black')
+ax.stock_img() # something else than the boarders for a change
+tdat = ax.contourf(hgrid.geolon, hgrid.geolat, ds_mom.thetao.isel(zl=0, time=10), cmap='RdYlBu_r', levels=np.arange(10,31,1))
+cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))
+cbar.set_label(r'[$^{\circ}$C]')
+#plt.savefig('basics_plot_6.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Try looking at the Equatorial Atlantic Ocean or other region that interests you (Gulf of Mexico, Gulf of Maine, California Coast).

+
+
+ Click here for hints +

Before plotting the region, you’ll need to modify the latitude/longitude bounds. Here are the bounds for the Equatorial Atlantic Ocean:

+
# define the extent of the map
+lonW = -60
+lonE = 20
+latS = -30
+latN = 30
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+

You can play with these to look at other regions of interest to you.

+
+

Question:

+

Try plotting other variables like sea surface height (SSH) or 50m temperature.

+
+
+ Click here for hints +

See hints in exercise 1.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/pop/advanced_pop.html b/notebooks/diagnostics/pop/advanced_pop.html new file mode 100644 index 000000000..c32775348 --- /dev/null +++ b/notebooks/diagnostics/pop/advanced_pop.html @@ -0,0 +1,938 @@ + + + + + + + + + + + Advanced Plotting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Advanced Plotting

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Advanced Plotting#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023b. This should be the default kernel, but if it is not, click on that button and select NPL 2023b.

+
+

This activity was developed primarily by Mauricio Rocha and Gustavo Marques.

+
+
+

Setting up the notebook#

+

Here we load modules needed for our analysis

+
+
+
# loading modules
+
+# %load_ext watermark # this is so that in the end we can check which module versions we used
+%load_ext autoreload
+
+import warnings 
+warnings.filterwarnings("ignore")
+
+import cartopy.crs as ccrs
+import cartopy.feature
+import matplotlib.pyplot as plt
+import xarray as xr
+import numpy as np 
+import pop_tools
+import glob
+
+
+
+
+
+

Get the data#

+
+
+
# Set your username here:
+username = "PUT_USER_NAME_HERE"
+casename = 'b1850.run_length'
+
+# Here we point to the archive directory from your b1850.run_length simulation
+pth = f"/glade/derecho/scratch/{username}/archive/{casename}/ocn/hist/"
+
+# If you were unable to successfully run the b1850.run_length simulation, then feel free to use
+# this provided simulation data instead:
+#pth = f'/glade/campaign/cesm/tutorial/tutorial_2024_archive/{casename}/ocn/hist/'
+
+# Print path to screen
+pth
+flist = glob.glob(pth + casename + '.pop.h.00??-??.nc')  
+ds = xr.open_mfdataset(flist, compat='override', coords='minimal')
+
+
+
+
+
+
+
+
+

Exercise 1#

+

Maximum mixed-layer depth for the winter months in the northern hemisphere (January, February, and March) and in the southern hemisphere (July, August, and September)

+
+
+
# POP grid
+pop_grid = pop_tools.get_grid('POP_gx1v7')
+ds['TLONG'] = pop_grid.TLONG; ds['TLAT'] = pop_grid.TLAT
+ds['ULONG'] = pop_grid.ULONG; ds['ULAT'] = pop_grid.ULAT
+
+
+
+
+
+
+
# July, August, and Septemper (JAS)
+def is_jas(month):
+        return (month >= 7) & (month <= 9)
+JAS = ds['XMXL'].sel(time=is_jas(ds['XMXL']['time.month'])).mean('time')
+
+# January, February, and March (JFM)
+def is_jfm(month):
+        return (month >= 1) & (month <= 3)
+JFM = ds['XMXL'].sel(time=is_jfm(ds['XMXL']['time.month'])).mean('time')
+
+
+
+
+
+
+
# Find the latitude value closest to the equator
+def find_nearest(array, value):
+    array = np.asarray(array)
+    idx = (np.abs(array - value)).argmin()
+    return array[idx]
+eq=find_nearest(JAS['TLAT']['TLAT'][:,0], value=0)
+print(eq)
+
+
+
+
+
+
+
# Find the index of this latitude
+idx=np.where(JAS['TLAT']['TLAT'][:,0] == eq)[0]
+print(idx)
+
+
+
+
+
+
+
# Create a new array
+winter=JFM.copy()
+
+# Since the variable winter already contains the data for the Northern Hemisphere, we will now add the data for the Southern Hemisphere
+winter.loc[0:187,:]=JAS.loc[0:187,:]
+
+
+
+
+
+
+
plt.figure(figsize=(8,6));
+ax = plt.axes(projection=ccrs.Robinson());
+orig_map=plt.cm.get_cmap('turbo')
+scale_color=orig_map.reversed()
+cf=(winter*0.01).plot.pcolormesh(ax=ax, # Multiply by 0.01 to transform centimeters to meters
+                              vmax=800,vmin=0,
+                              transform=ccrs.PlateCarree(),
+                              x='TLONG',
+                              y='TLAT',
+                              cmap=scale_color,
+                              add_colorbar=False,
+                           )                                    
+ax.coastlines()
+ax.add_feature(cartopy.feature.LAND)
+ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
+                  linewidth=2, color='gray', alpha=0.5, linestyle='-')
+cbar = plt.colorbar(cf, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(0,800,100), label='XMXL [m]')
+plt.title('Maximum Mixed-Layer Depth for the Winter', fontsize=14)
+#plt.savefig('advanced_plot_1.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+
+

Exercise 2#

+

Calculate the heat storage (HS) per area from the temperature tendency for the upper 2000m. +Equation: $\(\rm{HF = \uprho_\uptheta~C_p~\int_{z_2}^{z_1}\uptheta_{(z)}'~dz},\)$ +where:

+
    +
  • HF is heat storage (\(\rm{W~m^{-2}}\)),

  • +
  • \(\uprho_\uptheta\) is the sea water density (\(\rm{kg~m^{-3}}\)),

  • +
  • \(\rm{C_p}\) is the sea water specific heat (\(\rm{J~kg^{-1}~^{\circ}C^{-1}}\)),

  • +
  • \(\rm{dz}\) is the cell thickness (m),

  • +
  • and \(\uptheta\)’ is the temperature tendency (\(\rm{^{\circ}C^{-1}~s^{-1}}\)).

  • +
+
+
+
ds_HS=ds['TEND_TEMP'].sel(z_t=slice(0,200000))*ds['dz'].sel(z_t=slice(0,200000))*0.01  # Select the depth and multiply by dz. Unit: oC.s-1.m 
+ds_HS=ds_HS.sum('z_t')                                                                 # Sum in depth
+ds_HS=ds_HS*1026                                                                       # Multiply it by the sea water density. Unit: oC.s-1.kg.m-2
+ds_HS=ds_HS*3996                                                                       # Multiply it by the sea water heat specific. Unit: W.m-2    
+
+
+
+
+
+
+
plt.figure(figsize=(8,6))
+ax = plt.axes(projection=ccrs.Robinson())
+orig_map=plt.cm.get_cmap('RdBu')
+scale_color=orig_map.reversed()
+cf=ds_HS.mean('time').plot.pcolormesh(ax=ax,
+                              transform=ccrs.PlateCarree(),
+                              vmin=-50,
+                              vmax=50,
+                              x='TLONG',
+                              y='TLAT',
+                              cmap=scale_color,
+                              add_colorbar=False,
+                           )  
+ax.coastlines()
+ax.add_feature(cartopy.feature.LAND)
+ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
+                  linewidth=2, color='gray', alpha=0.5, linestyle='-')
+cbar = plt.colorbar(cf, ax=ax, shrink=0.5, pad=0.1, label='HS [W m$^{-2}$]')
+plt.title('Heat Storage per area for the upper 2000 m', fontsize=14)
+#plt.savefig('advanced_plot_2.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/pop/basics_pop.html b/notebooks/diagnostics/pop/basics_pop.html new file mode 100644 index 000000000..fed238986 --- /dev/null +++ b/notebooks/diagnostics/pop/basics_pop.html @@ -0,0 +1,1489 @@ + + + + + + + + + + + Basic Plotting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Basic Plotting#

+

BEFORE BEGINNING THIS EXERCISE - Check that your kernel (upper right corner, above) is NPL 2023a. This should be the default kernel, but if it is not, click on that button and select NPL 2023a.

+
+

This activity was developed primarily by Anna-Lena Deppenmeier and Gustavo Marques.

+
+
+

Setting up the notebook#

+

Here we load modules needed for our analysis

+
+
+
# loading modules
+
+# %load_ext watermark # this is so that in the end we can check which module versions we used
+%load_ext autoreload
+
+import warnings 
+warnings.filterwarnings("ignore")
+
+import datetime
+import glob
+import os
+import warnings
+import dask
+import dask_jobqueue
+import distributed
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+import xarray as xr
+import xgcm
+from matplotlib import ticker, cm
+import pop_tools
+from cartopy import crs as ccrs, feature as cfeature
+import cartopy
+
+
+
+
+
+

Define some functions#

+

These functions will be used more than once to read data and add a cyclic point. These could go in a package if you like.

+
+
+
# define function to get you the data you want relatively quickly 
+
+def read_dat(files, variables, pop=False):
+    def preprocess(ds):
+        return ds[variables].reset_coords(drop=True) # reset coords means they are reset as variables
+
+    ds = xr.open_mfdataset(files, parallel=True, preprocess=preprocess,
+                           chunks={'time':1, 'nlon': -1, 'nlat':-1},
+                           combine='by_coords')
+    if pop==True:
+        file0 = xr.open_dataset(files[0])
+        ds.update(file0[['ULONG', 'ULAT', 'TLONG', 'TLAT']])
+        file0.close()
+
+    ds
+    return ds
+
+# define function to be able to plot POP output properly on cartopy projections
+def pop_add_cyclic(ds):
+    
+    nj = ds.TLAT.shape[0]
+    ni = ds.TLONG.shape[1]
+
+    xL = int(ni/2 - 1)
+    xR = int(xL + ni)
+
+    tlon = ds.TLONG.data
+    tlat = ds.TLAT.data
+    
+    tlon = np.where(np.greater_equal(tlon, min(tlon[:,0])), tlon-360., tlon)    
+    lon  = np.concatenate((tlon, tlon + 360.), 1)
+    lon = lon[:, xL:xR]
+
+    if ni == 320:
+        lon[367:-3, 0] = lon[367:-3, 0] + 360.        
+    lon = lon - 360.
+    
+    lon = np.hstack((lon, lon[:, 0:1] + 360.))
+    if ni == 320:
+        lon[367:, -1] = lon[367:, -1] - 360.
+
+    #-- trick cartopy into doing the right thing:
+    #   it gets confused when the cyclic coords are identical
+    lon[:, 0] = lon[:, 0] - 1e-8
+
+    #-- periodicity
+    lat = np.concatenate((tlat, tlat), 1)
+    lat = lat[:, xL:xR]
+    lat = np.hstack((lat, lat[:,0:1]))
+
+    TLAT = xr.DataArray(lat, dims=('nlat', 'nlon'))
+    TLONG = xr.DataArray(lon, dims=('nlat', 'nlon'))
+    
+    dso = xr.Dataset({'TLAT': TLAT, 'TLONG': TLONG})
+
+    # copy vars
+    varlist = [v for v in ds.data_vars if v not in ['TLAT', 'TLONG']]
+    for v in varlist:
+        v_dims = ds[v].dims
+        if not ('nlat' in v_dims and 'nlon' in v_dims):
+            dso[v] = ds[v]
+        else:
+            # determine and sort other dimensions
+            other_dims = set(v_dims) - {'nlat', 'nlon'}
+            other_dims = tuple([d for d in v_dims if d in other_dims])
+            lon_dim = ds[v].dims.index('nlon')
+            field = ds[v].data
+            field = np.concatenate((field, field), lon_dim)
+            field = field[..., :, xL:xR]
+            field = np.concatenate((field, field[..., :, 0:1]), lon_dim)       
+            dso[v] = xr.DataArray(field, dims=other_dims+('nlat', 'nlon'), 
+                                  attrs=ds[v].attrs)
+
+
+    # copy coords
+    for v, da in ds.coords.items():
+        if not ('nlat' in da.dims and 'nlon' in da.dims):
+            dso = dso.assign_coords(**{v: da})
+                
+            
+    return dso
+
+
+
+
+
+
+

Setting up the Dask cluster#

+

Remember to:

+
    +
  • change the project number if doing this outside the tutorial

  • +
  • potentially change the walltime depending on what you want to do

  • +
  • check the memory if you are loading a different dataset with different needs

  • +
  • check the number of cores if you are loading a different dataset with different needs

  • +
+
+
+
# Set your username here:
+username = "PUT_USER_NAME_HERE"
+
+if "client" in locals():
+    client.close()
+    del client
+if "cluster" in locals():
+    cluster.close()
+
+cluster = dask_jobqueue.PBSCluster(
+    cores=2,  # The number of cores you want
+    memory="8GB",  # Amount of memory
+    processes=1,  # How many processes
+    queue="casper",  # The type of queue to utilize (/glade/u/apps/dav/opt/usr/bin/execcasper)
+    log_directory=f"/glade/derecho/scratch/{username}/dask/",  # Use your local directory
+    resource_spec="select=1:ncpus=1:mem=8GB",  # Specify resources
+    project="UESM0013",   # Input your project ID here
+    walltime="02:00:00",  # Amount of wall time
+)
+# cluster.adapt(maximum_jobs=24, minimum_jobs=2) # If you want to force everything to be quicker, increase the number of minimum jobs, 
+# # but sometimes then it will take a while until you get them assigned, so it's a trade-off
+cluster.scale(12) # I changed this because currently dask is flaky, this might have to be adjusted during the tutorial
+client = distributed.Client(cluster)
+client
+
+
+
+
+
+
+

Get the data#

+

Note: the drop-down solutions, below, assume you used b1850.run_length output for plotting

+
+
+
# Set your casename here:
+casename = 'b1850.run_length'
+
+# Here we point to the archive directory from your b1850.run_length simulation
+pth = f"/glade/derecho/scratch/{username}/archive/{casename}/ocn/hist/"
+
+# If you were unable to successfully run the b1850.run_length simulation, then feel free to use
+# this provided simulation data instead:
+#pth = f'/glade/campaign/cesm/tutorial/tutorial_2024_archive/{casename}/ocn/hist/'
+
+# Print path to screen
+pth
+
+
+
+
+
+

Details on files#

+
    +
  • b1850.run_length.pop.h.0001-01.nc : one timestep year ???? and month -?? for a number of 2D and 3D variables and constants

  • +
  • b1850.run_length.pop.h.nday1.0001-01-01.nc : daily timestep output for one month for SST, SST variance, SSS and (max) mixed layer depth

  • +
  • b1850.run_length.pop.h.once.nc : (background) mixing values

  • +
  • b1850.run_length.pop.hv.nc: viscosities

  • +
+
+
+
%%time
+# how quick this is depends among other things on the availability of workers on casper
+# you can check progress by clicking on the link for the cluster above which will show you the dask dashboard  
+flist = glob.glob(pth + casename + '.pop.h.00??-??.nc')  #also might want to use just some years not all 
+ds_pop = read_dat(flist, ['TEMP', 'SHF'], pop=True)
+ds_pop = ds_pop.sortby(ds_pop.time)
+tlist = np.asarray([time.replace(year=time.year+1957) for time in ds_pop.time.values]) # this makes sure the time axis is useful
+ds_pop['time'] = tlist
+ds_pop["time"] = ds_pop.indexes["time"].to_datetimeindex()
+ds_pop #print some meta-data to screen
+
+
+
+
+
+
+
+
+
+

Exercise 1#

+

Means of global Surface Heat Flux and Sea Surface Temperature

+
+
+
%%time
+fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)
+
+ds_pop.SHF.mean('time').plot(robust=True, ax=ax[0])
+ax[0].set_title(r'Surface Heat Flux [W/m$^2$]')
+
+ds_pop.TEMP.sel(z_t=0, method='nearest').mean('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))
+ax[1].set_title(r'Sea Surface Temperature [$^{\circ}$C]')
+#plt.savefig('basics_plot_1.png', bbox_inches='tight') # uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Can you plot 50m ocean temperature instead of surface heat flux (SHF)?

+
+
+ Click here for hints +

First, try using Xarray’s sel function to select temperature values at the POP z-axis (z_t) index closest to 50m (note that the values in z_t are in centimeters):

+
ds_pop.TEMP.sel(z_t=5000, method='nearest').mean('time').plot(robust=True, ax=ax[0], levels=np.arange(0,32,1))
+
+
+

What was the depth selected?

+
ds_pop.TEMP.sel(z_t=5000, method='nearest').mean('time').z_t.values
+
+
+

There is not a layer with the midpoint at 50m. There are layers with the midpoint at 45m and 55m.

+
(ds_pop.z_t)/100
+
+
+

To estimate the temperature at 50m, we can use Xarray’s interp to interpolate the values along the z-axis. By default, this function uses a linear interpolation method:

+
ds_pop.TEMP.interp(z_t=5000).mean('time').plot(robust=True, ax=ax[0], levels=np.arange(0,32,1))
+
+
+
+

Question:

+

Can you plot sea surface height (SSH) instead of surface heat flux (SHF)?

+
+
+ Click here for hints +

We didn’t initially load SSH as a variable we kept, so you will need to do that above.

+
ds_pop = read_dat(flist, ['TEMP', 'SHF','SSH'], pop=True)
+
+
+

Always be aware of which variables might be in a file.

+

Once you’ve loaded SSH in the dataset, then plot it instead of SHF as follows:

+
ds_pop.SSH.mean('time').plot(robust=True, ax=ax[0])
+ax[0].set_title(r'Sea Surface Height (cm)')
+
+
+
+

Question:

+

Can you plot standard deviations instead of means?

+
+
+ Click here for hints +

Replace the .mean function with .std in the plotting call.

+
ds_pop.SHF.std('time').plot(robust=True, ax=ax[0])
+
+ds_pop.TEMP.sel(z_t=0, method='nearest').std('time').plot(robust=True, ax=ax[1], levels=np.arange(0,32,1))
+
+
+
+
+
+
+

Exercise 2#

+

Let’s make some nicer plots! Have you noticed the x and y axes of the plots above? They are indices rather than longitudes and latitudes. POP output is on a curvilinear grid which means that the grid is not regularly (evenly) spaced. TLAT and TLONG are 2D variables depending on these indices, let’s have a look at how to make maps.

+
+
+
# learn what TLAT and TLONG look like 
+fig, ax = plt.subplots(1, 2, figsize=(12,3), sharex=True, sharey=True)
+
+ds_pop.TLAT.plot(ax=ax[0], levels=np.arange(-90,95,5))
+ax[0].set_title('TLAT')
+ds_pop.TLONG.plot(ax=ax[1], levels=np.arange(0,370,10))
+ax[1].set_title('TLONG')
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question

+

Can you see the irregularity in TLAT? What does the discontinuity in TLONG mean?

+
+

1. Make global maps#

+
+
+
# Add cyclic point
+ds_pop_cyc = pop_add_cyclic(ds_pop)
+
+
+
+
+
+
+
%%time
+
+# initiate the figure
+fig = plt.figure(dpi=150, figsize=(12,3))
+
+# add the first subplot
+ax_shf = plt.subplot(1, 2, 1, projection=ccrs.Robinson(central_longitude=300.0))
+
+pc = ax_shf.contourf(ds_pop_cyc.TLONG, ds_pop_cyc.TLAT, ds_pop_cyc.SHF.mean('time'),
+                   transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(-120,130,10))
+
+ax_shf.set_global() 
+
+land = ax_shf.add_feature(
+    cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',
+                                        linewidth=0.5,
+                                        edgecolor='black',
+                                        facecolor='darkgray'))
+
+shf_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_shf);
+shf_cbar.set_label(r'[W/m$^{2}$]')
+
+ax_shf.set_title('Surface Heat Flux')
+
+# add the second subplot
+ax_sst = plt.subplot(1, 2, 2, projection=ccrs.Robinson(central_longitude=300.0))
+
+pc = ax_sst.contourf(ds_pop_cyc.TLONG, ds_pop_cyc.TLAT, ds_pop_cyc.TEMP.isel(z_t=0).mean('time'),
+                   transform=ccrs.PlateCarree(), cmap='RdYlBu_r', extend='both', levels=np.arange(0,32,1))
+
+ax_sst.set_global() 
+
+land = ax_sst.add_feature(
+    cartopy.feature.NaturalEarthFeature('physical', 'land', '110m',
+                                        linewidth=0.5,
+                                        edgecolor='black',
+                                        facecolor='darkgray'))
+
+sst_cbar = plt.colorbar(pc, shrink=0.55, ax=ax_sst);
+sst_cbar.set_label(r'[$^{\circ}$C]')
+ax_sst.set_title('Sea Surface Temperature')
+
+#plt.savefig('basics_plot_3.png', bbox_inches='tight') # uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

2. Make regional map over continental US#

+
+
+
# define the extent of the map
+lonW = -140
+lonE = -40
+latS = 15
+latN = 65
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+
+
+
+
+
# what does sea surface temperature around the US look like? (i.e. where would you like to go swimming..)
+fig = plt.figure(figsize=(11, 8.5))
+ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())
+ax.set_title('')
+gl = ax.gridlines(
+    draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'
+)
+ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())
+ax.coastlines(resolution=res, color='black')
+ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')
+ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');
+tdat = ax.pcolormesh(ds_pop.TLONG, ds_pop.TLAT, ds_pop.TEMP.isel(z_t=0, time=10), cmap='RdYlBu_r')
+plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1)
+#plt.savefig('basics_plot_4.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

3. Make regional map over the Pacific#

+

There’s an awful lot of not-ocean over the continental US. Let’s look at the Pacific instead.

+
+
+
# define the extent of the map
+lonW = -180
+lonE = -60
+latS = -30
+latN = 30
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+
+
+
+
+
fig = plt.figure(figsize=(11, 8.5))
+ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())
+ax.set_title('SST')
+gl = ax.gridlines(
+    draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'
+)
+ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())
+ax.coastlines(resolution=res, color='black')
+ax.add_feature(cfeature.STATES, linewidth=0.3, edgecolor='brown')
+ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='blue');
+tdat = ax.pcolormesh(ds_pop.TLONG, ds_pop.TLAT, ds_pop.TEMP.isel(z_t=0, time=10), cmap='RdYlBu_r', vmin=15, vmax=31)
+cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))
+cbar.set_label(r'[$^{\circ}$C]')
+#plt.savefig('basics_plot_5.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+

4. Plotting contours#

+

The figures above use pcolormesh to plot, but if you want to make filled contours using contourf you will need to make your dataset cyclical.

+
+
+
#ds_pop_cyc = pop_add_cyclic(ds_pop)# uncomment this if you have not run this line before
+
+
+
+
+
+
+
# define the extent of the map
+lonW = -180
+lonE = -60
+latS = -30
+latN = 30
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+
+
+
+
+
fig = plt.figure(figsize=(11, 8.5))
+ax = plt.subplot(1, 1, 1, projection=ccrs.PlateCarree())
+ax.set_title('SST')
+gl = ax.gridlines(
+    draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--'
+)
+ax.set_extent([lonW, lonE, latS, latN], crs=ccrs.PlateCarree())
+ax.coastlines(resolution=res, color='black')
+ax.stock_img() # something else than the boarders for a change
+tdat = ax.contourf(ds_pop_cyc.TLONG, ds_pop_cyc.TLAT, ds_pop_cyc.TEMP.isel(z_t=0, time=10), cmap='RdYlBu_r', levels=np.arange(10,31,1))
+cbar = plt.colorbar(tdat, ax=ax, shrink=0.5, pad=0.1, ticks=np.arange(15,35,5))
+cbar.set_label(r'[$^{\circ}$C]')
+#plt.savefig('basics_plot_6.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Try looking at the Equatorial Atlantic Ocean or other region that interests you (Gulf of Mexico, Gulf of Maine, California Coast).

+
+
+ Click here for hints +

Before plotting the region, you’ll need to modify the latitude/longitude bounds. Here are the bounds for the Equatorial Atlantic Ocean:

+
# define the extent of the map
+lonW = -60
+lonE = 20
+latS = -30
+latN = 30
+cLat = (latN + latS) / 2
+cLon = (lonW + lonE) / 2
+res = '110m'
+
+
+

You can play with these to look at other regions of interest to you.

+
+

Question:

+

Try plotting other variables like sea surface height (SSH) or 50m temperature.

+
+
+ Click here for hints +

See hints in exercise 1.

+
+
+
+
+
+

Exercise 3#

+

So far we’ve just looked at 2D ocean properties, primarily at the surface. But the ocean is deep and you might want to look at how a variable changes with depth. Here we’ll plot a cross section of an ocean variable with depth and how it changes with time.

+

The difficulty here is that you can’t easily select your lat and lon location, you need to find the nlon and nlat index first. As you could see from the TLAT and TLONG plots above, they don’t behave regularly, so this is a bit of a challenge. Let’s start with the equator (which is a bit easier than high up north).

+
+
+
ds_pop.TLAT
+
+
+
+
+
+
+
# find the latitude that is the smallest, i.e. closest to the equator:
+abs(ds_pop.TLAT).argmin(dim='nlat')
+
+
+
+
+

This shows you that the equator is not the same everywhere +but it is within one index and so might be just on the south or north of the equator, you can choose either. (there is no latitude where lat=0, can you imagine why?)

+
+
+
# so let's say 
+ind_eq = 180
+
+
+
+
+

Let’s now find some location we might be interested in, say 140\(^{\circ}\)W

+
+
+
ds_pop.TLONG.isel(nlat=ind_eq).plot()
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+
+
+
# the longitude goes from 0-360, so if we want 140W which is -140 we would need to select 220
+ind_140w = abs(ds_pop.TLONG.isel(nlat=ind_eq)-220).argmin()
+
+
+
+
+
+

1. First Plot#

+
+
+
fig, ax = plt.subplots(2, 1, figsize=(9,4.5))
+
+ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).plot(y='z_t', ax=ax[0], 
+                ylim=(250e2,0), levels=np.arange(10,32,2), cmap='RdYlBu_r')
+
+ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).plot(y='z_t', ax=ax[1], 
+                ylim=(5000e2,0), levels=np.arange(0,10.2,0.2), cmap='Blues')
+
+#plt.savefig('basics_plot_8.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

What is the vertical dimension? Which side of the plot is the ocean surface vs. the ocean floor?

+
+
+ Click here for hints +

These plots have the surface of the ocean at the top of the plot. So it’s oriented physically with how we percieve the world. You should be aware of how the y axis changes when plotting figures like this to make them more easily interpretable.

+
+
+
+

2. Nicer axes#

+
+
+
fig, (ax_upper, ax_lower) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 3]}, 
+                                         figsize=(10,6), sharex=True)
+
+dat_upper = ax_upper.contourf(ds_pop.time, ds_pop.z_t/100, ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).T, 
+                              levels=np.arange(10,32,1), cmap='RdYlBu_r', extend='both')
+ax_upper.set_ylim(300,0)
+plt.colorbar(dat_upper, ax=ax_upper)
+
+dat_lower = ax_lower.contourf(ds_pop.time, ds_pop.z_t/100, ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).T, 
+                              levels=np.arange(0,10.5,0.5), cmap='Blues', 
+                 extend='both')
+ax_lower.set_ylim(4000,300)
+plt.colorbar(dat_lower, ax=ax_lower, shrink=0.7)
+#plt.savefig('basics_plot_9.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

What happened to the vertical axis? Why does this make the plot easier to read?

+
+
+ Click here for hints +

The ocean is deep and there is often different rates of change in a variable over the the upper ocean compared to the deep ocean. So using different scales and plotting them separately can be useful for analysis.

+
+
+
+
+
+

Exercise 4#

+

The previous exercise showed how to plot a vertical cross section of the ocean over time. But it can also be valuable to plot a profile of a variable with depth at a particular point either at one time, averaged over time, or a profile averaged over a set of points again at one time or averaged over time.

+

Here we will plot an average profile of temperature with depth.

+
+
+
ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq)
+
+
+
+
+
+
+
%%time
+# let's load these calculated quantities so that we don't have to calculate them time and time again 
+t_0n140w_mean = ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).mean('time').load()
+t_0n140w_std = ds_pop.TEMP.isel(nlon=ind_140w, nlat=ind_eq).std('time').load()
+
+
+
+
+
+
+
# plot the mean profile
+t_0n140w_mean.plot(y='z_t', ylim=(300e2,0), label='mean')
+plt.xlim(10,28)
+plt.title('T at 0$^{\circ}$N, 140$^{\circ}$W')
+
+# let's add some error bars --> standard deviation 
+
+plt.fill_betweenx(ds_pop.z_t, t_0n140w_mean-t_0n140w_std, t_0n140w_mean+t_0n140w_std, color='black', alpha=0.2, edgecolor=None, label='std')
+
+plt.legend()
+#plt.savefig('basics_plot_10.png', bbox_inches='tight')# uncomment this to save your figure
+
+
+
+
+
+
+Click here for the solution
+

plot example

+

Figure: Plotting solution.

+
+

Question:

+

Why is there grey shading on the plot above? i.e. How many ensembles have we included? What else could be causing a spread in the output?

+
+
+ Click here for hints +

Here we take an average of the profiles in one location over time. But you could average over ensembles or over a region at one time, and both would also provide information about the variability in this quantity over depth.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/diagnostics/pop/pop.html b/notebooks/diagnostics/pop/pop.html new file mode 100644 index 000000000..4af54e6c0 --- /dev/null +++ b/notebooks/diagnostics/pop/pop.html @@ -0,0 +1,796 @@ + + + + + + + + + + + Ocean — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Ocean#

+
+

Basic Plotting#

+
+

Learning Goals#

+
    +
  • How to load and plot POP ocean model output

  • +
  • How to deal with the curvilinear grid

  • +
  • How to select a point for making profiles

  • +
  • How to define useful functions

  • +
+
+
+
+

Exercise 1: Making map plots#

+

Here we will produce a map plot of surface heat flux and sea surface temperature. Some things to try include plotting standard deviations instead of means, plotting another surface variable, or plotting temperature at a particular depth.

+
+
+
+

Exercise 2: Making global and regional maps#

+

Here will we learn how to use the TLAT and TLONG coordinates in POP to plot nicer global or regional maps. Some things to try include plotting different regions or different variables.

+
+
+
+

Exercise 3: Making timeseries#

+

Here will we learn how to make a timeseries of temperature at a single point throughout the column.

+
+
+
+

Exercise 4: Making a profile#

+

Here we learn how to plot a temperature profile at a single point on the ocean grid.

+
+
+
+

Advanced Plotting#

+
+
+

Exercise 1: Plot winter time maximum mixed-layer depth#

+

Here we learn how to select winter months and plot the maximum mixed-layer depth for both hemispheres on a single map.

+
+
+
+

Exercise 2: Compute and plot ocean heat storage per area for the upper 2000m#

+

Here we learn how to calculate the heat storage per area from the temperature trend and plot the results on a global map.

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/cesm_expts/clim_data_gateway.html b/notebooks/intro/cesm_expts/clim_data_gateway.html new file mode 100644 index 000000000..f4bbb6dbe --- /dev/null +++ b/notebooks/intro/cesm_expts/clim_data_gateway.html @@ -0,0 +1,703 @@ + + + + + + + + + + + Climate Data Gateway — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Climate Data Gateway

+ +
+
+ +
+
+
+ + + + +
+ +
+

Climate Data Gateway#

+

Publicly released CESM data is available via the Climate Data Gateway. Timeseries data in both CESM standard format and CMIP format are available. Registration is quick and easy, and NCAR accounts are not required for access.

+

CDG

+

Figure: Climate Data Gateway Homepage.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/cesm_expts/clim_data_guide.html b/notebooks/intro/cesm_expts/clim_data_guide.html new file mode 100644 index 000000000..681510ce2 --- /dev/null +++ b/notebooks/intro/cesm_expts/clim_data_guide.html @@ -0,0 +1,703 @@ + + + + + + + + + + + Climate Data Guide — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Climate Data Guide

+ +
+
+ +
+
+
+ + + + +
+ +
+

Climate Data Guide#

+

The Climate Data Guide describes observations used for Earth System Model evaluation. To date 150+ data sets have been profiled. Expert-user guidance by 45+ scientists is provided to users, including pros and cons of each dataset. There are also comparisons of common variables (e.g. precipitation, sea surface temperature, sea ice concentration, etc.).

+

CDG

+

Figure: Climate Data Guide Homepage.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/cesm_webpage.html b/notebooks/intro/cesm_webpage.html new file mode 100644 index 000000000..019ecc830 --- /dev/null +++ b/notebooks/intro/cesm_webpage.html @@ -0,0 +1,718 @@ + + + + + + + + + + + CESM Webpage — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

CESM Webpage

+ +
+
+ +
+
+
+ + + + +
+ +
+

CESM Webpage#

+

The CESM Web Page is the first point of reference for all things CESM. Here we can explore the larger CESM project, delve deeper into individual working groups, models, research activities, model releases, supporting model data, tools, events and much much more.

+

Some points to pay attention to:

+
    +
  • CESM Project Information

  • +
  • Working Groups Information

  • +
  • Community Projects Information

    +
      +
    • CESM2 Large Ensemble

    • +
    • CESM2 Stratospheric Aerosol Injection (ARISE-SAI)

    • +
    +
  • +
  • What Version of the model should you use?

  • +
  • Individual Model Pages https://www.cesm.ucar.edu/models/

  • +
  • Supported Model Releases – 2.1.X vs 2.2.X

  • +
  • Experiments, expand a case for details, diagnostics plots for many experiments

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/community_experiments.html b/notebooks/intro/community_experiments.html new file mode 100644 index 000000000..319d67710 --- /dev/null +++ b/notebooks/intro/community_experiments.html @@ -0,0 +1,723 @@ + + + + + + + + + + + Community Experiments — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Community Experiments

+ +
+
+ +
+
+
+ + + + +
+ +
+

Community Experiments#

+

Information about community experiments performed with CESM version 2 and previous verisons of the model (CSM1, CCSM2, CCSM3, CESM1) are documented on an experiments webpage.

+

Explore this webpage and then click on the CESM2 Experiments, Data, and Diagnostic Output link for experiments from the most recent model version.

+

CESM Experiments

+

Figure: CESM experiments webpage.

+

This page provides a searchable list of all the CESM2 experiments available to the public. +To interpret the casenames, it is helpful to remember CESM naming conventions that provide information about the experiment at a glance. Knowing the CESM case naming conventions will help you navigate CESM community experiments. Information about the CESM naming is available at:

+

Click on the experiment that corresponds to the CESM2 CMIP6 preindustrial control experiment: +b.e21.B1850.f09_g17.MIP6-piControl.001

+

CESM Experiments

+

Figure: CESM2 CMIP6 PI control experiment.

+

Information about this experiment drops down below the experiment name. There are three main sections of information:

+
    +
  • The title of the experiment with active components listed.

  • +
  • Links to the data and/or the NCAR HPC directory with data. (#1, green arrow)

  • +
  • Links to the diagnostic component package output and the Climate Variability Diagnostics Package. (#2, blue arrow)

  • +
  • Details about the run, including the resolution, compset, etc. (#3, red arrow)

  • +
+

CESM Experiments

+

Figure: CESM2 CMIP6 PI control experiment.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/components.html b/notebooks/intro/components.html new file mode 100644 index 000000000..d9e6ba160 --- /dev/null +++ b/notebooks/intro/components.html @@ -0,0 +1,745 @@ + + + + + + + + + + + What is CESM ? — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

What is CESM ?

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

What is CESM ?#

+

CESM is a coupled Earth system model for simulating Earth’s climate system and connected component systems. The model is composed of separate models that simultaneously simulate the Earth’s atmosphere, ocean, land, river run-off, land-ice, and sea-ice. The model components that are coupled through the Common Infrastructure for Modeling the Earth known as CIME.

+

Discuss Image +

Figure: CESM2 Structure

+
+

Model Components#

+

Each model component has a page on the CESM website containing descriptions and documentation for active or prognostic models.

+

You can explore each of the component models and CIME from the links below.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/coupling.html b/notebooks/intro/coupling.html new file mode 100644 index 000000000..287162daa --- /dev/null +++ b/notebooks/intro/coupling.html @@ -0,0 +1,753 @@ + + + + + + + + + + + CIME (Advanced) — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

CIME (Advanced)#

+

The Combined Model Components form the coupled CESM through a shared common set of tools and infrastructure and coupling framework. Here we describe the Common Infrastructure for Modeling the Earth otherwise known as CIME, as well as the current CESM2 and future coupling frameworks.

+
+

Common Infrastructure for Modeling the Earth (CIME)#

+

The Common Infrastructure for Modeling the Earth is a python-based framework that is shared between CESM2 and other modeling center efforts to ensure efficient +coordination of model development. The schema below shows some of the science benefits and organizations that are using the CIME infrastructure. +

+

CESM directories and namelists +

Figure: Overview of the CESM2 Common Infrastructure for Modeling the Earth (CIME)

+
+
+

Model Coupling Toolkit (MCT)#

+

The CESM2 coupling is performed through the Model Coupling Toolkit (MCT). Additionally, the MCT coupling framework allows data and stub components to +replace active or prognostic components providing flexible activation/deactivation of feedbacks. +The schematic below shows all of the components and their connections. +

+

CESM directories and namelists +

Figure: Overview of the CESM2 Components and Model Coupling Toolkit (MCT)

+
+
+

Earth System Modeling Framework (ESMF) Coupling#

+

Coupling development beyond CESM2 will be changing to the Earth System Modeling Framework (ESMF) National Unified Operational Prediction Capability (NUOPC) framework. More details on NUOPC can be found at + https://earthsystemmodeling.org/nuopc/ . The schema below shows the new CESM configuration and coupling with NUOPC. +

+

CESM directories and namelists +

Figure: Overview of the new CESM Components and National Unified Operational Prediction Capability (NUOPC) framework

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/getting_help.html b/notebooks/intro/getting_help.html new file mode 100644 index 000000000..a42e72ba3 --- /dev/null +++ b/notebooks/intro/getting_help.html @@ -0,0 +1,733 @@ + + + + + + + + + + + Getting Help — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Getting Help

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Getting Help#

+

As you gain experience using and running CESM, you may want additional sources of information to help with problem solving, designing modeling experiments, runtime issues, etc.

+
+

DiscussCESM Forums#

+

The DiscussCESM or Bulletin Board forum is an excellent location to post questions or to search through previously posted and answered questions in regard to problems encounter while using CESM.

+

Register as a forums user by entering your valid information in the registration form. You can subscribe to forums of interest – especially the “Announcements” and “Known Problems” – and this way we can communicate updates to you.

+

Discuss Image +

Figure: CESM2 Discuss Bulletin Board

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/getting_involved.html b/notebooks/intro/getting_involved.html new file mode 100644 index 000000000..bcb6ba718 --- /dev/null +++ b/notebooks/intro/getting_involved.html @@ -0,0 +1,750 @@ + + + + + + + + + + + Getting Involved — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Getting Involved

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Getting Involved#

+
+

CESM Events#

+

CESM has a long history of open, Community Events. A schedule of CESM Events is maintained on the CESM Website. CESM events include Community and Working Group Meetings, Tutorials, Seminars, and other related events. The first Community workshop was held in 1996 and continues annually today, and there are winter working-group specific meetings.

+

CESM Events Image +

Figure: CESM2 Events Page

+

We hope to see you at a future CESM workshop!

+
+
+

CESM Email Lists#

+

There are a number of email lists for the CESM community that you can join to receive updates for the whole CESM community or for particular working groups.

+
+
+

CESM Github Alerts#

+

If you create a github account and opt-in, you can watch CESM related repositories.

+

Discuss Image +

Figure: CESM2 Github Page

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/intro_overview.html b/notebooks/intro/intro_overview.html new file mode 100644 index 000000000..42a9c1816 --- /dev/null +++ b/notebooks/intro/intro_overview.html @@ -0,0 +1,739 @@ + + + + + + + + + + + Introduction — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Introduction

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Introduction#

+

Welcome to the world of the Community Earth System Model (CESM). This introduction will discuss the structure of the CESM model, provide information about how to become more involved in the CESM community, and how to get help if required.

+
+

Visualizing this documentation#

+

Depending on your computer settings, you may see this documentation with a white or black background. To toggle between these settings click the sun or moon in the upper right of the page (see red arrow below).

+

We have developed the documentation with the white background and recommend you use these settings. If you choose to use the dark background it is possible some of the visualizations will be more difficult to read.

+

Light/Dark mode

+

Figure: How to change between light/dark mode.

+
+
+

Advanced Knowledge#

+

Some of the pages of this tutorial are marked as Advanced. Feel free to skip these as needed.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/intro/project.html b/notebooks/intro/project.html new file mode 100644 index 000000000..2163f12a2 --- /dev/null +++ b/notebooks/intro/project.html @@ -0,0 +1,720 @@ + + + + + + + + + + + CESM Working Groups — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

CESM Working Groups

+ +
+
+ +
+
+
+ + + + +
+ +
+

CESM Working Groups#

+

The CESM project has a strong commitment to Community involvment in governance and development of the CESM. The CESM modeling effort is coordinated through Working Groups that are responsible for the science and development of individual CESM components or organized to coordinate other across CESM efforts.

+

Each team takes responsibility for developing and continually improving its component of the CESM consistent with the CESM goal of a fully-coupled model and with the CESM design criteria. There are currently 12 Working Groups.

+

Each Working Group is coordinated by Co-Chairs. The Working Groups decide their own development priorities and work schedules, consistent with the overall goals of CESM, and are subject to oversight by the CESM Scientific Steering +Committee (SSC).

+

We welcome and strongly encourage anyone interested to join the relevant CESM working groups to participate more fully in the CESM project and model development.

+

Check the webpage “Getting Involved” for more information.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml.html b/notebooks/modifications/xml.html new file mode 100644 index 000000000..c77c40e98 --- /dev/null +++ b/notebooks/modifications/xml.html @@ -0,0 +1,707 @@ + + + + + + + + + + + Simple XML Modifications — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Simple XML Modifications

+ +
+
+ +
+
+
+ + + + +
+ +
+

Simple XML Modifications#

+

We use XML files to control case settings. This is what we cover in this chapter:

+
    +
  • The section Overview describes what XML files are and the primary files used in CESM.

  • +
  • You will then learn how to query and change XML variables.

  • +
  • Next, we describe some of the main XML variables used to control run length or run type.

  • +
  • The section Exercise Overview offers opportunities to practice the concepts learned in this chapter.

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/copying_cases.html b/notebooks/modifications/xml/copying_cases.html new file mode 100644 index 000000000..77a1c50d3 --- /dev/null +++ b/notebooks/modifications/xml/copying_cases.html @@ -0,0 +1,681 @@ + + + + + + + + + + + Copying Cases — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Copying Cases

+ +
+
+ +
+
+
+ + + + +
+ +
+

Copying Cases#

+

This is a placeholder for this lesson.

+
+ + + + +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/exercises.html b/notebooks/modifications/xml/exercises.html new file mode 100644 index 000000000..7d158459e --- /dev/null +++ b/notebooks/modifications/xml/exercises.html @@ -0,0 +1,706 @@ + + + + + + + + + + + Exercise Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise Overview

+ +
+
+ +
+
+
+ + + + +
+ +
+

Exercise Overview#

+

We will do three exercises to help us better understand xml modifications.

+
    +
  • In Exercise 1, we will practice runtime variable modifications.

  • +
  • In Exercise 2, we will create a branch run and modify the ocean coupling frequency.

  • +
  • In Exercise 3, we will create a hybrid run and modify the atmosphere physics timestep.

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/exercises/xml_length_exercise.html b/notebooks/modifications/xml/exercises/xml_length_exercise.html new file mode 100644 index 000000000..6387ad472 --- /dev/null +++ b/notebooks/modifications/xml/exercises/xml_length_exercise.html @@ -0,0 +1,820 @@ + + + + + + + + + + + Exercise 1: Modify run length — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise 1: Modify run length

+ +
+
+ +
+
+
+ + + + +
+ +
+

Exercise 1: Modify run length#

+
+

Exercise: Modify the env_run.xml file

+Part I:
+Create a new fully coupled startup case named “b1850.run_length” from the 1850 climate conditions with a resolution of f19_g17. Increase the amount of standard output produced by the model for debugging. Run for 1 month.

+
+
+ + + Hint! + +
    +
  1. Which variable controls the amount of standard output for debugging? We can use partial query to find out:

  2. +
+
    ./xmlquery -p DBUG
+
+
+
    +
  1. Use xmlchange to modify env_run.xml

  2. +
  3. Make sure to update the walltime to match the run length.

  4. +
+
+
+
+ + + Click here for the solution to Part I + +

From the SRCROOT (/glade/u/home/$USER/code/my_cesm_code) directory, create your case:

+
    cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts
+    ./create_newcase --case /glade/u/home/$USER/cases/b1850.run_length --res f19_g17 --compset B1850
+
+
+
+

In your case directory, change debugging levels and set runtime variables:

+
    cd /glade/u/home/$USER/cases/b1850.run_length
+    ./xmlchange INFO_DBUG=2,STOP_N=1,STOP_OPTION=nmonths
+    ./xmlchange --subgroup case.run JOB_WALLCLOCK_TIME=2:00:00
+
+
+
+

Remember to manually update your README.case file to document your changes.

+

Carry on to setup, build and submit the run:

+
      ./case.setup 
+      qcmd -- ./case.build
+      ./case.submit
+
+
+

Remember that qcmd is used on derecho only.

+
+
+

Exercise: Modify the env_run.xml file

+

Part II: +Do part II only after Part I has finished running.
+Change the debug level back to 1. Expand Part I to produce a total of 38 months of model run. Remember that you have already run for 1 month.

+
    +
  • You can only do part II after Part I has finished running

  • +
  • You should submit this at the end of the day so that it will (hopefully) run overnight and be available the following day. You can continue with Exercise 2-3 and submit the run later.

  • +
  • VERY, VERY IMPORTANT: Don’t use the tutorial for this run as it is an overnight run. You should submit that run in the main queue

  • +
+

To submit in the main queue, you need to add:

+
  ./xmlchange JOB_QUEUE=main
+
+
+
+
+ + + Hint! + +
    +
  1. Which variable controls the amount of standard output for debugging? We can use partial query to find out:

  2. +
+
    ./xmlquery -p DBUG
+
+
+
    +
  1. Use xmlchange to modify env_run.xml

  2. +
  3. Make sure to update the walltime to match the run length.

  4. +
  5. For Part II, how to tell the model that this run continues from the previously finished run of 1 month?

  6. +
+
+
+
+ + + Click here for the solution to Part II + +
+1. To continue the run, set `CONTINUE_RUN` to `TRUE` +
    cd /glade/u/home/$USER/cases/b1850.run_length
+    ./xmlchange CONTINUE_RUN=TRUE
+
+
+
+2. Keep `STOP_OPTION` as "nmonths” +
+3. Set `STOP_N` to “37” +
    ./xmlchange STOP_N=37
+
+
+
+4. Set INFO_DBUG to 1 +
    ./xmlchange INFO_DBUG=1
+
+
+
+5. Change queue +
    ./xmlchange JOB_QUEUE=main
+
+
+
+6. Change wallclock time to use the maximum of the allowed wallclock on derecho: +
    ./xmlchange --subgroup case.run JOB_WALLCLOCK_TIME=12:00:00
+    ./xmlchange --subgroup case.st_archive JOB_WALLCLOCK_TIME=6:00:00
+
+
+
+7. Submit (./case.submit) from your b1850.run_length case directory: +
    ./case.submit
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/exercises/xml_runtype_exercise.html b/notebooks/modifications/xml/exercises/xml_runtype_exercise.html new file mode 100644 index 000000000..0473a616a --- /dev/null +++ b/notebooks/modifications/xml/exercises/xml_runtype_exercise.html @@ -0,0 +1,774 @@ + + + + + + + + + + + Exercise 2: Modify run type — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise 2: Modify run type

+ +
+
+ +
+
+
+ + + + +
+ +
+

Exercise 2: Modify run type#

+
+

Exercise: Modify the env_run.xml file

+

Branch from the end of another run to create a new case named “b1850.branch”.

+

We will branch from a run b1850.initial at year 2. The restart files for this run are located in:

+
/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000
+
+
+

Double the ocean coupling frequency (OCN_NCPL). Include an initial file as output data. Run for 1 month, then restart for 1 month.

+
+
+ + + Hint! + +
    +
  1. For a branch run, we need to set several variables related to the reference case in env_run.xml. To find variables applied to reference case (Branch and Hybrid runs), use ./xmlquery -p REF.

  2. +
  3. Ocean coupling frequency needs to be changed in env_run.xml, controlled by the variable OCN_NCPL. What is the default value of OCN_NCPL? Use xmlquery to find out! You may also take a look at the variable description in env_run.xml to learn more about the variable.

  4. +
  5. Make sure to update the walltime to match the run length.

  6. +
  7. Don’t forget to put restart files into the run directory $RUNDIR.

  8. +
  9. To include an initial file as output, we will need to modify the variable inithist in the atmospehre namelist user_nl_cam. We will learn more about this in the next chapter namelist modification.

  10. +
+
+
+
+ + + Click here for the solution + +
+1. Create your new case with the command: +
    cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+    ./create_newcase --case /glade/u/home/$USER/cases/b1850.branch --res f19_g17 --compset B1850
+
+
+
+
+2. In your case directory, change the run type to branch, and change the associated RUN_* variables: +
    cd /glade/u/home/$USER/cases/b1850.branch
+    ./xmlchange RUN_TYPE=branch
+    ./xmlchange RUN_REFCASE=b1850.initial,RUN_REFDATE=0002-01-01,GET_REFCASE=FALSE
+
+
+
+3. Set run time variables: +
    ./xmlchange STOP_OPTION=nmonths,STOP_N=1,RESUBMIT=1,JOB_WALLCLOCK_TIME=02:00:00
+
+
+
+4. Double ocean coupling frequency in `env_run.xml`: +
    ./xmlchange OCN_NCPL=48
+
+
+
+5. Set up the case, put the initial and restart files in the `$RUNDIR`: +
    ./case.setup
+    cp /glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000/*  /glade/derecho/scratch/$USER/b1850.branch/run/
+
+
+
+
    +
  1. Run ./preview_namelists:

  2. +
+
    ./preview_namelists
+
+
+
+7. Carry on to build and submit the run: +
      qcmd -- ./case.build
+      ./case.submit
+
+
+
+

Remember that qcmd is used on derecho only.

+

After the job completes, go to the short term archive space and explore.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/exercises/xml_timestep_exercise.html b/notebooks/modifications/xml/exercises/xml_timestep_exercise.html new file mode 100644 index 000000000..77765c4c2 --- /dev/null +++ b/notebooks/modifications/xml/exercises/xml_timestep_exercise.html @@ -0,0 +1,754 @@ + + + + + + + + + + + Exercise 3: Change physics timestep — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise 3: Change physics timestep

+ +
+
+ +
+
+
+ + + + +
+ +
+

Exercise 3: Change physics timestep#

+
+

Exercise: Change physics timestep in CAM and CLM

+

Hybrid start a fully coupled run under pre-Industrial conditions with a resolution of f19_g17.

+

Use restart and initial files from the run b1850.initial at year 2. The restart files for this run are located in:

+
/glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000
+
+
+

Change the physics timestep in the atmosphere and land to 1200 seconds (default is 1800). Run 5 days.

+
+
+ + + Hint! + +

The atmosphere physics timestep is determined by the base period of coupling NCPL_BASE_PERIOD and the coupling frequency ATM_NCPL.
+Find out their default values using xmlquery.

+
+
+
+ + + Click here for the solution + +
+1. From the script directory, create your case: +
    cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+    ./create_newcase --case /glade/u/home/$USER/cases/b1850.timestep --res f19_g17 --compset B1850
+
+
+
+2. In your case directory, change run type and runtime variables: +
    cd /glade/u/home/$USER/cases/b1850.timestep
+    ./xmlchange RUN_TYPE=hybrid
+    ./xmlchange RUN_REFCASE=b1850.initial,RUN_REFDATE=0002-01-01,GET_REFCASE=FALSE,JOB_WALLCLOCK_TIME=2:00:00
+
+
+
+3. Change the physics timestep for CAM: +
    ./xmlchange ATM_NCPL=72
+
+
+

(Why ATM_NCPL = 72? Do the math).

+
+4. Set up the case and position your initial and restart files in the `$RUNDIR`: +
    ./case.setup
+    cp /glade/campaign/cesm/tutorial/tutorial_2023_archive/b1850.initial/rest/0002-01-01-00000/*   /glade/derecho/scratch/$USER/b1850.timestep/run/
+
+
+
+5. Continue to build and submit: +
    qcmd -- ./case.build
+    ./case.submit
+
+
+

Remember that qcmd is used on derecho only.

+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/model_control_files.html b/notebooks/modifications/xml/model_control_files.html new file mode 100644 index 000000000..3839748c8 --- /dev/null +++ b/notebooks/modifications/xml/model_control_files.html @@ -0,0 +1,894 @@ + + + + + + + + + + + How to Modify XML Files (*.xml) — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

How to Modify XML Files (*.xml)

+ +
+ +
+
+ + + + +
+ +
+

How to Modify XML Files (*.xml)#

+

Now let’s learn how to edit and search for variables in an *.xml file

+

We will use xmlchange to modify xml variables and use xmlquery to search xml variables. Note that you can change XML files manually, but using the xmlchange script prevents XML errors and ensures there is a record of your changes in the CaseStatus file.

+

For the examples below, you can follow along by going to your CASEROOT directory b1850.basics that you completed in the Basics section.

+
+
+

1. Editing with xmlchange#

+

When modifying an *.xml file, we highly recommend using the xmlchange tool. This is done using the syntax ./xmlchange VARIABLE=VALUE in your case directory.

+

The xml files can also be edited manually with your favorate text editor (vi, emacs, etc.), but users should take care not to introduce any formatting errors that could lead to incomplete environment variable settings. You can use your text editor to take a look at the xml files – you will find descriptions of each variable, which can be very helpful in understanding what they control.

+

Here is an example for using xmlchange. If you want to change the length of your run to one month, edit env_run.xml via the xmlchange tool by typing on the command line:

+
./xmlchange STOP_OPTION=nmonths,STOP_N=1
+
+
+
+ + + Tips! + +

When using xmlchange to modify multiple environment variables, use comma (and no space!) in between variables.

+You can always find help by typing ./xmlchange --help

+
+
+Click here for example output of "./xmlchange --help" >
+
./xmlchange --help
+
+
+
+

Output:

+
usage: xmlchange [-h] [-d] [-v] [-s] [--caseroot CASEROOT] [--append]
+                 [--subgroup SUBGROUP] [--id ID] [--val VAL] [--file FILE]
+                 [--delimiter DELIMITER] [--dryrun] [--noecho] [-f]
+                 [-loglevel LOGLEVEL]
+                 [listofsettings]
+
+Allows changing variables in env_*xml files via a command-line interface.
+
+This provides two main benefits over editing the xml files by hand:
+  - Settings are checked immediately for validity
+  - Settings are echoed to the CaseStatus file, providing a "paper trail" of
+    changes made by the user.
+
+Examples:
+
+   To set a single variable:
+      ./xmlchange REST_N=4
+
+   To set multiple variables at once:
+      ./xmlchange REST_OPTION=ndays,REST_N=4
+
+   Alternative syntax (no longer recommended, but supported for backwards
+   compatibility; only works for a single variable at a time):
+      ./xmlchange --id REST_N --val 4
+
+   Several xml variables that have settings for each component have somewhat special treatment.
+   The variables that this currently applies to are:
+    NTASKS, NTHRDS, ROOTPE, PIO_TYPENAME, PIO_STRIDE, PIO_NUMTASKS
+   For example, to set the number of tasks for all components to 16, use:
+      ./xmlchange NTASKS=16
+   To set just the number of tasks for the atm component, use:
+      ./xmlchange NTASKS_ATM=16
+
+   The CIME case xml variables are grouped together in xml elements <group></group>.
+   This is done to associate together xml variables with common features.
+   Most variables are only associated with one group. However, in env_batch.xml,
+   there are also xml variables that are associated with each potential batch job.
+   For these variables, the '--subgroup' option may be used to specify a particular
+   group for which the variable's value will be adjusted.
+   
+...
+
+
+
+
+
+
+Evaluate your understanding +

If you want to manually resubmit an initial case that previously had a CONTINUE_RUN value of FALSE, how do you change it to TRUE?

+
+
+
+Click here for the solution
+

Use xmlchange to modify the variable value with the command:

+
    ./xmlchange CONTINUE_RUN=TRUE 
+
+
+
+
+
+
+
+
+

2. Searching xml variables with xmlquery#

+

We recommend using the xmlquery tool in your case directory to query xml variables.

+

For example, to find out the run type of your job, search for xml variable RUN_TYPE:

+
./xmlquery RUN_TYPE
+
+
+
+ + + Tips! + +

You can always find help by typing ./xmlquery --help

+

This will return the default RUN_TYPE value:

+
+

RUN_TYPE: hybrid

+
+
+Evaluate your understanding +

Let’s check if the variables in the previous exercise are properly modified.

+

Query for the value of STOP_N, STOP_OPTION, and CONTINUE_RUN.

+
+
+
+ + + Click here for the solution + +

Use xmlquery to search the variables with the command: +

+
    ./xmlquery STOP_N,STOP_OPTION,CONTINUE_RUN 
+
+
+
+If you see: +
>STOP_N: 1 
+>STOP_OPTION: nmonths 
+>CONTINUE_RUN: TRUE 
+
+
+
+ Great! You have successfully queried these variables. +
+
+

+
+
+
+

3. Use the subgroup functionality of xmlchange#

+

Now let’s first try to find out the wallclock time of your job, search for xml variable JOB_WALLCLOCK_TIME:

+
./xmlquery JOB_WALLCLOCK_TIME
+
+
+
+ + + Tips! + +

If you are unsure about the full name of the xml variable, you can query variables with a partial match, using --partial-match or -p.

+

For example: ./xmlquery -p WALLCLOCK

+

+You will find that the query of wallclock time returns multiple instances:
+

Results in group case.run
+JOB_WALLCLOCK_TIME: 00:30:00

+
+
+

Results in group case.st_archive
+JOB_WALLCLOCK_TIME: 00:30:00

+
+

The variable JOB-WALLCLOCK_TIME has two instances in two different subgroups: case.run and case.st_archive.

+

Then, how do we specify which instance we want to modify?

+

For variables that have multiple instances, we can use the “subgroups” functionality in xmlchange. +For example, if we want to change the default JOB_WALLCLOCK_TIME from 30 minutes to 1 hour for the short term archiver subgroup, type in the following command:

+
./xmlchange --subgroup case.st_archive JOB_WALLCLOCK_TIME=01:00:00
+
+
+

Try it yourself! Type in the command above and use xmlquery to check if your modifications are correctly applied.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/modify_run_type.html b/notebooks/modifications/xml/modify_run_type.html new file mode 100644 index 000000000..317ec2c0d --- /dev/null +++ b/notebooks/modifications/xml/modify_run_type.html @@ -0,0 +1,708 @@ + + + + + + + + + + + Modifying the Type of Run — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Modifying the Type of Run

+ +
+
+ +
+
+
+ + + + +
+ +
+

Modifying the Type of Run#

+

CESM has three types of initial runs:

+
    +
  • startup

  • +
  • branch

  • +
  • hybrid

  • +
+

The xml variable $RUN_TYPE determines the initialization type.

+

Note that the RUN_TYPE setting is only important for the initial run of a production run when the $CONTINUE_RUN variable is set to FALSE. After the initial run, the $CONTINUE_RUN variable is set to TRUE, and the model restarts exactly using input files in a case, date, and bit-for-bit continuous fashion.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/modify_run_type/hybrid_branch_restart.html b/notebooks/modifications/xml/modify_run_type/hybrid_branch_restart.html new file mode 100644 index 000000000..a87977702 --- /dev/null +++ b/notebooks/modifications/xml/modify_run_type/hybrid_branch_restart.html @@ -0,0 +1,855 @@ + + + + + + + + + + + Hybrid, Branch and Startup — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Hybrid, Branch and Startup

+ +
+ +
+
+ + + + +
+ +
+

Hybrid, Branch and Startup#

+

The CESM model can be initialized in one of three ways: startup, hybrid and branch. These are set with the variable $RUN_TYPE in env_run.xml.

+
+
+
+

1. The three run types#

+
+

- STARTUP#

+
    +
  • In a startup run (the default), all model components are initialized from the basic default initial conditions. The coupler does not need an initial file.

  • +
+
+
+

- BRANCH#

+
    +
  • In a branch run, all components are initialized using a consistent set of restart files from a previous run (determined by the $RUN_REFCASE and $RUN_REFDATE variables in env_run.xml).

  • +
  • The case name is generally changed for a branch run, although it does not have to be.

  • +
  • In a branch run, setting $RUN_STARTDATE is ignored because the model components obtain the start date from their restart datasets. Therefore, the start date cannot be changed for a branch run. This is the same mechanism that is used for performing a restart run (where $CONTINUE_RUN is set to TRUE in the env_run.xml file).

  • +
  • Branch runs are typically used when sensitivity or parameter studies are required, or when settings for history file output streams need to be modified while still maintaining bit-for-bit reproducibility.

  • +
+
+
+

- HYBRID#

+
    +
  • A hybrid run indicates that CESM is initialized more like a startup, but uses initialization datasets from a previous case. This is somewhat analogous to a branch run with relaxed restart constraints.

  • +
  • A hybrid run allows users to bring together combinations of initial/restart files from a previous case (specified by $RUN_REFCASE) at a given model output date (specified by $RUN_REFDATE). Unlike a branch run, the starting date of a hybrid run (specified by $RUN_STARTDATE) can be modified relative to the reference case.

  • +
  • In a hybrid run, the model does not continue in a bit-for-bit fashion with respect to the reference case. The resulting climate, however, should be continuous provided that no model source code or namelists are changed in the hybrid run.

  • +
  • The atmosphere is initialized from initial condition files generated by a user-specified CESM simulation. The land, runoff, ocean and ice are initialized from restart files generated by a user-specified CESM simulation. No coupler file is needed

  • +
+
+

It is important to remember that the $RUN_TYPE variable is only relevant when a run is initialized. Let’s again take a look at the exercises we did in the chapter of Changing run length:

+
+Evaluate your understanding +

The tutorial version of the CESM model on derecho simulates ~10 model years per wallclock day. The maximum wallclock request is 12 hours. +If you want to run the model for 100 years, what values should be set for STOP_OPTION, STOP_N and RESUBMIT?

+

We worked out that for a total of 100 years, we will need 20 submissions. We can set:

+
STOP_OPTION = 'nyears', STOP_N = 5, RESUBMIT = 19
+
+
+
+

Now, if you want this run to be a hybrid run, what variables should you modify, and at which stage?

+
+
+ + + Hint! + +

The $RUN_TYPE variable is only important at the initial run when CONTINUE_RUN is set to FALSE. +

+
+
+ + + Click here for the solution + +

Set RUN_TYPE='hybrid' in env_run.xml before submitting the initial run.

+

Bonus question:

+

What happens if you set run_type='branch' after the 2nd resubmission when the CONTINUE_RUN=TRUE?

+

Answer: Nothing changes, because RUN_TYPE is only relevant for an initial run when CONTINUE_RUN is set to FALSE!

+
+

+

One more!

+
+Evaluate your understanding +

In the exercise above, if you have set RUN_TYPE='hybrid' and RESUBMIT=19 before the initial run, what are the value of CONTINUE_RUN, RESUBMIT, and RUN_TYPE at the time of:

+
    +
  • the initial submission of 5 years

  • +
  • the next submission of 5 years

  • +
  • the 3rd run (2nd resubmission) of 5 years?

  • +
+
+
+ + + Click here for the solution + +
    +
  • the initial submission of 5 years:

    +
     CONTINUE_RUN=FALSE, RESUBMIT=19, RUN_TYPE='hybrid' 
    +
    +
    +

    because when the run is first initialized, CONTINUE_RUN=FALSE
    +

    +
  • +
  • the next submission of 5 years:

    +
    CONTINUE_RUN=TRUE, RESUBMIT=18, RUN_TYPE='hybrid'
    +
    +
    +

    because RESUBMIT>0, CONTINUE_RUN will automatically switch to TRUE after the initial run, but RUN_TYPE won’t change.
    +

    +
  • +
  • the 3rd run (2nd resubmission) of 5 years:

    +
    CONTINUE_RUN=TRUE, RESUBMIT=17, RUN_TYPE='hybrid' 
    +
    +
    +

    CONTINUE_RUN stays to be TRUE, RESUBMIT decreases by 1, RUN_TYPE won’t change.

    +
  • +
+
+

+
+
+
+
+

2. When to use branch vs. hybrid?#

+

Branch and hybrid runs are useful if you have an experiment which only slightly differs from your control, but you want to make a slight modification, add history output, or start your simulation from a CESM spun-up initial state and maintaining an exact restart (which mimics what the model would do if it had kept running in the original setup).

+
    +
  • Use a hybrid run: for most applications where you do NOT need bit for bit restart. You CAN specify a new start date for your model run.

  • +
  • Use a branch run: only for applications which require exact restart. It is typically used when sensitivity or parameter studies are required, or when settings for history file output streams need to be modified while still maintaining bit-for-bit reproducibility. You CANNOT specify a new start date for your model run. It will be assigned by the reference case ($RUN_REFDATE).

  • +
+
+
+
+
+

3. Restart files for branch and hybrid runs#

+

For runs that are initialized as hybrid or branch runs, we will need restart/initial files from previous model runs (as specified by the variables, $RUN_REFCASE and $RUN_REFDATE). See the Chapter Run variables related to run type for details.

+

Let’s take a look back at the Chapter on restart files to refresh our memory!

+

It is important to note that these required files must be prestaged by the user to the case run directory ($RUNDIR) before the model run starts. This is normally done by just copying the contents of the relevant $RUN_REFCASE/rest/$RUN_REFDATE.00000 directory.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/modify_run_type/run_variables.html b/notebooks/modifications/xml/modify_run_type/run_variables.html new file mode 100644 index 000000000..8df51edaa --- /dev/null +++ b/notebooks/modifications/xml/modify_run_type/run_variables.html @@ -0,0 +1,708 @@ + + + + + + + + + + + Variables Related to Run Type — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Variables Related to Run Type

+ +
+
+ +
+
+
+ + + + +
+ + + + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/other_xml_variables.html b/notebooks/modifications/xml/other_xml_variables.html new file mode 100644 index 000000000..c1acec849 --- /dev/null +++ b/notebooks/modifications/xml/other_xml_variables.html @@ -0,0 +1,705 @@ + + + + + + + + + + + Other Useful XML Variables — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Other Useful XML Variables

+ +
+
+ +
+
+
+ + + + +
+ +
+

Other Useful XML Variables#

+

Here are some more xml variables in env_run.xml that you may encounter:

+
    +
  • INFO_DBUG ==> sets the level of stdout (standard out) print statements. This variable is useful for debugging. If debugging, a higher value may be set.

  • +
  • DOUT_S ==> turns on short-term archiving. DOUT_S is set to TRUE by default.

  • +
  • HIST_OPTION ==> sets driver snapshot history file frequency.

  • +
  • CCSM_CO2_PPMV ==> CO2 value to be propogated to the ocean component POP and the land component CLM, when OCN_CO2_TYPE and CLM_CO2_TYPE are set to 'constant'.

  • +
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/overview.html b/notebooks/modifications/xml/overview.html new file mode 100644 index 000000000..f08ae622b --- /dev/null +++ b/notebooks/modifications/xml/overview.html @@ -0,0 +1,761 @@ + + + + + + + + + + + Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Overview#

+

What is an XML file, and how do we use it in CESM?

+
+
+

1. What is an XML file?#

+

XML (Extensible Markup Language) is a markup language that defines a syntax for encoding documents that both humans and machines could read. It is used to describe data in a structured way and defines how the document should be stored and transported.

+
+
+
+

2. CESM XML files and CESM environment variables#

+

CESM cases are customized, built and run largely through setting what CESM calls “environment variables”. These actually appear to the user as variables defined in xml files.

+

These files appear in the case directory ($CASEROOT) once a case is created and are named something like env_*.xml. We control how we compile and run the model with these files.

+
+
+

XML file locations#

+

CESM xml files +

Figure: Overview of the XML file locations

+For the current tutorial on derecho, the paths are:

+
    +
  • $CASEROOT = /glade/u/home/$USER/cases/$CASE

  • +
+

There are multiple env_*.xml files in the $CASEROOT directory:

+
    +
  • env_archive.xml: specifies rules for short term archive script case.st_archive

  • +
  • env_batch.xml: specifies batch specific settings used in case.submit script

  • +
  • env_build.xml: specifies build information used in the case.build script

  • +
  • env_case.xml: set by create_newcase and cannot be modified

  • +
  • env_mach_pes.xml: specifies PE layout on NCAR HPC for components and used by case.run script

  • +
  • env_mach_specific.xml: specifies machine specific information used in case.build script

  • +
  • env_run.xml: sets run time information (such as length of run, number of submissions, …)

  • +
+

In this section, we will learn and practice modifying CESM run length and run type using env_run.xml!

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/physics_timestep.html b/notebooks/modifications/xml/physics_timestep.html new file mode 100644 index 000000000..2e7d1ee4d --- /dev/null +++ b/notebooks/modifications/xml/physics_timestep.html @@ -0,0 +1,713 @@ + + + + + + + + + + + Physics Timestep — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Physics Timestep

+ +
+
+ +
+
+
+ + + + +
+ +
+

Physics Timestep#

+

Where and When to Change Time Steps:

+

When the model crashes due to large, temporary instabilities, one method to overcome the problem is to change the time step. +This is typically done in either the atmosphere or ocean components.

+
    +
  • For atmosphere and land component (CAM/CLM): change ATM_NCPL in env_run.xml.

  • +
  • For ocean (POP): change dt_count in POP namelist.

  • +
+
+
+
    +
  • For the atmosphere component (CAM), the physics time step is set by ATM_NCPL and NCPL_BASE_PERIODin env_run.xml. NCPL_BASE_PERIOD specifies base period associated with coupling frequency, the default value is “day”. The ATM_NCPL variable specifies the number of coupling intervals per NCPL_BASE_PERIOD between the atmosphere/land and the coupled system. Based on these two variables, the scripts will automatically compute the time step for the atmosphere and land and populate the namelist files accordingly. For example, if NCPL_BASE_PERIOD is set to “day”, and ATM_NCPL is 48, then the timestep is 1800 seconds.

  • +
  • For the land component (CLM), the physics ime step is the same as the CAM time step; this is automatically set with the CAM time step via ATM_NCPL. You cannot set this separately.

  • +
  • For the ocean component (POP2), the physics time step is changed in the user_nl_pop file and is based on $OCN_NCPL (found in env_run.xml), dt_count , and dt_option. The default dt_option is “steps_per_day”.

  • +
  • For the sea ice component (CICE), the physics time step is set by the coupling interval variable $ICE_NCPL found in env_run.xml.

  • +
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/run_length.html b/notebooks/modifications/xml/run_length.html new file mode 100644 index 000000000..72539020a --- /dev/null +++ b/notebooks/modifications/xml/run_length.html @@ -0,0 +1,704 @@ + + + + + + + + + + + Controlling Run Length — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Controlling Run Length

+ +
+
+ +
+
+
+ + + + +
+ +
+

Controlling Run Length#

+

The length of your model run is controlled by several run time variables in the env_run.xml file. +These variables may be modified at the initialization of the model run and during the course of the model run.

+

These variables comprise coupler namelist settings for the model stop time, model restart frequency, coupler history frequency and a flag to determine if the run should be flagged as a continuation run.

+

We will learn about customizing runtime settings to control starting, stopping, restarting and continuing a model run, and practice how to specify the run length of your long simulations.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/run_length/changing_run_length.html b/notebooks/modifications/xml/run_length/changing_run_length.html new file mode 100644 index 000000000..c559941db --- /dev/null +++ b/notebooks/modifications/xml/run_length/changing_run_length.html @@ -0,0 +1,806 @@ + + + + + + + + + + + Changing Run Length — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Changing Run Length

+ +
+ +
+
+ + + + +
+ +
+

Changing Run Length#

+

How to set run length for long simulations using variables $STOP_OPTION, $STOP_N and $RESUBMIT?

+
+

1. Number of submissions and run length#

+

Recall that we can use STOP_N and STOP_OPTION to control the run length of each batch job submission.

+

A typical long model simulation (say you want to run the model for 100 years) is comprised of many job submissions. This is because we have limited batch wallclock time for each job submission. For example, on derecho, the regular queue wallclock limit is 12 hours.

+

We can specify the number of times to resubmit the run using the $RESUBMIT variable in env_run.xml to complete the long run.

+
+Evaluate your understanding +

The tutorial version of the CESM model on derecho simulates ~10 model years per wallclock day. The maximum wallclock request is 12 hours. +If you want to run the model for 100 years, what values should be set for STOP_OPTION, STOP_N and RESUBMIT?

+
+
+ + + Hint! + +
    +
  • How to set STOP_N and STOP_OPTION for each submission, given the wallclock limit?

  • +
  • How many times to resubmit the job to reach the 100 years?

  • +
  • The number of total submission = the initial submission + the number of resubmission.

    +
+ + +
+
+ + + Click here for the solution + +Assume we want to use the full 12 hours for each job submission. +

The model runs 10 years / wallclock day, which means that 12 hours would give us 5 years per job submission.

+

For a total of 100 years, we will need 20 submissions.

+
STOP_OPTION='nyears', STOP_N=5, RESUBMIT=19
+
+
+

so that initial run of 5 years + (19 resubmits x 5 years per job) = 100 years.

+
+

+
+
+

2. RESUBMIT and CONTINUE_RUN#

+

In the exercise above, the first submission is the initial run, where CONTINUE_RUN is by default set to FALSE. When you want to continue the run after running the first 5 years, you will need to tell the model to continue by setting CONTINUE_RUN=TRUE.

+

If you have set RESUBMIT>0, your script will automatically change CONTINUE_RUN=TRUE after completion of the first submission for all subsequent submissions into the queue.

+
+Evaluate your understanding +

In the previous exercise, if we have set RESUBMIT=19 before the initial run, what are the value of CONTINUE_RUN and RESUBMIT at the time of:

+
    +
  • the initial submission of 5 years

  • +
  • the next submission of 5 years

  • +
  • the 3rd run (2nd resubmission) of 5 years?

  • +
+
+
+ + + Click here for the solution + +
    +
  • the initial submission of 5 years:

    +
    CONTINUE_RUN=FALSE, RESUBMIT=19 
    +
    +
    +

    because when the run is first initialized, CONTINUE_RUN=FALSE. +

    +
  • +
  • the next submission of 5 years:

    +
    CONTINUE_RUN=TRUE, RESUBMIT=18 
    +
    +
    +

    because RESUBMIT>0, CONTINUE_RUN will automatically switch to TRUE after completing the initial run. +

    +
  • +
  • the 3rd run (2nd resubmission) of 5 years:

    +
    CONTINUE_RUN=TRUE, RESUBMIT=17
    +
    +
    +

    because CONTINUE_RUN stays to be TRUE, RESUBMIT decreases by 1.

    +
  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/run_length/number_of_submissions.html b/notebooks/modifications/xml/run_length/number_of_submissions.html new file mode 100644 index 000000000..9ec73f918 --- /dev/null +++ b/notebooks/modifications/xml/run_length/number_of_submissions.html @@ -0,0 +1,681 @@ + + + + + + + + + + + Controlling the Number of Submissions — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Controlling the Number of Submissions

+ +
+
+ +
+
+
+ + + + +
+ +
+

Controlling the Number of Submissions#

+

and continue_run

+
+ + + + +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/run_length/restarting.html b/notebooks/modifications/xml/run_length/restarting.html new file mode 100644 index 000000000..f4b244cb3 --- /dev/null +++ b/notebooks/modifications/xml/run_length/restarting.html @@ -0,0 +1,783 @@ + + + + + + + + + + + Restarting a Run — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Restarting a Run

+ +
+ +
+
+ + + + +
+ +
+

Restarting a Run#

+

How to continue a run.

+
+
+

1. Restart files#

+

Restart files are written by each model component at intervals dictated by the driver via the setting of the env_run.xml variables, $REST_OPTION and $REST_N. The default values for these two variables are set to be the same as $STOP_OPTION and $STOP_N. In most cases, we do not modify these two variables.

+

Restart files allow the model to stop and then start again with bit-for-bit exact capability (i.e. the model output is exactly the same as if it had never been stopped). The driver coordinates the writing of restart files as well as the time evolution of the model. All components receive restart and stop information from the driver and write restarts or stop as specified by the driver.

+

Whenever a component writes a restart file, it also writes a restart pointer file of the form, rpointer.$component (i.e. rpointer.atm). The restart pointer file contains the restart filename that was just written by the component. Upon a restart, each component reads its restart pointer file to determine the filename(s) to read in order to continue the model run. As examples, the following pointer files will be created for a component set using full active model components.

+
    +
  • rpointer.atm

  • +
  • rpointer.drv

  • +
  • rpointer.ice

  • +
  • rpointer.lnd

  • +
  • rpointer.rof

  • +
  • rpointer.cism

  • +
  • rpointer.ocn.ovf

  • +
  • rpointer.ocn.restart

  • +
+
+ + + Tips! + +
    +
  1. Try using xmlquery to check the values of REST_OPTION and REST_N. +What do you find?

  2. +
  3. Take a look at the restart files and restart pointer files in your archive directory ($DOUT_S_ROOT/rest/yyyy-mm-dd-ssss/) or run directory ($RUNDIR). What do they look like?

  4. +
+

+
+
+

2. Continue a run#

+

Recall that the flag variable $CONTINUE_RUN controls whether a model run is initialized (FALSE) or continues a run (TRUE).

+

In the case of our 1-month test run, we submited our initial job with CONTINUE_RUN = FALSE (because it was just initialized) and your RUN_TYPE (to startup, branch or hybrid). If the run has been finished and everything looks good, and we want to continue the run for another month, what do we do?

+

We will need to use xmlchange to change CONTINUE_RUN = TRUE and submit the run again to carry on running the model. The model will use the restart files to continue our run with a bit-for-bit match, as if it had never been stopped.

+
+Evaluate your understanding +

If we do not modify CONTINUE_RUN=TRUE and leave it as FALSE, what would happen after we submit the run again?

+
+
+ + + Click here for the solution + +

The model will run the previous month once again instead of carrying on to the next month!

+
+

The $CONTINUE_RUN flag will be automatically set to TRUE when the variable RESUBMIT>0. Learn more in the chapter Changing Run Length.

+
+
+
+
+

3. Backing up to a previous restart#

+

If a run encounters problems and crashes, it is extremely useful to back up to a previous restart.

+

You will need to find the latest restart files in the $DOUT_S_ROOT/rest/yyyy-mm-dd-ssss/ directory that was created and copy the contents of that directory into your run directory ($RUNDIR). You can then continue the run and these restarts will be used.

+

It is important to make sure the new rpointer.* files overwrite the previous rpointer.* files that were in $RUNDIR, or the job may not restart in the correct place.

+

Occasionally, when a run has problems restarting, it is because the rpointer files are out of sync with the restart files. The rpointer files are text files and can easily be edited to match the correct dates of the restart and history files. All the restart files should have the same date.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/run_length/starting_and_stopping.html b/notebooks/modifications/xml/run_length/starting_and_stopping.html new file mode 100644 index 000000000..e40e33e5b --- /dev/null +++ b/notebooks/modifications/xml/run_length/starting_and_stopping.html @@ -0,0 +1,760 @@ + + + + + + + + + + + Starting and Stopping — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Starting and Stopping

+ +
+ +
+
+ + + + +
+ +
+

Starting and Stopping#

+

To start a model run, we will need to submit $CASE.run to the batch queue. In addition, we will also need to specify how long we want to run the model in env_run.xml.

+

We will learn how to modify the runtime variables in env_run.xml to initialize, stop and restart a CESM model run.

+
+
+
+

1. “Initial run” and “continue run”#

+

When a CESM model run is first initialized, it is called an initial run.

+

The variable $CONTINUE_RUN is a flag indicating if the current model run is an initial run or a continue run.

+
    +
  • For an intial run, CONTINUE_RUN must be set to FALSE,

  • +
  • If the model continues a run, CONTINUE_RUN is set to TRUE.

  • +
+

Your initial CESM run can be initialized in one of three run types: startup, branch,or hybrid. We will get into more details about the run types in the Chapter Modifying Run Types.

+

For now, we need to know that setting run types is only important for an initial run when CONTINUE_RUN is set to FALSE.

+
+
+
+
+

2. Set runtime limits with STOP_OPTION and STOP_N#

+

Run length options can be set using $STOP_OPTION and $STOP_N variables in env_run.xml.

+
    +
  • STOP_OPTION : sets the run length time interval type, i.e. nmonths, ndays, nyears.

  • +
  • STOP_N : sets the number of intervals (set by STOP_OPTION) to run the model during each submission within the specified wallclock time.

  • +
+
+For example, if you want to run a simulation for 6 months during the job submssion, you will need to set: +
./xmlchange STOP_N=6
+./xmlchange STOP_OPTION='nmonths'
+
+
+
+

STOP_N and STOP_OPTION control the length of the run per job submission. They should be set based on the job queue limit and model throughput. You can find more information on this topic in the chapter Using timing files.

+
+

A typical simulation is comprised of many job submissions. This is because you can only stay in the computer queue for a limited time. We will learn more about completing long simulations in the chapter Changing run length.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/modifications/xml/run_length/timing_files.html b/notebooks/modifications/xml/run_length/timing_files.html new file mode 100644 index 000000000..29830e606 --- /dev/null +++ b/notebooks/modifications/xml/run_length/timing_files.html @@ -0,0 +1,752 @@ + + + + + + + + + + + Using Timing Files — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Using Timing Files#

+

Model timing files contain a summary of various timing information for the run. It is helpful to check the timings after the run to verify that the model is running efficiently.

+
+
+
+

1. What are timing files and where are they located?#

+

A summary timing output file is produced after every CESM run. This file is placed in $CASEROOT/timing/cesm_timing.$CASE.$date, where $date is a datestamp set by CESM at runtime, and contains a summary of various timing information.

+

The first section in the timing output, “TIMING PROFILE”, summarizes general timing information for the run. The total run time and cost is given in several metrics including pe-hrs per simulated year (cost), simulated years per wall day (thoughput), seconds, and seconds per model day. This provides general summary information quickly in several units for analysis and comparison with other runs. The total run time for each component is also provided, as is the time for initialization of the model. These times are the aggregate over the total run and do not take into account any temporal or processor load imbalances.

+
+
+
+
+
+

2. Use timing files to determine runtime variables#

+

Here is an example of cost information shown in a timing file:

+
Overall Metrics: 
+Model Cost: 327.14 pe-hrs/simulated_year (scale= 0.50)
+Model Throughput: 4.70 simulated_years/day
+
+
+

The model throughput is the estimated number of model years that you can run in a wallclock day. Based on this, you can maximize $CASE.run queue limit and change STOP_OPTION and STOP_N in env_run.xml.

+

For example, say a model’s throughput is 4.7 simulated_years/day. On derecho, the maximum runtime limit is 12 hours. 4.7 model years/24 hours * 12 hours = 2.34 years. On the massively parallel computers, there is always some variability in how long it will take a job to run. On some machines, you may need to leave as much as 20% buffer time in your run to guarantee that jobs finish reliably before the time limit. For that reason we will set our model to run only 2 model year/job.

+

Continuing to assume that the run is on derecho, we can set:

+
./xmlchange STOP_OPTION='nyears'
+./xmlchange STOP_N=2
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/documentation.html b/notebooks/namelist/documentation.html new file mode 100644 index 000000000..81e67d824 --- /dev/null +++ b/notebooks/namelist/documentation.html @@ -0,0 +1,710 @@ + + + + + + + + + + + Namelist Variables Documentation — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Namelist Variables Documentation

+ +
+
+ +
+
+
+ + + + +
+ +
+

Namelist Variables Documentation#

+
+

Complete documentation about the namelist variables can be found on the CESM webpage.

+
+

For instance, if you want to change the output frequency in CAM, go to the website and type the word frequency in the search box as illustrated in Figure 1.

+
+

Search namelist variables

+

Figure 1: Search for a namelist variable.

+
+

This will return the attributes of the namelist variable nhtfrq, as illustrated in Figure 2. nhtfrq is the variable you need in order to change the output frequency of a history file.

+
+

Attribute of a namelist variable

+

Figure 2: Attribute of a namelist variable. Here the variable: nhtfrq

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/exercises/exercise_cam_output.html b/notebooks/namelist/exercises/exercise_cam_output.html new file mode 100644 index 000000000..a05558798 --- /dev/null +++ b/notebooks/namelist/exercises/exercise_cam_output.html @@ -0,0 +1,875 @@ + + + + + + + + + + + Modify CAM output — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Modify CAM output

+ +
+
+ +
+
+
+ + + + +
+ +
+

Modify CAM output#

+
+Exercise: Customize your CAM history files

+

Create a case called b1850_high_freq using the compset B1850 at f19_g17 resolution.

+

In addition to the monthly history file h0, tell the model to output the following:

+
    +
  • a h1 file with instantaneous values of T, Q, U and V every 24 hours.

  • +
  • a h2 file with time-average values of T, Q, U and V every 3 hours.

  • +
+

Set your namelist so that you output:

+
    +
  • a single h1 file with all the daily output for the month.

  • +
  • multiple h2 files, one for every day of the month.

  • +
+

Your goal is to produce:

+
    +
  • one h1 file with 31 timesteps and

  • +
  • thirty-one h2 files with 8 timesteps each.

  • +
+

Set the run length to 1 month and make a 1-month run.

+
+
+
+ Click here for hints +

# How do I compile?

+

You can compile with the command:

+
qcmd -- ./case.build
+
+
+

# How do I control the output?

+

Use namelist variables: nhtfrq, mfilt, fincl.

+

Look at the online documentation for these variables.

+

# How do I check my solution?

+

When your run is completed, go to the archive directory and navigate to the subdirectory atm/hist

+
cd /glade/derecho/scratch/$USER/archive/b1850_high_freq
+cd atm/hist
+
+
+

(1) Check that your archive directory contains the files:

+
    +
  • h0 files

  • +
+
b1850_high_freq.cam.h0.0001-01.nc
+
+
+
    +
  • h1 files

  • +
+
b1850_high_freq.cam.h1.0001-01-01-00000.nc
+b1850_high_freq.cam.h1.0001-02-01-00000.nc
+
+
+
    +
  • h2 files

  • +
+
b1850_high_freq.cam.h2.0001-01-01-00000.nc
+…
+b1850_high_freq.cam.h2.0001-01-31-00000.nc
+b1850_high_freq.cam.h2.0001-02-01-00000.nc
+
+
+

(2) Compare the contents of the h1 and h2 files using ncdump.

+
ncdump -h b1850_high_freq.cam.h1.0001-01-01-00000.nc
+ncdump -h b1850_high_freq.cam.h2.0001-01-01-00000.nc
+
+
+

(3) Check the number of timesteps in the h1 and the h2 files. +Look at the sizes of the files.

+
+
+
+
+Click here for the solution
+

# Create a new case

+

Create a new case b1850_high_freq with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case ~/cases/b1850_high_freq  --compset B1850 --res f19_g17 
+
+
+

# Setup

+

Invoke case.setup with the command:

+
cd ~/cases/b1850_high_freq 
+./case.setup
+
+
+

# Customize namelists

+

Edit the file user_nl_cam and add the lines:

+
 nhtfrq = 0, -24, -3
+ mfilt = 1, 31, 8 
+ fincl2 = 'T:I','Q:I','U:I','V:I'
+ fincl3 = 'T','Q','U','V'
+
+
+

# Set run length

+

Change the run length:

+
./xmlchange STOP_N=1,STOP_OPTION=nmonths
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013 (You should use the project number given for this tutorial), use the command:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

# Build and submit

+

Build the model and submit your job:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Look at your solution

+

When the run is completed, look into the archive directory for: +b1850_high_freq.

+

(1) Check that your archive directory on derecho (The path will be different on other machines):

+
cd /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist
+ls 
+
+
+

(2) Compare the contents of the h1 and h2 files using ncdump. +Look at the variables attributes. What is the difference between the 2 files ?

+

The file with the instantaneous output h1 have no cell_methods attribute while the average output h2 has a attribute:

+
cell_methods = "time: mean"
+
+
+

For instance for the field Q.

+

In the instantaneous file b1850_high_freq.cam.h1.0001-01-01-00000.nc

+
float Q(time, lev, lat, lon) ;
+                Q:mdims = 1 ;
+                Q:units = "kg/kg" ;
+                Q:mixing_ratio = "wet" ;
+                Q:long_name = "Specific humidity" ;
+
+
+

In the time-averaged file b1850_high_freq.cam.h2.0001-01-01-00000.nc

+
float Q(time, lev, lat, lon) ;
+                Q:mdims = 1 ;
+                Q:units = "kg/kg" ;
+                Q:mixing_ratio = "wet" ;
+                Q:long_name = "Specific humidity" ;
+                Q:cell_methods = "time: mean" ;
+
+
+

(3) Check the number of timesteps in the h1 and the h2 files.

+
    +
  • h1 contains 31 time samples.
    +In the netcdf file,

  • +
+
time = UNLIMITED ; // (31 currently)
+
+
+
    +
  • h2 contains 8 time samples +In the netcdf file,

  • +
+
time = UNLIMITED ; // (8 currently)
+
+
+
    +
  • Check the size of the files

  • +
+
du –ks –h /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist/*
+
+
+
234M    b1850_high_freq.cam.h0.0001-01.nc
+
+210M    b1850_high_freq.cam.h1.0001-01-01-00000.nc
+7.0M    b1850_high_freq.cam.h1.0001-02-01-00000.nc
+
+55M     b1850_high_freq.cam.h2.0001-01-01-00000.nc
+55M     b1850_high_freq.cam.h2.0001-01-02-00000.nc
+...
+55M     b1850_high_freq.cam.h2.0001-01-31-00000.nc
+7.0M    b1850_high_freq.cam.h2.0001-02-01-00000.nc
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/exercises/exercise_tuning_parameter.html b/notebooks/namelist/exercises/exercise_tuning_parameter.html new file mode 100644 index 000000000..3762f9869 --- /dev/null +++ b/notebooks/namelist/exercises/exercise_tuning_parameter.html @@ -0,0 +1,804 @@ + + + + + + + + + + + Change a tuning parameter in CAM — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Change a tuning parameter in CAM

+ +
+
+ +
+
+
+ + + + +
+ +
+

Change a tuning parameter in CAM#

+
+Exercise: Modify a parameter, dcs

+

In the tuning lecture, we talked about the parameter dcs: +http://www.cesm.ucar.edu/events/tutorials/2019/files/Specialized-hannay.pdf

+

Create a case called b1850_dcs using the compset B1850 at f19_g17 resolution.

+

Locate where to change the parameter Dcs and change from the default value:
+dcs = 200.D-6
+to
+dcs = 500.D-6

+

Make a 1-month run.

+
+
+
+ + Click here for hints + +
    +
  • The trick is locating where to change dcs

  • +
  • Compare this run to the first run you did today: b1850_high_freq.

  • +
  • You can use ncdiff and ncview to look at the difference between the 2 runs. For instance:

  • +
+
ncdiff /glade/derecho/scratch/$USER/archive/b1850_dcs/atm/hist/b1850_dcs.cam.h0.0001-01.nc /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist/b1850_high_freq.cam.h0.0001-01.nc diff.nc
+
+ncview diff.nc
+
+
+
    +
  • Analyze how this does this affect the LWCF ?

  • +
+
+
+
+
+Click here for the solution
+

# Create a new case

+

Create a new case b1850_dcswith the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case ~/cases/b1850_dcs --compset B1850 --res f19_g17 
+
+
+

# Setup

+

Invoke case.setup with the command:

+
cd ~/cases/b1850_dcs
+./case.setup
+
+
+

# Customize namelists

+

Locate the variable to modify dcs. (Locating variables requires a learning curve. A good place to start is to look at the Variable namelist documentation.

+

The variable is: micro_mg_dcs.
+By default this variable is set to: +micro_mg_dcs = 200 microns +You want to set it to: +micro_mg_dcs = 500 microns

+

Edit the file user_nl_cam and add the lines:

+
micro_mg_dcs = 500.D-6 
+
+
+

# Set run length

+

Change the run length:

+
./xmlchange STOP_N=1,STOP_OPTION=nmonths
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013, use the command:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

# Build and submit

+

Build the model and submit your job:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Look at your solution

+
    +
  • When the run is completed, compare this run to the first run: +b1850_high_freq.

  • +
  • Create a file with the difference in LWCF between b1850_dcs and b1850_high_freq.

  • +
  • You can use ncdiff and ncview to look at the difference between the 2 runs.

  • +
  • For instance, use ncdiff to create a file with the difference between the 2 runs:

  • +
+
cd /glade/derecho/scratch/$USER/archive/b1850_dcs 
+ncdiff /glade/derecho/scratch/$USER/archive/b1850_dcs/atm/hist/b1850_dcs.cam.h0.0001-01.nc /glade/derecho/scratch/$USER/archive/b1850_high_freq/atm/hist/b1850_high_freq.cam.h0.0001-01.nc diff.nc
+
+
+
    +
  • Use ncview to look at the file you created.

  • +
+
ncview diff.nc
+
+
+

#How does this affect the LWCF ?

+

Dcs = Threshold diameter to convert cloud ice particles to snow

+

+dcs representation
+Figure: Representation of Dcs.

+

We increased Dcs from 200 microns to 500 microns. We should have more ice cloud and the LWCF should be larger.

+

The field LWCF difference looks like +

+ncview diff LWCF
+Figure: Difference of LWCF for micro_mg_dcs = 200.D-6->500.D-6

+

We can see that the change in Dcs affects the tropics where LWCF is large. However, 1-month run is too short to look at robust statistics.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/exercises_overview.html b/notebooks/namelist/exercises_overview.html new file mode 100644 index 000000000..e1ff776e5 --- /dev/null +++ b/notebooks/namelist/exercises_overview.html @@ -0,0 +1,742 @@ + + + + + + + + + + + Exercise Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise Overview

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Exercise Overview#

+
+

Learning Goals#

+
    +
  • Student will practice performing namelist changes.

  • +
  • Student will edit user_nl_* files, run the model and check the results.

  • +
+
+
+

Exercise overview:#

+

Do at least one exercise:

+
    +
  • Output high frequency data in CAM.

  • +
  • Change a tuning parameter in CAM.

  • +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/namelist.html b/notebooks/namelist/namelist.html new file mode 100644 index 000000000..1f84c120d --- /dev/null +++ b/notebooks/namelist/namelist.html @@ -0,0 +1,707 @@ + + + + + + + + + + + Namelist Modifications — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Namelist Modifications

+ +
+
+ +
+
+
+ + + + +
+ +
+

Namelist Modifications#

+

There are several ways in which the model can be modified using namelist settings. This is what we cover in this chapter:

+
    +
  • The section Overview describes the steps to modify the namelists and provides a visual representation of the directories and files that need to be modified.

  • +
  • The section Documentation explains how to find information about the namelist variables on the CESM webpage.

  • +
  • The section Customizing output describes how to customize the output history files, such as changing the output frequency or adding variables to a file.

  • +
  • The section Exercises offers opportunities to practice the concepts learned in this chapter.

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/output.html b/notebooks/namelist/output.html new file mode 100644 index 000000000..5d5ea297f --- /dev/null +++ b/notebooks/namelist/output.html @@ -0,0 +1,703 @@ + + + + + + + + + + + Customizing Output — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Customizing Output

+ +
+
+ +
+
+
+ + + + +
+ +
+

Customizing Output#

+

If you don’t add anything to the namelist, CESM will generate its default output. This is what was done in previous chapters of this tutorial. Typically, the model outputs monthly means (and in some cases, higher frequency outputs) of a default set of variables. Depending on your needs, you may want to output variables at a different frequency, or add more variables, etc …

+

In this chapter Customizing output, we will cover how to output at a different frequency, add history files, or add variables to the history files.

+

In the sections below, we provide the basics of customizing the output for the different components (atm, lnd, ice, and pop). The Customize CAM output is the most comprehensive, so we recommend at least reviewing that section.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/output/output_cam.html b/notebooks/namelist/output/output_cam.html new file mode 100644 index 000000000..7eb29a61c --- /dev/null +++ b/notebooks/namelist/output/output_cam.html @@ -0,0 +1,886 @@ + + + + + + + + + + + Customize CAM output — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Customize CAM output#

+

In this section, we will cover:

+
    +
  • how to change the output frequency

  • +
  • how to control the number of time samples written to a history file

  • +
  • how to output extra variables

  • +
  • how to output extra history files

  • +
+

This can be achieved with 3 namelist variables:

+
    +
  • nhtfrq: sets the output frequency

  • +
  • mfilt: maximum number of time samples written to a history file

  • +
  • fincl: add variables to the history file

  • +
+
+

Customizing CAM output frequency: nhtfrq#

+

The default history file from CAM is a monthly average. +We can change the output frequency with the namelist variable nhtfrq

+
    +
  • If nhtfrq=0, the file will be a monthly average

  • +
  • If nhtfrq>0, frequency is input as number of timesteps.

  • +
  • If nhtfrq<0, frequency is input as number of hours.

  • +
+

For instance to change the history file from monthly average to daily average, we set the namelist variable:

+
    nhtfrq = -24     
+
+
+
+Evaluate your understanding +

The default history file in CAM is a monthly average. How do you modify the output to output 3-hourly data ?

+
+
+
+Click here for the solution
+Add the following line to user_nl_cam:
+
    nhtfrq = -3
+
+
+
+
+
+

Customizing CAM history files: mfilt#

+

To control the number of time samples in the history file, we use the variable mfilt.
+This variable specifies the maximum number of time samples written to a history file.

+

For example, if we want to have 10 time samples on each history file, we can set the namelist variable as follows:

+
     mfilt = 10
+
+
+

To output daily data for a 1-year run in a single file, we can use the following values:

+
    nhtfrq = -24   
+    mfilt = 365
+
+
+

If we want to output daily data with only 1 time sample per file, we can set the variables as follows:

+
    nhtfrq = -24
+    mfilt = 1
+
+
+

Note: we cannot change mfilt for monthly frequency. For monthly frequency, we always have: +mfilt = 1

+
+Evaluate your understanding +

What is the setting to generate 3 hourly data for a month-long simulation that will create a file every day?

+
+
+
+Click here for the solution
+

Modify the length of the run in env_run.xml with the command:

+
    ./xmlchange STOP_OPTION=nmonths,STOP_N=1
+
+
+

Add the following line to user_nl_cam to output 3 hourly data and to create one file per day:

+
    nhtfrq = -3
+    mfilt = 8
+
+
+
+
+
+
+

Add extra variables and history files: fincl#

+

You can output up to 10 history files: h0, h1, …, h9.

+
    +
  • The h0 file contains the default variables or fields. (These are the variables you get by default without doing any modification to the namelist or code).

  • +
  • For the files h1 to h9, the user must specify the variables to output.

  • +
+

To control the list of fields in the history files, use the namelist variable fincl

+
    +
  • fincl1 controls the fields in h0

  • +
  • fincl2 controls the fields in h1

  • +
  • +
  • fincl10 controls the fields in h9

  • +
+

For example, to add the field PRECT to the h0 file, use the line:

+
    fincl1 = 'PRECT' 
+
+
+
+Evaluate your understanding +

What is the namelist setting to add:

+
    +
  • a hourly history h1 with the variables U, V, T

  • +
  • and a daily history h2 with the variable PRECT

  • +
  • and output 10 time samples in h1 and h2 ?

  • +
+
+
+
+Click here for the solution
+

Add the following lines to user_nl_cam:

+
    nhtfrq = 0, -1, -24 
+    mfilt = 1, 10, 10 
+    fincl2 = 'U', 'V', 'T' 
+    fincl3 = 'PRECT'
+
+
+
+
+
+
+

Averaging flag for the fincl variables#

+

Using a : following a field gives the averaging flag for the output field.

+

Valid flags are:

+
    +
  • A ==> Average

  • +
  • B ==> GMT 00:00:00 average

  • +
  • I ==> Instantaneous

  • +
  • M ==> Minimum

  • +
  • X ==> Maximum

  • +
  • L ==> Local-time

  • +
  • S ==> Standard deviation

  • +
+

For instance, the line:

+
     fincl1 = 'PRECT:M' 
+
+
+

is used to add the minimum of PRECT to the file h0

+
+Evaluate your understanding +

What happens if we set in user_nl_cam:

+
    fincl2   = 'T:I','Q:I','U:I','V:I'
+    nhtfrq   = 0, -3 
+    mfilt   = 1, 8
+
+
+
+
+
+Click here for the solution
+

In addition to the monthly history file h0,

+
    +
  • we will also output the file h1 with instantaneous values of T, Q, U, and V.

  • +
  • These variables will be output every 3 hours, resulting in 8 time samples in each h1 file.

  • +
  • A new file will be created every day.

  • +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/output/output_cice.html b/notebooks/namelist/output/output_cice.html new file mode 100644 index 000000000..7e65439a2 --- /dev/null +++ b/notebooks/namelist/output/output_cice.html @@ -0,0 +1,710 @@ + + + + + + + + + + + Customize CICE output — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Customize CICE output

+ +
+
+ +
+
+
+ + + + +
+ +
+

Customize CICE output#

+

The CICE output can changed with the namelist variables

+
    +
  • histfreq: Frequency of output written to history files (‘1’, ‘m’, ‘d’, ‘y’, …)

  • +
  • histfreq_n: Frequency history data is written to history files

  • +
  • hist_avg: if false => instantaneous values, if true => time-averages

  • +
+

Here is how to set user_nl_cice to output an extra history file with daily values (leaving the primary history file as monthly):

+
     histfreq = 'm','d','x','x','x'
+     histfreq_n = 1,1,1,1,1 
+
+
+

See: http://www.cesm.ucar.edu/models/cesm2/settings/current/cice_nml.html

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/output/output_clm.html b/notebooks/namelist/output/output_clm.html new file mode 100644 index 000000000..6291d4280 --- /dev/null +++ b/notebooks/namelist/output/output_clm.html @@ -0,0 +1,879 @@ + + + + + + + + + + + Customize CLM output — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Customize CLM output#

+

In this section, we will cover:

+
    +
  • how to change the output frequency

  • +
  • how to control the number of time samples written to a history file

  • +
  • how to output extra variables

  • +
  • how to output extra history files

  • +
+

This can be achieved with 3 namelist variables:

+
    +
  • hist_nhtfrq:: output frequency of the history file

  • +
  • hist_mfilt: number of samples on each history file

  • +
  • hist_fincl: adding variables and auxiliary history files

  • +
+
+

Customizing CLM output frequency: hist_nhtfrq#

+

We can change the output frequency with the namelist variable hist_nhtfrq

+
    +
  • If hist_nhtfrq=0, the file will be a monthly average

  • +
  • If hist_nhtfrq>0, frequency is input as number of timesteps.

  • +
  • If hist_nhtfrq<0, frequency is input as number of hours.

  • +
+

For instance,

+
     hist_nhtfrq = -24
+
+
+

means daily output

+
     hist_nhtfrq = 24
+
+
+

means output every 24 timesteps

+
+Evaluate your understanding +

How do you modify the CLM output to output 3-hourly data ?

+
+
+
+Click here for the solution
+

Add the following line to user_nl_clm:

+
    hist_nhtfrq = -3
+
+
+
+
+
+

Add extra variables and history files: hist_fincl#

+

You can output up to 10 history files:h0, h1, …, h9.

+

To control the list of fields in the history files, use the namelist variable hist_fincl

+
    +
  • hist_fincl1 controls the fields in h0

  • +
  • hist_fincl2 controls the fields in h1

  • +
  • +
  • hist_fincl10 controls the fields in h9

  • +
+

For example, to add the field ‘TG’ to the h0 file, use the line:

+
     hist_fincl1 = 'TG' 
+
+
+
+Evaluate your understanding +

What is the namelist setting to add a monthly history h1 with the variables ‘TG’, ‘TV’ and a daily history h2 with the variables ‘TG’, ‘TV’. Output 10 time samples in h1 and h2 ?

+
+
+
+Click here for the solution
+

Modify env_run.xml with the command:

+
    ./xmlchange STOP_N=nmonths, STOP_OPTION=1
+
+
+

Add the following lines to user_nl_cam:

+
    hist_nhtfrq = 0, 0, -24 
+    hist_mfilt = 1, 10, 10 
+    hist_fincl2 = 'TG', 'TV' 
+    hist_fincl3 = 'TG', 'TV' 
+
+
+
+
+
+
+

Customizing CLM history files: hist_mfilt#

+

To control the number of time samples in the history file, we use the variable hist_mfilt.
+This variable specifies is the maximum number of time samples written to a history file.

+

For example, if we want to have 10 time samples on each history file, we can set the namelist variable as follows:

+
     hist_mfilt = 10
+
+
+

To output daily data in a single file for a 1-year run, we can use the following values:

+
    hist_nhtfrq = -24   
+    hist_mfilt = 365
+
+
+

If we want to output daily data with only 1 time sample per file, we can set the variables as follows:

+
    hist_nhtfrq = -24
+    hist_mfilt = 1
+
+
+

NB: we cannot change mfilt for monthly frequency. For monthly frequency, we always have: +hist_mfilt = 1

+
+Evaluate your understanding +

What is the setting to generate CLM 3-hourly data for a month-long simulation that will create a file every day?

+
+
+
+Click here for the solution
+

Modify env_run.xml with the command:

+
    ./xmlchange STOP_N=nmonths, STOP_OPTION=1
+
+
+

Add the following line to user_nl_cam:

+
    hist_nhtfrq = -3
+    hist_mfilt = 8
+
+
+
+
+
+
+

Averaging flag for the fincl variables#

+

Using a “:” following a field gives the averaging flag for the output field.

+

Valid flags are:

+
    +
  • A ==> Average

  • +
  • I ==> Instantaneous

  • +
  • M ==> Minimum

  • +
  • X ==> Maximum

  • +
  • SUM ==> Sum

  • +
+

For instance, the line:

+
     hist_fincl1  = 'TLAI:M' 
+
+
+

is used to add the minimum of TLAI to the file h0

+
+Evaluate your understanding +

What happens if we set in user_nl_clm:

+
    hist_fincl2 = 'TG', 'TV' 
+    hist_fincl3 = 'TG', 'TV' 
+    hist_fincl4 = 'TG', 'TV'
+    hist_fincl5 = 'TG', 'TV' 
+    hist_nhtfrq = 0, -24, -6, -1, 1 
+
+
+
+
+
+Click here for the solution
+

In addition to the monthly history file h0, we output 4 extra history files with daily, six-hourly, hourly, and every time-step values of TG and TV (leaving the primary history h0 files as monthly).

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/output/output_pop.html b/notebooks/namelist/output/output_pop.html new file mode 100644 index 000000000..16d156719 --- /dev/null +++ b/notebooks/namelist/output/output_pop.html @@ -0,0 +1,718 @@ + + + + + + + + + + + Customize POP output — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Customize POP output

+ +
+
+ +
+
+
+ + + + +
+ +
+

Customize POP output#

+

POP output is controlled by POP’s tavg_nml namelist, which variables such as

+
    +
  • tavg_freq: frequency at which the model fields are written

  • +
  • tavg_freq_opt: units of time for ‘tavg_freq’ (‘nmonth’, ‘nhour’, ‘once’,…)

  • +
  • tavg_file_freq:frequency at which the model files are written

  • +
  • tavg_file_freq_opt: units of time for ‘tavg_file_freq’ (‘nmonth’, ‘nhour’, …)

  • +
+

These are arrays, with a value for each output stream. +A convenient way to change the first stream to be daily averages bundled into monthly +files is to add the following lines to user_nl_pop:

+
tavg_freq_opt(1) = 'nday' 
+tavg_freq(1) = 1 
+tavg_file_freq_opt(1) = 'nmonth' 
+tavg_file_freq(1) = 1 
+
+
+

See: https://www.cesm.ucar.edu/models/cesm2/settings/current/pop2_nml.html

+

CAUTION: Note that changing tavg_nml variables via user_nl_pop is non-standard. +While the above is convenient, attempting more complicated changes can lead to unexpected model behavior. +For full flexibility, use the workaround explained in user_nl_pop.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/namelist/overview.html b/notebooks/namelist/overview.html new file mode 100644 index 000000000..1c784ae08 --- /dev/null +++ b/notebooks/namelist/overview.html @@ -0,0 +1,724 @@ + + + + + + + + + + + Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Overview

+ +
+
+ +
+
+
+ + + + +
+ +
+

Overview#

+

There are a number of ways that the model can be modified via namelist settings. These values control the way the code is run.

+

The namelist variables include settings to control over output, tune the model for various quantities, and many other options. For instance, the output frequency in the different components can be controlled via the namelists.

+
+

The steps to modify the namelists are:

+

In $CASEROOT

+
    +
  • edit the user_nl_xxx files.

  • +
  • generate the namelists by running ./preview_namelists.

  • +
+

This results in the creation of component namelists, the *_in files (i.e. atm_in, lnd_in, and so on).

+

The *_in files are located in $CASEROOT/CaseDocs/ and in $RUNDIR.

+
+

An overview of the CESM directories and the location of the namelist files is showed in Figure 1

+
+

CESM directories and namelists

+

Figure 1: Overview of the CESM directories and the namelist files.

+
+

The *_in files should not be directly edited. Any manual changes of the *_in files will be overwritten when you compile or submit the run.

+

Note that step ./preview_namelists is optional as the script preview_namelists is also called when you build the model.

+

Note that you cannot change the namelist variables:

+
    +
  • after the run is submitted

  • +
  • or when CONTINUE_RUN=TRUE.

  • +
+
+

Complete documentation about the namelist variables can be found on the CESM webpage.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/prereqs/exercises.html b/notebooks/prereqs/exercises.html new file mode 100644 index 000000000..e834e4933 --- /dev/null +++ b/notebooks/prereqs/exercises.html @@ -0,0 +1,767 @@ + + + + + + + + + + + Exercise Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise Overview

+ +
+ +
+
+ + + + +
+ +
+

Exercise Overview#

+

This exercise will introduce you to the derecho computing system. Specifically, in this exercise we will:

+
    +
  • Step 1. Login to the derecho supercomputer.

  • +
  • Step 2. Examine the derecho glade file system.

  • +
+
+

Step 1: derecho Login#

+

From your tutorial terminal window prompt get online.

+
+Login to derecho:

+
ssh –XY username@derecho.hpc.ucar.edu
+
+
+
+

Where username is replaced with your tutorial username. Your derecho login will be used through out the tutorial. If you have difficulty getting this to work please ask for help.

+
    +
  • If you are in the in-person tutorial at NCAR, there will be helpers available.

  • +
  • If you are doing this outside of the tutorial then you can contact the user support from the NCAR Computational and Information Systems Laboratory (CISL).

  • +
+
+
+

Step 2: Look Around derecho File Systems#

+

Now that you are on the derecho login nodes you can start to explore the file system. The following simple exercises will start that process.

+
+Show your current directory:
+
pwd
+
+
+
+

List all the directories on the glade file system:

+
ls /glade
+
+
+
+

List the contents of the Input Data directory:

+
ls /glade/campaign/cesm/cesmdata/cseg/inputdata/
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/prereqs/prereqs_overview.html b/notebooks/prereqs/prereqs_overview.html new file mode 100644 index 000000000..28cea38f2 --- /dev/null +++ b/notebooks/prereqs/prereqs_overview.html @@ -0,0 +1,792 @@ + + + + + + + + + + + Prerequisites for Success — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Prerequisites for Success

+ +
+ +
+
+ + + + +
+ +
+

Prerequisites for Success#

+

NOTE: Although the materials and notebooks in this tutorial are published as a Jupyter Book, you will need to use a terminal window to actually run the commands presented in this tutorial.

+

To successfully complete this tutorial you will:

+
    +
  • Utilize a terminal window

  • +
  • Issue commands at the command line using UNIX

  • +
  • Need to be able to access and run on the NCAR HPC systems (HPC = High Performance Computing)

  • +
  • Use JupyterHub for some basic diagnostic plotting

  • +
+

The links below provide more information about these topics. If you are not familiar with any of the four topics above, we strongly recommend that you read through the following sections.

+
+
+

Terminal windows#

+

For most of these tutorial exercises, we assume that you will use the online documentation in tandem with an open terminal window. The commands described in these materials will be entered at the command line in your terminal window.

+

If you are unfamiliar with opening terminal windows, please review the information at the link below.

+
+
+
+

UNIX#

+

The commands described in these materials will be entered in a UNIX environment. If you are unfamiliar with navigating a UNIX environment, we suggest you use the link below to learn more about UNIX.

+
+

UNIX

+
+
+
+

Login to NCAR High Performance Computing (HPC)#

+

When logging into the NCAR HPC machines, we recommend using X11 forwarding. X11 forwarding is an SSH protocol that allows users to run graphical applications on a remote server and interact with them using their local display and I/O devices. It is frequently used by CESM developers for securely interacting with NCAR HPC remote machines.

+

To enable X11 forwarding when logging into the NCAR HPC, simply add the -XY option to your SSH command.

+
ssh -XY username@derecho.hpc.ucar.edu 
+
+
+

OR

+
ssh -XY username@casper.hpc.ucar.edu
+
+
+

More information about logging into the NCAR HPC follows below.

+
+
+
+

Using JupyterHub#

+

The diagnostics section of this tutorial will use JupyterHub to run Jupyter Notebooks. You will need to login to the NCAR JupyterHub system to run the notebooks successfully.

+

NOTE: To run a Jupyter cell

+
    +
  • Type your command into the cell

  • +
  • To execute the command:

    +
      +
    • Press shift+return

    • +
    +
    + OR +
    + - Select the cell then click the 'play' button at the top of the window +
  • +
+

To learn more about JupyterHub, please follow the link below.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/fortran.html b/notebooks/resources/fortran.html new file mode 100644 index 000000000..271638ebf --- /dev/null +++ b/notebooks/resources/fortran.html @@ -0,0 +1,709 @@ + + + + + + + + + + + Fortran — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Fortran

+ +
+
+ +
+
+
+ + + + +
+ +
+

Fortran#

+

The CESM model is primarily written in Fortran. If you plan to modify the CESM code in any way, we strongly recommend you be able to navigate the Fortran code.

+

The 2-unit module listed below, from The COMET Program, introduces users to scientific programming structures and methods and the history, basic syntax and functionality of Fortran.

+

Recommendations for Module Use:

+
    +
  • Users who have little to no programming experience should take both units in full.

  • +
  • Users that do have some programming experience, such as a web-based language like HTML, but have limited experience in scientific programming, such as a C-based languages, should start with unit 1 and may find they can complete it quickly. While unit 2, covering Fortran and CESM Fortran examples, should be taken in full.

  • +
  • Users that have significant scientific programming experience (C-based languages, for example) can safely start in unit 2, which covers Fortran and CESM Fortran examples.

  • +
  • Users that have significant programming experience in Fortran can likely begin at the “Fortran and CESM” subsection (near bottom of table of contents) in unit 2.

  • +
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/github.html b/notebooks/resources/github.html new file mode 100644 index 000000000..bd9da38b0 --- /dev/null +++ b/notebooks/resources/github.html @@ -0,0 +1,754 @@ + + + + + + + + + + + Github — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Github

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Github#

+

The CESM project is managed through the GitHub online software development platform. The CESM Project is hosted under the Earth System Community Modeling Portal (ESCOMP) which is managed by the University Corporation for Atmospheric Research (UCAR). The ESCOMP portal and the CESM project are publicly available and do not require a Github account for read and download access. You can find information, track conversations, create issues, and learn lots about what’s going on with CESM development through the CESM GitHub repository and the associated wiki.

+

Note: In the tutorial, where git commands are needed we explicitly detail what commands to use. You will not need to use Github for other activities in this Tutorial. We do however suggest that in your own time you become familar with Github, register as a Github user, and then become an active member of the CESM user and development community. When you make a free account in GitHub to access numerous repositories for different software code development at NCAR and beyond. Github, ESCOMP, and the CESM project are vast and you can get lost in this material for hours, days, weeks or even years. Don’t go too far off the path in this tutorial as we are expecting that you will focus on learning other derecho and CESM code download tasks.

+
+

What are Git and GitHub?#

+

Git is an open-source version control software to track your changes in the source code.

+

GitHub is an online software development platform. GitHub provides a centralized online service to host the source code and version control using Git. GitHub is used for storing, tracking, and collaborating on software projects. It makes it easy for developers to share code files and collaborate with fellow developers on open-source projects. GitHub also serves as a social networking site where developers can openly network, collaborate, and pitch their work. GitHub allows software developers to create remote, publicly available repositories on the cloud for free. A repository, or “repo” for short, is a coding project’s files and the revision history for each file.

+

Github Image +

Figure: Top Level Github Header

+

Learning all the tricks and features of Git and GitHub takes some time to figure out. Below are some links to GitHub tutorials that can help you become more familiar with this powerful tool.

+
+
+

ESCOMP#

+

The ESCOMP github organization is managed by UCAR and NCAR to organize and manage large, community-oriented earth system modeling projects of broad interest. As shown below there are many projects beyond CESM managed under the ESCOMP organization. The component models (see CAM and CTSM in figure below) that make up CESM are also hosted under the ESCOMP organization.

+

ESCOMP Image +

Figure: ESCOMP Github Header

+
+
+

CESM and GitHub#

+

The CESM Project has been hosted on Github since CESM2.0 under the ESCOMP organization. The CESM Project contains all development and release code for all subsequent versions of CESM. The CESM GitHub repository has the tools for managing the exeternal components that make up a CESM model tag. Additionally, the documentation at this repository provides information about software requirements to run CESM, developer guidelines, and a Quikstart guide to accessing CESM through GitHub.

+

CESM Project Image +

Figure: CESM Project Github Header

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/ncar_hpc.html b/notebooks/resources/ncar_hpc.html new file mode 100644 index 000000000..3084ff62e --- /dev/null +++ b/notebooks/resources/ncar_hpc.html @@ -0,0 +1,794 @@ + + + + + + + + + + + NCAR Supercomputer — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

NCAR Supercomputer

+ +
+ +
+
+ + + + +
+ +
+

NCAR Supercomputer#

+

Once you have an account and the necessary software, you can log in and run jobs on the NCAR supercomputer. The NCAR supercomputer is also referenced to the NCAR High Performance Computing (HPC).

+
+
+

Logging in on an NCAR system#

+

To log in, start your terminal or Secure Shell client and run an ssh command as shown here:

+
ssh -XY username@derecho.hpc.ucar.edu 
+
+
+

OR

+
ssh -XY username@casper.hpc.ucar.edu
+
+
+

When you log in to the NCAR HPC machines, we recommend you use X11 forwarding. X11 forwarding is an SSH protocol that enables users to run graphical applications on a remote server and interact with them using their local display and I/O devices. It is frequently used by CESM developers for securely interacting with NCAR HPC remote machines.

+

You can do this by adding the -XY option when logging into the machines with SSH. More information about logging into the NCAR HPC follows below.

+
+
+
+

Running on derecho#

+

This tutorial material is designed for use with the derecho HPC system. All of your CESM experiment builds and jobs will be run on derecho.

+

Please see the link below for more information about the derecho system, including a quick start guide with information about logging into derecho from a terminal, setting up your environment, submitting jobs, etc.

+
+

Porting#

+

This tutorial assumes that you are using NCAR HPC assets. In order to run the CESM on a different computing platform, you will first need to port the CESM code to that environment/machine. We provide information about how to port the model code in the porting section.

+
+
+
+
+

Using Casper#

+

The Casper cluster is a system of specialized data analysis and visualization resources. Casper is not used for building or running CESM, but it is used for CESM data analysis. We will use Casper for the diagnostics section of the lab activities. To utilize the additional analysis tools described in the analysis tools section you will also want to use Casper.

+
+
+
+

Using JupyterHub#

+

The diagnostics section of this tutorial will use JupyterHub to run Jupyter Notebooks. You will need to login to the NCAR JupyterHub system to run the notebooks successfully.

+

NOTE: To run a Jupyter cell

+
    +
  • Type your command into the cell

  • +
  • To execute the command:

    +
      +
    • Press shift+return

    • +
    +
    + OR +
    + - Select the cell then click the 'play' button at the top of the window +
  • +
+

To learn more about JupyterHub, please follow the link below.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/ncar_hpc_login.html b/notebooks/resources/ncar_hpc_login.html new file mode 100644 index 000000000..24645ffd5 --- /dev/null +++ b/notebooks/resources/ncar_hpc_login.html @@ -0,0 +1,836 @@ + + + + + + + + + + + NCAR Supercomputer — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

NCAR Supercomputer#

+

Once you have an account and the necessary software, you can log in and run jobs on the NCAR supercomputer. The NCAR supercomputer is also referenced to the NCAR High Performance Computing (HPC).

+
+
+

Logging in on an NCAR system¶#

+

To log in, start your terminal or Secure Shell client and run an ssh command as shown here:

+
ssh -XY username@derecho.hpc.ucar.edu 
+
+
+

OR

+
ssh -XY username@casper.hpc.ucar.edu
+
+
+

When you log in to the NCAR HPC machines, we recommend you use X11 forwarding. X11 forwarding is an SSH protocol that enables users to run graphical applications on a remote server and interact with them using their local display and I/O devices. It is frequently used by CESM developers for securely interacting with NCAR HPC remote machines.

+

You can do this by adding the -XY option when logging into the machines with SSH. More information about logging into the NCAR HPC follows below.

+
+
+
+

Running on derecho#

+

This tutorial material is designed for use with the derecho HPC system. All of your CESM experiment builds and jobs will be run on derecho.

+

Please see the link below for more information about the derecho system, including a quick start guide with information about logging into derecho from a terminal, setting up your environment, submitting jobs, etc.

+
+

Porting#

+

This tutorial assumes that you are using NCAR HPC assets. In order to run the CESM on a different computing platform, you will first need to port the CESM code to that environment/machine. We provide information about how to port the model code in the porting section.

+
+
+
+
+

Using Casper#

+

The Casper cluster is a system of specialized data analysis and visualization resources. Casper is not used for building or running CESM, but it is used for CESM data analysis. We will use Casper for the diagnostics section of the lab activities. To utilize the additional analysis tools described in the analysis tools section you will also want to use Casper.

+
+
+
+

Using JupyterHub#

+

The diagnostics section of this tutorial will use JupyterHub to run Jupyter Notebooks. You will need to login to the NCAR JupyterHub system to run the notebooks successfully.

+

NOTE: To run a Jupyter cell

+
    +
  • Type your command into the cell

  • +
  • To execute the command:

    +
      +
    • Press shift+return

    • +
    +
    + OR +
    + - Select the cell then click the 'play' button at the top of the window +
  • +
+

To learn more about JupyterHub, please follow the link below.

+
+
+
+

Modules on NCAR HPC#

+

NCAR maintains a number of different programs on the HPC systems that can be added to your user environment by executing the module load command.

+

We will use a few modules throughout this tutorial to visualize data, so you need to be able to check which modules you have loaded and to load necessary modules.

+

We provide basic instructions below on how to check and load Modules, but to learn more about Modules on NCAR HPC, please follow the link below.

+
+

Checking what modules are loaded in your environment#

+

To check what modules you have loaded in your environment, use the following at the command line:

+
+
+
module list
+
+
+
+
+
+
+

Checking what modules are available#

+

You can see which modules are available on the HPC resources by using the following at the command line:

+
+
+
module avail
+
+
+
+
+

The command returns a list to the terminal window of the modules available to load to your environment.

+

Modules

+

Figure: Some modules available on NCAR HPC resources. D: Default Module. L: Module is loaded.

+

The modules highlighted in blue are text editors discussed further in the text editors section.

+

The modules highlighted in red are netCDF tools that will be discussed further in the netCDF section.

+

Note that there are many other analysis software tools available to load into your NCAR HPC environment. These include: idl, julia, matlab, R, python, ncl, etc. While some of these tools are discussed in the analysis tools section, we do not highlight them all here and encourage you to further explore your environment and needs.

+
+
+

Loading a new module to your environment#

+

You can load one of the available modules (here we show loading ncview) using the following at the command line:

+
+
+
module load ncview
+
+
+
+
+
+NOTE: We will provide a file that will load necessary modules for those attending the in person tutorial. +
+
+
+ + + + +
+ + + + + + +
+ +
+
+
+ +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/ncar_hpc_module.html b/notebooks/resources/ncar_hpc_module.html new file mode 100644 index 000000000..eb515ba0a --- /dev/null +++ b/notebooks/resources/ncar_hpc_module.html @@ -0,0 +1,773 @@ + + + + + + + + + + + Modules on NCAR HPC — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Modules on NCAR HPC#

+

NCAR maintains a number of different programs on the HPC systems that can be added to your user environment by executing the module load command.

+

We will use a few modules throughout this tutorial to visualize data, so you need to be able to check which modules you have loaded and to load necessary modules.

+

We provide basic instructions below on how to check and load Modules, but to learn more about Modules on NCAR HPC, please follow the link below.

+
+

Checking what modules are loaded in your environment#

+

To check what modules you have loaded in your environment, use the following at the command line:

+
+
+
module list
+
+
+
+
+
+
+

Checking what modules are available#

+

You can see which modules are available on the HPC resources by using the following at the command line:

+
+
+
module avail
+
+
+
+
+

The command returns a list to the terminal window of the modules available to load to your environment.

+

Modules

+

Figure: Some modules available on NCAR HPC resources. D: Default Module. L: Module is loaded.

+

The modules highlighted in blue are text editors discussed further in the text editors section.

+

The modules highlighted in red are netCDF tools that will be discussed further in the netCDF section.

+

Note that there are many other analysis software tools available to load into your NCAR HPC environment. These include: idl, julia, matlab, R, python, ncl, etc. While some of these tools are discussed in the analysis tools section, we do not highlight them all here and encourage you to further explore your environment and needs.

+
+
+

Loading a new module to your environment#

+

You can load one of the available modules (here we show loading ncview) using the following at the command line:

+
+
+
module load ncview
+
+
+
+
+
+NOTE: We will provide a file that will load necessary modules for those attending the in person tutorial. +
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/netcdf.html b/notebooks/resources/netcdf.html new file mode 100644 index 000000000..77ddd3a49 --- /dev/null +++ b/notebooks/resources/netcdf.html @@ -0,0 +1,866 @@ + + + + + + + + + + + NetCDF files — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

NetCDF files

+ +
+ +
+
+ + + + +
+ +
+

NetCDF files#

+

All CESM model output is in netCDF (*.nc) data format. Below, you will find some useful information for how to navigate and manipulate CESM netCDF files.

+
+

NetCDF#

+

NetCDF stands for “network Common Data Form”. NetCDF files are array-oriented and a community standard for sharing scientific model data.

+

Some benefits of netCDF files include that they:

+
    +
  • Are self describing and generally include substantial metadata to assist with comprehension of the data.

  • +
  • Supported by a range of languages (Fortran, C, Matlab, ferret, GrADS, NCL, IDL, python).

  • +
  • Appendable, so data can be added to a file.

  • +
  • Viewable with tools like ncview and panopoly.

  • +
+

The files are saved in netcdf format (denoted with the .nc file extension), a file format commonly used for storing large, multi-dimensional scientific variables. +Netcdf files are platform independent and self-describing; each file includes metadata that describes the data, including: variables, dimensions, and attributes.

+

The figure below provides a generic example of the data structure in a netcdf file. The dataset illustrated has two variables (temperature and pressure) that have three dimensions. Coordinate data (e.g., latitude, longitude, time) that describe the data are also included.

+

Netcdf

+
+
+

ncdump#

+

Sometimes you want to see what information a netCDF file without fully opening it. ncdump is a command line netCDF utility that allows the user to dump the contents of the netCDF file to the terminal screen or to a file in a human-readable format.

+

NOTE: ncdump is installed by default as part of the netCDF libraries.

+

To view the header of a netCDF file, use the following command:

+
+
+
ncdump -h file.nc
+
+
+
+
+

At the command line, you get the following information from the ncdump -h command. It includes the dimensions in the file, a list of variables, and global attributes that can be very useful.

+

ncdump

+

Figure: Example output from the ncdump -h command.

+

To view the contents of a variable, use the following command:

+
    +
  • Note that you must verify the variable exists in the file by first doing a the command above.

  • +
+
+
+
ncdump -v PSL file.nc
+
+
+
+
+

To view the netCDF file type, use the following command:

+
+
+
ncdump –k file.nc
+
+
+
+
+

To print readable date-time strings, use the following command:

+
+
+
ncdump –t –v time file.nc
+
+
+
+
+
+
+

ncview#

+

ncview is a graphical interface which allows the user to quickly view the variables inside a NetCDF file. ncview also allows the user to interactively visualize a selected variable aross a selected range (time, spatial).

+

NOTE: ncview must be loaded as a module in your HPC environment. See section (LINK).

+
+
+
ncview file.nc
+
+
+
+
+

ncview

+

Figure: Example output from ncview command.

+
+
+

netCDF Operators (NCO)#

+

NCO is a suite of programs designed to perform certain “operations” on netCDF files, i.e., things like averaging, concatenating, subsetting, or metadata manipulation.Command-line operations are extremely useful for processing model data given that modelers often work in a UNIX-type environment.

+

We will describe a few key types of NCO operators below, but there are many other NCO operators beyond these that could be of use. We recommend visiting the NCO page to get full documentation.

+

NOTE: nco must be loaded as a module in your HPC environment. See section (LINK).

+

ncra is a netCDF record averager that averages across the record dimesion (i.e. time) for the files specified. The example below shows the command for how to average across two files from different months.

+
+
+
ncra file1.nc file2.nc avgfile.nc
+
+
+
+
+

ncrcat is a netCDF record concatenator that combines the files specified across the record dimesion (i.e. time). The example below shows the command for how to concatenate two files from different months into a single file that will have two timesteps.

+
+
+
ncrcat file1.nc file2.nc out12.nc
+
+
+
+
+

ncdiff is a netCDF differener that will reveal differences between files. The example below shows the command for how to create a file showing differences between two files from different months.

+
+
+
ncdiff file1.nc file2.nc diff.nc
+
+
+
+
+

ncks stands for netCDF kitchen sink and has numerous functions that may be useful. The examples below show

+
    +
  1. how to use NCO operator options to subset only some specified variables from the input file because the -v option operates only on the variables listed.

  2. +
  3. how to use NCO operator options to subset only a given latitude and longitude range because the -d option operates on the dimensions. Note that real numbers indicate coordinate values while integers indicate array indexes.

  4. +
+
+
+
ncks –v T,U,PS file_in.nc file_out.nc
+
+
+
+
+
+
+
ncks -d lon,0.,180. -d lat,0,63 file_in.nc file_out.nc
+
+
+
+
+
+
+

Climate Data Operators (CDO)#

+

CDO are a suite of command line operators to manipulate and analyze climate and NWP model data. CDO are similar to NCO. The CDO library inclues over 600 command line operators that do a variety of tasks including: detrending, EOF analysis, metadata modification, statistical analysis, etc.

+

NOTE: cdo must be loaded as a module in your HPC environment. See section (LINK).

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/porting.html b/notebooks/resources/porting.html new file mode 100644 index 000000000..e53ca5c93 --- /dev/null +++ b/notebooks/resources/porting.html @@ -0,0 +1,732 @@ + + + + + + + + + + + Porting — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Porting

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Porting#

+

Moving CESM to a new machine that has not been previously setup requires knowledge of both the CESM model and the target machine architecture and software. Porting details can also be found in specialized lecture slides from previous CESM tutorials.

+

Porting Image +

Figure: Porting CESM2 to the CGD Cluster Hobart

+
+
+

Take-away Points#

+
    +
  • On supported machines - no porting is necessary

  • +
  • On new machines - porting needs to be done

  • +
  • Documentation from CIME and CESM Website

  • +
  • Thursday afternoon lecture on Porting

  • +
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/profile.html b/notebooks/resources/profile.html new file mode 100644 index 000000000..99b97ac9a --- /dev/null +++ b/notebooks/resources/profile.html @@ -0,0 +1,930 @@ + + + + + + + + + + + Tutorial specific instructions — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Tutorial specific instructions#

+
+

Tutorial Project Account#

+
+You should have access to project account UESM0013 and use this for your simulations. +
+
+
+

Special Queues#

+
+We have a special queue every day for running to ensure you get through the derecho queues quickly and get your jobs run. These are only active for portions of each day during our lab sessions and change for each session. So you should be sure you are using the correct reservation queue. +

Schedule for Tutorial Reservation Queues

+
Mon      14:00 - 17:00    derecho   R???????
+Tue      10:30 - 12:00    derecho   R???????
+         14:00 - 17:00    derecho   R???????
+Wed      10:30 - 12:00    derecho   R???????
+         14:00 - 17:00    derecho   R???????
+Thu      13:30 - 17:00    casper    R???????
+Fri      13:30 - 17:00    derecho   R??????? 
+
+
+
+
+

Using these tutorial-specific codes#

+

In theory, you should be able to automatically use this account and the reservation queues if you correctly set up your NCAR HPC environment using your .profile or .tcshrc files, as described below. If you need to change the values for a run, you can change the account and reservation queue in your case directory using the following command:

+
./xmlchange --force JOB_QUEUE=R???????
+./xmlchange PROJECT=UESM0013
+
+
+

For instance, on Wednesday

+
    +
  • If (Wed 10:30 - 12:00) then

  • +
+
./xmlchange JOB_QUEUE=R??????? --force
+
+
+
    +
  • If (Wed 14:00 - 17:00) then

  • +
+
./xmlchange JOB_QUEUE=R??????? --force
+
+
+
    +
  • If (Wed at another time) then

  • +
+
./xmlchange JOB_QUEUE=tutorial
+
+
+

If you do use these commands, make sure for the JOB_QUEUE you are using the correct reservation code for the relevant day and time of that lab session. You should not have to set the PROJECT more than once during the tutorial if your profile is set up, as described below, but we include it for your reference in case you are having trouble.

+
+
+

Setting up your NCAR HPC environment#

+

Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded.

+
+NOTE: The next section describes how to use a file that loads the modules necessary for those attending the in-person tutorial. Once you set up your environment you should not have to do it again for the remainder of the tutorial. Every time you login to NCAR HPC these files will automatically be sourced. However, if you intend to use NCAR HPC after the tutorial you may need to modify your `.profile` or `.tcshrc` file to load the correct modules, project numbers, or queues. +

+
+

SHELL environment#

+

To determine what shell environment you are using on the NCAR HPC, type the following command:

+
+
echo $SHELL
+
+
+

If the command returns, you are a bash user +/bin/bash

+

If the command returns, you are a cshell user +/bin/tcsh

+

NOTE: All new NCAR HPC accounts default to bash.

+
+
+
+

Bash users#

+

NOTE: You may already have a .profile file in your home directory.

+
    +
  • If you have an existing .profile file and do not wish to overwrite its contents, please save your original .profile file to a new filename before copying the tutorial .profile file into your home directory.

  • +
  • Alternatively, you could copy the contents of the tutorial profile file into your existing .profile file using a text editor. (see special instructions below)

  • +
+
+

One-time setup#

+

To set up your environment for the tutorial, follow the following three steps:

+
+

Copy over the .profile file into your home directory:

+
cp /glade/campaign/cesm/development/cross-wg/profile ~/.profile
+
+
+
+

Source the file:

+
source ~/.profile
+
+
+
+
+
+

Before each practical#

+

Do the following step before every practical. This is because we are getting a different special queue every day.

+
+

Source the file:

+
source ~/.profile
+
+
+
+
+
+
+

Tcsh users#

+

NOTE: You should already have a .tcshrc file in your home directory. If you do not wish to overwrite the existing .tcshrc file, please save this file to a new name OR copy the contents of the /glade/campaign/cesm/development/cross-wg/tcshrc file to your .tcshrc file using a text editor.

+
+

One-time setup#

+

To set up your environment for the tutorial, follow the following three steps:

+
+
+

Copy over the .tcshrc file to your home directory:

+
cp /glade/campaign/cesm/development/cross-wg/tcshrc ~/.tcshrc
+
+
+
+

Source the file:

+
source ~/.tcshrc
+
+
+
+
+
+

Before each practical#

+

Do the following step before every practical. This is because we are getting a different special queue every day.

+
+

Source the file:

+
source ~/.tcshrc
+
+
+
+
+
+
+
+

If you have any trouble#

+

Please ask for help if you are having trouble with this step!

+

The modules necessary for this tutorial and loaded through these files are:

+
    +
  • ncarenv/1.3

  • +
  • intel

  • +
  • ncl

  • +
  • nco

  • +
  • ncview

  • +
  • netcdf

  • +
+
+
+
+

Special instructions (if you already had an account on derecho)#

+

If you already have a .profile or .tcsh and you do not wish to overwrite its contents, you need to add the following into your existing .profile or .tcsh using a text editor.

+
+

Bash:#

+
+

Add to your .profile:

+
export PROJECT=UESM0013         #<- This should never change over the course of the tutorial
+export TUTORIAL_QUEUE=R???????  #<- This will be different for every practical. 
+                                #<- Look at the schedule below:
+
+
+

Source the file:

+
source ~/.profile
+
+
+
+
+
+

C-shell:#

+
+

Add to your .tcshrc:

+
setenv PROJECT UESM0013         #<-This should never change over the course of the tutorial
+setenv TUTORIAL_QUEUE R???????  #<-This will be different for every practical 
+                                #<- Look at the schedule below:
+
+
+

Source the file:

+
source ~/.tcshrc
+
+
+
+
+
+
+ + + + +
+ + + + + + +
+ +
+
+
+ +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/resources_overview.html b/notebooks/resources/resources_overview.html new file mode 100644 index 000000000..7547a3430 --- /dev/null +++ b/notebooks/resources/resources_overview.html @@ -0,0 +1,701 @@ + + + + + + + + + + + Resources — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Resources

+ +
+
+ +
+
+
+ + + + +
+ +
+

Resources#

+

While there is no way for this tutorial to provide every bit of information or resources needed to successfully learn CESM, this section provides some resources that you may find particularly helpful.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/terminals.html b/notebooks/resources/terminals.html new file mode 100644 index 000000000..2898abbb7 --- /dev/null +++ b/notebooks/resources/terminals.html @@ -0,0 +1,781 @@ + + + + + + + + + + + Terminal Windows — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Terminal Windows#

+

For local or remote execution of a program, a terminal is a window in a graphical interface that is used to display a command line. In the UNIX environment, the terminal window is widely used by developers to perform myriad maintenance operations in local and remote computers.

+

Most CESM users and developers use terminal windows to run the model. Users open a terminal window and access the NCAR HPC resources remotely. This way the user can be located anywhere and access the HPC assets located in Cheyenne, WY.

+
+

Logging into a terminal from a Mac#

+

Go to the search spotlight (magnifying glass icon) and type in “terminal”.

+
    +
  • Terminal is automatically built into the MacOS and clicking on it will open a terminal window.

  • +
  • iTerm is software that was installed by the user on their laptop and is another option for opening a terminal. (Recommended)

  • +
+

mac terminal

+

Figure: Finding terminal on a mac.

+
+
+

Logging into a terminal from a PC#

+

Go to the start menu and type in “terminal”.

+
    +
  • Terminal will open a terminal window.

  • +
  • Command Prompt will open a terminal window.

  • +
+

pc terminal

+

Figure: Finding terminal on a PC.

+
+
+

Logging into a terminal from JupyterHub#

+

If you have a JupyterHub session open you can open a terminal window as well.

+
    +
  • Click on the + symbol in the upper left for a New Launcher

  • +
  • Click on the Terminal icon

  • +
+

Note: some terminal functions (e.g. X11 forwarding) do not work in a terminal opened through JupyterHub.

+

JH terminal

+

Figure: Opening a terminal using JupyterHub.

+

JH terminal

+

Figure: Terminal interface in JupyterHub.

+
+
+

Logging into a terminal via fastX#

+

CISL has provided an option to log into casper via the fastX software. Detailed instructions are provided here

+ +
+
+

Using PuTTY and Xmg#

+

For older Windows laptops, it may require the use of PuTTY and Xmg. These might be installed on your machine already, but if not you can download them. Here is a nice guide from UC-Irvine.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/text_editors.html b/notebooks/resources/text_editors.html new file mode 100644 index 000000000..1d7409219 --- /dev/null +++ b/notebooks/resources/text_editors.html @@ -0,0 +1,765 @@ + + + + + + + + + + + Text Editors — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Text Editors

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Text Editors#

+

You will need to edit files directly through the command line when using UNIX. There are quite a few text editors available for UNIX. Below we provide some information about some of the favorite text editors from CESM developers. This list is not comprehensive, so if you have another editor you prefer you can use that.

+
+

Vi#

+

Vi is a text editor included with most UNIX systems, even embedded ones. It was designed to be simple yet powerful for text manipulation. It’s a modal text editor, which means has both an insert and command mode. Vi doesn’t provide a list of keyboard shortcuts on the screen.

+

NOTE: vi does not need to be loaded in your environment to be used.

+
+
+

Vim#

+

Vim (Vi IMproved) is a clone of Vi but offers more features than Vi. It’s free and open source and can be used both at the command-line or in a graphical user interface (GUI).

+

NOTE: vim does not need to be loaded in your environment to be used.

+
+
+

Nano#

+

Nano is a text editor that uses a command line interface. It emulates the Pico text editor and in addition to basic text editing, nano has features such as an interactive search-and-replace, undo/redo, etc.

+

NOTE: nano must be loaded as a module in your HPC environment. See section (LINK).

+
+
+

Emacs#

+

Emacs is an extensible, customizable, and self-documenting editor. Emacs opens a GUI to your computer and requires X11 forwarding. Once open, it can be used similar to a normal document including scrolling.

+

NOTE: emacs does not need to be loaded in your environment to be used. While it will work from the terminal command line, it does not work in the Jupyter environment.

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/tutorial_one_time_setup.html b/notebooks/resources/tutorial_one_time_setup.html new file mode 100644 index 000000000..3ef29c175 --- /dev/null +++ b/notebooks/resources/tutorial_one_time_setup.html @@ -0,0 +1,866 @@ + + + + + + + + + + + Tutorial one time setup — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Tutorial one time setup#

+
+

Setting up your NCAR HPC environment#

+

Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded.

+
+NOTE: The next section describes how to use a file that loads the modules necessary for those attending the in-person tutorial. Once you set up your environment you should not have to do it again for the remainder of the tutorial. Every time you login to NCAR HPC these files will automatically be sourced. However, if you intend to use NCAR HPC after the tutorial you may need to modify your `.profile` or `.tcshrc` file to load the correct modules, project numbers, or queues. +

+
+

SHELL environment#

+

To determine what shell environment you are using on the NCAR HPC, type the following command:

+
+
echo $SHELL
+
+
+

If the command returns, you are a bash user +/bin/bash

+

If the command returns, you are a cshell user +/bin/tcsh

+

NOTE: All new NCAR HPC accounts default to bash.

+
+
+
+

Bash users#

+

NOTE: You may already have a .profile file in your home directory.

+
    +
  • If you have an existing .profile file and do not wish to overwrite its contents, please save your original .profile file to a new filename before copying the tutorial .profile file into your home directory.

  • +
  • Alternatively, you could copy the contents of the tutorial profile file into your existing .profile file using a text editor. (see special instructions below)

  • +
+
+

One-time setup#

+

To set up your environment for the tutorial, follow the following three steps:

+
+

Copy over the .profile file into your home directory:

+
cp /glade/campaign/cesm/tutorial/tutorial_2024_env/profile ~/.profile
+
+
+
+

Source the file:

+
source ~/.profile
+
+
+
+
+
+
+
+

Tcsh users#

+

NOTE: You should already have a .tcshrc file in your home directory. If you do not wish to overwrite the existing .tcshrc file, please save this file to a new name OR copy the contents of the /glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc file to your .tcshrc file using a text editor.

+
+

One-time setup#

+

To set up your environment for the tutorial, follow the following three steps:

+
+
+

Copy over the .tcshrc file to your home directory:

+
cp /glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc ~/.tcshrc
+
+
+
+

Source the file:

+
source ~/.tcshrc
+
+
+
+
+
+
+
+

If you have any trouble#

+

Please ask for help if you are having trouble with this step!

+

The modules necessary for this tutorial and loaded through these files are:

+
    +
  • ncarenv

  • +
  • intel

  • +
  • ncl

  • +
  • nco

  • +
  • ncview

  • +
  • netcdf

  • +
+
+
+
+

Special instructions (if you already had an account on derecho)#

+

If you already have a .profile or .tcsh and you do not wish to overwrite its contents, you need to add the following into your existing .profile or .tcsh using a text editor.

+
+

Bash:#

+
+

Add to your .profile:

+
export PROJECT=UESM0013         #<- This should never change over the course of the tutorial
+
+
+

Source the file:

+
source ~/.profile
+
+
+
+
+
+

C-shell:#

+
+

Add to your .tcshrc:

+
setenv PROJECT UESM0013         #<-This should never change over the course of the tutorial
+
+
+

Source the file:

+
source ~/.tcshrc
+
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/tutorial_queue_account.html b/notebooks/resources/tutorial_queue_account.html new file mode 100644 index 000000000..6a6baa7bc --- /dev/null +++ b/notebooks/resources/tutorial_queue_account.html @@ -0,0 +1,768 @@ + + + + + + + + + + + Tutorial queue and account — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Tutorial queue and account

+ +
+ +
+
+ + + + +
+ +
+

Tutorial queue and account#

+
+

Tutorial Project Account#

+
+You should have access to project account UESM0013 and use this for your simulations. +
+

You can change the account in your case directory using the following command:

+
./xmlchange PROJECT=UESM0013
+
+
+
+
+

Special Queues#

+
+

Schedule for Tutorial Reservation Queues

+
    +
  • We have a special queue tutorial during the lab sessions to ensure you get through the derecho queues quickly and get your jobs run. This queue are only active during our lab sessions.

  • +
  • Outside the lab sessions, you should use the queue main to run cesm.

  • +
+
+

If you need to change the value for a run, you can change the reservation queue in your case directory using the following command:

+

During the lab sessions:

+
./xmlchange JOB_QUEUE=tutorial --force
+
+
+

Outside the lab sessions:

+
./xmlchange JOB_QUEUE=main --force
+
+
+
+
+

Compiling in the Special Queue#

+

By default, we compile cesm on a shared node called develop. However, as we want to avoid long wait time during the labs, we will compile in the specialed reservation queue tutorial.

+

During the lab sessions, use

+
qcmd -q tutorial -- ./case.build 
+
+
+

Outside the lab sessions, use

+
qcmd -- ./case.build 
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/tutorial_specific.html b/notebooks/resources/tutorial_specific.html new file mode 100644 index 000000000..e191f7d70 --- /dev/null +++ b/notebooks/resources/tutorial_specific.html @@ -0,0 +1,890 @@ + + + + + + + + + + + Tutorial specific instructions — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Tutorial specific instructions#

+
+

Tutorial Project Account#

+
+You should have access to project account UESM0013 and use this for your simulations. +
+

You can change the account in your case directory using the following command:

+
./xmlchange PROJECT=UESM0013
+
+
+
+
+

Special Queues#

+
+

Schedule for Tutorial Reservation Queues

+
    +
  • We have a special queue tutorial during the lab sessions to ensure you get through the derecho queues quickly and get your jobs run. This queue are only active during our lab sessions.

  • +
  • Outside the lab sessions, you should use the queue cpu

  • +
+
+

If you need to change the value for a run, you can change the reservation queue in your case directory using the following command:

+

During the lab sessions:

+
./xmlchange JOB_QUEUE=tutorial --force
+
+
+

Outside the lab sessions:

+
./xmlchange JOB_QUEUE=cpu --force
+
+
+
+
+

Using these tutorial-specific codes#

+

In theory, you should be able to automatically use this account and the reservation queues if you correctly set up your NCAR HPC environment using your .profile or .tcshrc files, as described below. If you need to change the values for a run, you can change the account and reservation queue in your case directory using the following command:

+

If you do use these commands, make sure for the JOB_QUEUE you are using the correct reservation code for the relevant day and time of that lab session. You should not have to set the PROJECT more than once during the tutorial if your profile is set up, as described below, but we include it for your reference in case you are having trouble.

+
+
+

Setting up your NCAR HPC environment#

+

Every time you log onto the NCAR HPC you want to ensure you have the correct modules loaded.

+
+NOTE: The next section describes how to use a file that loads the modules necessary for those attending the in-person tutorial. Once you set up your environment you should not have to do it again for the remainder of the tutorial. Every time you login to NCAR HPC these files will automatically be sourced. However, if you intend to use NCAR HPC after the tutorial you may need to modify your `.profile` or `.tcshrc` file to load the correct modules, project numbers, or queues. +

+
+

SHELL environment#

+

To determine what shell environment you are using on the NCAR HPC, type the following command:

+
+
echo $SHELL
+
+
+

If the command returns, you are a bash user +/bin/bash

+

If the command returns, you are a cshell user +/bin/tcsh

+

NOTE: All new NCAR HPC accounts default to bash.

+
+
+
+

Bash users#

+

NOTE: You may already have a .profile file in your home directory.

+
    +
  • If you have an existing .profile file and do not wish to overwrite its contents, please save your original .profile file to a new filename before copying the tutorial .profile file into your home directory.

  • +
  • Alternatively, you could copy the contents of the tutorial profile file into your existing .profile file using a text editor. (see special instructions below)

  • +
+
+

One-time setup#

+

To set up your environment for the tutorial, follow the following three steps:

+
+

Copy over the .profile file into your home directory:

+
cp /glade/campaign/cesm/tutorial/tutorial_2024_env/profile ~/.profile
+
+
+
+

Source the file:

+
source ~/.profile
+
+
+
+
+
+
+
+

Tcsh users#

+

NOTE: You should already have a .tcshrc file in your home directory. If you do not wish to overwrite the existing .tcshrc file, please save this file to a new name OR copy the contents of the /glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc file to your .tcshrc file using a text editor.

+
+

One-time setup#

+

To set up your environment for the tutorial, follow the following three steps:

+
+
+

Copy over the .tcshrc file to your home directory:

+
cp /glade/campaign/cesm/tutorial/tutorial_2024_env/tcshrc ~/.tcshrc
+
+
+
+

Source the file:

+
source ~/.tcshrc
+
+
+
+
+
+
+
+

If you have any trouble#

+

Please ask for help if you are having trouble with this step!

+

The modules necessary for this tutorial and loaded through these files are:

+
    +
  • ncarenv/1.3

  • +
  • intel

  • +
  • ncl

  • +
  • nco

  • +
  • ncview

  • +
  • netcdf

  • +
+
+
+
+

Special instructions (if you already had an account on derecho)#

+

If you already have a .profile or .tcsh and you do not wish to overwrite its contents, you need to add the following into your existing .profile or .tcsh using a text editor.

+
+

Bash:#

+
+

Add to your .profile:

+
export PROJECT=UESM0013         #<- This should never change over the course of the tutorial
+export TUTORIAL_QUEUE=tutorial  #<- Special queue for the tutorial
+
+
+

Source the file:

+
source ~/.profile
+
+
+
+
+
+

C-shell:#

+
+

Add to your .tcshrc:

+
setenv PROJECT UESM0013         #<-This should never change over the course of the tutorial
+setenv TUTORIAL_QUEUE tutorial  #<- Special queue for the tutorial
+
+
+

Source the file:

+
source ~/.tcshrc
+
+
+
+
+
+
+ + + + +
+ + + + + + +
+ +
+
+
+ +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/unix-cheatsheet.html b/notebooks/resources/unix-cheatsheet.html new file mode 100644 index 000000000..2e165a3ed --- /dev/null +++ b/notebooks/resources/unix-cheatsheet.html @@ -0,0 +1,755 @@ + + + + + + + + + + + UNIX cheatsheet — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

UNIX cheatsheet

+ +
+
+ +
+
+
+ + + + +
+ +
+

UNIX cheatsheet#

+

This Unix commands cheat sheet summarizes a few basic commands you will need during the tutorial.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

You can also find a lot of resources online.

+ + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/resources/unix.html b/notebooks/resources/unix.html new file mode 100644 index 000000000..369b26c2d --- /dev/null +++ b/notebooks/resources/unix.html @@ -0,0 +1,741 @@ + + + + + + + + + + + UNIX — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

UNIX

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

UNIX#

+

Most CESM users and developers use the UNIX environment to set up CESM experiments and do preliminary analysis of their CESM model output data. We strongly suggest those using CESM become familiar with working in a command line environment.

+
+

Some Unix Basics#

+

The module listed below, from The COMET Program, will help those unfamiliar with UNIX. You can learn about the basics of UNIX file structures, how to navigate in a UNIX environment, and you’ll get to practice creating, storing and searching for files.

+

The expected length is 15-30 minutes for users with some UNIX experience, and 30-60 minutes for novices.

+
+
+

Unix cheatsheet#

+

This Unix commands cheat sheet summarizes a few basic commands you will need during the tutorial.

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/sourcemods/add_fields_cam.html b/notebooks/sourcemods/add_fields_cam.html new file mode 100644 index 000000000..3f5ebf99c --- /dev/null +++ b/notebooks/sourcemods/add_fields_cam.html @@ -0,0 +1,796 @@ + + + + + + + + + + + Source Modification Example — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Source Modification Example

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Source Modification Example#

+

A common source code modification that you may want to do is to output a new variable that is not defined in CESM.

+

As an example, we will add a new variable to CAM: the atmopsheric temperature at 750hPa.

+
+

Adding a variable to CAM#

+

CAM has a history field that corresponds to the temperature at 500hPa and a number of other pressure levels, but not at 750hPa. Suppose you wanted to output the temperature at 750hPa. The following two +calls are required to add an output variable:

+
call addfld(’T750’,...) (Add a field to the master field list)
+call outfld(’T750’,...) (Collect values for this field and write to history file)
+
+
+

Each of these are now described in more detail:

+
+
+

addfld#

+

The sub-routine addfld adds a field to the master list with the following syntax:

+
addfld(fname,type,avgflag,units,long name)
+
+
+

where

+
    +
  • fname = field name

  • +
  • type = the type of field. The entry for a single level field would be “horiz only” and the entry +for a 3D field would be “(/ ’lev’ /)”.

  • +
  • avgflag = Averaging flag, A = average, I=instantaneous

  • +
  • units = the units of the field

  • +
  • long name = Field full name

  • +
+

Appropriate values of these parameters for the output of T750 are:

+
call addfld(’T750’,horiz only, ’A’, ’K’, ’Temperature at 750hPa pressure surface’)
+
+
+
+
+

outfld#

+

The subroutine outfld accumulates (or takes the minimum or maximum of, as appropriate) the field into the history buffer for the appropriate history tape with the following syntax

+
    outfld(fname, field, idim, c)
+
+
+

with

+
    +
  • fname = Field name

  • +
  • field = array containing field values

  • +
  • idim = longitude dimension of field array

  • +
  • c = chunk (physics) or latitude (dynamics) index.

  • +
+

For example:

+
    call outfld(’T750’,t750, pcols, lchnk)
+
+
+
+
+

add_default#

+

Another useful subroutine is the subroutine add_default. The subroutine add_default Add a field to the list of default fields on history file with the following syntax

+
    subroutine add_default (fname, tindex, flag)
+
+
+

where

+
    +
  • fname = Field name

  • +
  • tindex = history tape index

  • +
  • flag = Averaging flag: A = average (default). I = instantaneous

  • +
+

For example:

+
    call add_default ('T500', 1, ' ')
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/sourcemods/exercises/exercise_add_field.html b/notebooks/sourcemods/exercises/exercise_add_field.html new file mode 100644 index 000000000..6dc824803 --- /dev/null +++ b/notebooks/sourcemods/exercises/exercise_add_field.html @@ -0,0 +1,851 @@ + + + + + + + + + + + Add output variable in CAM — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Add output variable in CAM

+ +
+
+ +
+
+
+ + + + +
+ +
+

Add output variable in CAM#

+
+Exercise: Add an additional output variable

+

Create a case called b1850_T750 using the compset B1850 at f19_g17 resolution.

+
    +
  • Add an output field for the temperature at 750 mbar.

  • +
  • Output daily values of T750 and T500 in the h1 history file.

  • +
  • Set the namelist to output a single h1 for the run.

  • +
  • Make a 1-month run.

  • +
+
+
+
+ + Click here for hints + +

Tip to add T750

+
    +
  • Use T500 as a template for your changes.

  • +
  • Find the subroutine containing T500. +For instance, in the CESMROOT, use the command:

  • +
+
    grep –r T500 *    
+
+
+

Tip to check your solution T750

+
    +
  • When the run is completed, go to your archive directory:

  • +
  • check the fields T750 and T500 are in the file h1

  • +
  • create a file with the difference between T750-T500

  • +
  • For instance, you can use ncap2

  • +
+
    ncap2 -s ’T750_minus_T500=T750-T500' b1850_T750.cam.h1.0001-01-01-00000.nc  T750-T500.nc
+
+
+
    +
  • Look at the difference with ncview.

  • +
+
    ncview T750-T500.nc
+
+
+
+
+
+
+Click here for the solution
+

# Create a new case

+

Create a new case b1850_T750 with the command:

+
 cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+./create_newcase --case ~/cases/b1850_T750 --compset B1850 --res f19_g17 
+
+
+

# Setup

+

Invoke case.setup with the command:

+
cd ~/cases/b1850_T750
+./case.setup
+
+
+

# Make Source Modifications
+Use T500 as a template for your changes. For that purpose, locate the file where T500 is computed and copy it into +SourceMods/src.atm:

+
cp /glade/u/home/$USER/code/my_cesm_code/components/cam/src/physics/cam/cam_diagnostics.F90 SourceMods/src.cam
+
+
+

Now, let’s use T500 as a template for your changes and add the relevant lines for T750: edit the file SourceMods/src.cam/cam_diagnostics.F90 to add the following.

+

First change

+

Under the lines:

+
!++ add a variable for T500 
+call addfld ('T500', horiz_only,  'A', 'K','Temperature at 500 mbar pressure surface') 
+
+
+

add the lines:

+
!++ add a variable for T750 
+call addfld ('T750', horiz_only,  'A', 'K','Temperature at 750 mbar pressure surface')  
+
+
+

Second change +Under the lines:

+
!++ add a variable for T500 
+if (hist_fld_active('T500')) then 
+    call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, state%t, p_surf, & 
+         extrapolate='T', ps=state%ps, phis=state%phis)
+    call outfld('T500    ', p_surf, pcols, lchnk )
+end if
+
+
+

add the lines:

+
!++ add a variable for T750 
+if (hist_fld_active('T750')) then 
+    call vertinterp(ncol, pcols, pver, state%pmid, 75000._r8, state%t, p_surf, & 
+         extrapolate='T', ps=state%ps, phis=state%phis)
+    call outfld('T750    ', p_surf, pcols, lchnk )
+end if
+
+
+

# Customize namelists +Edit the file user_nl_cam and add the lines:

+
    nhtfrq = 0, -24
+    mfilt = 1, 31
+    fincl2 = 'T750', 'T500'
+
+
+

# Set run length

+

Set the run length to 1 month:

+
./xmlchange STOP_N=1,STOP_OPTION=nmonths
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013, use the command:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

# Build and submit

+

Build the model and submit your job:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Look at your solution

+

When the run is completed, check the fields T750 and T500 are in the file h1:

+
cd /glade/derecho/scratch/$USER/archive/b1850_T750/atm/hist/ 
+ncdump -h b1850_T750.cam.h1.0001-01-01-00000.nc
+
+
+

The file should contain:

+
float T500(time, lat, lon) ;
+    T500:units = "K" ;
+    T500:long_name = "Temperature at 500 mbar pressure surface" ;
+    T500:cell_methods = "time: mean" ;
+float T750(time, lat, lon) ;
+    T750:units = "K" ;
+    T750:long_name = "Temperature at 750 mbar pressure surface" ;
+    T750:cell_methods = "time: mean" ;
+
+
+

If you don’t see these variables, check you correctly set the user_nl_cam.

+

Create a file with the difference between T750-T500:

+
cd /glade/derecho/scratch/$USER/archive/b1850_T750/atm/hist/ 
+ncap2 -s 'T750_minus_T500=T750-T500' b1850_T750.cam.h1.0001-01-01-00000.nc  T750-T500.nc 
+
+
+

Look at the difference between T750-T500 with ncview:

+
cd /glade/derecho/scratch/$USER/archive/b1850_T750/atm/hist/ 
+ncview T750-T500.nc
+
+
+

The field T750-T500 looks like:

+

+ncview T750-T500
+Figure: Overview of the CESM directories and the SourceMods directories.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/sourcemods/exercises/exercise_rain_threshold.html b/notebooks/sourcemods/exercises/exercise_rain_threshold.html new file mode 100644 index 000000000..78d5345e7 --- /dev/null +++ b/notebooks/sourcemods/exercises/exercise_rain_threshold.html @@ -0,0 +1,770 @@ + + + + + + + + + + + Modify the rain_threshold in CLM — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Modify the rain_threshold in CLM

+ +
+
+ +
+
+
+ + + + +
+ +
+

Modify the rain_threshold in CLM#

+

In the below exercise, we will change the rain threshold for stress deciduous vegetation, which includes C3 grasses. The rain threshold is the amount of rain required to initiate leaf onset. Reaching the rain threshold is one of several requirements for stress deciduous vegetation leaf onset. If you are interested, you can find more information about the stress deciduous phenology representation in the CLM Technical Note.

+

The current value of rain_threshold is 20mm as specified in the code:

+
rain_threshold = 20._r8 
+
+
+
+Exercise: Modify the CLM rain_threshold parameter

+

Create a case called b1850_rain_threshold using the compset B1850 at f19_g17 resolution.

+
    +
  • Change the rain_threshold from 20mm to 1mm.

  • +
  • Make a 1-month run.

  • +
+
+
+
+ + Click here for hints + +

Tip to locate the ‘rain_threshold’ parameter

+
    +
  • Find the subroutine containing rain_threshold. +For instance, in the CESMROOT, use the command:

  • +
+
    grep –r rain_threshold *    
+
+
+
+
+
+
+Click here for the solution
+

Create a new case b1850_rain_threshold with the command:

+
cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts
+./create_newcase --case ~/cases/b1850_rain_threshold --compset B1850 --res f19_g17 
+
+
+

Case setup:

+
cd ~/cases/b1850_rain_threshold
+./case.setup
+
+
+

Locate the file where rain_threshold is defined and copy it into +SourceMods/src.lnd:

+
cp /glade/u/home/$USER/code/my_cesm_code/components/clm/src/biogeochem/CNPhenologyMod.F90 SourceMods/src.clm
+
+
+

Edit the file SourceMods/src.clm/CNPhenologyMod.F90 and add the lines:

+
      ! specify rain threshold for leaf onset                                   
+      rain_threshold = 20._r8
+
+
+

to

+
      ! specify rain threshold for leaf onset                                   
+      rain_threshold = 1._r8
+
+
+

Change the run length:

+
./xmlchange STOP_N=1,STOP_OPTION=nmonths
+
+
+

If needed, change job queue and account number +For instance:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

Build and submit:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/sourcemods/exercises_overview.html b/notebooks/sourcemods/exercises_overview.html new file mode 100644 index 000000000..5a50b7804 --- /dev/null +++ b/notebooks/sourcemods/exercises_overview.html @@ -0,0 +1,740 @@ + + + + + + + + + + + Exercise Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise Overview

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Exercise Overview#

+
+

Learning Goals#

+
    +
  • Student will practice how to make a code modification in CESM.

  • +
+
+
+

Exercise overview:#

+

Do at least one exercise:

+
    +
  • Add a new variable in CAM

  • +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/sourcemods/overview.html b/notebooks/sourcemods/overview.html new file mode 100644 index 000000000..4b668809e --- /dev/null +++ b/notebooks/sourcemods/overview.html @@ -0,0 +1,716 @@ + + + + + + + + + + + Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Overview

+ +
+
+ +
+
+
+ + + + +
+ +
+

Overview#

+

If you want to make modifications to the CESM code, the best practice is to copy the relevant sub-routine into the relevant sub-directory within the SourceMods directory in your case directory.

+

For example, if you wanted to modify a CAM subroutine, in the case called case01, you would copy that subroutine to the following location

+
   case01/SourceMods/src.cam
+
+
+

and modify it there.

+

Figure 1 shows the location of the SourceMods directory and sub-directories.

+
+

The steps when making a source code modification are:

+
    +
  • In the CESM code, find the subroutine you want to modify.

  • +
  • Copy this subroutine to the relevant SourceMods directory within your case directory

  • +
  • Make your modifications

  • +
  • Compile and run the model

  • +
+
+

CESM directories and namelists

+

Figure: Overview of the CESM directories and the SourceMods directories.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/sourcemods/sourcemods.html b/notebooks/sourcemods/sourcemods.html new file mode 100644 index 000000000..959f0fe15 --- /dev/null +++ b/notebooks/sourcemods/sourcemods.html @@ -0,0 +1,706 @@ + + + + + + + + + + + Source Modifications — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Source Modifications

+ +
+
+ +
+
+
+ + + + +
+ +
+

Source Modifications#

+

The goal of this chapter is to understand how to modify the CESM code. This is referred to as source modifications.

+
    +
  • The section Overview describes the steps for making source modifications and provides a visual representation of the directories and files that need to be modified.

  • +
  • The section Source Modification Example provides detailed instructions on how to add a new variable to CAM: the atmospheric temperature at 750hPa.

  • +
  • The section Exercises offers opportunities to practice the concepts learned in this chapter.

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/troubleshooting/debugging_flag.html b/notebooks/troubleshooting/debugging_flag.html new file mode 100644 index 000000000..231ba6577 --- /dev/null +++ b/notebooks/troubleshooting/debugging_flag.html @@ -0,0 +1,719 @@ + + + + + + + + + + + Adding debugging info — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Adding debugging info

+ +
+
+ +
+
+
+ + + + +
+ +
+

Adding debugging info#

+

If you cannot find the reason of the crash in the log files, there are two ways to add more debugging information.

+
    +
  • Increase the value of the run-time xml variable INFO_DBUG (This does NOT require rebuilding):

  • +
+
./xmlchange INFO_DBUG=2. 
+
+
+

This adds more information to the cpl.log file that can be useful if you can’t tell what component is aborting the run, or where bad coupling fields are originating.

+
    +
  • Try rebuilding and rerunning with the variable DEBUG set to TRUE (This ** requires rebuilding**):

  • +
+
./xmlchange DEBUG=TRUE.
+
+
+

This adds various runtime checks that trap conditions such as out-of-bounds array indexing, divide by 0, and other floating point exceptions. +Before running, you must rebuild the run:

+
./case.build --clean-all
+qcmd -- ./case.build.
+
+
+

Note that the model will run significantly slower in DEBUG mode, so this may not be feasible if the model has to run a long time before producing the error.

+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/troubleshooting/exercises/troubleshooting_cam.html b/notebooks/troubleshooting/exercises/troubleshooting_cam.html new file mode 100644 index 000000000..e683468b7 --- /dev/null +++ b/notebooks/troubleshooting/exercises/troubleshooting_cam.html @@ -0,0 +1,804 @@ + + + + + + + + + + + Debugging CAM — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Debugging CAM

+ +
+
+ +
+
+
+ + + + +
+ +
+

Debugging CAM#

+
+Exercise: Add an additional output variable

+

Create a case called b1850_high_freq_bugfixing using the compset B1850 at f19_g17 resolution. +Set the run length to 1 month.

+

Now in addition to the default monthly output, add the following output:

+
    +
  • an h1 file containing daily averages of T2M and set your namelist so that there is one file per day for this daily averaged output.

  • +
+

Set up, build and submit your case.

+

Your goal is to make the model crash. And then to troubleshoot why it crashed.

+
+
+
+ + Click here for hints + +

Tip to add a h1 file

+

For more information about how to add a h1 file, check the section about namelist modifications.

+

If you don’t have time to check the section immediately, the way to add an h1 file with daily averages of T2M and create one file per day for this daily averaged output is:

+

add the following lines in user nl cam

+
 fincl2 = ’T2M:A’
+ nhtfrq = 0,-24
+ mfilt = 1,1
+
+
+

Tip to for troubleshooting

+

Check the derecho queue and wait until your run doesn’t show in the queue anymore.

+

When your run is not in the queue anymore:

+
    +
  • Go to the archive directory: can you see the history files in the archive directory? The answer should be no. Why?

  • +
  • Go to the run directory: Is there any evidence of history files or restart files being created by the run? The answer, again, should be no. This is because we have tricked you, with a bug.

  • +
+

Look at the log files in the RUNDIR to try to understand why the run crashed.

+
+
+
+
+Click here for the solution
+

# Create a new case

+

Create a new case b1850_high_freq_bugfixing with the command:

+
 cd /glade/u/home/$USER/code/my_cesm_code/cime/scripts/
+ ./create_newcase --case ~/cases/b1850_high_freq_bugfixing --compset B1850 --res f19_g17 
+
+
+

# Setup

+

Invoke case.setup with the command:

+
 cd ~/cases/b1850_high_freq_bugfixing
+ ./case.setup
+
+
+

# Customize namelists

+

Add the daily output of T2M by editing the file user_nl_cam and adding the lines:

+
 fincl2 = 'T2M:A'
+ nhtfrq = 0,-24
+ mfilt = 1,1
+
+
+

# Set run length

+

Set the run length to 1 month:

+
./xmlchange STOP_N=1,STOP_OPTION=nmonths
+
+
+

# Change the job queue and account number

+

If needed, change job queue and account number.
+For instance, to run in the queue tutorial and the project number UESM0013 (you should use the project number given for this tutorial), use the command:

+
./xmlchange JOB_QUEUE=tutorial,PROJECT=UESM0013 --force
+
+
+

# Build and submit

+

Build the model and submit your job:

+
qcmd -- ./case.build
+./case.submit
+
+
+
+

# Look at what happened

+

Your run should crash !!!. This is normal. The goal of the exercise is to troubleshooting.

+

What you should find in your run directory is three log files.

+
    +
  • One for the coupler cpl.log.*,

  • +
  • one for CAM atm.log.*

  • +
  • and one for CESM cesm.log.*.

  • +
+

Somewhere in these log files is information about what has gone wrong, but it is often not entirely +straightforward to find.

+
    +
  • Often at the bottom of the log file, there are errors that are not relative to your problem because +they are just demonstrating that individual processes are exiting.

  • +
  • Often the relevant error lies above this and can sometimes be found by searching for the first occurrence of ERROR or ABORT or cesm.exe.

  • +
+

In this case, searching for the first occurrence of ERROR in cesm.log.* gives us some relevant information. We find

+
ERROR: FLDLST: 1 errors found, see log
+
+
+

This tells us is that something has gone wrong with the list of output variables that we have asked for.

+

More information can then be found in the CAM log file atm.log.*. +Look at the very end of that file and you should see

+
FLDLST: T2M in fincl(1, 2) not found
+ERROR: FLDLST: 1 errors found, see log
+
+
+

This tells us that T2M is not a valid history variable for CAM. That’s because the correct variable +for near surface temperature is TREFHT. T2M is not a CAM +history field and this has caused CESM to crash.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/troubleshooting/exercises_overview.html b/notebooks/troubleshooting/exercises_overview.html new file mode 100644 index 000000000..9d9d3eeeb --- /dev/null +++ b/notebooks/troubleshooting/exercises_overview.html @@ -0,0 +1,739 @@ + + + + + + + + + + + Exercise Overview — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Exercise Overview

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Exercise Overview#

+
+

Learning Goals#

+
    +
  • The goal of the exercise is to make the model crash, and then troubleshoot as to why it crashed.

  • +
+
+
+

Exercise#

+
    +
  • Do the exercise: Debugging CAM.

  • +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/troubleshooting/log_files.html b/notebooks/troubleshooting/log_files.html new file mode 100644 index 000000000..9d66d7027 --- /dev/null +++ b/notebooks/troubleshooting/log_files.html @@ -0,0 +1,745 @@ + + + + + + + + + + + The log files — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

The log files

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

The log files#

+

The log files are files in the format $model.log.*

+
    +
  • When the model is running, it produces the log files in the run directory: RUNDIR.

  • +
  • When the run completes successfully, the model moves the log files into the archive directory: DOUT_S_ROOT

  • +
  • When the model fails, the log files remain in the run directory RUNDIR

  • +
+

CESM directories and namelists

+

Figure: Overview of the CESM directories and the log files.

+
+

What to do when a run fails?#

+

First, check the latest cpl.log.*, which will often tell you when the model failed. If a run completed successfully, the last several lines of the cpl.log.* file will have a string like SUCCESSFUL TERMINATION OF CESM. +If you don’t see this message, it means the run has failed.

+

Check these things first when a job fails:

+
    +
  • Did the model time out?

  • +
  • Was a disk quota limit hit?

  • +
  • Did a machine go down?

  • +
  • Did a file system become full? +If any of those things happened, take appropriate corrective action and resubmit the job.

  • +
+

If it is not clear that any of the above caused a case to fail, check the rest of the component log files $model.log.* for error messages. It takes a bit of practice to interpret message errors. We will look at an example later on in this chapter’s exercises.

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/notebooks/troubleshooting/troubleshooting.html b/notebooks/troubleshooting/troubleshooting.html new file mode 100644 index 000000000..cc9966fe6 --- /dev/null +++ b/notebooks/troubleshooting/troubleshooting.html @@ -0,0 +1,707 @@ + + + + + + + + + + + Troubleshooting runtime errors — CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Troubleshooting runtime errors

+ +
+
+ +
+
+
+ + + + +
+ +
+

Troubleshooting runtime errors#

+

There are several places to look for information if a job fails.

+
    +
  • The log files will probably give you a hint.

  • +
  • It is also possible to run with more debugging info.

  • +
+
+

More information about troubleshooting can be found in the CIME documentation.

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 000000000..b109b5b0d Binary files /dev/null and b/objects.inv differ diff --git a/search.html b/search.html new file mode 100644 index 000000000..05200d5ca --- /dev/null +++ b/search.html @@ -0,0 +1,627 @@ + + + + + + + + + Search - CESM Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + Ctrl+K +
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + +
+

Search

+ + + + + + Ctrl+K + +
+
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 000000000..ac4dd04bb --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"- BRANCH": [[96, "branch"]], "- HYBRID": [[96, "hybrid"]], "- STARTUP": [[96, "startup"]], "1. Editing with xmlchange": [[94, "editing-with-xmlchange"]], "1. First Plot": [[76, "first-plot"]], "1. Make global maps": [[74, "make-global-maps"], [76, "make-global-maps"]], "1. Number of submissions and run length": [[102, "number-of-submissions-and-run-length"]], "1. Reading and formatting data": [[70, "reading-and-formatting-data"]], "1. Restart files": [[104, "restart-files"]], "1. The three run types": [[96, "the-three-run-types"]], "1. What are timing files and where are they located?": [[106, "what-are-timing-files-and-where-are-they-located"]], "1. What is an XML file?": [[99, "what-is-an-xml-file"]], "1. Why UXarray?": [[63, "why-uxarray"]], "1. \u201cInitial run\u201d and \u201ccontinue run\u201d": [[105, "initial-run-and-continue-run"]], "1.1 Point to the data": [[70, "point-to-the-data"]], "1.2 Simple Calculations": [[70, "simple-calculations"]], "1: Control case": [[36, null], [44, null], [53, null]], "1: Control case: F2000climo": [[28, null]], "1: Control case: running with chemistry": [[23, null]], "1: Preindustrial control case": [[48, null]], "1: Set up a BGC case": [[21, null]], "2. CESM XML files and CESM environment variables": [[99, "cesm-xml-files-and-cesm-environment-variables"]], "2. Continue a run": [[104, "continue-a-run"]], "2. Make regional map over continental US": [[74, "make-regional-map-over-continental-us"], [76, "make-regional-map-over-continental-us"]], "2. Nicer axes": [[76, "nicer-axes"]], "2. Plotting": [[70, "plotting"]], "2. RESUBMIT and CONTINUE_RUN": [[102, "resubmit-and-continue-run"]], "2. Searching xml variables with xmlquery": [[94, "searching-xml-variables-with-xmlquery"]], "2. Set runtime limits with STOP_OPTION and STOP_N": [[105, "set-runtime-limits-with-stop-option-and-stop-n"]], "2. UXarray Resources": [[63, "uxarray-resources"]], "2. Use timing files to determine runtime variables": [[106, "use-timing-files-to-determine-runtime-variables"]], "2. When to use branch vs. hybrid?": [[96, "when-to-use-branch-vs-hybrid"]], "2.1 Easy plots using Xarray": [[70, "easy-plots-using-xarray"]], "2.2 Calculating differences": [[70, "calculating-differences"]], "2.3 Calculating Time Series": [[70, "calculating-time-series"]], "2.3.1 Time series at a single point": [[70, "time-series-at-a-single-point"]], "2.3.2 Global time series": [[70, "global-time-series"]], "2.4 Calculate an annual weighted mean and create customized plots": [[70, "calculate-an-annual-weighted-mean-and-create-customized-plots"]], "2.4.1 Calculate monthly weights": [[70, "calculate-monthly-weights"]], "2.4.2 Customized maps": [[70, "customized-maps"]], "2: Historical compset: FHIST": [[29, null]], "2: Test case: changing the chemistry": [[24, null]], "2: Tune the albedo": [[37, null]], "2: Turn off parameterization": [[54, null]], "2: Use the BGC model": [[45, null]], "2: mid-Holocene case": [[49, null]], "3. Backing up to a previous restart": [[104, "backing-up-to-a-previous-restart"]], "3. How to access UXarray?": [[63, "how-to-access-uxarray"]], "3. Make regional map over the Pacific": [[74, "make-regional-map-over-the-pacific"], [76, "make-regional-map-over-the-pacific"]], "3. Restart files for branch and hybrid runs": [[96, "restart-files-for-branch-and-hybrid-runs"]], "3. Use the subgroup functionality of xmlchange": [[94, "use-the-subgroup-functionality-of-xmlchange"]], "3: Modify input data": [[46, null]], "3: Modify the snow conductivity": [[38, null]], "3: Modify wind stress": [[55, null]], "3: Starting FHIST from spunup state in 1850": [[30, null]], "3: Test case: changing the emissions": [[25, null]], "3: Water isotope tracers in CESM": [[50, null]], "4. Minimal UXarray visualization": [[63, "minimal-uxarray-visualization"]], "4. Plotting contours": [[74, "plotting-contours"], [76, "plotting-contours"]], "4: Increase orographic height over the western US": [[31, null]], "4: Turn on the ecosystem": [[56, null]], "4: Visualization option with GEOV": [[26, null]], "5: Control case using MOM6": [[47, null]], "5: Modify sea surface temperature in the tropics": [[32, null]], "6: Adjust threshold for deep convection over land": [[33, null]], "ADF": [[58, null]], "Acknowledgements": [[0, "acknowledgements"]], "Add extra variables and history files: fincl": [[113, "add-extra-variables-and-history-files-fincl"]], "Add extra variables and history files: hist_fincl": [[115, "add-extra-variables-and-history-files-hist-fincl"]], "Add output variable in CAM": [[137, null]], "Adding a variable to CAM": [[136, "adding-a-variable-to-cam"]], "Adding debugging info": [[142, null]], "Additional Topics": [[57, null]], "Advanced Knowledge": [[86, "advanced-knowledge"]], "Advanced Plotting": [[64, null], [66, "advanced-plotting"], [67, null], [69, "advanced-plotting"], [75, null], [77, "advanced-plotting"]], "Air temperature": [[41, "air-temperature"]], "Analysis Software": [[59, "analysis-software"]], "Are the differences coming from incoming or reflected radiation?": [[70, "are-the-differences-coming-from-incoming-or-reflected-radiation"]], "Atmosphere": [[27, null], [66, null]], "Atmospheric chemistry": [[22, null]], "Averaging flag for the fincl variables": [[113, "averaging-flag-for-the-fincl-variables"], [115, "averaging-flag-for-the-fincl-variables"]], "BGC Initial Conditions": [[20, "bgc-initial-conditions"]], "BGC env*xml variables": [[20, "bgc-env-xml-variables"]], "BGC units and sign conventions": [[20, "bgc-units-and-sign-conventions"]], "Bash users": [[127, "bash-users"], [131, "bash-users"], [133, "bash-users"]], "Bash:": [[127, "bash"], [131, "bash"], [133, "bash"]], "Basic Plotting": [[65, null], [66, "basic-plotting"], [68, null], [69, "basic-plotting"], [70, null], [76, null], [77, "basic-plotting"]], "Basic Plotting with MOM6": [[74, null]], "Basics": [[1, null]], "Batch Job Scheduler Monitoring": [[6, "batch-job-scheduler-monitoring"]], "Before each practical": [[127, "before-each-practical"], [127, "id2"]], "Biogeochemistry": [[20, null]], "Biogeochemistry in CESM": [[20, "biogeochemistry-in-cesm"]], "C-shell:": [[127, "c-shell"], [131, "c-shell"], [133, "c-shell"]], "CAM-chem and WACCM component sets": [[22, "cam-chem-and-waccm-component-sets"]], "CAM-chem and WACCM tested F component sets": [[22, "cam-chem-and-waccm-tested-f-component-sets"]], "CESM Email Lists": [[85, "cesm-email-lists"]], "CESM Events": [[85, "cesm-events"]], "CESM Github Alerts": [[85, "cesm-github-alerts"]], "CESM Project Funding": [[0, "cesm-project-funding"]], "CESM Webpage": [[80, null]], "CESM Workflow": [[2, null]], "CESM Working Groups": [[87, null]], "CESM analysis tools": [[59, null]], "CESM and GitHub": [[121, "cesm-and-github"]], "CESM code": [[13, null]], "CESM2 Supported Compsets": [[8, "cesm2-supported-compsets"]], "CESM2 Supported Grid Definitions": [[8, "cesm2-supported-grid-definitions"]], "CIME (Advanced)": [[83, null]], "CISM Challenge Exercise": [[40, null]], "CUPiD": [[72, null]], "CVDP": [[60, null]], "Case Build": [[3, null]], "Case Setup": [[4, null]], "Case Submit": [[5, null]], "CaseStatus file": [[6, "casestatus-file"]], "Casename": [[8, "casename"]], "Challenge Exercises": [[34, null]], "Change a tuning parameter in CAM": [[109, null]], "Changing Run Length": [[102, null]], "Check the CESM compset definitions": [[15, "check-the-cesm-compset-definitions"]], "Check the CESM grid resolutions": [[15, "check-the-cesm-grid-resolutions"]], "Check the CaseStatus file": [[15, "check-the-casestatus-file"]], "Check the Job Queue and Project": [[15, "check-the-job-queue-and-project"]], "Checking Your Run": [[6, null]], "Checking what modules are available": [[123, "checking-what-modules-are-available"], [124, "checking-what-modules-are-available"]], "Checking what modules are loaded in your environment": [[123, "checking-what-modules-are-loaded-in-your-environment"], [124, "checking-what-modules-are-loaded-in-your-environment"]], "Climate Data Gateway": [[78, null]], "Climate Data Guide": [[79, null]], "Climate Data Operators (CDO)": [[125, "climate-data-operators-cdo"]], "Command Arguments": [[8, "command-arguments"]], "Command Syntax": [[3, "command-syntax"], [4, "command-syntax"], [5, "command-syntax"], [7, "command-syntax"], [8, "command-syntax"]], "Common Infrastructure for Modeling the Earth (CIME)": [[83, "common-infrastructure-for-modeling-the-earth-cime"]], "Community Experiments": [[81, null]], "Compiling in the Special Queue": [[132, "compiling-in-the-special-queue"]], "Compset": [[8, "compset"]], "Computing ice sheet related sea level change from a CISM simulation": [[42, null]], "Controlling Run Length": [[101, null]], "Controlling the Number of Submissions": [[103, null]], "Copying Cases": [[89, null]], "Coupled BGC Compsets": [[20, "coupled-bgc-compsets"]], "Create Clone (Advanced)": [[7, null]], "Create New Case": [[8, null]], "Customize CAM output": [[113, null]], "Customize CICE output": [[114, null]], "Customize CLM output": [[115, null]], "Customize POP output": [[116, null]], "Customizing CAM history files: mfilt": [[113, "customizing-cam-history-files-mfilt"]], "Customizing CAM output frequency: nhtfrq": [[113, "customizing-cam-output-frequency-nhtfrq"]], "Customizing CLM history files: hist_mfilt": [[115, "customizing-clm-history-files-hist-mfilt"]], "Customizing CLM output frequency: hist_nhtfrq": [[115, "customizing-clm-output-frequency-hist-nhtfrq"]], "Customizing Output": [[112, null]], "Data paths": [[63, "data-paths"]], "Debugging CAM": [[143, null]], "Define some functions": [[76, "define-some-functions"]], "Defining the path and filenames": [[41, "defining-the-path-and-filenames"]], "Details on files": [[76, "details-on-files"]], "Diagnostics": [[73, null]], "DiscussCESM Forums": [[84, "discusscesm-forums"]], "Download CESM": [[12, null]], "Download CESM (tag cesm2_3_beta17)": [[47, "download-cesm-tag-cesm2-3-beta17"]], "Download the Component Models with checkout_externals": [[47, "download-the-component-models-with-checkout-externals"]], "ESCOMP": [[121, "escomp"]], "Earth System Data Science initiative (ESDS)": [[59, "earth-system-data-science-initiative-esds"]], "Earth System Modeling Framework (ESMF) Coupling": [[83, "earth-system-modeling-framework-esmf-coupling"]], "Emacs": [[130, "emacs"]], "Examine History Files": [[14, null]], "Example 1: Plot per-category ice area": [[67, "example-1-plot-per-category-ice-area"]], "Example 2: Plot per-category snow thickness": [[67, "example-2-plot-per-category-snow-thickness"]], "Example 3: Ice area related tracer": [[67, "example-3-ice-area-related-tracer"]], "Example 4: Remapping a sea ice gridded field": [[67, "example-4-remapping-a-sea-ice-gridded-field"]], "Exercise": [[47, "exercise"], [144, "exercise"]], "Exercise 1": [[74, "exercise-1"], [75, "exercise-1"], [76, "exercise-1"]], "Exercise 1-2 Details": [[51, "exercise-1-2-details"]], "Exercise 1: CAM-SE output analysis": [[64, "exercise-1-cam-se-output-analysis"], [66, "exercise-1-cam-se-output-analysis"]], "Exercise 1: Make a lat-lon plot of TS": [[65, "exercise-1-make-a-lat-lon-plot-of-ts"]], "Exercise 1: Making map plots": [[77, "exercise-1-making-map-plots"]], "Exercise 1: Making polar projection plots of sea ice concentration.": [[69, "exercise-1-making-polar-projection-plots-of-sea-ice-concentration"]], "Exercise 1: Modify run length": [[91, null]], "Exercise 1: Plot Sea Ice Concentration on a polar projection.": [[68, "exercise-1-plot-sea-ice-concentration-on-a-polar-projection"]], "Exercise 1: Plot per-category ice area": [[69, "exercise-1-plot-per-category-ice-area"]], "Exercise 1: Plot winter time maximum mixed-layer depth": [[77, "exercise-1-plot-winter-time-maximum-mixed-layer-depth"]], "Exercise 1: lat-lon plot": [[66, "exercise-1-lat-lon-plot"]], "Exercise 2": [[74, "exercise-2"], [75, "exercise-2"], [76, "exercise-2"]], "Exercise 2: Compute and plot ocean heat storage per area for the upper 2000m": [[77, "exercise-2-compute-and-plot-ocean-heat-storage-per-area-for-the-upper-2000m"]], "Exercise 2: Compute total sea ice area and plot versus time.": [[69, "exercise-2-compute-total-sea-ice-area-and-plot-versus-time"]], "Exercise 2: Making a zonal plot": [[66, "exercise-2-making-a-zonal-plot"]], "Exercise 2: Making global and regional maps": [[77, "exercise-2-making-global-and-regional-maps"]], "Exercise 2: Modify run type": [[92, null]], "Exercise 2: Plot a time series of total sea ice area.": [[68, "exercise-2-plot-a-time-series-of-total-sea-ice-area"]], "Exercise 2: Plot per-category snow thickness": [[69, "exercise-2-plot-per-category-snow-thickness"]], "Exercise 2: Zonal plot of SWCF": [[65, "exercise-2-zonal-plot-of-swcf"]], "Exercise 3": [[76, "exercise-3"]], "Exercise 3 Details": [[51, "exercise-3-details"]], "Exercise 3: Change physics timestep": [[93, null]], "Exercise 3: Making a lat-height plot": [[66, "exercise-3-making-a-lat-height-plot"]], "Exercise 3: Making timeseries": [[77, "exercise-3-making-timeseries"]], "Exercise 3: Plot ice area related tracer": [[69, "exercise-3-plot-ice-area-related-tracer"]], "Exercise 3: Plot of zonal T": [[65, "exercise-3-plot-of-zonal-t"]], "Exercise 4": [[76, "exercise-4"]], "Exercise 4: Making a profile": [[77, "exercise-4-making-a-profile"]], "Exercise 4: Remapping or regridding sea ice fields": [[69, "exercise-4-remapping-or-regridding-sea-ice-fields"]], "Exercise Details": [[35, "exercise-details"], [39, "exercise-details"], [43, "exercise-details"], [52, "exercise-details"]], "Exercise Overview": [[19, null], [90, null], [110, null], [118, null], [139, null], [144, null]], "Exercise overview:": [[19, "id1"], [110, "id1"], [139, "id1"]], "Explore CESM Code": [[11, null]], "Explore Further": [[15, null]], "Explore the CASE directory": [[15, "explore-the-case-directory"]], "Explore the cime/scripts directory": [[15, "explore-the-cime-scripts-directory"]], "Extending your run": [[18, null]], "Extra credit challenge": [[70, "extra-credit-challenge"]], "Finding more information CAM-chem and WACCM": [[22, "finding-more-information-cam-chem-and-waccm"]], "Finding more information about compsets": [[27, "finding-more-information-about-compsets"]], "First calculate the land weights:": [[70, "first-calculate-the-land-weights"]], "Fortran": [[120, null]], "G Compset forcing data": [[35, "g-compset-forcing-data"], [52, "g-compset-forcing-data"]], "Generating time series": [[72, "generating-time-series"]], "GeoCAT": [[59, "geocat"]], "Get the data": [[75, "get-the-data"], [76, "get-the-data"]], "Getting Help": [[84, null]], "Getting Involved": [[85, null]], "Git Clone": [[47, "git-clone"]], "Github": [[121, null]], "Global Visualizations": [[70, "global-visualizations"]], "Goals of This Tutorial": [[0, "goals-of-this-tutorial"]], "Grab data from first time stamp": [[65, "grab-data-from-first-time-stamp"]], "History vs. Timeseries files": [[62, "history-vs-timeseries-files"]], "How to Modify XML Files (*.xml)": [[94, null]], "Hybrid, Branch and Startup": [[96, null]], "Ice Thickness": [[41, "ice-thickness"]], "If you have any trouble": [[127, "if-you-have-any-trouble"], [131, "if-you-have-any-trouble"], [133, "if-you-have-any-trouble"]], "Image Magick": [[59, "image-magick"]], "Input data": [[64, "input-data"]], "Introduction": [[86, null]], "Is exposed leaf area index (ELAI) contributing to the differences in albedo?": [[70, "is-exposed-leaf-area-index-elai-contributing-to-the-differences-in-albedo"]], "Jupyter Hub": [[59, "jupyter-hub"]], "Land": [[43, null], [71, null]], "Land Ice": [[39, null]], "Large Ensembles": [[61, null]], "Learning Goals": [[22, "learning-goals"], [27, "learning-goals"], [35, "learning-goals"], [39, "learning-goals"], [43, "learning-goals"], [51, "learning-goals"], [52, "learning-goals"], [58, "learning-goals"], [61, "learning-goals"], [63, "learning-goals"], [66, "learning-goals"], [66, "id1"], [69, "learning-goals"], [69, "id1"], [71, "learning-goals"], [77, "learning-goals"], [110, "learning-goals"], [139, "learning-goals"], [144, "learning-goals"]], "Learning Goals:": [[19, "learning-goals"]], "Learning Objectives": [[13, "learning-objectives"]], "Load the data": [[74, "load-the-data"]], "Loading a new module to your environment": [[123, "loading-a-new-module-to-your-environment"], [124, "loading-a-new-module-to-your-environment"]], "Loading packages": [[41, "loading-packages"]], "Logging in on an NCAR system": [[122, "logging-in-on-an-ncar-system"]], "Logging in on an NCAR system\u00b6": [[123, "logging-in-on-an-ncar-system"]], "Logging into a terminal from JupyterHub": [[129, "logging-into-a-terminal-from-jupyterhub"]], "Logging into a terminal from a Mac": [[129, "logging-into-a-terminal-from-a-mac"]], "Logging into a terminal from a PC": [[129, "logging-into-a-terminal-from-a-pc"]], "Logging into a terminal via fastX": [[129, "logging-into-a-terminal-via-fastx"]], "Login to NCAR High Performance Computing (HPC)": [[119, "login-to-ncar-high-performance-computing-hpc"]], "Looking at 2D plots": [[41, "looking-at-2d-plots"]], "Looking at the simulation": [[41, null]], "Looking at time series": [[41, "looking-at-time-series"]], "MOM6 diag_table and history files": [[74, "mom6-diag-table-and-history-files"]], "Machines": [[8, "machines"]], "MetPy": [[59, "metpy"]], "Model Components": [[82, "model-components"]], "Model Coupling Toolkit (MCT)": [[83, "model-coupling-toolkit-mct"]], "Model Output": [[9, null]], "Modify CAM output": [[108, null]], "Modify the rain_threshold in CLM": [[138, null]], "Modifying the Type of Run": [[95, null]], "Modules on NCAR HPC": [[123, "modules-on-ncar-hpc"], [124, null]], "Monitoring Files in the Run and Archive Directories": [[6, "monitoring-files-in-the-run-and-archive-directories"]], "More information": [[2, "more-information"]], "NCAR Command Language (NCL)": [[59, "ncar-command-language-ncl"]], "NCAR Supercomputer": [[122, null], [123, null]], "Namelist Modifications": [[111, null]], "Namelist Variables Documentation": [[107, null]], "Nano": [[130, "nano"]], "NetCDF": [[125, "netcdf"]], "NetCDF files": [[125, null]], "Next, calculate and plot a global weighted sum": [[70, "next-calculate-and-plot-a-global-weighted-sum"]], "Notebook Objectives": [[70, "notebook-objectives"]], "Now make the plot!": [[70, "now-make-the-plot"]], "Ocean": [[52, null], [77, null]], "Ocean Specific BGC Compsets": [[20, "ocean-specific-bgc-compsets"]], "One-time setup": [[127, "one-time-setup"], [127, "id1"], [131, "one-time-setup"], [131, "id1"], [133, "one-time-setup"], [133, "id1"]], "Other Useful XML Variables": [[98, null]], "Overview": [[99, null], [117, null], [140, null]], "Overview of CAM Challenge Exercises": [[27, "overview-of-cam-challenge-exercises"]], "Overview of the Challenge Exercises for CAM-chem/WACCM": [[22, "overview-of-the-challenge-exercises-for-cam-chem-waccm"]], "POP BGC Specific Output": [[21, "pop-bgc-specific-output"]], "Paleo": [[51, null]], "Panopoly": [[59, "panopoly"]], "Parameters": [[64, "parameters"]], "Physics Timestep": [[100, null]], "Plot 1: Natively via xarray": [[65, "plot-1-natively-via-xarray"]], "Plot 2: Quick ADF style": [[65, "plot-2-quick-adf-style"]], "Plot 3: ADF style with reversed y-axis": [[65, "plot-3-adf-style-with-reversed-y-axis"]], "Plot 4: Complex ADF style": [[65, "plot-4-complex-adf-style"]], "Porting": [[122, "porting"], [123, "porting"], [126, null]], "Post processing and viewing your output": [[35, "post-processing-and-viewing-your-output"], [43, "post-processing-and-viewing-your-output"], [52, "post-processing-and-viewing-your-output"]], "Postprocessing data": [[62, null]], "Prerequisites for Success": [[119, null]], "Printing information about the dataset is helpful for understanding your data.": [[70, "printing-information-about-the-dataset-is-helpful-for-understanding-your-data"]], "Project Pythia": [[59, "project-pythia"]], "Python": [[59, "python"]], "Resolution": [[8, "resolution"]], "Resources": [[128, null]], "Restarting a Run": [[104, null]], "Review Questions": [[17, null]], "Running on derecho": [[122, "running-on-derecho"], [123, "running-on-derecho"]], "SHELL environment": [[127, "shell-environment"], [131, "shell-environment"], [133, "shell-environment"]], "Sea Ice": [[35, null], [69, null]], "Set the 2 years you would like to compare": [[41, "set-the-2-years-you-would-like-to-compare"]], "Set your user name": [[41, "set-your-user-name"]], "Setting up the Dask cluster": [[74, "setting-up-the-dask-cluster"], [76, "setting-up-the-dask-cluster"]], "Setting up the notebook": [[74, "setting-up-the-notebook"], [75, "setting-up-the-notebook"], [76, "setting-up-the-notebook"]], "Setting up your NCAR HPC environment": [[127, "setting-up-your-ncar-hpc-environment"], [131, "setting-up-your-ncar-hpc-environment"], [133, "setting-up-your-ncar-hpc-environment"]], "Setting up your environment": [[1, "setting-up-your-environment"]], "Setting your workspaces": [[10, "setting-your-workspaces"]], "Simple XML Modifications": [[88, null]], "Some Unix Basics": [[134, "some-unix-basics"]], "Source Modification Example": [[136, null]], "Source Modifications": [[141, null]], "Special Queues": [[127, "special-queues"], [132, "special-queues"], [133, "special-queues"]], "Special instructions (if you already had an account on derecho)": [[127, "special-instructions-if-you-already-had-an-account-on-derecho"], [131, "special-instructions-if-you-already-had-an-account-on-derecho"], [133, "special-instructions-if-you-already-had-an-account-on-derecho"]], "Starting and Stopping": [[105, null]], "Step 1. Download CESM Tutorial notebooks with Git Clone": [[73, "step-1-download-cesm-tutorial-notebooks-with-git-clone"]], "Step 1. Explore the b1850.basics Archive directory": [[14, "step-1-explore-the-b1850-basics-archive-directory"]], "Step 1. Locate Your Code Workspace Area": [[11, "step-1-locate-your-code-workspace-area"]], "Step 1: Create CESM Code Directory": [[12, "step-1-create-cesm-code-directory"]], "Step 1: derecho Login": [[118, "step-1-derecho-login"]], "Step 2. Download CESM Code with Git Clone": [[12, "step-2-download-cesm-code-with-git-clone"]], "Step 2. Examine the CIME Directory": [[11, "step-2-examine-the-cime-directory"]], "Step 2. Login to JupyterHub": [[73, "step-2-login-to-jupyterhub"]], "Step 2. Open the CAM h0 monthly history file": [[14, "step-2-open-the-cam-h0-monthly-history-file"]], "Step 2: Look Around derecho File Systems": [[118, "step-2-look-around-derecho-file-systems"]], "Step 3. Download the Component Models with checkout_externals": [[12, "step-3-download-the-component-models-with-checkout-externals"]], "Step 3. Examine Average Monthly Surface Temperature": [[14, "step-3-examine-average-monthly-surface-temperature"]], "Step 3. Examine the CESM Components Area": [[11, "step-3-examine-the-cesm-components-area"]], "Step 3. Open a Diagnostics Notebook": [[73, "step-3-open-a-diagnostics-notebook"]], "Step 4. Check Your Notebook Kernel": [[73, "step-4-check-your-notebook-kernel"]], "Step 4. Examine Average Monthly Precipitation": [[14, "step-4-examine-average-monthly-precipitation"]], "Step 4. Look at the Community Atmosphere Model (CAM) Component Model": [[11, "step-4-look-at-the-community-atmosphere-model-cam-component-model"]], "Step 5. Run Jupyter Notebook Cells": [[73, "step-5-run-jupyter-notebook-cells"]], "Subsection 1": [[58, "subsection-1"], [61, "subsection-1"]], "Subsection 2": [[58, "subsection-2"], [61, "subsection-2"]], "Surface mass balance": [[41, "surface-mass-balance"]], "Take-away Points": [[126, "take-away-points"]], "Tcsh users": [[127, "tcsh-users"], [131, "tcsh-users"], [133, "tcsh-users"]], "Terminal Windows": [[129, null]], "Terminal windows": [[119, "terminal-windows"]], "Test your understanding": [[16, "test-your-understanding"], [18, "test-your-understanding"], [37, "test-your-understanding"], [38, "test-your-understanding"], [45, "test-your-understanding"], [46, "test-your-understanding"], [54, "test-your-understanding"], [55, "test-your-understanding"]], "Text Editors": [[130, null]], "The log files": [[145, null]], "Tips": [[3, "tips"]], "Troubleshooting runtime errors": [[146, null]], "Tutorial Project Account": [[127, "tutorial-project-account"], [132, "tutorial-project-account"], [133, "tutorial-project-account"]], "Tutorial one time setup": [[131, null]], "Tutorial queue and account": [[132, null]], "Tutorial specific instructions": [[127, null], [133, null]], "UNIX": [[119, "unix"], [134, null]], "UNIX cheatsheet": [[135, null]], "UXArray\u2019s Project Pythia Cookbook": [[63, "uxarray-s-project-pythia-cookbook"]], "UXarray": [[63, null]], "UXarray Code": [[63, "uxarray-code"]], "UXarray Documentation Website": [[63, "uxarray-documentation-website"]], "Unix cheatsheet": [[134, "unix-cheatsheet"]], "Useful CICE references": [[35, "useful-cice-references"]], "Useful CISM references": [[39, "useful-cism-references"]], "Useful CLM references": [[43, "useful-clm-references"]], "Useful MOM6 references": [[52, "useful-mom6-references"]], "Useful POP references": [[52, "useful-pop-references"]], "Using Casper": [[122, "using-casper"], [123, "using-casper"]], "Using JupyterHub": [[119, "using-jupyterhub"], [122, "using-jupyterhub"], [123, "using-jupyterhub"]], "Using PuTTY and Xmg": [[129, "using-putty-and-xmg"]], "Using Timing Files": [[106, null]], "Using these tutorial-specific codes": [[127, "using-these-tutorial-specific-codes"], [133, "using-these-tutorial-specific-codes"]], "Variables Related to Run Type": [[97, null]], "Versions": [[12, "versions"]], "Vi": [[130, "vi"]], "Vim": [[130, "vim"]], "Visualizing this documentation": [[86, "visualizing-this-documentation"]], "Welcome to the CESM Tutorial": [[0, null]], "What are Git and GitHub?": [[121, "what-are-git-and-github"]], "What is CESM ?": [[82, null]], "What is a F compset ?": [[27, "what-is-a-f-compset"]], "What is a G case?": [[35, "what-is-a-g-case"], [52, "what-is-a-g-case"]], "What is a T case?": [[39, "what-is-a-t-case"]], "What is an I case?": [[43, "what-is-an-i-case"]], "What to do when a run fails?": [[145, "what-to-do-when-a-run-fails"]], "Workflow Elements": [[1, "workflow-elements"]], "Workspace Overview": [[10, "workspace-overview"]], "Workspaces": [[10, null]], "XML file locations": [[99, "xml-file-locations"]], "Yearly In-Person Tutorials": [[0, "yearly-in-person-tutorials"]], "Your first CESM run": [[16, null]], "add_default": [[136, "add-default"]], "addfld": [[136, "addfld"]], "ncdump": [[125, "ncdump"]], "ncview": [[125, "ncview"]], "netCDF Operators (NCO)": [[125, "netcdf-operators-nco"]], "outfld": [[136, "outfld"]]}, "docnames": ["README", "notebooks/basics/basics_overview", "notebooks/basics/cesm_workflow", "notebooks/basics/cesm_workflow/case_build", "notebooks/basics/cesm_workflow/case_setup", "notebooks/basics/cesm_workflow/case_submit", "notebooks/basics/cesm_workflow/checking_jobs_and_status", "notebooks/basics/cesm_workflow/create_clone", "notebooks/basics/cesm_workflow/create_newcase", "notebooks/basics/cesm_workflow/model_output", "notebooks/basics/cesm_workspaces", "notebooks/basics/code/cesm_code_explore", "notebooks/basics/code/git_download_cesm", "notebooks/basics/code_overview", "notebooks/basics/exercises/examine_history_B1850", "notebooks/basics/exercises/extra", "notebooks/basics/exercises/first_B1850", "notebooks/basics/exercises/review_questions", "notebooks/basics/exercises/second_B1850", "notebooks/basics/exercises_overview", "notebooks/challenge/bgc/bgc", "notebooks/challenge/bgc/bgc_exercise_1", "notebooks/challenge/cam-chem_waccm/cam-chem_waccm", "notebooks/challenge/cam-chem_waccm/exercise_1", "notebooks/challenge/cam-chem_waccm/exercise_2", "notebooks/challenge/cam-chem_waccm/exercise_3", "notebooks/challenge/cam-chem_waccm/visualization", "notebooks/challenge/cam/cam", "notebooks/challenge/cam/exercise_1", "notebooks/challenge/cam/exercise_2", "notebooks/challenge/cam/exercise_3", "notebooks/challenge/cam/exercise_4", "notebooks/challenge/cam/exercise_5", "notebooks/challenge/cam/exercise_6", "notebooks/challenge/challenge", "notebooks/challenge/cice/cice", "notebooks/challenge/cice/cice_exercise_1", "notebooks/challenge/cice/cice_exercise_2", "notebooks/challenge/cice/cice_exercise_3", "notebooks/challenge/cism/cism", "notebooks/challenge/cism/cism_exercise_1", "notebooks/challenge/cism/cism_exercise_2", "notebooks/challenge/cism/cism_exercise_3", "notebooks/challenge/clm_ctsm/clm_ctsm", "notebooks/challenge/clm_ctsm/clm_exercise_1", "notebooks/challenge/clm_ctsm/clm_exercise_2", "notebooks/challenge/clm_ctsm/clm_exercise_3", "notebooks/challenge/mom/mom_exercise_5", "notebooks/challenge/paleo/exercise_1", "notebooks/challenge/paleo/exercise_2", "notebooks/challenge/paleo/exercise_3", "notebooks/challenge/paleo/paleo", "notebooks/challenge/pop/pop", "notebooks/challenge/pop/pop_exercise_1", "notebooks/challenge/pop/pop_exercise_2", "notebooks/challenge/pop/pop_exercise_3", "notebooks/challenge/pop/pop_exercise_4", "notebooks/diagnostics/additional/additional", "notebooks/diagnostics/additional/adf", "notebooks/diagnostics/additional/analysis_tools", "notebooks/diagnostics/additional/cvdp", "notebooks/diagnostics/additional/large_ensembles", "notebooks/diagnostics/additional/postprocessing", "notebooks/diagnostics/additional/uxarray", "notebooks/diagnostics/cam/advanced_cam", "notebooks/diagnostics/cam/basics_cam", "notebooks/diagnostics/cam/cam", "notebooks/diagnostics/cice/advanced_cice", "notebooks/diagnostics/cice/basics_cice", "notebooks/diagnostics/cice/cice", "notebooks/diagnostics/clm_ctsm/basics_clm", "notebooks/diagnostics/clm_ctsm/clm_ctsm", "notebooks/diagnostics/cupid", "notebooks/diagnostics/diagnostics", "notebooks/diagnostics/mom/basics_mom", "notebooks/diagnostics/pop/advanced_pop", "notebooks/diagnostics/pop/basics_pop", "notebooks/diagnostics/pop/pop", "notebooks/intro/cesm_expts/clim_data_gateway", "notebooks/intro/cesm_expts/clim_data_guide", "notebooks/intro/cesm_webpage", "notebooks/intro/community_experiments", "notebooks/intro/components", "notebooks/intro/coupling", "notebooks/intro/getting_help", "notebooks/intro/getting_involved", "notebooks/intro/intro_overview", "notebooks/intro/project", "notebooks/modifications/xml", "notebooks/modifications/xml/copying_cases", "notebooks/modifications/xml/exercises", "notebooks/modifications/xml/exercises/xml_length_exercise", "notebooks/modifications/xml/exercises/xml_runtype_exercise", "notebooks/modifications/xml/exercises/xml_timestep_exercise", "notebooks/modifications/xml/model_control_files", "notebooks/modifications/xml/modify_run_type", "notebooks/modifications/xml/modify_run_type/hybrid_branch_restart", "notebooks/modifications/xml/modify_run_type/run_variables", "notebooks/modifications/xml/other_xml_variables", "notebooks/modifications/xml/overview", "notebooks/modifications/xml/physics_timestep", "notebooks/modifications/xml/run_length", "notebooks/modifications/xml/run_length/changing_run_length", "notebooks/modifications/xml/run_length/number_of_submissions", "notebooks/modifications/xml/run_length/restarting", "notebooks/modifications/xml/run_length/starting_and_stopping", "notebooks/modifications/xml/run_length/timing_files", "notebooks/namelist/documentation", "notebooks/namelist/exercises/exercise_cam_output", "notebooks/namelist/exercises/exercise_tuning_parameter", "notebooks/namelist/exercises_overview", "notebooks/namelist/namelist", "notebooks/namelist/output", "notebooks/namelist/output/output_cam", "notebooks/namelist/output/output_cice", "notebooks/namelist/output/output_clm", "notebooks/namelist/output/output_pop", "notebooks/namelist/overview", "notebooks/prereqs/exercises", "notebooks/prereqs/prereqs_overview", "notebooks/resources/fortran", "notebooks/resources/github", "notebooks/resources/ncar_hpc", "notebooks/resources/ncar_hpc_login", "notebooks/resources/ncar_hpc_module", "notebooks/resources/netcdf", "notebooks/resources/porting", "notebooks/resources/profile", "notebooks/resources/resources_overview", "notebooks/resources/terminals", "notebooks/resources/text_editors", "notebooks/resources/tutorial_one_time_setup", "notebooks/resources/tutorial_queue_account", "notebooks/resources/tutorial_specific", "notebooks/resources/unix", "notebooks/resources/unix-cheatsheet", "notebooks/sourcemods/add_fields_cam", "notebooks/sourcemods/exercises/exercise_add_field", "notebooks/sourcemods/exercises/exercise_rain_threshold", "notebooks/sourcemods/exercises_overview", "notebooks/sourcemods/overview", "notebooks/sourcemods/sourcemods", "notebooks/troubleshooting/debugging_flag", "notebooks/troubleshooting/exercises/troubleshooting_cam", "notebooks/troubleshooting/exercises_overview", "notebooks/troubleshooting/log_files", "notebooks/troubleshooting/troubleshooting"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "notebooks/basics/basics_overview.ipynb", "notebooks/basics/cesm_workflow.ipynb", "notebooks/basics/cesm_workflow/case_build.ipynb", "notebooks/basics/cesm_workflow/case_setup.ipynb", "notebooks/basics/cesm_workflow/case_submit.ipynb", "notebooks/basics/cesm_workflow/checking_jobs_and_status.ipynb", "notebooks/basics/cesm_workflow/create_clone.ipynb", "notebooks/basics/cesm_workflow/create_newcase.ipynb", "notebooks/basics/cesm_workflow/model_output.ipynb", "notebooks/basics/cesm_workspaces.ipynb", "notebooks/basics/code/cesm_code_explore.ipynb", "notebooks/basics/code/git_download_cesm.ipynb", "notebooks/basics/code_overview.ipynb", "notebooks/basics/exercises/examine_history_B1850.ipynb", "notebooks/basics/exercises/extra.ipynb", "notebooks/basics/exercises/first_B1850.ipynb", "notebooks/basics/exercises/review_questions.ipynb", "notebooks/basics/exercises/second_B1850.ipynb", "notebooks/basics/exercises_overview.ipynb", "notebooks/challenge/bgc/bgc.ipynb", "notebooks/challenge/bgc/bgc_exercise_1.ipynb", "notebooks/challenge/cam-chem_waccm/cam-chem_waccm.ipynb", "notebooks/challenge/cam-chem_waccm/exercise_1.ipynb", "notebooks/challenge/cam-chem_waccm/exercise_2.ipynb", "notebooks/challenge/cam-chem_waccm/exercise_3.ipynb", "notebooks/challenge/cam-chem_waccm/visualization.ipynb", "notebooks/challenge/cam/cam.ipynb", "notebooks/challenge/cam/exercise_1.ipynb", "notebooks/challenge/cam/exercise_2.ipynb", "notebooks/challenge/cam/exercise_3.ipynb", "notebooks/challenge/cam/exercise_4.ipynb", "notebooks/challenge/cam/exercise_5.ipynb", "notebooks/challenge/cam/exercise_6.ipynb", "notebooks/challenge/challenge.ipynb", "notebooks/challenge/cice/cice.ipynb", "notebooks/challenge/cice/cice_exercise_1.ipynb", "notebooks/challenge/cice/cice_exercise_2.ipynb", "notebooks/challenge/cice/cice_exercise_3.ipynb", "notebooks/challenge/cism/cism.ipynb", "notebooks/challenge/cism/cism_exercise_1.ipynb", "notebooks/challenge/cism/cism_exercise_2.ipynb", "notebooks/challenge/cism/cism_exercise_3.ipynb", "notebooks/challenge/clm_ctsm/clm_ctsm.ipynb", "notebooks/challenge/clm_ctsm/clm_exercise_1.ipynb", "notebooks/challenge/clm_ctsm/clm_exercise_2.ipynb", "notebooks/challenge/clm_ctsm/clm_exercise_3.ipynb", "notebooks/challenge/mom/mom_exercise_5.ipynb", "notebooks/challenge/paleo/exercise_1.ipynb", "notebooks/challenge/paleo/exercise_2.ipynb", "notebooks/challenge/paleo/exercise_3.ipynb", "notebooks/challenge/paleo/paleo.ipynb", "notebooks/challenge/pop/pop.ipynb", "notebooks/challenge/pop/pop_exercise_1.ipynb", "notebooks/challenge/pop/pop_exercise_2.ipynb", "notebooks/challenge/pop/pop_exercise_3.ipynb", "notebooks/challenge/pop/pop_exercise_4.ipynb", "notebooks/diagnostics/additional/additional.ipynb", "notebooks/diagnostics/additional/adf.ipynb", "notebooks/diagnostics/additional/analysis_tools.ipynb", "notebooks/diagnostics/additional/cvdp.ipynb", "notebooks/diagnostics/additional/large_ensembles.ipynb", "notebooks/diagnostics/additional/postprocessing.ipynb", "notebooks/diagnostics/additional/uxarray.ipynb", "notebooks/diagnostics/cam/advanced_cam.ipynb", "notebooks/diagnostics/cam/basics_cam.ipynb", "notebooks/diagnostics/cam/cam.ipynb", "notebooks/diagnostics/cice/advanced_cice.ipynb", "notebooks/diagnostics/cice/basics_cice.ipynb", "notebooks/diagnostics/cice/cice.ipynb", "notebooks/diagnostics/clm_ctsm/basics_clm.ipynb", "notebooks/diagnostics/clm_ctsm/clm_ctsm.ipynb", "notebooks/diagnostics/cupid.ipynb", "notebooks/diagnostics/diagnostics.ipynb", "notebooks/diagnostics/mom/basics_mom.ipynb", "notebooks/diagnostics/pop/advanced_pop.ipynb", "notebooks/diagnostics/pop/basics_pop.ipynb", "notebooks/diagnostics/pop/pop.ipynb", "notebooks/intro/cesm_expts/clim_data_gateway.ipynb", "notebooks/intro/cesm_expts/clim_data_guide.ipynb", "notebooks/intro/cesm_webpage.ipynb", "notebooks/intro/community_experiments.ipynb", "notebooks/intro/components.ipynb", "notebooks/intro/coupling.ipynb", "notebooks/intro/getting_help.ipynb", "notebooks/intro/getting_involved.ipynb", "notebooks/intro/intro_overview.ipynb", "notebooks/intro/project.ipynb", "notebooks/modifications/xml.ipynb", "notebooks/modifications/xml/copying_cases.ipynb", "notebooks/modifications/xml/exercises.ipynb", "notebooks/modifications/xml/exercises/xml_length_exercise.ipynb", "notebooks/modifications/xml/exercises/xml_runtype_exercise.ipynb", "notebooks/modifications/xml/exercises/xml_timestep_exercise.ipynb", "notebooks/modifications/xml/model_control_files.ipynb", "notebooks/modifications/xml/modify_run_type.ipynb", "notebooks/modifications/xml/modify_run_type/hybrid_branch_restart.ipynb", "notebooks/modifications/xml/modify_run_type/run_variables.ipynb", "notebooks/modifications/xml/other_xml_variables.ipynb", "notebooks/modifications/xml/overview.ipynb", "notebooks/modifications/xml/physics_timestep.ipynb", "notebooks/modifications/xml/run_length.ipynb", "notebooks/modifications/xml/run_length/changing_run_length.ipynb", "notebooks/modifications/xml/run_length/number_of_submissions.ipynb", "notebooks/modifications/xml/run_length/restarting.ipynb", "notebooks/modifications/xml/run_length/starting_and_stopping.ipynb", "notebooks/modifications/xml/run_length/timing_files.ipynb", "notebooks/namelist/documentation.ipynb", "notebooks/namelist/exercises/exercise_cam_output.ipynb", "notebooks/namelist/exercises/exercise_tuning_parameter.ipynb", "notebooks/namelist/exercises_overview.ipynb", "notebooks/namelist/namelist.ipynb", "notebooks/namelist/output.ipynb", "notebooks/namelist/output/output_cam.ipynb", "notebooks/namelist/output/output_cice.ipynb", "notebooks/namelist/output/output_clm.ipynb", "notebooks/namelist/output/output_pop.ipynb", "notebooks/namelist/overview.ipynb", "notebooks/prereqs/exercises.ipynb", "notebooks/prereqs/prereqs_overview.ipynb", "notebooks/resources/fortran.ipynb", "notebooks/resources/github.ipynb", "notebooks/resources/ncar_hpc.ipynb", "notebooks/resources/ncar_hpc_login.ipynb", "notebooks/resources/ncar_hpc_module.ipynb", "notebooks/resources/netcdf.ipynb", "notebooks/resources/porting.ipynb", "notebooks/resources/profile.ipynb", "notebooks/resources/resources_overview.ipynb", "notebooks/resources/terminals.ipynb", "notebooks/resources/text_editors.ipynb", "notebooks/resources/tutorial_one_time_setup.ipynb", "notebooks/resources/tutorial_queue_account.ipynb", "notebooks/resources/tutorial_specific.ipynb", "notebooks/resources/unix.ipynb", "notebooks/resources/unix-cheatsheet.ipynb", "notebooks/sourcemods/add_fields_cam.ipynb", "notebooks/sourcemods/exercises/exercise_add_field.ipynb", "notebooks/sourcemods/exercises/exercise_rain_threshold.ipynb", "notebooks/sourcemods/exercises_overview.ipynb", "notebooks/sourcemods/overview.ipynb", "notebooks/sourcemods/sourcemods.ipynb", "notebooks/troubleshooting/debugging_flag.ipynb", "notebooks/troubleshooting/exercises/troubleshooting_cam.ipynb", "notebooks/troubleshooting/exercises_overview.ipynb", "notebooks/troubleshooting/log_files.ipynb", "notebooks/troubleshooting/troubleshooting.ipynb"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [4, 6, 8, 14, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 39, 43, 46, 48, 49, 50, 51, 52, 59, 60, 64, 65, 67, 68, 70, 72, 74, 75, 76, 82, 94, 96, 104, 106, 113, 116, 121, 130, 137, 143, 145], "0": [5, 6, 8, 12, 14, 20, 22, 23, 24, 25, 27, 31, 33, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 50, 63, 64, 65, 67, 68, 70, 72, 74, 75, 76, 96, 102, 104, 106, 108, 113, 115, 121, 125, 137, 142, 143], "00": [5, 6, 44, 45, 46, 49, 65, 67, 73, 74, 75, 76, 91, 92, 93, 94, 113, 127], "000": [63, 74], "00000": [3, 14, 23, 24, 25, 28, 37, 38, 40, 41, 53, 64, 92, 93, 96, 108, 137], "0001": [8, 14, 28, 29, 35, 36, 37, 38, 43, 49, 50, 52, 53, 65, 76, 108, 109, 137], "0002": [92, 93], "0003": 65, "0005": 47, "001": [25, 30, 40, 48, 49, 50, 64, 67, 68, 70, 81], "005": [65, 67, 68], "00z": 68, "01": [3, 5, 8, 12, 14, 23, 24, 25, 28, 30, 36, 37, 38, 40, 41, 49, 50, 53, 64, 65, 67, 68, 75, 76, 92, 93, 94, 108, 109, 137], "015": 41, "018682": 49, "02": [14, 36, 37, 38, 49, 65, 67, 70, 74, 76, 92, 108], "020": [3, 5, 8], "0242": 65, "03": [68, 70, 73], "0301": [3, 5, 8], "0321": 30, "04": [6, 49, 67, 68], "05": [65, 68, 70], "06": 6, "07": [65, 68], "08": 49, "09": 11, "090206": 8, "0_api": 6, "0e": 68, "0e6": 20, "0m": 108, "1": [3, 6, 8, 17, 18, 20, 22, 24, 25, 26, 29, 30, 31, 32, 33, 37, 38, 40, 41, 42, 45, 46, 47, 49, 50, 54, 55, 56, 59, 60, 72, 80, 81, 90, 92, 93, 107, 108, 109, 113, 114, 115, 116, 117, 120, 127, 133, 136, 137, 138, 140, 143], "10": [11, 32, 33, 42, 63, 65, 68, 70, 74, 76, 96, 102, 113, 115, 127], "100": [37, 67, 68, 75, 76, 96, 102], "1000": [14, 41, 50, 59, 64], "1001": [67, 68, 70], "101": 11, "102": 65, "1026": 75, "105": [3, 49], "108": 8, "109": 3, "11": [11, 49, 68, 70, 74, 76], "110": 64, "110m": [70, 74, 76], "11117": 11, "1155": 11, "1184802": 63, "12": [5, 6, 11, 24, 35, 41, 47, 48, 49, 50, 52, 63, 65, 67, 70, 74, 76, 87, 91, 96, 102, 106, 127], "120": [23, 24, 25, 74, 76], "1200": 93, "121": 41, "122": 41, "126202": 3, "127ka_cam60_clm50": 8, "12ypd": 8, "13": [6, 42, 68, 70, 127], "130": [3, 74, 76], "133": [3, 65], "134": 65, "134217": 3, "135": 65, "136": 65, "137": 65, "14": [3, 11, 75, 106, 127], "140": [74, 76], "1409": 11, "140w": 76, "1410g": 6, "142718": 3, "144": 8, "14663": 11, "15": [11, 41, 44, 45, 46, 65, 68, 74, 76, 134], "150": [3, 74, 76, 79], "150km": 22, "151008": 8, "154": 22, "155": 22, "156770e": 49, "15k": 14, "16": [48, 50, 65, 70, 94], "17": [6, 68, 96, 102, 127], "173952": 3, "1747": 11, "18": [50, 67, 96, 102], "180": [32, 65, 70, 74, 76, 125], "1800": [93, 100], "1850": [8, 20, 27, 67, 91], "1850_cam50_clm45": 8, "1850_cam60": 8, "1850_cam60_clm45": 8, "1850_cam60_clm50": 8, "1852977": 0, "187": 75, "19": [6, 96, 102], "1925": 11, "1948": [35, 52], "1950": 29, "1957": [74, 76], "196": 65, "197": 65, "1979": [30, 68], "198": 65, "1983": 0, "199": 65, "1994": 0, "1995": [23, 24, 25], "1996": [67, 85], "1_tutorial2022": 8, "1a": 71, "1d": 70, "1e": 76, "1e12": 68, "1e4": [67, 68], "1e6": 70, "1mm": 138, "1pct_clm50": 8, "2": [0, 3, 17, 20, 22, 23, 25, 26, 28, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 50, 52, 53, 60, 64, 72, 80, 81, 90, 91, 93, 107, 108, 109, 120, 126, 142, 143], "20": [5, 6, 41, 65, 67, 68, 74, 76, 96, 102, 106, 138], "200": [64, 65, 70, 109], "2000": [27, 28, 75], "200000": 75, "2000_cam50_clm45": 8, "2000m": 75, "2001_2020": 25, "2003": 64, "2009": [35, 52, 54, 74], "201": 65, "2010": [0, 25, 27], "2013": 0, "2014_cmip6_0p5deglat_c170126": 25, "2015": [40, 41, 42], "2015_0": 25, "2016": [38, 40, 41], "2017": [35, 49, 52], "2018": [35, 52], "2019": [49, 109], "2020": 42, "2021": [68, 70], "2022": 68, "2023": 68, "2023a": [67, 68, 70, 73, 74, 76], "2023b": [64, 65, 73, 75], "2024": 6, "2024a": 63, "2027": 65, "205": 50, "207": 3, "207183e": 49, "20mm": 138, "20th": [45, 68], "21": [41, 68], "210": [50, 65], "2100": 40, "2100_0": 25, "2101": [41, 42], "210m": 108, "211": 65, "2116708": 11, "2119": 11, "212": 65, "215": 65, "216": 65, "217": 65, "218": 65, "219": 65, "22": 6, "220": [65, 76], "221": 70, "222": 70, "223": 70, "224": 70, "225": 65, "225k": 65, "23": 68, "234m": 108, "235": 31, "235gb": 6, "24": [23, 24, 25, 44, 45, 49, 70, 74, 76, 106, 108, 113, 115, 137, 143], "240": [23, 24, 25, 28, 29, 30, 31, 32, 33], "240606": 3, "2433": 11, "244": 14, "2461": 11, "2464": 65, "2475": 11, "249592": 3, "25": [22, 55], "250": 37, "250e2": 76, "252": 8, "25_1850_2017_c180507": 25, "25_c20170322": 25, "25_c20170608": 25, "25_c20170616": 25, "25_c20180504": 25, "25_mol_2000_2022": 25, "26": [11, 68], "260": 31, "2601516": 63, "2666": [3, 5], "2667": [3, 5], "2668": [3, 5], "2675": [3, 5], "2676": [3, 5], "2677": [3, 5], "2678": [3, 5], "2679": [3, 5], "2680": [3, 5], "2681": [3, 5], "2682": [3, 5], "2683": [3, 5], "2684": [3, 5], "27": 3, "273": 14, "278138": 3, "28": [3, 20, 70, 76], "282": 11, "288": 8, "29": 68, "290": 74, "292": 3, "29859": 11, "2_04": 6, "2d": [14, 39, 67, 70, 74, 76], "2deg": 30, "2k": 32, "2nd": [96, 102], "3": [17, 22, 23, 24, 26, 28, 29, 31, 32, 33, 36, 40, 41, 42, 47, 49, 53, 64, 68, 72, 75, 81, 90, 91, 92, 108, 113, 115, 127, 133], "30": [6, 13, 23, 24, 25, 31, 50, 60, 64, 67, 70, 74, 76, 94, 127, 134], "300": [41, 65, 70, 74, 76], "300e2": 76, "300k": 65, "30_dbl_kind": 38, "31": [6, 11, 36, 70, 74, 76, 108, 137], "32": [11, 14, 41, 74, 76], "320": 76, "321": [30, 65], "327": 106, "33": 3, "336": 65, "337": 65, "338": 65, "339": 65, "34": [11, 68, 106], "340": 65, "3445d0f0f93e": 65, "35": [3, 68, 74, 76], "3500": 41, "36": [8, 68], "360": [42, 65, 67, 68, 76], "361": 67, "365": [23, 24, 25, 113, 115], "367": 76, "37": [6, 91], "370": 76, "38": 91, "385": 65, "386": 65, "387": 65, "388": 65, "389": [3, 65], "39": [67, 68], "390": 65, "391": 65, "393": 65, "394": 65, "395": 65, "396": 65, "398": 65, "399": 65, "3996": 75, "3_ihesp_hir": 50, "3b": 49, "3d": [65, 70, 74, 76, 136], "3gauss": 14, "3rd": [96, 102], "4": [2, 3, 12, 17, 39, 41, 42, 46, 49, 64, 68, 91, 92, 93, 94, 106, 115], "40": [8, 74, 76], "400": [14, 65], "4000": [11, 76], "4048": 65, "4050": 49, "4096": 11, "41": [6, 68], "410538e": 49, "413109": 3, "42": [6, 68], "421": 11, "43": 68, "44": [20, 68], "444": 11, "45": 79, "45m": 76, "46": [6, 11], "4670": 11, "47": [67, 68], "4743615": [5, 6], "4743616": [5, 6], "479993": 3, "48": [92, 100], "480": [23, 24, 25], "49": 6, "4cesm": 6, "4xco2_clm50": 8, "5": [3, 5, 6, 8, 10, 11, 12, 17, 18, 23, 24, 25, 28, 29, 30, 31, 33, 35, 39, 40, 41, 42, 44, 45, 46, 49, 50, 52, 64, 65, 67, 68, 70, 74, 75, 76, 91, 92, 93, 96, 102], "50": [6, 31, 75, 106], "500": [37, 109, 137], "5000": 76, "50000": 137, "5000e2": 76, "500hpa": 136, "50m": [74, 76], "51": [3, 68], "5128": 11, "528": 3, "53": 6, "5498": 11, "55": [3, 65, 67, 68, 74, 76], "554": 65, "555": 65, "556": 65, "55m": [76, 108], "56": [41, 65, 70], "562": 65, "563": 65, "565": 65, "566": 65, "567": 65, "568": 65, "569": 65, "57": [6, 65, 67], "570": 65, "571": 65, "572": 65, "573": 65, "574": 65, "58": 68, "584": 65, "585": 65, "586": 65, "587": 65, "588": 65, "589": 65, "59": 68, "590": 65, "591": 65, "592": 65, "593": 65, "594": 65, "595": 65, "596": 65, "597": 65, "598": 65, "599": 65, "5_2000climo_c180511": 32, "5_finn": 25, "5_l": 8, "5_nc3000_nsw084_nrs016_co120_fi001_zr_grnl_031819": 31, "5_oi": 8, "5_r8": 33, "5th": [24, 25], "6": [6, 11, 17, 35, 44, 45, 49, 50, 52, 64, 67, 70, 75, 76, 91, 105, 109, 115], "60": [13, 67, 74, 76, 134], "600": [65, 125], "602": 65, "603": 65, "618865": 11, "62": 68, "63": 125, "64": [67, 68], "648": 11, "65": [74, 76], "65e": 24, "685": 11, "696128e": 49, "6th": 70, "7": [11, 17, 42, 49, 65, 68, 70, 75, 76, 91, 92, 106, 108], "70": 106, "700": 49, "710858": 63, "716460": 3, "72": [68, 93], "73": [23, 24, 25], "74": [3, 68], "75": 70, "750": 137, "75000": 137, "7501": 11, "750hpa": [136, 141], "751115e": 49, "757": 50, "76": 68, "768": 6, "78": 68, "7_taubgnd2": 64, "7a6c5b0": 12, "8": [6, 11, 17, 40, 41, 49, 67, 68, 72, 74, 75, 76, 108, 113, 115], "800": 75, "82": 68, "83": 68, "837194": 3, "85": [3, 70], "850": [28, 29, 30, 31, 32, 33], "86": [3, 14, 39, 40, 68], "86400": 64, "868182e": 49, "87": [49, 68], "89": 68, "8904": 11, "8e": 26, "8gb": [74, 76], "9": [38, 41, 75, 76], "90": [65, 67, 68, 70, 74, 76], "9067": 11, "90_dbl_kind": 38, "91": 68, "93": 6, "95": [63, 74, 76], "958399": 3, "966": 20, "99": 50, "9x1": [22, 25], "9x2": [8, 31, 32], "A": [0, 1, 5, 14, 22, 23, 24, 25, 27, 39, 42, 46, 48, 49, 50, 51, 62, 65, 85, 96, 97, 102, 105, 106, 109, 113, 115, 116, 121, 135, 136, 137, 143], "And": [8, 40, 143], "As": [6, 8, 11, 17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 37, 48, 49, 50, 70, 76, 84, 104, 121, 136], "At": [11, 42, 125], "But": [23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 65, 68, 76], "By": [6, 8, 15, 19, 30, 70, 73, 76, 109, 132], "For": [3, 4, 5, 8, 9, 10, 11, 14, 15, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 65, 67, 68, 70, 72, 73, 91, 92, 94, 96, 97, 99, 100, 102, 105, 106, 107, 108, 109, 113, 115, 116, 117, 119, 127, 129, 136, 137, 138, 140, 143], "If": [0, 3, 4, 5, 7, 9, 11, 12, 13, 14, 17, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 59, 64, 65, 68, 70, 72, 73, 74, 75, 76, 85, 86, 94, 96, 97, 98, 102, 104, 105, 108, 109, 112, 113, 115, 118, 119, 120, 129, 132, 137, 138, 140, 142, 143, 145], "In": [2, 8, 10, 11, 12, 14, 17, 18, 22, 24, 25, 27, 30, 33, 35, 37, 38, 39, 40, 41, 42, 43, 50, 52, 54, 59, 62, 63, 64, 65, 67, 68, 69, 70, 72, 73, 90, 91, 92, 93, 96, 99, 102, 104, 105, 108, 109, 112, 113, 115, 117, 121, 122, 123, 127, 129, 133, 138, 140, 143], "It": [11, 26, 35, 38, 42, 43, 48, 49, 52, 59, 62, 63, 68, 71, 72, 73, 74, 96, 99, 104, 106, 119, 121, 122, 123, 125, 130, 145, 146], "NO": 25, "NOT": [21, 96, 142], "Near": 33, "No": [0, 8, 65, 96], "Not": 72, "OF": 145, "OR": [11, 73, 119, 122, 123, 127, 131, 133], "On": [3, 41, 106, 126], "One": [6, 10, 12, 37, 38, 42, 62, 72, 96, 143], "Or": 12, "That": 143, "The": [0, 1, 2, 3, 4, 7, 8, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 59, 60, 62, 63, 64, 65, 67, 68, 69, 70, 72, 73, 74, 76, 79, 80, 81, 82, 83, 84, 85, 87, 88, 92, 93, 94, 95, 100, 101, 102, 104, 105, 106, 108, 109, 111, 112, 113, 114, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 131, 133, 134, 136, 137, 138, 140, 141, 143, 144, 146], "Then": [23, 24, 25, 26, 27, 65, 68, 69, 94], "There": [10, 14, 17, 27, 35, 43, 52, 59, 70, 73, 74, 76, 79, 81, 85, 87, 99, 111, 117, 130, 146], "These": [0, 10, 12, 14, 17, 20, 35, 43, 59, 63, 67, 68, 70, 73, 76, 96, 99, 101, 106, 113, 116, 117, 123, 124, 127, 129], "To": [0, 3, 6, 11, 12, 14, 20, 24, 26, 27, 37, 41, 49, 50, 54, 59, 64, 65, 67, 68, 70, 72, 73, 74, 76, 79, 81, 86, 91, 92, 94, 105, 113, 115, 119, 122, 123, 124, 125, 127, 131, 133], "Will": 70, "With": [63, 65], "_": [20, 37], "__enter__": 65, "__getitem__": 65, "__init__": 65, "_acquir": 65, "_acquire_with_cache_info": 65, "_ai": 67, "_arg": 65, "_cach": 65, "_config": 72, "_dataset_from_backend_dataset": 65, "_ensure_nc_success": 65, "_filenam": 65, "_generatorcontextmanag": 65, "_group": 65, "_in": 117, "_kei": 65, "_lock": 65, "_manag": 65, "_mode": 65, "_nc4_require_group": 65, "_netcdf4": 65, "_normalize_path": 65, "_open": 65, "_r": 68, "_r8": [33, 137, 138], "_resolve_decoders_kwarg": 65, "a691": 65, "a_pft": 46, "ab": [75, 76], "abil": [38, 59], "abio": 8, "abl": [9, 76, 119, 120, 123, 124, 127, 129, 133], "abort": [3, 142, 143], "about": [0, 2, 8, 12, 13, 15, 18, 22, 28, 29, 34, 37, 38, 41, 42, 47, 57, 59, 63, 64, 67, 68, 69, 73, 76, 81, 86, 92, 94, 101, 105, 107, 109, 111, 117, 119, 121, 122, 123, 124, 130, 134, 138, 143, 146], "abov": [3, 4, 5, 8, 11, 12, 14, 27, 41, 42, 50, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 94, 96, 102, 116, 119, 125, 143, 145], "abstractdatastor": 65, "abund": 50, "abyss": 54, "accept": [12, 47, 67], "access": [6, 59, 72, 78, 119, 121, 127, 129, 132, 133], "accompani": 49, "accord": 49, "accordingli": 100, "account": [23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 44, 45, 46, 47, 49, 53, 54, 55, 56, 73, 78, 85, 106, 108, 109, 121, 122, 123, 137, 138, 143], "accumul": [42, 136], "accur": 54, "achiev": [113, 115], "acom": 25, "acquaint": 70, "acquir": [3, 65], "acquire_context": 65, "across": [63, 67, 72, 87, 125], "act": 54, "action": [3, 4, 5, 15, 59, 145], "activ": [6, 8, 15, 27, 35, 42, 43, 49, 52, 59, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 80, 81, 82, 83, 104, 121, 122, 123, 127, 132, 133], "actual": [37, 38, 65, 67, 68, 69, 99, 119], "ad": [29, 30, 44, 45, 49, 50, 72, 111, 115, 122, 123, 124, 125, 143], "adam": 0, "adapt": [8, 74, 76], "add": [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 37, 40, 46, 49, 50, 54, 64, 65, 68, 70, 74, 75, 76, 91, 96, 108, 109, 112, 116, 119, 127, 131, 133, 136, 138, 139, 141, 142, 143], "add_ax": [41, 65], "add_colorbar": 75, "add_cyclic_point": [50, 70], "add_featur": [67, 68, 70, 74, 75, 76], "add_subplot": [65, 67, 68], "addfld": 137, "addit": [12, 17, 23, 24, 54, 59, 63, 67, 70, 72, 73, 84, 99, 105, 108, 113, 115, 122, 123, 130, 137, 143], "addition": [67, 83, 121], "adf": 72, "adf_quick_run": 72, "adher": 63, "adjust": [41, 49, 50, 68, 70, 74, 76, 94], "administr": 0, "advanc": 27, "advanced_plot_1": 75, "advanced_plot_2": 75, "advic": 12, "aerosol": [20, 80], "affect": [55, 109], "after": [1, 3, 4, 5, 6, 8, 9, 15, 16, 17, 18, 23, 24, 25, 33, 41, 48, 50, 55, 65, 68, 73, 91, 92, 95, 96, 102, 104, 106, 117, 127, 131, 133], "afternoon": 126, "afterok": 5, "ag": 25, "again": [14, 18, 40, 46, 65, 76, 96, 104, 127, 131, 133, 143], "against": [12, 67, 74], "age_of_air_trc": 24, "aggreg": 106, "agre": 38, "agreement": 0, "agulhas_sect": 74, "aic": [67, 68], "aicen": 67, "aid": 65, "aim": [59, 63], "air": [20, 42], "al": [35, 38, 42, 49, 52, 54, 68, 70], "albedo": [35, 38], "algorithm": 63, "alia": 8, "alic": [0, 35, 43, 68, 73], "all": [0, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 20, 27, 34, 39, 40, 41, 52, 60, 62, 65, 67, 68, 70, 72, 73, 74, 76, 80, 81, 83, 94, 96, 102, 104, 108, 118, 121, 122, 123, 124, 125, 127, 131, 133, 135, 142], "allact": 8, "allow": [14, 17, 27, 59, 65, 70, 83, 91, 94, 96, 104, 119, 121, 125], "almost": 68, "alon": [20, 42], "along": [14, 22, 27, 42, 67, 68, 70, 74, 76, 94], "alpha": [74, 75, 76], "alphabet": 14, "alreadi": [4, 11, 14, 16, 35, 36, 42, 49, 50, 53, 72, 75, 91, 129], "also": [0, 2, 8, 22, 23, 25, 26, 27, 28, 31, 32, 35, 39, 42, 43, 49, 50, 52, 56, 59, 60, 65, 67, 68, 70, 72, 73, 74, 76, 79, 92, 94, 104, 105, 106, 113, 117, 121, 122, 123, 125, 126, 135, 146], "alter": [49, 59], "altern": [11, 28, 29, 30, 31, 32, 33, 49, 94, 127, 131, 133], "although": [49, 73, 96, 119], "altmax": 72, "alwai": [42, 76, 94, 106, 113, 115], "am": [29, 30], "amazon": 70, "ambient": 54, "amip": [25, 29], "among": [42, 59, 74, 76], "amount": [74, 76, 91, 138], "amwg": [65, 72, 87], "an": [0, 1, 4, 6, 7, 8, 12, 16, 17, 18, 22, 23, 24, 25, 26, 27, 29, 30, 35, 37, 39, 41, 42, 45, 46, 47, 49, 52, 59, 60, 63, 65, 67, 68, 69, 71, 74, 76, 81, 84, 91, 92, 94, 96, 105, 106, 114, 117, 119, 121, 129, 130, 136, 137, 143, 145], "analog": 96, "analys": 72, "analysi": [22, 26, 57, 60, 63, 65, 68, 72, 73, 74, 75, 76, 106, 122, 123, 124, 125, 134], "analyt": 59, "analyz": [10, 26, 42, 62, 64, 71, 72, 109, 125], "ancient": 51, "ani": [3, 4, 12, 16, 17, 18, 31, 32, 36, 42, 44, 46, 47, 50, 53, 56, 65, 67, 70, 72, 73, 94, 106, 113, 117, 119, 120, 143, 145], "anna": 76, "annot": 70, "announc": 84, "annual": [35, 43, 52, 68, 85], "anoth": [30, 49, 65, 69, 71, 77, 92, 104, 127, 129, 130, 136], "answer": [42, 84, 96, 143], "antarct": [37, 38, 68], "anthropocen": 49, "anthropogen": 29, "anymor": 143, "anyon": 87, "anyth": [8, 11, 12, 65, 67, 112], "anytim": [23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50], "anywher": 129, "apart": 0, "api": [63, 65], "app": [14, 65, 73, 74, 76], "appear": [6, 14, 23, 24, 25, 99], "append": [24, 67, 68, 70, 94, 125], "appli": [0, 14, 49, 59, 60, 70, 92, 94], "applic": [14, 59, 96, 119, 122, 123], "approach": 22, "appropri": [70, 72, 136, 145], "aqchem": 25, "ar": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 23, 24, 25, 26, 27, 28, 34, 35, 37, 38, 39, 40, 41, 42, 43, 46, 47, 49, 50, 51, 52, 54, 55, 59, 60, 62, 63, 64, 65, 67, 68, 69, 72, 73, 74, 76, 78, 79, 81, 82, 83, 85, 86, 87, 88, 92, 93, 94, 96, 97, 98, 99, 102, 104, 111, 113, 115, 116, 117, 118, 119, 122, 125, 127, 129, 130, 131, 132, 133, 136, 137, 138, 140, 142, 143, 145, 146], "arang": [65, 67, 74, 75, 76], "architectur": 126, "archiv": [5, 9, 10, 16, 17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 65, 68, 70, 72, 73, 74, 75, 76, 92, 94, 98, 99, 104, 108, 109, 137, 143, 145], "arctic": [37, 38, 67], "area": [10, 17, 27, 41, 64, 75], "area_ground": 41, "arg": 65, "argmin": [75, 76], "args_for_script": 5, "argu": 42, "argument": [4, 47, 65, 67], "argwher": 64, "aris": 80, "aross": 125, "around": [1, 12, 13, 15, 27, 28, 49, 59, 63, 74, 76], "arrai": [41, 64, 67, 68, 70, 75, 116, 125, 136, 142], "arrow": [49, 73, 81, 86], "articl": 42, "artm": 41, "artm1": 41, "artm2": 41, "asa": 70, "asarrai": [74, 75, 76], "ascii": [24, 59], "ask": [11, 12, 118, 127, 131, 133, 143], "aspect": 49, "assert": 64, "assess": 60, "asset": [59, 122, 123, 129], "assign": [74, 76, 96], "assign_coord": 76, "assist": 125, "associ": [8, 64, 72, 92, 94, 100, 121], "assum": [49, 50, 64, 70, 74, 76, 102, 106, 119, 122, 123], "atla": 74, "atlant": [74, 76], "atm": [3, 5, 8, 14, 23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 65, 72, 94, 104, 108, 109, 112, 137, 143], "atm_in": [3, 5, 23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 117], "atm_modelio": 23, "atm_ncpl": [93, 100], "atmopsher": 136, "atmospehr": 92, "atmospher": [0, 8, 14, 17, 20, 23, 25, 26, 35, 39, 40, 43, 49, 52, 65, 72, 82, 87, 90, 93, 96, 100, 121, 141], "attach": 42, "attempt": 116, "attend": [0, 123, 124, 127, 131, 133], "attent": [70, 80], "attr": [64, 67, 68, 70, 76], "attribut": [8, 28, 29, 30, 31, 32, 33, 70, 107, 108, 125], "august": [49, 75], "autoclos": 65, "autom": [7, 60], "automat": [9, 10, 23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 65, 96, 97, 100, 102, 104, 127, 129, 131, 133], "autoreload": [74, 75, 76], "auxiliari": 115, "avaiabl": 59, "avail": [0, 5, 8, 12, 20, 25, 27, 33, 35, 39, 43, 49, 50, 51, 52, 59, 70, 73, 74, 76, 78, 81, 91, 118, 121, 130], "averag": [17, 26, 35, 39, 43, 52, 64, 65, 67, 69, 70, 76, 108, 114, 116, 125, 136, 143], "avgfil": 125, "avgflag": 136, "avgflag_pertap": [23, 24, 25], "avoid": [50, 67, 70, 132], "aw": [74, 76], "awai": 37, "awar": [70, 76], "award": 63, "ax": [41, 50, 64, 65, 67, 68, 70, 74, 75], "ax1": 64, "ax_low": 76, "ax_shf": [74, 76], "ax_sst": [74, 76], "ax_upp": 76, "axes_grid1": 65, "axi": [37, 67, 74, 76], "b": [3, 5, 6, 8, 22, 27, 30, 40, 43, 45, 48, 49, 50, 67, 68, 70, 81, 113], "b1850": [3, 4, 5, 8, 15, 16, 18, 19, 20, 21, 30, 48, 49, 50, 51, 65, 68, 70, 72, 74, 75, 76, 81, 91, 92, 93, 94, 108, 109, 137, 138, 143], "b1850_bprp": [20, 21], "b1850_dc": 109, "b1850_high_freq": [108, 109], "b1850_high_freq_bugfix": 143, "b1850_rain_threshold": 138, "b1850_t750": 137, "b1850c5": [50, 51], "b1850c5l45bgc": 8, "b1850cmip6": 8, "b1850l45bgcr": 8, "b1pctcmip6": 8, "b_1850": 21, "b_1850_bprp": 21, "back": [11, 12, 13, 17, 48, 91, 96], "backend": 65, "backend_d": 65, "backend_kwarg": 65, "background": [14, 65, 67, 76, 86], "backward": 94, "bad": [64, 142], "bailei": [0, 35, 68], "balanc": 20, "bar": 76, "bare": 37, "barents_open": 74, "bartlein": 49, "basal": 42, "base": [0, 6, 7, 11, 22, 26, 35, 37, 42, 43, 51, 52, 59, 65, 70, 72, 83, 93, 100, 105, 106, 120], "base_path": 63, "bash": [28, 29, 30, 31, 32, 33, 40, 48, 49, 50, 72], "basic": [3, 4, 5, 7, 8, 13, 15, 16, 17, 18, 27, 67, 71, 73, 94, 96, 112, 119, 120, 123, 124, 130, 135], "basics_plot_1": [74, 76], "basics_plot_10": 76, "basics_plot_2": 74, "basics_plot_3": [74, 76], "basics_plot_4": [74, 76], "basics_plot_5": [74, 76], "basics_plot_6": [74, 76], "basics_plot_8": 76, "basics_plot_9": 76, "basin": 54, "batch": [4, 5, 7, 17, 59, 73, 94, 99, 102, 105], "batch_system_typ": 8, "bb": [22, 25], "bbox_inch": [74, 75, 76], "bbox_to_anchor": 65, "bc5l45bgc": 8, "bc_a4": 25, "bcg": 20, "bco2x4cmip6": 8, "bdrd": [8, 20], "becasu": [28, 29, 30, 31, 32, 33], "becaus": [3, 8, 28, 37, 42, 46, 49, 62, 63, 65, 67, 68, 74, 76, 96, 102, 104, 105, 125, 127, 143], "becom": [8, 15, 59, 70, 86, 121, 134, 145], "bed": 42, "bedrock": 42, "been": [0, 2, 6, 14, 15, 20, 22, 24, 40, 42, 62, 65, 70, 73, 79, 104, 121, 126], "befor": [3, 4, 13, 18, 24, 25, 27, 39, 47, 49, 50, 51, 63, 64, 65, 67, 68, 70, 71, 72, 74, 75, 76, 96, 102, 106, 131, 133, 142], "begin": [19, 42, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 120], "behav": 76, "behavior": 116, "being": [8, 38, 59, 129, 143], "bellow": 42, "belong": 17, "below": [8, 10, 11, 12, 14, 22, 24, 25, 26, 27, 37, 46, 54, 59, 62, 67, 70, 72, 73, 74, 76, 81, 82, 83, 86, 94, 112, 119, 120, 121, 122, 123, 124, 125, 127, 130, 131, 133, 134, 138], "benefit": [83, 94, 125], "benzen": 25, "bering_strait": 74, "best": 140, "beta": 6, "better": [14, 15, 51, 74, 90], "between": [10, 20, 22, 27, 29, 30, 35, 42, 43, 45, 49, 50, 52, 54, 57, 63, 64, 65, 70, 83, 86, 94, 100, 108, 109, 125, 137], "beyond": [73, 83, 121, 125], "bgc": [8, 43], "bgc_cice": 8, "bgc_cice_pop2": 8, "bgc_cice_pop2_mosart_sglc_swav": 8, "bgc_cice_pop2_rtm_sglc_swav": 8, "bgcwg": 87, "bhist": [8, 20], "bhist_bprp": 20, "bhistcmip6": [8, 67, 68, 70], "bhistsmbb": 8, "bias": [42, 74], "bigalk": 25, "bigen": 25, "biggest": 37, "bin": [67, 70, 74, 76, 127, 131, 133], "binari": [46, 59], "binder": 63, "biogeochem": [0, 138], "biogeochemistri": [8, 43, 45, 87], "biolog": 51, "biomass": 25, "bit": [42, 76, 95, 96, 104, 128, 145], "black": [41, 42, 74, 76, 86], "blanco": 38, "bld": [3, 4, 5, 9, 10, 11], "bldlog": 3, "bliesner": 49, "blig127kcmip6": 8, "block": 70, "blog": 59, "blue": [65, 68, 74, 76, 81, 123, 124], "blues_r": [67, 68], "bmh6kcmip6": 8, "bnd_topo": 31, "board": [22, 84], "boarder": [74, 76], "bold": 70, "bonu": 96, "book": [72, 119], "book_config_kei": 72, "book_toc": 72, "border": [74, 76], "borderaxespad": 65, "bosporus_strait": 74, "both": [9, 22, 40, 50, 60, 62, 65, 74, 76, 77, 78, 99, 120, 126, 130], "bottom": [49, 65, 120, 143], "boulder": 0, "bound": [70, 74, 76, 142], "boundari": [20, 25, 31, 32, 35, 52, 54, 64, 65, 67, 68], "box": [8, 16, 18, 36, 44, 47, 53, 56, 74, 107], "bp": 49, "bprp": 20, "branch": [12, 73, 90, 92, 95, 97, 104, 105], "brian": 0, "brief": 74, "briefli": 11, "bright": 14, "bring": [63, 96], "broad": [0, 121], "brown": [74, 76], "brows": 26, "browser": [73, 129], "bssp126": 8, "bssp245": 8, "bssp245smbb": 8, "bssp370": 8, "bssp370smbb": 8, "bssp370smbbext": 8, "bssp585": 8, "bssp585cmip6": [8, 40], "budget": 21, "buffer": [106, 136], "bufferediobas": 65, "bug": 143, "build": [1, 2, 4, 5, 6, 8, 10, 16, 17, 19, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 59, 63, 91, 92, 93, 99, 108, 109, 117, 122, 123, 132, 137, 138, 142, 143], "build_script": 3, "buildconf": [3, 5, 50], "buildcpp": 3, "buildlib": 3, "buildnml": [3, 5], "built": [3, 5, 19, 59, 63, 65, 99, 129], "bulletin": 84, "bundl": 116, "burn": 25, "button": [14, 49, 59, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 119, 122, 123], "bw1850": 8, "bw1850cmip6": 8, "bw1pctcmip6": 8, "bwco2x4cmip6": 8, "bwhist": 8, "bwhistcmip6": 8, "bwma1850": 8, "bwma1pctcmip6": 8, "bwmaco2x4cmip6": 8, "bwmahist": 8, "bwr": 70, "bwsc1850": 8, "bwsc1850smyle": 8, "bwschist": 8, "bwssp126": 8, "bwssp126cmip6": 8, "bwssp245": 8, "bwssp245cmip6": 8, "bwssp370": 8, "bwssp370cmip6": 8, "bwssp534o": 8, "bwssp534oscmip6": 8, "bwssp534osextcmip6": 8, "bwssp585": 8, "bwssp585cmip6": 8, "bwssp585extcmip6": 8, "by_coord": 76, "c": [12, 14, 41, 49, 65, 74, 75, 76, 120, 125, 136], "c171117": 46, "c1850eco": 20, "c2h2": 25, "c2h4": 25, "c2h5oh": 25, "c2h6": 25, "c3": 138, "c3h6": 25, "c3h8": 25, "c_p": 75, "cach": 65, "cachingfilemanag": 65, "calcul": [42, 49, 50, 59, 65, 67, 68, 75, 76, 77], "calculate_d18op": 50, "calder": [0, 39], "calendar": 49, "california": [74, 76], "call": [3, 5, 16, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 65, 67, 73, 74, 76, 99, 105, 108, 109, 117, 132, 136, 137, 138, 140, 143], "cam": [3, 5, 6, 8, 12, 20, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 49, 50, 65, 72, 73, 93, 100, 107, 110, 112, 121, 139, 140, 141, 144], "cam6": [8, 24, 27], "cam6_3_112": 64, "cam_cesm2_1_rel_60": 6, "cam_config_opt": [24, 50], "cam_diagnost": 137, "cam_history_nl": [23, 24, 25], "cam_initfiles_nl": 25, "camchem": [22, 25], "camconf": [3, 5], "campaign": [3, 5, 10, 25, 31, 32, 40, 46, 64, 65, 67, 68, 70, 72, 74, 75, 76, 92, 93, 118, 127, 131, 133], "can": [1, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 59, 60, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 76, 80, 82, 83, 84, 85, 91, 94, 96, 102, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126, 127, 129, 130, 132, 133, 134, 135, 137, 138, 142, 143, 146], "candid": 27, "cannot": [17, 96, 99, 100, 113, 115, 117, 142], "capabl": [29, 50, 51, 63, 83, 104], "capac": 59, "cape": 33, "capelmt": 33, "capelmt_mask": 33, "caption": 72, "captur": [40, 54], "carbon": [20, 21], "card": [68, 70], "care": 94, "carefulli": 40, "carma": [6, 12], "carma3_49_rel": 6, "carma_trop_strat09": 25, "carpentri": 121, "carre": 65, "carri": [22, 27, 91, 92, 104], "cartesian": 63, "cartopi": [50, 64, 65, 67, 68, 70, 74, 75, 76], "case": [1, 2, 6, 7, 9, 10, 11, 14, 16, 17, 18, 19, 22, 27, 29, 30, 31, 32, 33, 37, 38, 40, 42, 45, 46, 50, 54, 55, 56, 60, 64, 67, 71, 74, 80, 81, 88, 91, 92, 93, 94, 95, 96, 97, 99, 104, 105, 106, 108, 109, 112, 127, 132, 133, 137, 138, 140, 142, 143, 145], "case01": 140, "case1": 7, "case2": 7, "case_nam": 72, "casedir": [23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50], "casedoc": [4, 23, 24, 25, 28, 29, 30, 31, 32, 33, 40, 45, 46, 48, 49, 50, 74, 117], "casenam": [17, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 43, 48, 49, 50, 52, 74, 75, 76, 81], "casename_diff": [35, 52], "caseroot": [3, 4, 5, 6, 8, 9, 10, 24, 94, 99, 106, 117], "casestatu": [7, 17, 94], "casper": [26, 46, 59, 73, 74, 76, 119, 127, 129], "caspian": 8, "cat": 72, "caus": [49, 54, 70, 71, 76, 143, 145], "caution": 116, "cave": 51, "cax": [41, 65], "cb": 70, "cbar": [41, 64, 67, 70, 74, 75, 76], "cbar_ax": 65, "ccm": 0, "ccr": [50, 64, 65, 67, 68, 70, 74, 75, 76], "ccsm": [0, 60], "ccsm2": 81, "ccsm3": 81, "ccsm_bgc": 20, "ccsm_co2_ppmv": [20, 98], "ccwg": 87, "cd": [3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 72, 73, 91, 92, 93, 108, 109, 135, 137, 138, 143], "cecil": [0, 64, 65], "cell": [64, 65, 67, 68, 69, 70, 75, 119, 122, 123], "cell_method": [28, 29, 30, 31, 32, 33, 108, 137], "center": [0, 41, 42, 59, 67, 68, 70, 83], "centimet": [75, 76], "central": [0, 32, 59, 65, 67, 121], "central_longitud": [50, 65, 74, 76], "centuri": [45, 68], "certain": 125, "certainli": 68, "certif": [12, 47], "cesm": [1, 3, 4, 5, 6, 7, 8, 9, 10, 14, 17, 19, 22, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 42, 43, 46, 48, 49, 51, 52, 53, 57, 60, 62, 64, 65, 67, 68, 70, 72, 74, 75, 76, 78, 81, 83, 84, 86, 88, 92, 93, 95, 96, 102, 105, 106, 107, 109, 111, 112, 114, 116, 117, 118, 119, 120, 122, 123, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 136, 137, 139, 140, 141, 143, 145], "cesm1": [20, 50, 51, 53, 81], "cesm2": [0, 2, 6, 10, 11, 12, 20, 22, 27, 35, 40, 47, 60, 67, 68, 70, 80, 81, 82, 83, 84, 85, 114, 116, 121, 126], "cesm2_init": [3, 5], "cesm3": [35, 52, 72], "cesm_output_dir": 72, "cesm_proj": 8, "cesm_tim": 106, "cesm_tutori": 72, "cesm_tutorial_quick_run": 72, "cesmcod": 10, "cesmdata": [3, 5, 10, 25, 31, 32, 46, 118], "cesmroot": [137, 138], "cf": 75, "cfeatur": [65, 67, 68, 70, 74, 76], "cfg": [6, 11, 12], "cftime": [65, 68, 70], "cftime_rang": 70, "cgd": [0, 22, 67, 68, 70, 126], "ch2o": 25, "ch3cho": 25, "ch3cn": 25, "ch3coch3": 25, "ch3cocho": 25, "ch3cooh": 25, "ch3oh": 25, "chair": 87, "challeng": [21, 36, 42, 52, 53, 76], "chanc": 72, "chang": [7, 11, 12, 14, 16, 17, 18, 21, 22, 23, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 64, 65, 68, 69, 70, 73, 74, 76, 83, 86, 87, 88, 91, 92, 94, 96, 100, 104, 105, 106, 107, 108, 110, 111, 113, 114, 115, 116, 117, 121, 127, 131, 132, 133, 135, 137, 138, 143], "changelog": 11, "changelog_templ": 11, "chaotic": 68, "chapter": [12, 23, 27, 28, 29, 30, 31, 32, 33, 72, 88, 92, 96, 104, 105, 111, 112, 141, 145], "characterist": 49, "charge_account": 8, "cheat": [134, 135], "cheatsheet": 130, "check": [1, 2, 3, 5, 12, 14, 16, 18, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 64, 65, 67, 68, 70, 72, 74, 75, 76, 87, 94, 104, 106, 108, 110, 137, 142, 143, 145], "check_input_data": 3, "checkout": [12, 47], "checkout_extern": [50, 72], "chem": [23, 24, 25, 27], "chem_inparm": 25, "chem_mech": [23, 24], "chem_proc": [6, 11, 12], "chem_proc5_0_03_rel": 6, "chemic": [22, 23, 24, 51], "chemistri": [27, 87], "cheyenn": 129, "chief": 0, "chmod": 46, "choic": [7, 27, 72, 73], "choos": [22, 25, 27, 64, 65, 68, 76, 86], "chunk": [65, 70, 76, 136], "chunked_array_typ": 65, "cice": [3, 5, 6, 8, 11, 12, 36, 37, 38, 53, 67, 68, 100], "cice5_cesm2_1_1_20231220": 6, "cice6": 35, "cice_nml": 114, "cime": [2, 3, 4, 5, 6, 7, 8, 12, 16, 17, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 82, 91, 92, 93, 94, 108, 109, 126, 137, 138, 143, 146], "cime5": 6, "cime_config": [3, 5, 8, 11], "cime_output_root": [5, 10], "cimeroot": [8, 10], "circ": [74, 75, 76], "circl": [67, 68], "circul": [54, 55], "circular": [67, 68], "cisl": [59, 73, 118, 119, 122, 123, 124, 129], "cism": [3, 5, 6, 8, 11, 12, 23, 41, 104], "cism1": 8, "cism2": [6, 8], "cism_in": 23, "cl": 65, "clarifi": 63, "class": [39, 65], "clat": [74, 76], "cldlow": 28, "clean": [3, 4, 6, 24, 142], "clear": [67, 145], "clearli": 49, "clemen": 67, "click": [3, 4, 5, 6, 8, 12, 14, 16, 17, 18, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 81, 86, 91, 92, 93, 94, 96, 102, 104, 108, 109, 113, 115, 119, 122, 123, 129, 137, 138, 143], "client": [74, 76, 122, 123, 129], "clim": 63, "climat": [0, 22, 25, 27, 40, 42, 49, 51, 54, 55, 57, 60, 63, 68, 81, 82, 87, 91, 96], "climatolog": [27, 28], "climatologi": [35, 52, 70, 74], "clm": [3, 5, 6, 8, 11, 12, 14, 20, 39, 44, 45, 46, 70, 71, 93, 98, 100], "clm2": [3, 43, 45, 46, 70], "clm4_5": 3, "clm5": [6, 8], "clm5_0": 3, "clm5_param": 46, "clm_co2_typ": 98, "clm_namelist_opt": 8, "cln": 43, "clobber": 65, "clon": [74, 76], "clone": [2, 37, 38, 46, 50, 54, 55, 72, 130], "close": [41, 42, 74, 76], "close_on_error": 65, "closest": [75, 76], "cloud": [65, 66, 109, 121], "clubb": [6, 12], "cluster": [46, 59, 63, 122, 123, 126], "cm": [41, 67, 68, 74, 75, 76], "cmakelist": 11, "cmap": [41, 65, 67, 68, 70, 74, 75, 76], "cmip": [72, 78], "cmip6": [22, 25, 30, 40, 60, 81], "cmip6_bc_a4_anthro_surface_1750": 25, "cmip6_benzene_anthro_surface_1750": 25, "cmip6_bigalk_anthro_surface_1750": 25, "cmip6_bigene_anthro_surface_1750": 25, "cmip6_c2h2_anthro_surface_1750": 25, "cmip6_c2h4_anthro_surface_1750": 25, "cmip6_c2h4_other_surface_1750": 25, "cmip6_c2h5oh_anthro_surface_1750": 25, "cmip6_c2h6_anthro_surface_1750": 25, "cmip6_c2h6_other_surface_1750": 25, "cmip6_c3h6_anthro_surface_1750": 25, "cmip6_c3h6_other_surface_1750": 25, "cmip6_c3h8_anthro_surface_1750": 25, "cmip6_c3h8_other_surface_1750": 25, "cmip6_ch2o_anthro_surface_1750": 25, "cmip6_ch3cho_anthro_surface_1750": 25, "cmip6_ch3cn_anthro_surface_1750": 25, "cmip6_ch3coch3_anthro_surface_1750": 25, "cmip6_ch3cooh_anthro_surface_1750": 25, "cmip6_ch3oh_anthro_surface_1750": 25, "cmip6_co_anthro_surface_1750": 25, "cmip6_co_other_surface_1750": 25, "cmip6_dms_other_surface_1750": 25, "cmip6_emissions_1750_2015": 25, "cmip6_hcn_anthro_surface_1750": 25, "cmip6_hcooh_anthro_surface_1750": 25, "cmip6_ivoc_anthro_surface_1750": 25, "cmip6_mek_anthro_surface_1750": 25, "cmip6_nh3_anthro_surface_1750": 25, "cmip6_nh3_other_surface_1750": 25, "cmip6_no_anthro_surface_1750": 25, "cmip6_no_other_surface_1750": 25, "cmip6_num_bc_a4_anthro_surface_1750": 25, "cmip6_num_pom_a4_anthro_surface_1750": 25, "cmip6_num_so4_a1_anthro": 25, "cmip6_num_so4_a2_anthro": 25, "cmip6_pom_a4_anthro_surface_1750": 25, "cmip6_pop2": 8, "cmip6_so2_anthro": 25, "cmip6_so4_a1_anthro": 25, "cmip6_so4_a2_anthro": 25, "cmip6_svoc_anthro_surface_1750": 25, "cmip6_toluene_anthro_surface_1750": 25, "cmip6_xylenes_anthro_surface_1750": 25, "cmip6deck_cic": 8, "cmip6waccmdeck_cic": 8, "cn": 8, "cnphenologymod": 138, "co": [20, 25, 67, 68, 87], "co2": [8, 20, 49, 98], "co2_ff": 20, "co2_lnd": 20, "co2_ocn": 20, "co2a": 20, "co2b": 20, "co2c": 20, "coars": 67, "coast": [42, 74, 76], "coastlin": [50, 64, 70, 74, 75, 76], "code": [1, 2, 3, 4, 5, 7, 8, 9, 10, 15, 16, 17, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 41, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 65, 68, 70, 72, 73, 91, 92, 93, 96, 108, 109, 113, 117, 120, 121, 122, 123, 136, 137, 138, 139, 140, 141, 143], "code_of_conduct": 11, "codebas": 39, "coderoot": 38, "col": 70, "col_wrap": 70, "collabor": [59, 63, 121], "collect": [59, 136], "color": [14, 41, 42, 65, 67, 74, 75, 76], "colorado": 0, "colorbar": [41, 50, 63, 64, 65, 67, 68, 70, 74, 75, 76], "colormap": [65, 67, 68, 69, 70], "column": [8, 64, 77], "com": [8, 12, 47, 50, 72, 73], "combin": [22, 27, 29, 30, 41, 51, 64, 68, 70, 76, 83, 96, 125], "combine_attr": [67, 68], "come": [14, 30], "comet": [120, 134], "comma": [73, 94], "command": [1, 2, 6, 11, 12, 13, 14, 15, 16, 17, 18, 20, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 43, 44, 47, 48, 49, 50, 52, 53, 54, 55, 56, 65, 68, 72, 73, 92, 94, 108, 109, 113, 115, 119, 121, 122, 123, 124, 125, 127, 129, 130, 131, 132, 133, 134, 135, 137, 138, 143], "comment": [8, 64], "commit": [12, 87], "committe": [0, 87], "common": [10, 11, 37, 65, 72, 79, 82, 94, 125, 136], "commonli": [50, 51, 70, 125], "commun": [0, 8, 12, 14, 17, 22, 27, 39, 43, 59, 62, 63, 80, 84, 85, 86, 87, 121, 125], "comp": 72, "compar": [12, 21, 24, 25, 27, 35, 36, 37, 38, 42, 43, 45, 46, 47, 49, 51, 52, 53, 54, 55, 59, 60, 67, 71, 72, 76, 108, 109], "comparison": [26, 51, 60, 79, 106], "compat": [50, 63, 67, 68, 75, 94], "compil": [3, 16, 36, 37, 38, 40, 47, 53, 54, 55, 56, 99, 108, 117, 140], "complet": [1, 3, 5, 6, 10, 11, 12, 14, 16, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 67, 72, 73, 92, 94, 102, 105, 107, 108, 109, 117, 119, 120, 137, 145], "complex": [22, 63], "complic": 116, "compon": [0, 3, 4, 5, 6, 8, 14, 17, 20, 24, 27, 33, 34, 35, 38, 39, 42, 43, 48, 49, 50, 52, 55, 56, 62, 72, 73, 81, 83, 87, 94, 96, 98, 99, 100, 104, 106, 112, 117, 121, 137, 138, 142, 145], "compos": 82, "composet": 47, "composit": [50, 60], "comprehens": [8, 22, 59, 63, 112, 125, 130], "compris": [101, 102, 105], "compset": [16, 17, 21, 22, 23, 24, 25, 28, 30, 31, 32, 33, 36, 38, 39, 40, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 56, 81, 91, 92, 93, 108, 109, 137, 138, 143], "compset_match": 8, "comput": [3, 20, 39, 41, 49, 50, 59, 68, 72, 74, 86, 100, 105, 106, 118, 122, 123, 129, 130, 137], "computation_config": 72, "compute_notebook": 72, "con": 79, "concat_charact": 65, "concaten": [76, 125], "concentr": [20, 67, 79], "concept": [67, 88, 111, 141], "conclus": 42, "cond": 38, "conda": [63, 65, 70, 72], "condit": [25, 30, 60, 91, 93, 96, 142], "conduct": 35, "config": [4, 8, 11, 12, 22, 23, 27, 72], "config_compset": 8, "config_grid": 8, "config_p": 8, "configur": [8, 11, 20, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 39, 48, 49, 50, 51, 71, 72, 83], "confirm": [40, 135], "confus": 76, "congratul": [11, 12, 47], "connect": [63, 82, 83], "consequentiali": 55, "consid": [12, 25, 42, 49, 68], "consist": [10, 17, 70, 87, 96], "consitut": 20, "consituti": 20, "consortium": 35, "constant": [20, 42, 76, 98], "constitu": 20, "constrained_layout": [50, 70], "constraint": 96, "construct": [70, 72], "contact": [42, 118], "contain": [8, 10, 17, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 41, 43, 47, 50, 52, 53, 74, 75, 82, 104, 106, 108, 113, 121, 136, 137, 138, 143], "content": [11, 14, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 47, 49, 53, 72, 96, 104, 108, 118, 120, 125, 127, 131, 133, 135], "context": 65, "contextlib": 65, "contextmanag": 65, "continent": 54, "continu": [0, 49, 85, 87, 91, 93, 95, 96, 101, 102, 106], "continue_run": [91, 94, 95, 96, 97, 103, 104, 105, 117], "contour": 67, "contourf": [50, 65, 67, 74, 76], "contrast": [22, 67], "contribut": [0, 11, 42, 54, 63], "contributor": 63, "control": [19, 20, 21, 22, 27, 29, 30, 31, 32, 33, 35, 37, 38, 43, 45, 46, 51, 52, 54, 55, 56, 70, 72, 74, 81, 88, 91, 92, 94, 96, 99, 102, 104, 105, 108, 113, 115, 116, 117, 121], "controlcas": [35, 52], "convect": [14, 27, 28, 29, 30, 31, 32, 50, 64], "convective_precip_nam": 64, "conveni": [41, 116], "convent": [8, 48, 49, 50, 63, 72, 81], "converg": 67, "convers": [42, 70, 121], "convert": [14, 20, 42, 59, 62, 63, 64, 67, 68, 70, 72, 109], "cooper": 0, "coord": [50, 67, 68, 70, 75, 76], "coordin": [5, 35, 52, 63, 70, 74, 77, 83, 87, 104, 125], "copi": [3, 5, 7, 23, 24, 25, 31, 32, 33, 38, 40, 42, 55, 65, 70, 75, 76, 96, 104, 127, 131, 133, 135, 137, 138, 140], "coral": 51, "core": [35, 52, 74, 76], "corner": [64, 65, 67, 68, 70, 72, 73, 74, 75, 76], "cornerston": 59, "corpor": [17, 121], "correct": [1, 16, 42, 49, 73, 104, 127, 131, 133, 143, 145], "correctli": [14, 40, 48, 50, 94, 127, 133, 137], "correl": 42, "correspond": [41, 68, 81, 136], "cosp2": [6, 12], "cost": 106, "could": [31, 32, 38, 41, 42, 65, 67, 68, 70, 76, 94, 99, 125, 127, 131, 133], "coupl": [35, 39, 40, 42, 48, 49, 50, 52, 82, 87, 90, 91, 92, 93, 100, 142], "coupler": [0, 20, 39, 96, 101, 143], "cours": [101, 127, 131, 133], "cover": [1, 3, 4, 15, 20, 22, 25, 65, 67, 69, 73, 88, 111, 112, 113, 115, 120], "cp": [7, 24, 31, 32, 33, 38, 40, 46, 55, 92, 93, 127, 131, 133, 135, 137, 138], "cp_data": 64, "cpl": [3, 4, 5, 49, 142, 143, 145], "cpl_modelio": 23, "cpl_ssp5": 40, "cpl_ssp585": 40, "cplhist": [8, 40], "cpu": [6, 133], "cr": [50, 64, 65, 67, 68, 70, 74, 75, 76], "crash": [100, 104, 142, 143, 144], "creat": [0, 1, 2, 3, 4, 5, 9, 10, 11, 16, 17, 19, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 59, 63, 65, 67, 68, 72, 74, 75, 85, 90, 91, 92, 93, 99, 104, 108, 109, 113, 115, 121, 125, 129, 134, 135, 137, 138, 143], "create_clon": [7, 11, 37, 38, 46, 54, 55], "create_newcas": [2, 8, 11, 16, 17, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 40, 44, 45, 47, 48, 49, 50, 53, 56, 91, 92, 93, 99, 108, 109, 137, 138, 143], "create_test": 11, "creation": 117, "criteria": 87, "critic": [0, 55], "crop": [8, 43, 45], "crop_cice_pop2": 8, "cross": [40, 76, 127], "crucial": 54, "cseg": [10, 25, 31, 32, 46, 118], "csh": 40, "cshell": [127, 131, 133], "csm": [0, 60], "csm1": 81, "csm_share": 3, "ctrl": 49, "ctsm": [43, 70, 121], "cube": [64, 66], "cupid": [62, 73], "current": [3, 4, 5, 8, 9, 10, 11, 12, 22, 30, 42, 47, 49, 54, 55, 62, 68, 70, 72, 73, 74, 76, 83, 87, 94, 99, 105, 108, 114, 116, 118, 135, 138], "curv": 109, "curvilinear": [74, 76, 77], "custom": [4, 23, 24, 25, 28, 29, 30, 31, 32, 33, 69, 72, 99, 101, 108, 109, 111, 137, 143], "customiz": 130, "cut": 68, "cvcwg": 87, "cvdp": 57, "cvmix": [6, 12], "cycl": [20, 21, 51], "cyclic": 76, "d": [6, 36, 50, 64, 65, 67, 68, 70, 72, 75, 76, 94, 109, 114, 123, 124, 125], "d18o": 50, "d18o_new": 50, "d18op": 50, "da": [70, 76], "da467520": 65, "da_list": [67, 68, 70], "dagnost": 70, "dai": [6, 9, 14, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 44, 45, 46, 64, 70, 91, 93, 96, 100, 102, 106, 108, 113, 115, 121, 127, 133, 143], "daili": [21, 23, 24, 25, 40, 74, 76, 108, 113, 114, 115, 116, 137, 143], "dark": 86, "darkgrai": [74, 76], "dart": 8, "dash": 8, "dashboard": [74, 76], "dask": [59, 63], "dask_jobqueu": [74, 76], "dat_low": 76, "dat_upp": 76, "data": [1, 3, 5, 8, 10, 14, 17, 23, 25, 27, 28, 29, 30, 39, 40, 41, 42, 43, 60, 67, 68, 71, 72, 73, 80, 81, 83, 92, 97, 99, 110, 113, 114, 115, 118, 122, 123, 124, 134], "data_assimil": 11, "data_avg": 64, "data_filenam": 63, "data_global_averag": 64, "data_model": 65, "data_region_averag": 64, "data_sourc": 72, "data_var": [50, 76], "dataarrai": [67, 68, 70, 76], "datafil": 68, "datai": 64, "dataproj": 64, "dataset": [27, 30, 31, 32, 35, 39, 41, 42, 50, 52, 63, 65, 67, 68, 74, 76, 79, 96, 97, 125], "date": [0, 25, 30, 41, 68, 70, 79, 95, 96, 97, 104, 106, 125], "datestamp": 106, "datetim": [68, 74, 76], "datm": 8, "dav": [74, 76], "davgovr": 65, "david": [0, 35, 67, 68], "davis_strait": 74, "day5": [43, 44, 45, 46], "dbug": 91, "dc": 109, "dd": [97, 104], "dd8b": 65, "deactiv": 83, "deal": [40, 77], "debug": [62, 91, 98, 144, 146], "dec": 50, "decad": 42, "decid": [27, 62, 87], "decidu": 138, "decis": 12, "decod": 65, "decode_cf": 65, "decode_coord": 65, "decode_tim": 65, "decode_timedelta": 65, "decreas": [46, 65, 96, 102], "deep": [27, 54, 59, 76], "deeper": [59, 80], "def": [50, 64, 65, 70, 75, 76], "default": [8, 18, 20, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 39, 40, 50, 52, 62, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 92, 93, 94, 96, 98, 100, 102, 104, 109, 112, 113, 123, 124, 125, 127, 131, 132, 133, 136, 143], "default_kernel_nam": 72, "defin": [3, 8, 17, 24, 42, 55, 64, 65, 67, 68, 70, 74, 77, 99, 136, 138], "definit": [31, 35, 39, 43, 45, 47, 49, 50, 52, 56], "deg": [8, 38, 40, 41, 42, 49], "degre": [22, 25, 28, 40, 49, 67, 69], "del": [65, 67, 68, 70, 74, 76], "delai": [6, 33], "delet": [4, 9, 72, 135], "delimit": 94, "deliv": 59, "delta": [37, 50], "delv": [15, 80], "demonstr": [59, 63, 67, 143], "denmark_strait": 74, "denomin": 70, "denot": [70, 125], "dens": 54, "densiti": [42, 54, 74, 75], "depend": [5, 13, 74, 76, 86, 112], "deploy": 59, "deposit": [23, 51], "deppenmei": 76, "deprec": [3, 5], "depth": [67, 70, 75, 76], "derecho": [3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 18, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 59, 63, 65, 68, 70, 72, 73, 74, 75, 76, 91, 92, 93, 96, 99, 102, 106, 108, 109, 119, 121, 132, 137, 143], "deriv": 69, "derive_var": 72, "desch": 6, "desched1": [5, 6], "descib": 41, "describ": [8, 12, 25, 62, 68, 70, 79, 83, 88, 99, 111, 119, 122, 123, 125, 127, 131, 133, 136, 141], "describe_vers": 11, "descript": [6, 12, 30, 42, 82, 92, 94, 135], "descriptor": 63, "design": [0, 2, 19, 34, 72, 84, 87, 122, 123, 125, 130], "desktop": 129, "destin": [67, 135], "detach": 12, "detachedhead": 12, "detail": [2, 3, 4, 5, 8, 10, 11, 14, 15, 17, 55, 59, 80, 81, 83, 96, 105, 121, 126, 129, 135, 136, 141], "determin": [8, 12, 37, 38, 76, 93, 95, 96, 97, 101, 104, 127, 131, 133], "detrend": [60, 125], "dev": 72, "develop": [0, 1, 12, 13, 17, 22, 35, 40, 54, 57, 59, 60, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 83, 86, 87, 119, 121, 122, 123, 127, 129, 130, 132, 134], "deviat": [37, 74, 76, 77, 113], "devic": [119, 122, 123], "dfferenc": 70, "diagnost": [8, 20, 41, 57, 60, 62, 65, 68, 70, 72, 74, 80, 81, 119, 122, 123], "diagram": 22, "diamet": 109, "dic": 8, "dic14": 8, "dic_mosart_cism2": 8, "dict": [65, 70], "dictat": 104, "did": [16, 18, 37, 38, 46, 68, 74, 96, 109, 145], "didn": [65, 72, 76], "diff": [45, 46, 109, 125], "diff_artm": 41, "diff_mh": 49, "diff_smb": 41, "diff_sst": 32, "diff_thk": 41, "diff_topo": 31, "differ": [8, 10, 11, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 65, 67, 68, 69, 71, 72, 74, 76, 77, 94, 96, 108, 109, 112, 117, 121, 122, 123, 124, 125, 127, 137], "differen": 125, "differenc": 67, "difficult": [42, 86], "difficulti": [76, 118], "dim": [64, 65, 68, 70, 76], "dimens": [63, 64, 65, 67, 68, 70, 74, 76, 125, 136], "dimension": [21, 70, 125], "dimes": 125, "din_loc_root": [3, 8, 10, 30], "dipol": [67, 68], "direct": [10, 51], "directli": [10, 17, 63, 72, 117, 130], "directori": [1, 3, 4, 5, 7, 8, 9, 10, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 64, 65, 68, 70, 71, 72, 73, 74, 75, 76, 81, 91, 92, 93, 94, 96, 97, 99, 104, 108, 111, 117, 118, 127, 131, 132, 133, 135, 137, 140, 141, 143, 145], "disappear": 6, "discard": 12, "discontinu": [74, 76], "discuss": [22, 35, 39, 42, 43, 52, 55, 84, 86, 123, 124], "disk": [68, 70, 145], "diskless": 65, "displac": [8, 42], "displai": [22, 25, 41, 49, 59, 60, 119, 122, 123, 129, 135], "distribut": [13, 67, 69, 74, 76], "divers": 59, "divid": [50, 67, 70, 142], "dlnd": 40, "dlnd_cplhist_cas": 40, "dlnd_cplhist_dir": 40, "dlnd_cplhist_yr_align": 40, "dlnd_cplhist_yr_end": 40, "dlnd_cplhist_yr_start": 40, "dm": 25, "do": [3, 4, 5, 7, 8, 12, 14, 16, 17, 18, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 45, 46, 47, 49, 50, 52, 53, 54, 55, 56, 65, 67, 68, 70, 72, 73, 74, 76, 90, 91, 93, 94, 96, 99, 104, 106, 108, 110, 113, 115, 118, 120, 121, 122, 123, 124, 125, 127, 129, 131, 133, 134, 136, 139, 144], "dobbin": 0, "doc": [11, 22, 23, 27, 53], "docn": 23, "docn_in": [23, 24, 25], "document": [0, 2, 4, 7, 8, 12, 37, 38, 52, 59, 60, 72, 73, 81, 82, 91, 99, 108, 109, 111, 117, 119, 121, 122, 123, 124, 125, 126, 130, 146], "doe": [8, 10, 11, 12, 17, 35, 38, 49, 50, 52, 63, 65, 67, 68, 70, 72, 74, 76, 96, 109, 130, 142], "doesn": [11, 65, 72, 130, 143], "domain": 8, "domin": [59, 67], "don": [14, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 49, 70, 76, 91, 92, 112, 121, 137, 143, 145], "done": [3, 11, 24, 25, 33, 38, 42, 59, 64, 66, 67, 70, 72, 74, 94, 96, 100, 112, 126], "dot": 70, "doubl": [8, 25, 73, 92], "dout_": 98, "dout_s_root": [6, 9, 10, 104, 145], "down": [6, 27, 54, 65, 70, 73, 74, 76, 81, 145], "download": [1, 2, 3, 11, 13, 17, 19, 26, 40, 50, 59, 72, 121, 129], "downscal": 39, "downward": 65, "dpi": [74, 76], "drake_passag": 74, "draw": 42, "draw_label": [74, 75, 76], "drive": 55, "driver": [3, 5, 38, 98, 104], "drof": 8, "drop": [67, 68, 70, 73, 74, 76, 81], "drop_vari": 65, "drv": [3, 5, 8, 104], "drv_flds_in": 23, "drv_in": 23, "drwxr": 11, "dry": [20, 23], "dryrun": 94, "ds_area": 68, "ds_h": 75, "ds_in": [67, 68, 70], "ds_mom": 74, "ds_pop": 76, "ds_pop_cyc": 76, "ds_siconc_ocean": 67, "ds_swcf": 65, "ds_swcf_zonal": 65, "ds_t": 65, "ds_vol": 68, "dsann": 70, "dsdiff": 70, "dsfin": 70, "dsglobalwgt": 70, "dsini": 70, "dso": 76, "dt": [38, 68], "dt_count": 100, "dt_option": 100, "du": [36, 108], "due": [39, 42, 100], "dump": 125, "duo": 73, "dure": [28, 35, 41, 42, 49, 52, 65, 73, 74, 76, 101, 105, 127, 132, 133, 134, 135], "duvivi": [0, 35, 43, 68, 73], "dwav": 8, "dycor": 22, "dynam": [0, 22, 63, 136], "dz": [38, 75], "e": [4, 12, 15, 20, 22, 24, 28, 41, 42, 46, 49, 50, 60, 62, 64, 65, 68, 70, 72, 73, 74, 76, 79, 104, 105, 117, 125, 129], "e12": 42, "e13": 50, "e20": [3, 5, 8], "e21": [23, 24, 25, 30, 40, 48, 49, 67, 68, 70, 81], "e90": 25, "each": [6, 8, 10, 15, 21, 24, 35, 39, 41, 43, 48, 49, 50, 52, 64, 65, 67, 68, 70, 72, 73, 79, 82, 87, 94, 102, 104, 105, 106, 108, 113, 115, 116, 121, 125, 136], "earli": 73, "earth": [0, 11, 17, 49, 50, 51, 65, 79, 82, 86, 87, 121], "earthcub": 63, "earthsystemmodel": 83, "easi": [2, 59, 64, 78, 121], "easier": 76, "easili": [15, 70, 76, 104], "east_lon": 64, "eccentr": 49, "echo": [28, 29, 30, 31, 32, 33, 94, 127, 131, 133], "eco": 8, "eco_mosart_cism2": 8, "ecosi": [20, 21], "ecosystem": [20, 59], "ecosystemabiot": 8, "eddington": 37, "edg": 67, "edge_node_connect": 63, "edgecolor": [67, 68, 74, 76], "edit": [4, 23, 24, 25, 28, 29, 30, 31, 32, 33, 37, 38, 49, 54, 55, 104, 108, 109, 110, 117, 130, 137, 138, 143], "editor": [17, 23, 24, 25, 28, 29, 30, 31, 32, 33, 49, 74, 94, 123, 124, 127, 131, 133], "edu": [8, 22, 25, 26, 27, 42, 52, 53, 73, 80, 109, 114, 116, 118, 119, 122, 123], "educ": 59, "effect": [33, 37, 42, 49], "effgw0": 64, "effici": [62, 83, 106], "effort": [0, 59, 63, 83, 87], "either": [39, 70, 72, 73, 76, 100], "elap": 6, "element": [10, 17, 70, 94], "elev": [39, 42], "elizabeth": 0, "els": [33, 42, 64, 65, 70, 74, 76], "elsewher": 20, "emac": [49, 94], "embed": 130, "emi": 25, "emis_bc_a4_0": 25, "emis_benzene_0": 25, "emis_bigalk_0": 25, "emis_bigene_0": 25, "emis_c2h2_0": 25, "emis_c2h4_0": 25, "emis_c2h5oh_0": 25, "emis_c2h6_0": 25, "emis_c3h6_0": 25, "emis_c3h8_0": 25, "emis_ch2o_0": 25, "emis_ch3cho_0": 25, "emis_ch3cn_0": 25, "emis_ch3coch3_0": 25, "emis_ch3cocho_0": 25, "emis_ch3cooh_0": 25, "emis_ch3oh_0": 25, "emis_co_0": 25, "emis_dms_0": 25, "emis_glyald_0": 25, "emis_hcn_0": 25, "emis_hcooh_0": 25, "emis_isop_0": 25, "emis_ivoc_0": 25, "emis_mek_0": 25, "emis_nh3_0": 25, "emis_no_0": 25, "emis_num_bc_a4_0": 25, "emis_num_pom_a4_0": 25, "emis_num_so4_a1_0": 25, "emis_pom_a4_0": 25, "emis_so2_0": 25, "emis_so4_a1_0": 25, "emis_svoc_0": 25, "emis_terpenes_0": 25, "emis_toluene_0": 25, "emis_xylenes_0": 25, "emiss": 22, "emissions_e90global_surface_1750": 25, "emphas": 65, "emul": 130, "en": 72, "enabl": [1, 50, 51, 63, 119, 122, 123], "encod": 99, "encount": [84, 98, 104], "encourag": [87, 123, 124], "end": [3, 4, 5, 8, 14, 19, 33, 40, 42, 70, 74, 75, 76, 91, 92, 137, 143], "end_year": 72, "ene_surface_1750": 25, "energi": [33, 70], "engin": [59, 65, 87], "english_channel": 74, "enhanc": 63, "enough": [38, 42], "ensembl": [60, 68, 70, 76, 80], "enso": 60, "ensur": [1, 17, 65, 83, 94, 127, 131, 132, 133], "enter": [3, 4, 5, 8, 40, 50, 58, 61, 65, 68, 72, 73, 84, 119], "entir": [49, 59, 67, 73, 143], "entri": [25, 136], "env": [63, 65, 72], "env_": [7, 94, 99], "env_arch": [17, 99], "env_batch": [17, 94, 99], "env_build": [3, 17, 99], "env_cas": [17, 99], "env_mach_p": [17, 99], "env_mach_specif": [4, 17, 99], "env_run": [17, 25, 45, 91, 92, 94, 96, 97, 98, 99, 100, 101, 102, 104, 105, 106, 113, 115], "environ": [14, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 40, 43, 48, 49, 50, 59, 63, 72, 73, 94, 119, 122, 125, 129, 130, 134], "environemnt": 72, "environment": 51, "eof": [72, 125], "epoch": 49, "eq": 75, "equat": [37, 70, 75, 76], "equatori": [74, 76], "equival": 42, "erik": 43, "errno": 65, "error": [7, 29, 30, 40, 76, 94, 142, 143, 145], "escomp": [12, 17, 47], "esd": 70, "esm": [37, 38], "esmf": 67, "esp": [3, 8], "esp_modelio": 23, "especi": [42, 84], "espwg": 87, "establish": 49, "estim": [13, 76, 106], "et": [35, 38, 42, 49, 52, 54, 68, 70], "etc": [15, 20, 37, 38, 47, 53, 54, 55, 59, 65, 79, 81, 84, 94, 112, 122, 123, 124, 125, 130], "evalu": [12, 27, 35, 43, 51, 52, 79, 94, 96, 102, 104, 113, 115], "even": [40, 121, 130], "evenli": 76, "event": [80, 109], "ever": 40, "everi": [1, 25, 35, 41, 46, 52, 106, 108, 113, 115, 127, 128, 131, 133], "everyth": [0, 72, 74, 76, 104], "everywher": 76, "evid": 143, "evolut": [8, 39, 41, 42, 104], "evolv": [0, 35, 39, 40, 42, 52, 68], "ex": [3, 143], "exact": [96, 104], "exactli": [27, 68, 95, 104], "examin": [19, 35, 40, 43, 52, 63, 72, 118], "exampl": [3, 4, 5, 6, 7, 8, 12, 22, 24, 26, 50, 52, 59, 60, 62, 64, 65, 66, 68, 69, 70, 72, 73, 74, 94, 100, 102, 104, 105, 106, 113, 115, 120, 125, 135, 140, 141, 145], "excel": 84, "except": [52, 65, 142], "exchang": 20, "execcasp": [74, 76], "execut": [1, 2, 3, 41, 42, 47, 63, 72, 73, 97, 119, 122, 123, 124, 129], "exercis": [3, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 18, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 42, 44, 45, 46, 48, 49, 50, 53, 54, 55, 56, 63, 67, 70, 72, 88, 94, 96, 102, 108, 109, 111, 119, 137, 138, 141, 143, 145], "exeroot": [3, 4, 5, 9, 10], "exetern": 121, "exist": [4, 7, 22, 39, 40, 49, 62, 72, 125, 127, 131, 133], "exit": [26, 49, 143], "exodu": 63, "expand": [0, 80, 91], "expect": [8, 11, 37, 38, 46, 54, 121, 134], "expens": 42, "experi": [0, 5, 7, 8, 10, 12, 13, 16, 17, 20, 22, 27, 35, 37, 38, 40, 42, 43, 45, 46, 51, 52, 54, 55, 62, 73, 80, 84, 96, 120, 122, 123, 134], "experiment": [12, 35, 39, 43, 45, 46, 52], "expert": 79, "explain": [70, 111, 116], "explan": [22, 27, 74], "explicitli": [8, 121], "explor": [13, 26, 50, 56, 70, 80, 81, 82, 92, 118, 123, 124], "export": [28, 29, 30, 31, 32, 33, 40, 48, 49, 50, 127, 131, 133], "express": [8, 50], "extend": [50, 74, 76], "extens": [27, 70, 99, 125, 130, 135], "extent": [74, 76], "extern": [6, 11, 12, 72], "externals_c": [6, 12], "externals_cam": [6, 11, 12], "externals_clm": [6, 12], "externals_pop": [6, 12], "extra": [15, 24, 114], "extract": [41, 59], "extrapol": 137, "extrem": [104, 125], "f": [14, 23, 24, 25, 49, 63, 64, 65, 68, 70, 72, 74, 75, 76, 94, 135], "f09": 25, "f09_f09_mg17": [23, 24, 25, 28, 29, 30, 31, 32, 33], "f09_g17": [20, 67, 68, 70, 81], "f09_g17_gl4": [43, 44, 45, 46], "f19_f19_mg17": [28, 29, 30, 31, 32, 33], "f19_g16": [50, 51], "f19_g17": [3, 5, 8, 16, 20, 21, 30, 40, 48, 49, 51, 91, 92, 93, 108, 109, 137, 138, 143], "f19_g17_gl4": [39, 40], "f19_g17_gris4": 40, "f2000": [31, 32, 33], "f2000_control": 28, "f2000climo": [27, 29, 31, 32, 33], "f2010climo": 27, "f90": [33, 38, 55, 137, 138], "f_": 38, "f_aic": 36, "f_hi": 36, "f_var": [36, 37, 38], "face": 63, "face_lat": 63, "face_lon": 63, "face_node_connect": 63, "facecolor": [70, 74, 76], "facil": 0, "facilit": 59, "fact": 42, "factor": [38, 42, 55, 64], "fail": 146, "faircloth": 0, "fairli": [8, 65, 68], "fake": 27, "fall": 0, "fals": [3, 12, 54, 65, 67, 70, 72, 75, 76, 92, 93, 94, 95, 96, 97, 102, 104, 105, 114], "familar": 121, "familiar": [8, 11, 12, 15, 31, 32, 63, 70, 119, 121, 134], "faq": [53, 59], "far": [76, 121], "fashion": [95, 96], "fast": [48, 49, 50], "faster": [28, 49], "fate": [6, 12], "favor": 94, "favorit": 130, "fcev": 70, "fchist": [23, 24, 25], "fcnudged_mam4_f09": 25, "fctr": 70, "feasibl": 142, "featur": [8, 12, 20, 65, 67, 68, 70, 74, 75, 76, 94, 121, 130], "feb": 68, "februari": 75, "feedback": 83, "feel": [31, 32, 34, 65, 67, 68, 70, 74, 75, 76, 86], "fellow": 121, "ferret": [46, 125], "few": [14, 41, 49, 68, 70, 123, 124, 125, 130, 134, 135], "fgev": 70, "fhist": 27, "fi": 72, "field": [20, 22, 42, 70, 76, 108, 109, 113, 115, 116, 136, 137, 142, 143], "fig": [41, 50, 64, 65, 67, 68, 70, 74, 76], "fig1": 64, "figsiz": [41, 42, 50, 64, 65, 67, 68, 70, 74, 75, 76], "figur": [3, 4, 5, 8, 10, 11, 14, 20, 22, 26, 27, 31, 32, 33, 35, 37, 39, 41, 42, 43, 45, 49, 52, 54, 56, 60, 64, 65, 67, 68, 70, 73, 74, 75, 76, 78, 79, 81, 82, 83, 84, 85, 86, 99, 107, 109, 117, 121, 123, 124, 125, 126, 129, 137, 140, 145], "fil": 64, "file": [3, 4, 5, 7, 8, 9, 10, 11, 12, 16, 17, 18, 20, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 52, 53, 54, 55, 57, 59, 60, 64, 65, 67, 68, 70, 72, 88, 91, 92, 93, 95, 97, 98, 100, 101, 105, 107, 108, 109, 110, 111, 112, 114, 116, 117, 121, 123, 124, 127, 130, 131, 133, 134, 135, 136, 137, 138, 141, 142, 143, 146], "file0": 76, "file1": [3, 5, 41, 125], "file2": [3, 5, 41, 125], "file_areag": 41, "file_in": 125, "file_manag": 65, "file_mass": 41, "file_mass_above_flot": 42, "file_nam": 65, "file_out": 125, "filenam": [65, 72, 104, 127, 131, 133, 135], "filename_or_obj": 65, "filenotfounderror": 65, "filepath": 65, "fill": [67, 74, 76], "fill_betweenx": 76, "filter": 60, "filterwarn": [74, 75, 76], "final": [3, 11, 14, 42, 67, 68, 70, 73], "fincl": [28, 29, 30, 31, 32, 33, 108, 143], "fincl1": 113, "fincl10": 113, "fincl2": [23, 24, 25, 28, 29, 30, 31, 32, 33, 108, 113, 137, 143], "fincl3": [108, 113], "find": [14, 17, 23, 24, 25, 26, 38, 41, 70, 73, 75, 76, 91, 92, 93, 94, 104, 105, 111, 120, 121, 125, 128, 129, 135, 137, 138, 140, 142, 143], "find_nearest": 75, "finish": [3, 5, 6, 23, 24, 25, 48, 49, 71, 72, 91, 104, 106], "fire": 25, "first": [1, 3, 4, 5, 8, 12, 13, 14, 17, 19, 23, 24, 25, 35, 41, 43, 52, 55, 59, 62, 67, 68, 72, 73, 74, 80, 85, 94, 96, 102, 105, 106, 109, 116, 122, 123, 125, 129, 137, 143, 145], "five": [10, 17], "fix": [27, 49, 70], "fix_tim": 70, "fixed_paramet": 49, "flag": [72, 97, 101, 104, 105, 136], "flaki": [74, 76], "flatten": 64, "flbc_file": 25, "fldlst": 143, "flds_wiso": 50, "flexibl": [59, 83, 116], "flip": 65, "flist": [75, 76], "fln": [28, 29, 30, 31, 32, 33], "flnt": [28, 29, 30, 31, 32, 33], "float": [28, 29, 30, 31, 32, 33, 108, 137, 142], "floatat": 42, "floor": 76, "florida_bahama": 74, "florida_bahamas_extend": 74, "florida_cuba": 74, "flotat": [41, 42], "flow": 54, "flux": [20, 21, 28, 29, 30, 31, 32, 33, 39, 67, 70, 74, 76, 77], "fmthist_v0c": 64, "fname": 136, "focu": [15, 41, 121], "folder": [25, 72, 73], "follow": [2, 3, 4, 5, 6, 8, 12, 15, 16, 20, 21, 23, 24, 25, 37, 38, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 63, 64, 65, 68, 73, 74, 76, 91, 94, 104, 108, 113, 115, 116, 118, 119, 122, 123, 124, 125, 127, 131, 132, 133, 136, 137, 140, 143], "fontsiz": [41, 42, 65, 67, 68, 70, 75], "fontweight": 70, "food": 42, "forc": [8, 20, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 49, 53, 54, 55, 56, 60, 65, 66, 74, 76, 108, 109, 127, 132, 133, 135, 137, 138, 143], "forcefulli": 135, "forcing_coupl": 55, "forget": 92, "form": [83, 84, 104, 125], "format": [8, 26, 46, 54, 59, 62, 63, 65, 72, 78, 94, 125, 135, 145], "fortran": [24, 38, 125], "fortran_unit_test": 11, "forum": [22, 35, 39, 43, 52], "forward": [49, 119, 122, 123, 129, 130], "fossil": 20, "foster": 59, "found": [8, 12, 17, 20, 22, 23, 25, 27, 30, 38, 40, 42, 59, 68, 72, 83, 100, 107, 117, 126, 143, 146], "foundat": 0, "four": [1, 65, 119], "frac": 50, "fraction": [65, 67, 68, 70], "fram_strait": 74, "frameon": 65, "framework": [11, 65, 72], "free": [31, 32, 34, 59, 65, 67, 68, 70, 74, 75, 76, 86, 121, 130], "freeli": [0, 59], "freq": 70, "frequenc": [17, 40, 62, 90, 92, 93, 98, 100, 101, 107, 110, 111, 112, 114, 116, 117], "frequent": [17, 119, 122, 123], "fresh": 42, "fri": 127, "from": [4, 6, 8, 9, 10, 12, 13, 14, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 35, 37, 38, 39, 40, 41, 43, 45, 46, 49, 50, 51, 52, 54, 55, 56, 59, 60, 63, 64, 67, 68, 69, 71, 72, 73, 74, 75, 76, 77, 81, 82, 91, 92, 93, 94, 96, 97, 104, 109, 113, 118, 120, 121, 122, 123, 125, 126, 130, 134, 138], "from_array_kwarg": 65, "fsd": 70, "fsen": 67, "fsens_ai": 67, "fsens_diff": 67, "fsr": 70, "fuel": 20, "full": [8, 67, 70, 94, 102, 104, 116, 120, 125, 136, 145], "full_pth": 74, "fulli": [20, 39, 40, 48, 49, 50, 60, 87, 91, 93, 125], "func": 65, "function": [21, 42, 46, 50, 59, 63, 64, 65, 68, 70, 72, 74, 77, 120, 125, 129], "fund": 63, "fundament": 63, "further": [42, 55, 63, 73, 123, 124], "futur": [12, 15, 38, 39, 83, 85], "futurewarn": 67, "fv1": 42, "fv2": 42, "fv_1": 31, "fvitt": 26, "fwhist": [23, 24, 25], "fwhistbgccrop": 25, "fwmahist": 22, "fwschist": 22, "g": [8, 12, 15, 20, 22, 24, 36, 38, 42, 46, 49, 50, 53, 56, 62, 65, 68, 70, 72, 73, 79, 125, 129], "g16_g16": 8, "g17_g17": 8, "g1850eco": [20, 52, 56], "g1850ecoiaf": 20, "g_control": [36, 37, 38, 53, 54, 55], "g_diff": [37, 38], "g_eco1850": 56, "g_ksno": 38, "g_overflow": 54, "g_snowalbedo": 37, "g_windstress": 55, "gain": 84, "galleri": 63, "gase": 49, "gazillion": 59, "gc": 70, "gca": [65, 70], "gen": 65, "gener": [3, 8, 23, 24, 40, 42, 59, 60, 65, 70, 96, 106, 112, 113, 115, 117, 125], "geo_pth": 74, "geocat": [68, 70], "geodatafram": 63, "geolat": 74, "geolog": 49, "geolon": 74, "geometri": 63, "geophys": 26, "geopotenti": 31, "geos5": 22, "geoscienc": 59, "geoscientist": 59, "geov4": 26, "get": [4, 11, 12, 15, 16, 18, 21, 29, 30, 47, 59, 63, 64, 65, 67, 68, 70, 71, 72, 73, 74, 86, 87, 105, 113, 118, 121, 125, 127, 132, 133, 134], "get_cmap": [41, 67, 68, 70, 75], "get_grid": [67, 68, 75], "get_posit": [41, 65], "get_refcas": [92, 93, 97], "get_yaxi": 41, "ghg": [29, 30], "giaf": [35, 52], "gibraltar_strait": 74, "gif": 59, "git": [13, 17, 19, 50, 72], "github": [12, 13, 17, 22, 27, 47, 50, 70, 72, 73, 125], "give": [27, 41, 59, 63, 102, 113, 115, 143, 146], "given": [3, 5, 8, 28, 29, 31, 32, 33, 46, 48, 49, 50, 62, 96, 102, 106, 108, 125, 143], "gl": [74, 76], "glacial": 51, "glacier": [39, 42], "glade": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 64, 65, 67, 68, 70, 72, 74, 75, 76, 91, 92, 93, 99, 108, 109, 118, 127, 131, 133, 137, 138, 143], "glanc": [8, 81], "gland4": 8, "gland4_w": 8, "gland5um": 8, "glass": 129, "glc": [3, 5, 8, 40, 41, 42, 72], "glc_modelio": 23, "glob": [64, 74, 75, 76], "global": [0, 25, 42, 49, 50, 64, 65, 66, 71, 125], "global_param": 72, "globe": 70, "glyald": 25, "gmom_jra": [47, 74], "gmt": 113, "go": [2, 4, 7, 8, 11, 12, 13, 16, 17, 18, 26, 36, 37, 38, 41, 47, 53, 63, 64, 65, 67, 70, 72, 73, 74, 76, 92, 94, 107, 108, 121, 129, 137, 143, 145], "goal": [59, 87, 108, 141, 143], "goe": 76, "goelzer": 42, "goldenrod": 65, "gone": 143, "good": [9, 42, 59, 104, 109], "gouraud": 64, "govern": 87, "gpop": 53, "gpp": 70, "gptl": 3, "grab": [68, 70, 72], "grad": 125, "grai": [74, 75, 76], "grain": 37, "graphic": [26, 59, 60, 119, 122, 123, 125, 129, 130], "grass": 138, "great": [70, 94], "greater": 50, "greater_equ": 76, "greatest": [42, 70], "green": 81, "greenhous": 49, "greenland": [8, 40, 42, 67], "grei": 76, "grep": [27, 72, 137, 138], "gri": [40, 42], "grib": 59, "grib2": 59, "grid": [22, 29, 30, 39, 40, 63, 64, 65, 66, 68, 69, 70, 74, 75, 76, 77], "grid_filenam": 63, "gridcel": [67, 68], "gridlin": [74, 75, 76], "gridspec": [65, 67, 68], "gridspec_kw": 76, "gross": 70, "ground": [41, 65], "group": [21, 59, 65, 72, 80, 85, 94], "groupbi": 70, "growth": 67, "gswp3v1": 45, "gt": 42, "guarante": 106, "gui": [26, 59, 130], "guid": [35, 39, 43, 52, 59, 63, 121, 122, 123, 129], "guidanc": 79, "guidelin": 121, "gulf": [74, 76], "gunter": [0, 39, 42], "gunterl": [40, 42], "gustavo": [0, 52, 74, 75, 76], "gx1": 8, "gx1v6": 8, "gx1v7": [8, 67, 68], "gx1v7_r": 8, "gz": 49, "h": [4, 6, 8, 21, 23, 24, 25, 28, 35, 36, 37, 38, 40, 41, 42, 43, 47, 52, 53, 67, 68, 72, 74, 75, 76, 94, 108, 125, 137], "h0": [23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 65, 70, 72, 108, 109, 113, 115], "h1": [23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 108, 113, 115, 137, 143], "h2": [108, 113, 115], "h3": 64, "h9": [113, 115], "ha": [2, 3, 6, 14, 15, 20, 22, 24, 35, 36, 37, 40, 42, 43, 52, 59, 65, 68, 70, 73, 82, 85, 87, 91, 94, 95, 104, 108, 121, 125, 126, 129, 130, 136, 142, 143, 145], "had": [94, 96, 104], "hadsst": 29, "half": 67, "hand": [73, 94], "handl": [63, 65, 70], "hannai": [0, 64, 65, 109], "happen": [21, 41, 67, 76, 96, 104, 113, 115, 143, 145], "hard": 38, "have": [0, 1, 2, 3, 6, 8, 11, 12, 14, 15, 18, 19, 20, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 36, 39, 40, 42, 47, 49, 52, 53, 59, 62, 65, 67, 68, 70, 72, 73, 74, 76, 79, 86, 91, 94, 96, 102, 104, 108, 109, 113, 115, 118, 120, 122, 123, 124, 125, 129, 130, 132, 143, 145], "hcn": 25, "hcooh": 25, "hdf": 59, "he": 55, "head": 12, "header": [121, 125], "heat": [28, 29, 30, 31, 32, 33, 38, 67, 70, 74, 75, 76], "heavi": 50, "height": [27, 32, 65, 74, 76], "height_ratio": 76, "held": 85, "hello": 33, "help": [0, 4, 8, 11, 12, 52, 59, 63, 72, 81, 86, 90, 94, 106, 118, 121, 127, 128, 131, 133, 134], "helper": 118, "hemispher": [49, 67, 68, 69, 75, 77], "henc": [37, 42, 49], "here": [3, 4, 5, 6, 8, 12, 16, 17, 18, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 58, 61, 63, 64, 65, 67, 68, 69, 70, 72, 73, 74, 75, 76, 77, 80, 83, 91, 92, 93, 94, 96, 98, 102, 104, 106, 107, 108, 109, 113, 114, 115, 122, 123, 124, 129, 137, 138, 143], "hf": 75, "hfd": 74, "hgrid": 74, "hi": [67, 68, 72], "hidden": [4, 135], "hierarchi": 11, "high": [60, 63, 64, 65, 76, 110, 122, 123], "higher": [8, 37, 65, 67, 68, 98, 112], "highest": [65, 67], "highli": [42, 94], "highlight": [65, 123, 124], "hint": [16, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 47, 48, 49, 50, 53, 54, 55, 56, 65, 67, 68, 70, 74, 76, 91, 92, 93, 96, 102, 108, 109, 137, 138, 143, 146], "hist": [14, 21, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 65, 68, 70, 74, 75, 76, 108, 109, 137], "hist_avg": 114, "hist_cam60": 8, "hist_cam60_clm50": 8, "hist_fincl1": 115, "hist_fincl10": 115, "hist_fincl2": 115, "hist_fincl3": 115, "hist_fincl4": 115, "hist_fincl5": 115, "hist_fld_act": 137, "hist_mfilt": [44, 45], "hist_nhtfrq": [44, 45], "hist_opt": 98, "hist_str": 72, "histfreq": [36, 37, 38, 114], "histfreq_n": [36, 37, 38, 114], "histor": [22, 27, 30, 60, 68, 70], "histori": [5, 6, 9, 17, 18, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 36, 39, 41, 42, 48, 49, 50, 57, 65, 68, 70, 72, 85, 96, 98, 101, 104, 107, 108, 111, 112, 114, 120, 121, 136, 137, 143], "hit": 145, "hobart": 126, "hold": 72, "holocen": 51, "home": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 18, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 73, 74, 91, 92, 93, 99, 108, 109, 127, 131, 133, 137, 138, 143], "homepag": [72, 78, 79], "hope": 85, "hopefulli": 91, "horiz": 136, "horiz_onli": 137, "horizont": [22, 70, 74], "host": [17, 121], "hour": [94, 96, 102, 106, 108, 113, 115, 121], "hourli": [28, 29, 30, 31, 32, 33, 113, 115], "how": [0, 2, 4, 10, 12, 15, 16, 17, 18, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 42, 43, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 60, 62, 65, 67, 68, 69, 70, 72, 73, 74, 76, 77, 86, 88, 91, 99, 101, 102, 104, 105, 106, 108, 109, 111, 112, 113, 114, 115, 122, 123, 124, 125, 127, 131, 133, 134, 139, 141, 143], "howev": [8, 14, 39, 42, 54, 62, 68, 70, 73, 94, 96, 109, 121, 127, 131, 132, 133], "hpc": [1, 3, 5, 9, 10, 11, 12, 13, 35, 43, 63, 73, 81, 99, 118, 122, 125, 129, 130], "hr": 106, "hs_max": 67, "hsn": 67, "hstack": 76, "html": [8, 11, 22, 26, 27, 52, 72, 114, 116, 120], "http": [8, 12, 22, 25, 26, 27, 47, 50, 52, 53, 72, 73, 80, 83, 109, 114, 116], "huge": 59, "hui": 0, "human": [7, 49, 99, 125], "humid": 108, "hv": 76, "hybrid": [8, 30, 90, 92, 93, 94, 95, 97, 104, 105], "hydrogen": 51, "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 59, 60, 62, 63, 64, 65, 67, 68, 69, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 83, 84, 85, 86, 87, 88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 133, 134, 136, 137, 138, 140, 141, 142, 143, 144, 145, 146], "i2000": 43, "i2000clm50sp": [43, 44, 46], "i_diff": [43, 45, 46], "iareag": 41, "ic": [0, 3, 5, 8, 20, 23, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 43, 49, 51, 52, 72, 79, 82, 87, 96, 100, 104, 109, 112], "ice_const": 38, "ice_in": [23, 24, 25], "ice_modelio": 23, "ice_ncpl": 100, "iceland_norwai": 74, "icepack": 35, "icesm": 50, "icesm1": 50, "icon": 129, "id": [5, 6, 74, 76, 94], "idea": [9, 68, 70], "ideal": 42, "ideep": 33, "ident": [50, 67, 68, 76], "identi": [36, 53], "idim": 136, "idl": [26, 46, 59, 123, 124, 125], "idx": 75, "ignor": [64, 65, 67, 72, 74, 75, 76, 96], "ihist": 45, "ihistclm50bgccrop": [43, 45], "ii": 91, "illustr": [11, 70, 107, 125], "im": [70, 100], "im1": 67, "im4": 67, "imag": [64, 65], "imagemagick": 59, "imagin": [38, 76], "imaginari": 63, "imass": 41, "imass_above_flot": 42, "imbal": 106, "img": [64, 65], "immedi": [94, 143], "impact": [12, 37, 38, 39, 42, 49, 55, 59], "implement": [16, 51], "implic": 67, "import": [11, 12, 23, 24, 27, 38, 41, 50, 62, 63, 64, 65, 67, 68, 70, 74, 75, 76, 91, 95, 96, 97, 104, 105], "improv": [54, 59, 87, 130], "imshow": 41, "incid": 70, "inclu": 125, "includ": [0, 12, 17, 20, 22, 23, 25, 26, 27, 38, 39, 42, 45, 50, 57, 59, 60, 62, 63, 67, 68, 69, 70, 72, 74, 76, 77, 79, 81, 85, 92, 106, 117, 122, 123, 124, 125, 127, 130, 133, 135, 138], "inclus": 59, "incom": [49, 50], "incomplet": 94, "increas": [14, 27, 32, 33, 37, 38, 46, 55, 65, 74, 76, 91, 109, 142], "ind_140w": 76, "ind_eq": 76, "independ": [68, 70, 125], "index": [11, 68, 72, 74, 75, 76, 125, 136, 142], "indic": [50, 64, 67, 76, 96, 105, 125], "individu": [3, 11, 17, 34, 60, 70, 80, 87, 143], "indonesian_throughflow": 74, "industri": [27, 49, 50, 93], "inf": 64, "infin": 64, "influenc": [49, 50], "info": [4, 8, 37, 38, 58, 61, 72, 146], "info_dbug": [91, 98, 142], "inform": [0, 6, 8, 12, 16, 17, 19, 23, 24, 28, 29, 30, 31, 32, 33, 41, 49, 54, 57, 59, 63, 65, 67, 68, 69, 73, 74, 76, 80, 81, 84, 86, 87, 99, 104, 105, 106, 111, 118, 119, 121, 122, 123, 125, 128, 130, 135, 138, 142, 143, 146], "infrastructur": [11, 72, 82], "inher": 37, "inherit": 63, "init": 25, "inithist": 92, "initi": [23, 24, 25, 30, 33, 42, 60, 70, 74, 76, 92, 93, 94, 95, 96, 97, 101, 102, 104, 106, 138], "initial_hist": [41, 72], "inject": 80, "inlin": [41, 70], "inline_arrai": 65, "input": [1, 3, 4, 5, 10, 16, 17, 24, 31, 32, 43, 59, 67, 74, 76, 95, 113, 115, 118, 125], "input_data_list": 5, "input_data_root": 40, "inputdata": [3, 5, 10, 25, 30, 31, 32, 46, 118], "insert": 130, "insid": [64, 72, 125], "insol": [49, 50], "inspect": 74, "inspir": 59, "instabl": [67, 100], "instal": [63, 72, 125, 129], "instanc": [2, 10, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 94, 107, 108, 109, 113, 115, 117, 127, 137, 138, 143], "instantan": [23, 24, 25, 28, 29, 30, 31, 32, 33, 108, 113, 114, 115, 136], "instead": [27, 29, 62, 64, 65, 67, 68, 69, 70, 72, 74, 75, 76, 77, 104], "instruct": [12, 21, 60, 63, 123, 124, 129, 141], "instrument": 51, "int": 76, "int_": 75, "integ": 125, "integr": [11, 21, 70], "intel": [127, 131, 133], "intend": [13, 29, 30, 59, 127, 131, 133], "intens": 54, "interact": [17, 35, 49, 52, 59, 119, 122, 123, 125, 130], "interannu": [20, 35, 52], "interchang": 68, "intercompon": 8, "intererest": 70, "interest": [0, 8, 25, 34, 35, 39, 43, 52, 68, 70, 73, 74, 76, 84, 87, 121, 138], "interfac": [26, 59, 63, 72, 94, 125, 129, 130], "interglaci": 49, "interior": 42, "intern": [60, 67, 129], "interoper": 63, "interp": 76, "interpert": 46, "interpol": 76, "interpret": [51, 76, 81, 145], "interv": [100, 104, 105], "intial": 105, "introduc": [20, 67, 70, 94, 118, 120], "introduct": [0, 17, 71, 130], "intuit": [65, 68], "intutit": 68, "inventori": 25, "invert": [42, 65], "invert_yaxi": [41, 65], "investig": [10, 17, 39, 49], "invok": [1, 2, 16, 23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 108, 109, 137, 143], "involv": [37, 86, 87], "io": [22, 27], "ionospher": 27, "ipynb": [72, 73], "irregular": [74, 76], "irvin": 129, "is_ja": 75, "is_jfm": 75, "is_remot": 65, "is_remote_uri": 65, "isel": [64, 67, 68, 70, 74, 76], "isin": 68, "isn": 70, "isop": 25, "isotop": 51, "issu": [84, 119, 121], "itd": [67, 69], "item": [64, 76], "iterm": 129, "its": [8, 18, 32, 49, 59, 63, 72, 73, 74, 87, 104, 112, 127, 131, 133, 135], "iulog": 33, "ivoc": 25, "j": 75, "ja": 75, "jan": 14, "januari": [14, 68, 75], "jargon": [2, 10], "jb": 72, "jess": [0, 64, 65, 73], "jet": 65, "jfm": 75, "job": [2, 4, 5, 8, 16, 17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 59, 73, 74, 76, 92, 94, 102, 104, 105, 106, 108, 109, 122, 123, 127, 132, 133, 137, 138, 143, 145, 146], "job_prior": 5, "job_queu": [15, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 91, 108, 109, 127, 132, 133, 137, 138, 143], "job_wallclock_tim": [44, 45, 46, 91, 92, 93, 94], "jobnam": 6, "join": [65, 67, 68, 70, 85, 87], "jpg": 59, "jra": 47, "jra55": [35, 52], "juli": [68, 75], "julia": [123, 124], "jun": 11, "june": 68, "jupyt": [39, 42, 70, 72, 119, 122, 123, 130], "jupyterbook": 72, "jupyterhub": 59, "jupyterlab": 59, "just": [11, 18, 34, 64, 67, 68, 69, 72, 74, 76, 94, 96, 104, 143], "k": [28, 29, 30, 31, 32, 33, 36, 67, 68, 108, 125, 136, 137], "k_": 38, "ka": 49, "kate": [0, 39], "keep": [6, 7, 10, 64, 68, 70, 91], "keep_attr": [67, 68], "kei": [10, 15, 55, 65, 72, 73, 125], "kelvin": 14, "kept": [14, 76, 96], "kernel": [63, 64, 65, 67, 68, 70, 72, 74, 75, 76], "keyboard": 130, "keyerror": 65, "keyword": [67, 72], "kg": [20, 41, 42, 75, 108], "kind": 70, "kitchen": 125, "kluzek": 43, "km": 70, "km2": 70, "know": [8, 21, 42, 62, 64, 81, 105], "knowledg": [10, 126], "known": [35, 59, 82, 83, 84], "konw": 64, "ksno": [35, 38], "kwarg": 65, "kwd": 65, "l": [5, 8, 11, 14, 16, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 72, 108, 113, 118, 123, 124, 135], "la": 70, "lab": [19, 73, 122, 123, 127, 132, 133], "label": [12, 65, 70, 74, 75, 76], "labelpad": 41, "labels": 41, "laboratori": [0, 118], "lai": 70, "land": [0, 8, 14, 20, 23, 27, 35, 52, 67, 68, 69, 72, 73, 74, 75, 76, 82, 87, 93, 96, 98, 100], "land_comparison": 72, "landfrac": [33, 70], "languag": [17, 99, 120, 125], "laptop": 129, "larg": [14, 28, 29, 30, 31, 32, 33, 35, 49, 50, 52, 54, 55, 59, 60, 63, 68, 70, 80, 99, 100, 109, 121, 125], "larger": [37, 67, 70, 80, 109], "largest": [55, 70], "last": [11, 17, 41, 52, 65, 68, 70, 145], "last_panel0": 41, "last_panel1": 41, "last_panel2": 41, "lat": [28, 29, 30, 31, 32, 33, 50, 64, 67, 70, 74, 76, 108, 125, 137], "lat2d": [31, 32, 67], "latent": [28, 29, 30, 31, 32, 33, 70], "later": [2, 3, 4, 12, 17, 39, 60, 68, 91, 145], "latest": [104, 145], "lath": 74, "latitud": [65, 67, 68, 70, 74, 75, 76, 125, 136], "latn": [74, 76], "latq": 74, "launcher": 129, "lawrenc": [0, 43, 70], "layer": [26, 65, 75, 76], "layout": [17, 99], "lb": 25, "lbc": 25, "lbc_1750": 25, "lc_kwarg": 72, "lchnk": [136, 137], "le": [12, 67, 68, 70], "le2": [67, 68, 70], "lead": [37, 42, 54, 94, 116], "leaf": [46, 138], "learn": [0, 10, 14, 15, 18, 30, 34, 59, 68, 74, 76, 88, 92, 94, 99, 101, 104, 105, 109, 111, 119, 121, 122, 123, 124, 128, 134, 141], "least": [42, 110, 112, 139], "leav": [70, 104, 106, 114, 115], "lectur": [109, 126], "left": [14, 26, 65, 67, 70, 73, 129], "legend": [65, 76], "legg": 54, "legui": [0, 39, 42], "len": [41, 64, 70], "lena": 76, "lengath": 33, "lenght": [54, 55, 56], "length": [17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 65, 88, 92, 94, 96, 99, 104, 105, 108, 109, 113, 134, 137, 138, 143], "lengthi": 8, "less": [7, 22, 24, 49, 50, 68], "lesson": 89, "let": [48, 49, 50, 63, 67, 68, 70, 72, 74, 76, 94, 96, 137], "lev": [65, 72, 108, 136], "level": [11, 17, 22, 39, 50, 65, 66, 67, 72, 74, 76, 91, 98, 121, 136], "leverag": 63, "lhflx": [28, 29, 30, 31, 32, 33], "li": [0, 143], "lib": [11, 63, 65], "librari": [3, 20, 67, 68, 70, 72, 125], "licenc": 59, "licens": 11, "light": [50, 86], "like": [4, 22, 23, 24, 25, 35, 39, 43, 49, 52, 63, 65, 68, 70, 74, 76, 96, 99, 104, 109, 120, 125, 137, 145], "limit": [63, 65, 68, 102, 106, 120, 145], "line": [3, 4, 5, 8, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 37, 38, 41, 42, 43, 44, 45, 46, 49, 54, 59, 64, 65, 67, 68, 72, 73, 76, 94, 108, 109, 113, 115, 116, 119, 123, 124, 125, 129, 130, 134, 137, 138, 143, 145], "line2d": 65, "linear": [60, 76], "linestyl": [74, 75, 76], "linewidth": [50, 64, 74, 75, 76], "link": [2, 8, 14, 20, 53, 57, 70, 74, 76, 81, 82, 119, 121, 122, 123, 124, 125, 130], "linspac": [50, 67, 68], "linux": 49, "liq": [28, 29, 30, 31, 32, 33], "list": [3, 4, 5, 6, 8, 11, 12, 14, 18, 24, 27, 35, 59, 70, 72, 73, 74, 81, 113, 115, 118, 120, 123, 124, 125, 130, 134, 135, 136, 143], "listofset": 94, "literatur": 60, "littl": 120, "live": 40, "liwg": 87, "ll": [64, 68, 70, 72, 74, 76, 134], "lmwg": 87, "lnd": [3, 5, 8, 43, 44, 45, 46, 70, 72, 104, 112, 138], "lnd_co2_typ": 20, "lnd_in": [23, 24, 25, 45, 46, 117], "lnd_modelio": 23, "lnd_ocn": 8, "load": [1, 3, 5, 14, 26, 35, 42, 43, 49, 50, 64, 70, 72, 75, 76, 77, 106, 125, 127, 130, 131, 133], "load_ext": [74, 75, 76], "loc": [65, 70, 75], "local": [6, 12, 42, 63, 74, 76, 113, 119, 122, 123, 129], "locat": [1, 3, 4, 5, 7, 8, 9, 10, 12, 17, 25, 26, 27, 63, 65, 67, 70, 74, 76, 84, 92, 93, 109, 117, 129, 137, 138, 140], "location_of_hfil": 64, "lock": 65, "lock_mak": 65, "log": [1, 7, 13, 14, 35, 43, 49, 52, 65, 119, 127, 131, 133, 142, 143, 146], "log_directori": [74, 76], "logarithm": 65, "logic": 64, "login": [3, 10, 12, 46, 122, 123, 127, 131, 133], "loglevel": 94, "lon": [28, 29, 30, 31, 32, 33, 50, 64, 67, 70, 76, 108, 125, 137], "lon2d": [31, 32, 67], "lon_dim": 76, "lon_new": 50, "lone": [74, 76], "long": [8, 11, 14, 15, 16, 20, 49, 70, 72, 85, 101, 102, 105, 106, 113, 115, 132, 135, 136, 142], "long_nam": [28, 29, 30, 31, 32, 33, 70, 108, 137], "longer": [8, 18, 59, 94], "longitud": [65, 67, 68, 70, 74, 76, 125, 136], "longnam": 8, "longwav": [28, 29, 30, 31, 32, 33], "lonh": 74, "lonq": 74, "lonw": [74, 76], "look": [6, 12, 14, 15, 16, 18, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 64, 65, 67, 68, 70, 72, 73, 74, 76, 92, 94, 96, 104, 108, 109, 127, 137, 143, 145, 146], "loop": 41, "lost": [42, 121], "lot": [67, 70, 74, 76, 121, 135], "lower": [22, 25, 37, 50, 65, 67], "lowest": 67, "lru_cach": 65, "lrucach": 65, "lsp": 65, "lt": 18, "luck": 67, "luckili": 42, "lw": 70, "lwcf": 109, "m": [4, 8, 14, 20, 28, 29, 30, 31, 32, 33, 36, 37, 38, 41, 42, 64, 67, 68, 70, 74, 75, 76, 113, 114, 115], "m2": [28, 29, 30, 31, 32, 33, 41, 70], "ma": 22, "macarew": 50, "macarewich": 0, "mach": 8, "machin": [1, 3, 4, 16, 17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 59, 72, 99, 106, 108, 119, 122, 123, 126, 129, 145], "maco": 129, "macro": [4, 7], "made": [17, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 51, 64, 72, 94], "magnif": 14, "magnifi": [14, 129], "magnitud": [38, 42], "mai": [6, 12, 23, 24, 25, 26, 27, 40, 48, 49, 63, 67, 70, 72, 73, 84, 86, 92, 94, 98, 101, 104, 106, 112, 120, 125, 127, 128, 129, 131, 133, 136, 142], "main": [5, 10, 17, 38, 40, 48, 49, 50, 65, 67, 68, 73, 74, 76, 81, 88, 91, 94, 132], "maintain": [12, 85, 96, 123, 124], "mainten": [59, 129], "major": 0, "make": [1, 3, 4, 7, 10, 12, 16, 17, 18, 21, 23, 24, 25, 28, 35, 37, 39, 40, 48, 49, 50, 52, 54, 59, 64, 67, 68, 71, 72, 73, 91, 92, 96, 104, 108, 109, 121, 127, 133, 137, 138, 139, 140, 141, 143, 144], "make_axes_locat": 65, "make_map": 64, "mamba": 72, "manag": [13, 17, 59, 65, 70, 121], "manage_extern": [11, 12, 47, 50, 72], "mani": [7, 14, 17, 51, 59, 62, 68, 70, 72, 73, 74, 76, 80, 102, 105, 117, 121, 123, 124, 125], "manipul": [59, 125, 130], "manual": [59, 68, 91, 94, 97, 117], "manuscript": 55, "map": [14, 64, 65, 67, 68], "map_funct": 70, "marbl": [6, 12, 20], "march": [68, 69, 75], "margin": 67, "mark": [14, 49, 86], "markup": [17, 99], "marqu": [0, 52, 74, 75, 76], "mask": [8, 59, 69], "mask_and_scal": 65, "mask_g": 8, "mass": [40, 42, 65], "mass_above_flot": 42, "mass_af": 42, "massiv": 106, "master": 136, "match": [8, 11, 65, 68, 74, 91, 92, 94, 104], "materi": [0, 17, 73, 119, 121, 122, 123], "math": [68, 70, 93], "matlab": [26, 46, 59, 123, 124, 125], "matplotlib": [41, 50, 64, 65, 67, 68, 70, 74, 75, 76], "mauricio": 75, "max": [63, 65, 67, 76], "maxim": 106, "maximum": [37, 65, 68, 70, 75, 91, 96, 102, 106, 113, 115, 136], "maximum_job": [74, 76], "mbar": [28, 29, 30, 31, 32, 33, 137], "mcm": 41, "mct": [3, 5], "md": 11, "mdim": 108, "mdxxx": 36, "mean": [8, 35, 42, 43, 49, 52, 60, 64, 65, 66, 67, 68, 69, 72, 73, 74, 75, 76, 77, 102, 108, 112, 115, 130, 137, 145], "measur": 51, "mechan": [22, 23, 24, 96], "meet": 85, "megan": 23, "mek": 25, "melt": [37, 67], "mem": [74, 76], "member": [70, 121], "memori": [6, 74, 76, 96], "menu": [73, 129], "merg": [67, 68, 70], "meridian": 67, "meridion": 55, "merra2": 22, "mesh": 63, "meshgrid": [65, 67], "mesospher": 22, "messag": [12, 24, 47, 72, 145], "meta": [74, 76], "metadata": [67, 68, 70, 125], "meteora": 52, "meteorolog": 22, "meteorologi": 22, "meter": [14, 68, 75], "methan": 8, "method": [30, 62, 63, 64, 67, 70, 73, 74, 76, 100, 120], "metric": [60, 106], "mexico": [74, 76], "mfc": [41, 42], "mfilt": [23, 24, 25, 28, 29, 30, 31, 32, 33, 108, 115, 137, 143], "mgsl": 42, "micro_mg_dc": 109, "micron": [37, 109], "mid": 51, "middl": [22, 49], "midh_cam60_clm50": 8, "midholocen": 49, "midpoint": 76, "might": [4, 65, 67, 68, 70, 74, 76, 129], "mimic": 96, "min": [63, 65, 67, 76], "mind": 70, "miner": 51, "mini": 59, "minim": [50, 75], "minimum": [33, 37, 63, 65, 74, 76, 113, 115, 136], "minimum_job": [74, 76], "minimun": 70, "minor": 65, "minut": [13, 48, 94, 134], "mip6": 81, "mirror": 65, "miscellan": 74, "miss": [3, 40, 74], "mix": [22, 27, 54, 75, 76], "mixing_ratio": 108, "mkdir": [10, 12, 16, 28, 48, 49, 50, 72, 135], "mlat": 65, "mlev": 65, "mm": [14, 41, 42, 64, 74, 97, 104], "mm_equiv": 42, "moc": 74, "mod": [31, 32], "modal": 130, "mode": [39, 49, 59, 60, 65, 86, 130, 142], "model": [0, 1, 2, 3, 5, 6, 8, 10, 13, 14, 15, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 42, 43, 44, 46, 48, 49, 50, 52, 53, 54, 55, 56, 59, 60, 62, 65, 67, 68, 70, 71, 72, 73, 77, 79, 80, 81, 84, 86, 87, 91, 95, 96, 97, 99, 100, 101, 102, 104, 105, 106, 108, 109, 110, 111, 112, 114, 116, 117, 120, 121, 122, 123, 125, 126, 129, 134, 137, 140, 142, 143, 144, 145], "model_onli": 3, "modern": 49, "modif": [3, 4, 23, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 44, 46, 47, 51, 52, 53, 54, 56, 90, 92, 94, 96, 113, 125, 137, 139, 140, 143], "modifi": [0, 15, 17, 22, 23, 27, 31, 33, 37, 40, 43, 48, 49, 50, 51, 70, 74, 76, 90, 96, 99, 101, 104, 105, 109, 111, 113, 115, 117, 120, 127, 131, 133, 140, 141], "modififi": 30, "modul": [1, 14, 26, 35, 38, 41, 43, 49, 50, 72, 74, 75, 76, 120, 125, 127, 130, 131, 133, 134], "modular": 52, "moistur": 70, "molecular": 20, "mollweid": 64, "mom": 47, "mom6": [67, 72], "moment": 73, "mon": 127, "mon_dai": 70, "mon_wgt": 70, "monitor": [17, 49], "month": [14, 18, 35, 49, 50, 52, 65, 67, 68, 70, 75, 76, 77, 91, 92, 94, 104, 105, 108, 109, 113, 115, 125, 137, 138, 143], "month_1": [67, 68, 70], "monthli": [18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 43, 48, 49, 50, 52, 68, 69, 74, 108, 112, 113, 114, 115, 116, 143], "monthly_output_path": [63, 65, 67, 68, 70], "moon": 86, "more": [4, 6, 7, 9, 10, 12, 13, 14, 15, 18, 23, 28, 29, 30, 31, 32, 33, 38, 42, 49, 51, 59, 62, 65, 67, 68, 70, 72, 73, 76, 80, 83, 86, 87, 92, 96, 98, 104, 105, 109, 112, 116, 119, 121, 122, 123, 124, 127, 130, 133, 136, 138, 142, 143, 146], "mosart": [3, 5, 6, 8, 11, 12], "mosart_in": 23, "most": [0, 7, 8, 17, 22, 37, 50, 59, 62, 65, 67, 68, 70, 81, 94, 96, 104, 112, 119, 129, 130, 134], "move": [5, 9, 11, 15, 49, 67, 69, 126, 135, 145], "move_to_end": 65, "movi": 59, "mozambique_channel": 74, "mozart": [22, 26], "mpa": 63, "mpath": [65, 67, 68], "mpl": [41, 65, 74, 76], "mpl_toolkit": 65, "mplc": 41, "mterp": 25, "mu": 37, "much": [8, 59, 62, 80, 106], "multi": [70, 125], "multialign": [41, 42], "multifil": [68, 70], "multipi": [20, 68], "multipl": [67, 68, 70, 94, 99, 108], "multipli": [14, 38, 68, 75], "murrai": 67, "musica": 25, "must": [3, 13, 14, 19, 25, 37, 39, 40, 72, 73, 96, 105, 113, 125, 130, 142], "mv": [41, 49, 135], "my": [16, 30, 36, 37, 38, 47, 53, 108], "my_cesm_cod": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 44, 45, 46, 48, 49, 53, 54, 55, 56, 91, 92, 93, 108, 109, 137, 138, 143], "my_chem_mech": 24, "my_cmap": 41, "my_directori": 135, "myriad": 129, "n": [76, 135], "n00": 6, "n_edg": 63, "n_face": 63, "n_max_face_nod": 63, "n_node": 63, "n_nodes_per_fac": 63, "name": [4, 8, 10, 12, 20, 25, 40, 48, 49, 50, 64, 65, 67, 68, 70, 72, 81, 91, 92, 94, 96, 97, 99, 127, 131, 133, 135, 136], "name_l": 8, "name_m": 8, "name_oi": 8, "name_r": 8, "name_w": 8, "namelist": [3, 4, 5, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 44, 45, 46, 48, 49, 50, 52, 92, 96, 100, 101, 108, 109, 110, 112, 113, 114, 115, 116, 117, 137, 143], "narrow": 27, "nation": [0, 83], "nativ": [64, 66, 67, 74], "natur": [29, 50, 51], "naturalearthfeatur": [70, 74, 76], "navig": [8, 10, 12, 81, 108, 119, 120, 125, 134], "nb": 115, "nb_path_root": 72, "nbin": 70, "nblibrari": 72, "nc": [3, 8, 14, 21, 23, 24, 25, 28, 31, 32, 35, 36, 37, 38, 40, 41, 42, 43, 45, 46, 47, 49, 50, 52, 53, 63, 64, 65, 67, 70, 72, 74, 75, 76, 108, 109, 125, 137], "nc_time_axi": 68, "ncap2": [31, 32, 46, 50, 137], "ncar": [0, 1, 3, 5, 9, 10, 11, 12, 13, 22, 26, 27, 35, 40, 43, 50, 60, 63, 70, 72, 73, 78, 81, 99, 118, 121, 129], "ncarenv": [127, 131, 133], "ncdata": 25, "ncdiff": [31, 32, 35, 37, 38, 43, 45, 46, 49, 52, 54, 55, 109, 125], "ncdump": [23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 46, 47, 50, 53, 72, 108, 137], "ncfile": [41, 42], "nck": 125, "ncl": [26, 46, 123, 124, 125, 127, 131, 133], "nco": [26, 27, 31, 32, 35, 41, 43, 46, 49, 50, 51, 52, 72, 127, 131, 133], "ncol": [50, 64, 70, 137], "ncpl_base_period": [93, 100], "ncpu": [74, 76], "ncra": [35, 43, 52, 125], "ncrcat": [41, 42, 125], "ncview": [14, 26, 31, 32, 35, 37, 38, 43, 44, 45, 46, 49, 50, 51, 52, 54, 55, 59, 73, 109, 123, 124, 127, 131, 133, 137], "ncview_home_pag": 52, "nd": 6, "ndai": [23, 24, 25, 28, 29, 30, 31, 32, 33, 94, 105, 116], "nday1": [21, 53, 76], "ndenumer": 70, "ndep_mosart_cism2": 8, "ne": 72, "ne30": 64, "ne30x8": 63, "ne30x8_220105": 63, "ne30x8_dir": 63, "ne30x8_np4_scrip": 63, "nearest": [70, 74, 76], "nearest_s2d": 67, "nearli": 67, "necessari": [50, 64, 67, 70, 122, 123, 124, 126, 127, 131, 133], "nedit": 24, "need": [5, 8, 10, 11, 12, 13, 17, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 64, 67, 68, 70, 72, 73, 74, 75, 76, 86, 91, 92, 96, 97, 102, 104, 105, 106, 107, 108, 109, 111, 112, 119, 121, 122, 123, 124, 126, 127, 128, 130, 131, 132, 133, 134, 135, 137, 138, 141, 143], "needs_lock": 65, "neg": [37, 42, 50, 68], "net": [28, 29, 30, 31, 32, 33], "netcdf": [9, 14, 26, 35, 43, 46, 52, 59, 60, 68, 70, 72, 108, 123, 124, 127, 131, 133], "netcdf4": [41, 65], "netcdf4_": 65, "netcdf4backendentrypoint": 65, "netcdf4datastor": 65, "network": [121, 125, 129], "never": [104, 127, 131, 133], "new": [1, 2, 3, 4, 5, 7, 11, 12, 14, 16, 17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 59, 62, 64, 65, 67, 70, 72, 75, 83, 91, 92, 96, 104, 108, 109, 113, 126, 127, 129, 131, 133, 135, 136, 137, 138, 139, 141, 143], "new_nam": 135, "newer": 63, "newli": [23, 72], "next": [0, 14, 15, 18, 65, 67, 68, 72, 88, 92, 96, 102, 104, 127, 131, 133], "nh3": 25, "nhour": 116, "nhtfrq": [23, 24, 25, 28, 29, 30, 31, 32, 33, 107, 108, 137, 143], "ni": [67, 68, 76], "nice": [23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 70, 129], "nicer": 77, "nicknam": 72, "nj": [67, 68, 76], "nl": 143, "nlat": [67, 68, 76], "nlon": [67, 68, 76], "nml": 23, "nmonth": [18, 70, 91, 92, 94, 105, 108, 109, 113, 115, 116, 137, 138, 143], "no_conflict": [67, 68], "node": [3, 46, 59, 118, 132], "node_lat": 63, "node_lon": 63, "noecho": 94, "noevolve_ww3": 8, "noevolve_ww3_bgc": 8, "noisi": 68, "nomin": 74, "non": [8, 37, 39, 64, 116], "none": [4, 8, 65, 70, 76], "nonmelt": 37, "normal": [20, 35, 52, 67, 96, 130, 143], "north": [67, 68, 69, 76], "north_lat": 64, "northern": [49, 67, 68, 69, 75], "northpolarstereo": [67, 68], "not_compset": 8, "notabl": 67, "notat": [8, 50], "note": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 20, 24, 25, 28, 29, 30, 31, 32, 33, 35, 36, 40, 41, 42, 45, 46, 47, 48, 49, 50, 53, 56, 64, 65, 67, 68, 70, 72, 73, 74, 76, 94, 95, 96, 113, 116, 117, 119, 121, 122, 123, 124, 125, 127, 129, 130, 131, 133, 138, 142], "notebook": [39, 41, 59, 62, 63, 65, 67, 68, 71, 72, 119, 122, 123], "noth": 96, "notic": [3, 4, 30, 40, 50, 65, 67, 74, 76], "novic": 134, "now": [4, 11, 12, 14, 15, 18, 39, 41, 47, 48, 49, 59, 67, 68, 72, 73, 75, 76, 94, 96, 105, 118, 136, 137, 143], "np": [41, 50, 64, 65, 67, 68, 70, 74, 75, 76], "npl": [63, 64, 65, 67, 68, 70, 73, 74, 75, 76], "nrow": [50, 70], "nsf": [0, 60, 63], "nsidc": 68, "nsidc_index": 68, "nsidc_tim": 68, "ntask": 94, "ntasks_atm": [8, 94], "ntasks_cpl": 8, "ntasks_glc": 8, "ntasks_ic": 8, "ntasks_lnd": 8, "ntasks_ocn": 8, "ntasks_rof": 8, "ntasks_wav": 8, "nthrd": 94, "nthrds_atm": 8, "nthrds_cpl": 8, "nthrds_glc": 8, "nthrds_ice": 8, "nthrds_lnd": 8, "nthrds_ocn": 8, "nthrds_rof": 8, "nthrds_wav": 8, "nudg": 22, "null": [8, 72], "num_a1": 25, "num_a2": 25, "num_a4": 25, "num_proc": 72, "number": [0, 9, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 59, 64, 70, 73, 74, 76, 85, 94, 99, 100, 105, 106, 108, 109, 113, 115, 117, 123, 124, 125, 127, 131, 133, 136, 137, 138, 143], "numer": [22, 27, 59, 70, 121, 125], "numpi": [41, 50, 64, 65, 67, 68, 70, 74, 75, 76], "nuopc": 83, "nusbaum": [0, 64, 65, 73], "nwp": 125, "nyear": [36, 40, 47, 48, 49, 50, 53, 56, 96, 102, 105, 106], "nyear1": 21, "nyf": [35, 52], "o": [31, 32, 47, 50, 63, 65, 67, 68, 70, 74, 76, 119, 122, 123], "o1d": 24, "o2": 24, "o3": [23, 24, 25], "object": [64, 67, 68], "obliqu": 49, "observ": [27, 42, 60, 67, 68, 79], "obtain": [42, 96], "oc": 75, "occasion": 104, "occur": [4, 21, 50, 54, 65], "occurr": 143, "ocean": [0, 8, 21, 23, 27, 28, 35, 39, 42, 43, 54, 55, 67, 69, 70, 72, 74, 76, 82, 87, 90, 92, 96, 98, 100], "ocean_geometri": 74, "ocn": [3, 5, 8, 21, 47, 53, 54, 55, 56, 72, 74, 75, 76, 104], "ocn_co2_typ": [20, 98], "ocn_modelio": 23, "ocn_ncpl": [92, 100], "ocn_tracer_modul": [20, 50], "ocnic": 8, "odd": 67, "oero": 63, "off": [8, 12, 19, 52, 68, 70, 74, 76, 82, 121], "offer": [0, 88, 111, 130, 141], "often": [65, 76, 125, 143, 145], "ogw": 64, "oi": 8, "ok": 5, "old": [4, 68, 70, 72], "older": [22, 129], "omask": [31, 32], "omwg": 87, "onc": [2, 6, 14, 22, 24, 25, 59, 62, 70, 73, 76, 94, 99, 104, 116, 122, 123, 127, 130, 131, 133], "one": [1, 19, 22, 23, 24, 25, 27, 34, 35, 37, 38, 39, 42, 43, 46, 48, 49, 50, 52, 54, 55, 65, 67, 68, 69, 70, 72, 76, 94, 96, 100, 105, 108, 110, 113, 123, 124, 138, 139, 143], "ones": [130, 135], "onli": [1, 5, 7, 8, 16, 20, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 39, 42, 43, 52, 65, 67, 68, 70, 72, 91, 92, 93, 94, 95, 96, 97, 105, 106, 113, 115, 125, 127, 132, 133, 136], "onlin": [0, 37, 38, 59, 63, 108, 118, 119, 121, 135], "onset": 138, "onto": [1, 39, 67, 69, 127, 131, 133], "open": [23, 24, 25, 26, 59, 65, 67, 68, 70, 85, 119, 121, 125, 129, 130], "open_backend_dataset_paramet": 65, "open_dataset": [63, 64, 65, 74, 76], "open_dataset_paramet": 65, "open_mfdataset": [50, 64, 67, 68, 70, 74, 75, 76], "openli": 121, "oper": [12, 27, 31, 32, 35, 43, 52, 63, 68, 70, 72, 83, 129], "opportun": [88, 111, 141], "opt": [65, 74, 76, 85], "optic": 37, "optim": 63, "option": [3, 5, 6, 8, 11, 12, 14, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 40, 43, 47, 48, 49, 50, 52, 59, 60, 70, 72, 73, 94, 105, 117, 119, 122, 123, 125, 129, 135], "orang": 68, "orb_eccen": 49, "orb_mod": 49, "orb_mvelp": 49, "orb_obliq": 49, "orb_param": 49, "orbit": [49, 50, 51], "order": [8, 14, 72, 104, 107, 122, 123], "org": [72, 83], "organ": [72, 83, 87, 121], "orient": [65, 67, 68, 70, 76, 121, 125], "orig_map": 75, "origin": [46, 54, 63, 67, 96, 127, 131, 133, 142], "orograph": [27, 32], "orographi": [31, 32], "orthogon": 67, "other": [0, 4, 8, 10, 12, 14, 16, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 59, 65, 68, 70, 72, 73, 74, 76, 83, 85, 87, 106, 108, 117, 121, 123, 124, 125, 136, 142], "other_dim": 76, "otherwis": [6, 15, 64, 83, 129], "otto": 49, "our": [42, 43, 59, 68, 70, 72, 74, 75, 76, 96, 104, 106, 127, 132, 133], "out": [8, 12, 15, 16, 18, 22, 23, 24, 25, 27, 36, 44, 46, 47, 51, 53, 56, 64, 67, 68, 70, 72, 73, 74, 91, 92, 93, 94, 96, 98, 104, 118, 121, 142, 145], "out12": 125, "outcom": [6, 15], "outdat": 74, "outfld": 137, "output": [0, 1, 3, 4, 5, 6, 8, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42, 44, 49, 50, 53, 57, 59, 60, 62, 67, 68, 70, 72, 73, 74, 76, 77, 81, 91, 92, 94, 96, 104, 106, 107, 110, 111, 117, 125, 134, 136, 143], "output_dir": [35, 43, 52], "output_tavg_add1": 53, "output_tavg_add2": 53, "outsid": [12, 40, 74, 76, 118, 132, 133], "over": [14, 17, 27, 29, 32, 35, 42, 49, 52, 62, 63, 64, 65, 67, 68, 70, 94, 106, 117, 125, 127, 131, 133], "overal": [55, 62, 67, 87, 106], "overcom": 100, "overflow": [52, 54], "overflows_interact": 54, "overflows_on": 54, "overid": [29, 30], "overnight": 91, "overrid": [50, 65, 75], "overridden": 65, "oversight": 87, "overview": [24, 83, 88, 111, 137, 141, 145], "overwrit": [67, 68, 104, 127, 131, 133], "overwrite_encoded_chunk": 65, "overwrite_t": 72, "overwritten": 117, "ovf": [3, 5, 104], "own": [12, 23, 24, 25, 27, 28, 31, 32, 39, 41, 72, 87, 121], "oxygen": [50, 51], "ozon": 26, "p": [23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 50, 59, 91, 92, 94, 125, 137], "p0": 50, "p16o": 50, "p18o": 50, "p93300641": 8, "p_surf": 137, "pa": [28, 29, 30, 31, 32, 33], "pacif": 32, "pacific_undercurr": 74, "packag": [35, 43, 52, 57, 59, 60, 63, 65, 68, 70, 72, 76, 81], "pad": [65, 67, 68, 70, 74, 75, 76], "page": [15, 60, 73, 80, 81, 82, 85, 86, 125], "pager": 49, "pai": [70, 80], "paleo": [49, 50], "paleocaladjust": 49, "paleoclim": [51, 87], "paleoclimatologi": 51, "palett": 14, "panda": [70, 76], "panel": [67, 70], "pangeo": 59, "panopoli": 125, "paper": 94, "parallel": [8, 50, 52, 74, 76, 106], "paramdata": 46, "paramet": [37, 38, 42, 46, 49, 50, 72, 96, 110, 136, 138], "parameter": [27, 52], "paramfil": 46, "paramter": 54, "part": [3, 5, 10, 42, 65, 72, 91, 125, 126], "partial": [91, 94], "particip": 87, "particl": 109, "particular": [6, 22, 27, 70, 73, 76, 77, 85, 94], "particularli": [49, 128], "pass": [20, 60, 72], "password": 73, "past": [23, 24, 25, 42, 48, 51], "path": [3, 4, 5, 8, 9, 10, 11, 12, 16, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 99, 108, 121, 135], "path_to_fil": [41, 42], "pathlib": 64, "pathlik": 65, "pattern": [50, 55, 60, 64], "pb": [8, 73], "pblt": 33, "pbrp": 20, "pbs_account": 40, "pbscluster": [74, 76], "pc": [74, 76], "pcol": [33, 136, 137], "pcolormesh": [64, 65, 67, 68, 70, 74, 75, 76], "pcwg": 87, "pd": [70, 76], "pdf": [59, 109], "pe": [8, 17, 99, 106], "peer": 60, "pennsylvania": 63, "peopl": [0, 35, 39, 43, 52], "per": [42, 70, 75, 96, 100, 102, 105, 106, 113, 115, 143], "perceiv": 65, "perciev": 76, "perfectli": 68, "perform": [22, 23, 24, 25, 59, 81, 83, 96, 110, 122, 123, 125, 129], "perh": 49, "perhap": 27, "perihelion": 49, "period": [17, 29, 35, 49, 52, 67, 70, 76, 93, 100], "perl": 46, "perman": [9, 12, 47], "permit": 8, "persist": 65, "person": [12, 118, 123, 124, 127, 131, 133], "perspect": 73, "pertain": 97, "peter": [0, 43, 70], "pft": 46, "phenologi": [43, 138], "phi": [31, 137], "phillip": 0, "phy": 24, "physic": [6, 8, 27, 33, 37, 38, 42, 51, 54, 70, 74, 76, 90, 136, 137], "physiologi": 46, "pi": [22, 50, 67, 68, 81], "pi_0001": 49, "pico": 130, "picontrol": [30, 48, 49, 50, 81], "piec": [10, 68, 70], "pierc": 52, "pin": 73, "pio": 3, "pio_numtask": 94, "pio_strid": 94, "pio_typenam": 94, "pip": 72, "pitch": 121, "place": [49, 63, 68, 104, 106, 109, 146], "placehold": [10, 12, 89], "plai": [54, 55, 73, 74, 76, 119, 122, 123], "plain": 39, "plan": 120, "plant": 46, "plasma": 68, "plate": 65, "platecarre": [50, 64, 65, 67, 68, 70, 74, 75, 76], "platform": [70, 121, 122, 123, 125], "pleas": [0, 1, 12, 13, 72, 73, 74, 118, 119, 122, 123, 124, 127, 131, 133], "plot": [14, 26, 37, 42, 50, 51, 59, 63, 71, 73, 80, 119], "plotdata": 70, "plotproj": 64, "plotvar": 70, "plt": [41, 42, 50, 64, 65, 67, 68, 70, 74, 75, 76], "pmid": 137, "png": [59, 74, 75, 76], "po": 41, "point": [10, 11, 24, 25, 32, 46, 63, 64, 65, 68, 73, 74, 75, 76, 77, 80, 142], "pointer": [24, 25, 104], "polar": [67, 87], "pole": [8, 67, 69, 70], "polygon": 63, "pom_a4": 25, "pond": 37, "poor": 54, "pop": [3, 5, 6, 8, 11, 12, 20, 36, 53, 54, 55, 65, 67, 68, 75, 76, 77, 98, 100, 112], "pop2": [8, 53, 100], "pop2_cesm2_1_rel_n15": 6, "pop2_nml": 116, "pop_add_cycl": 76, "pop_grid": 75, "pop_gx1v7": [67, 68, 75], "pop_tool": [67, 68, 75, 76], "popgrid": 67, "popul": 100, "port": 1, "portal": [17, 121], "portion": [49, 67, 73, 127], "posit": [37, 42, 50, 65, 93], "posn": 65, "possibl": [22, 27, 86, 146], "possibli": 1, "post": [72, 84], "postprocess": [68, 70, 72], "potenti": [33, 42, 70, 74, 76, 94], "power": [59, 60, 121, 130], "pp_": 24, "pp_waccm_tsmlt_mam4": 24, "ppmv": 20, "practic": [59, 88, 90, 99, 101, 110, 111, 134, 139, 140, 141, 145], "pre": [27, 49, 50, 74, 93], "precc": [14, 64], "preced": 8, "precip": 64, "precipit": [28, 29, 30, 31, 32, 33, 50, 51, 64, 79], "precipt": 50, "precl": [14, 64], "precrc_h216or": 50, "precrc_h218or": 50, "precrl_h216or": 50, "precrl_h218or": 50, "precsc_h216o": 50, "precsc_h218o": 50, "precsl_h216o": 50, "precsl_h218o": 50, "prect": [28, 29, 30, 31, 32, 33, 113], "predict": [20, 83, 87], "prefer": 130, "preindustri": [49, 50, 51, 81], "preliminari": 134, "preprocess": 76, "preprocessor": 24, "prescrib": [20, 23, 27], "present": [19, 23, 49, 119], "press": [49, 65, 73, 119, 122, 123], "pressur": [28, 29, 30, 31, 32, 33, 65, 70, 125, 136, 137], "prestag": [3, 5, 71, 96, 97], "pretti": 70, "prevent": [3, 94], "preview_namelist": [17, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 40, 44, 45, 46, 48, 49, 50, 92, 117], "preview_run": 4, "previou": [2, 12, 13, 24, 25, 27, 30, 34, 39, 56, 68, 74, 76, 81, 94, 96, 102, 112, 126], "previous": [42, 84, 91, 94, 126], "primari": [49, 70, 88, 114, 115], "primarili": [42, 64, 65, 67, 68, 70, 75, 76, 120], "print": [42, 64, 65, 67, 68, 74, 75, 76, 98, 125, 135], "prior": 23, "prioriti": 87, "pro": 79, "probabl": [0, 46, 146], "problem": [12, 67, 84, 100, 104, 143], "proc": [67, 68, 70, 72], "proc_atm": 6, "proce": 19, "process": [6, 7, 12, 23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 54, 59, 62, 72, 74, 76, 118, 125, 143], "process_al": 72, "processor": 106, "produc": [18, 50, 64, 69, 73, 77, 91, 106, 108, 142, 145], "product": [21, 63, 70, 73, 95, 97], "profil": [14, 76, 79, 106, 127, 131, 133], "prognist": 20, "prognost": [8, 20, 21, 43, 45, 82, 83], "program": [0, 49, 52, 59, 120, 123, 124, 125, 129, 134], "progress": [6, 74, 76], "project": [5, 8, 17, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 64, 65, 67, 70, 72, 73, 74, 75, 76, 80, 87, 108, 109, 121, 125, 131, 137, 138, 143], "promot": 59, "prompt": [24, 118, 129], "prone": 7, "pronounc": 67, "proper": 72, "properli": [1, 42, 51, 76, 94], "properti": [37, 46, 65, 76], "propog": 98, "proport": 50, "protocol": [29, 119, 122, 123], "provi": 59, "provid": [2, 3, 8, 13, 17, 18, 20, 34, 37, 38, 51, 57, 59, 60, 62, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 79, 81, 83, 86, 94, 96, 106, 111, 112, 119, 121, 122, 123, 124, 125, 128, 129, 130, 141], "proxi": 51, "psl": 125, "pstrid": 8, "ptclm": 12, "pth": [74, 75, 76], "public": 81, "publicli": [78, 121], "publish": [42, 119], "pull": 14, "purpos": [33, 59, 70, 74, 137], "push": 59, "put": [0, 3, 10, 12, 14, 16, 72, 92, 97], "put_user_name_her": [63, 65, 68, 70, 74, 75, 76], "pver": 137, "pwd": [11, 24, 118, 135], "pwg": 87, "py": [63, 65], "pyplot": [41, 50, 64, 65, 67, 68, 70, 74, 75, 76], "pythia": 70, "python": [7, 11, 26, 41, 46, 50, 63, 67, 69, 70, 72, 73, 83, 123, 124, 125], "python3": [63, 65], "pyx": 65, "q": [5, 6, 15, 49, 108, 113, 132], "qcmd": [3, 16, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 91, 92, 93, 108, 109, 132, 137, 138, 142, 143], "qfed": 25, "qfed2": 25, "qstat": [6, 16, 17, 18, 48, 50], "qsub": 5, "quadrat": 60, "quantit": 60, "quantiti": [20, 76, 117], "queri": [17, 27, 88, 91, 94], "query_config": [8, 11, 15, 20, 27], "query_testlist": 11, "question": [42, 49, 50, 65, 67, 68, 70, 74, 76, 84, 96], "queue": [6, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 73, 74, 76, 91, 102, 105, 106, 108, 109, 131, 137, 138, 143], "quick": [11, 26, 70, 74, 76, 78, 122, 123], "quicker": [74, 76], "quickli": [51, 59, 76, 106, 120, 125, 127, 132, 133], "quickstart": 121, "quikstart": 121, "quit": [8, 15, 26, 42, 130], "quota": 145, "r": [3, 7, 8, 11, 41, 42, 65, 74, 76, 123, 124, 127, 135, 137, 138], "r05": 8, "r05_g": 8, "r8": 33, "r_": [37, 50], "r_snw": 37, "racmo": 42, "racmo2": 42, "rad": [20, 49], "rad_lwsw": [28, 29, 30, 31, 32, 33], "radi": [20, 28, 29, 30, 31, 32, 33, 37], "radiat": [20, 37, 49], "radiu": [37, 67, 68], "raijin": 63, "rain": [50, 138], "rainbow": 68, "rais": [42, 65], "ramp": 20, "ran": [14, 17, 27, 71, 73], "rang": [14, 41, 59, 62, 68, 70, 125], "raster": [63, 64], "rate": [24, 28, 29, 30, 31, 32, 33, 76], "rather": [3, 50, 74, 76], "ratio": [50, 51, 70], "ravel": 67, "raw": [67, 70], "rc": [12, 23], "rdbu": [67, 75], "rdylbu_r": [74, 76], "re": [3, 8, 16, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 40, 44, 45, 47, 48, 49, 50, 53, 56, 68, 70, 74, 76, 91, 92, 93, 108, 109, 137, 138, 143], "reach": [102, 138], "reaction": 24, "read": [2, 20, 24, 42, 46, 49, 50, 59, 65, 67, 68, 71, 76, 86, 99, 104, 119, 121], "read_dat": 76, "readabl": 125, "readi": [72, 73], "readm": [7, 11, 91], "readme_extern": 11, "real": [21, 33, 49, 65, 73, 125], "realist": [37, 38], "realiz": 68, "reanalysi": 22, "reason": [42, 64, 67, 70, 106, 142], "rebuild": [3, 24, 142], "rebuilt": 5, "recal": [102, 104], "reced": 49, "receiv": [85, 104], "recent": [65, 81], "recogn": 0, "recommend": [22, 28, 62, 72, 86, 94, 112, 119, 120, 122, 123, 125, 129], "reconstruct": 51, "record": [6, 14, 15, 17, 51, 70, 94, 125], "rectangl": 64, "recurs": [72, 135], "red": [65, 72, 73, 81, 86, 123, 124], "redefin": 25, "redo": 130, "redon": [23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50], "reduc": [3, 64], "ref": [30, 92], "refcas": [3, 5, 97], "refer": [0, 1, 2, 10, 20, 49, 59, 60, 63, 68, 74, 80, 92, 96, 97, 127, 133, 141], "referenc": [122, 123], "reflect": [46, 49, 50], "refresh": 96, "regard": 84, "region": [42, 64, 67, 70], "region_area": 64, "region_data": 64, "region_ind": 64, "regist": [84, 121], "registr": [78, 84], "regrid": 67, "regridd": 67, "regular": [5, 8, 67, 102], "regularli": [74, 76], "reimplement": 59, "rel": [39, 50, 65, 67, 70, 76, 96, 143], "relat": [21, 59, 85, 92, 96], "relax": 96, "releas": [0, 2, 6, 12, 26, 40, 78, 80, 121], "release_cesm2_1_0": [3, 5, 8], "release_tag": 6, "relev": [34, 72, 87, 96, 127, 133, 137, 140, 143], "reli": [51, 54], "reliabl": 106, "remain": [5, 9, 72, 145], "remaind": [10, 11, 127, 131, 133], "remap": 74, "rememb": [11, 16, 23, 68, 70, 74, 76, 81, 91, 92, 93, 96], "remot": [119, 121, 122, 123, 129], "remov": [60, 65, 68, 70, 135], "renam": [0, 41, 74, 135], "rename_dim": [67, 68], "render": 73, "repeat": [35, 52], "repeatedli": 70, "replac": [4, 12, 25, 33, 40, 64, 72, 74, 76, 83, 118, 130], "repo": [72, 121], "report": [54, 70], "repositori": [0, 12, 60, 68, 73, 85, 121], "repres": [14, 17, 74], "represent": [54, 109, 111, 138, 141], "reproduc": [59, 96], "req": 6, "request": [73, 96, 102], "requir": [3, 6, 8, 10, 12, 17, 22, 25, 33, 35, 47, 52, 59, 70, 72, 78, 86, 96, 109, 121, 126, 129, 130, 136, 138, 142], "rerun": 142, "res_surface_1750": 25, "research": [0, 17, 40, 80, 121], "reserv": [127, 132, 133], "reset": [24, 76], "reset_coord": 76, "resol": 8, "resolut": [16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56, 63, 64, 74, 76, 81, 91, 93, 108, 109, 137, 138, 143], "resourc": [1, 13, 57, 59, 70, 73, 74, 76, 122, 123, 124, 129, 135], "resource_spec": [74, 76], "respect": [10, 50, 96], "respons": [46, 60, 87], "rest": [11, 12, 14, 35, 39, 43, 51, 52, 67, 68, 92, 93, 96, 104, 145], "rest_n": [94, 104], "rest_opt": [94, 104], "restart": [3, 5, 14, 17, 30, 92, 93, 95, 97, 101, 105, 143], "resubmiss": [96, 102], "resubmit": [5, 92, 94, 96, 104, 145], "result": [3, 5, 6, 24, 25, 35, 38, 42, 46, 49, 50, 52, 65, 70, 71, 72, 73, 77, 94, 96, 110, 113, 117], "retain": 12, "return": [11, 25, 50, 64, 65, 70, 73, 75, 76, 94, 107, 119, 122, 123, 124, 127, 131, 133], "reuse_weight": 67, "reveal": 125, "revers": [68, 75], "revert": 49, "review": [1, 12, 60, 112, 119], "revis": 121, "revisit": 47, "rf": 72, "rho2": 74, "rholvi": 46, "right": [11, 14, 33, 41, 49, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 86], "ring": 51, "rise": 49, "river": [8, 82], "rm": [72, 75, 135], "ro": 3, "robeson_channel": 74, "robinson": [50, 70, 74, 75, 76], "robust": [70, 74, 76, 109], "rocha": 75, "rodger": [68, 70], "rof": [3, 5, 8, 104], "rof_modelio": 23, "role": [54, 55], "roll": 70, "root": [1, 10, 65, 72], "rootp": [8, 94], "rootpe_atm": 8, "rootpe_cpl": 8, "rootpe_glc": 8, "rootpe_ic": 8, "rootpe_lnd": 8, "rootpe_ocn": 8, "rootpe_rof": 8, "rootpe_wav": 8, "rotate_wind_stress": 55, "rougli": 59, "routin": [55, 72, 136, 140], "rpointer": [3, 5, 104], "rsnw": 37, "rsnw_mlt": 37, "rsnw_nonmelt": 37, "rst": 11, "rtm": [6, 8, 11, 12], "rule": [17, 99], "run": [0, 1, 2, 3, 4, 5, 8, 9, 10, 12, 13, 14, 15, 17, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 59, 60, 62, 65, 68, 70, 71, 72, 74, 75, 76, 81, 82, 84, 88, 90, 93, 94, 99, 106, 108, 109, 110, 113, 115, 117, 119, 121, 127, 129, 132, 133, 137, 138, 140, 142, 143, 146], "run_": 92, "run_dir": [23, 24, 25, 72], "run_length": [47, 65, 68, 70, 72, 74, 75, 76, 91], "run_nam": [67, 68, 70], "run_refcas": [8, 20, 30, 92, 93, 96, 97], "run_refd": [8, 30, 92, 93, 96, 97], "run_startd": [8, 25, 30, 40, 96, 97], "run_typ": [8, 92, 93, 94, 95, 96, 97, 104], "rundir": [3, 4, 5, 6, 9, 10, 23, 24, 25, 28, 29, 30, 31, 32, 33, 48, 49, 50, 92, 93, 96, 97, 104, 117, 143, 145], "runoff": [35, 52, 82, 96], "runtim": [84, 90, 91, 93, 101, 142], "runtimeerror": 65, "russia": 67, "rw": 11, "rwxr": 11, "rx1": 8, "safe": 120, "sai": [40, 76, 80, 102, 106], "salin": 74, "same": [12, 18, 20, 22, 27, 29, 30, 31, 32, 33, 35, 39, 40, 43, 49, 51, 52, 64, 65, 70, 72, 76, 96, 100, 104], "sampl": [36, 50, 51, 108, 113, 115], "sampling_sequ": [28, 29, 30, 31, 32, 33], "sandbox": 6, "satellit": [43, 68], "satm": 8, "save": [10, 59, 60, 70, 74, 75, 76, 125, 127, 131, 133], "savefig": [74, 75, 76], "scalabl": [59, 63], "scalar": [41, 42], "scale": [8, 14, 28, 29, 30, 31, 32, 33, 42, 50, 54, 55, 64, 65, 68, 74, 76, 106], "scale_color": 75, "scale_factor": 64, "scenario": [8, 40, 42], "schedul": [5, 85, 87, 127, 132, 133], "schema": 83, "schemat": 83, "scheme": 37, "sci": 6, "scienc": [0, 35, 39, 43, 52, 83, 87], "scientif": [8, 12, 22, 25, 27, 40, 59, 70, 73, 87, 120, 125], "scientist": [0, 79], "scope": 0, "scratch": [3, 4, 5, 9, 10, 14, 16, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 65, 68, 70, 72, 74, 75, 76, 92, 93, 108, 109, 137], "screen": [49, 74, 75, 76, 125, 130], "scrip": 63, "script": [3, 4, 5, 7, 8, 11, 16, 17, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 91, 92, 93, 94, 99, 100, 102, 108, 109, 117, 137, 138, 143], "scroll": [15, 130], "scrub": 9, "sd": 22, "sea": [0, 8, 20, 23, 25, 27, 29, 37, 38, 39, 43, 52, 72, 74, 75, 76, 77, 79, 82, 100], "seaic": 72, "seaice_index": 68, "search": [25, 27, 38, 47, 49, 50, 54, 55, 56, 59, 84, 107, 129, 130, 134, 135, 143], "search_pattern": 64, "searchabl": 81, "season": [37, 49, 65, 68], "seat": 63, "sec": 3, "second": [3, 14, 17, 23, 24, 25, 65, 67, 70, 74, 76, 93, 100, 106, 137], "section": [1, 2, 3, 4, 5, 8, 12, 13, 15, 17, 18, 19, 34, 47, 57, 60, 62, 68, 70, 72, 74, 76, 81, 88, 94, 99, 106, 111, 112, 113, 115, 119, 122, 123, 124, 125, 127, 128, 130, 131, 133, 141, 143], "secur": [119, 122, 123], "sediment": 51, "see": [0, 4, 6, 8, 10, 14, 25, 27, 37, 38, 40, 41, 42, 45, 46, 49, 54, 60, 63, 65, 67, 68, 70, 72, 73, 74, 76, 85, 86, 94, 96, 109, 114, 116, 121, 122, 123, 124, 125, 126, 127, 130, 131, 133, 137, 143, 145], "seek": 59, "seen": [24, 37], "sel": [65, 67, 68, 70, 74, 75, 76], "select": [14, 21, 25, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 77, 119, 122, 123, 125], "self": [63, 65, 70, 125, 130], "semienclos": 54, "seminar": 85, "send": 15, "sens": [21, 59, 63, 65, 68], "sensibl": [28, 29, 30, 31, 32, 33, 67, 68], "sensit": [12, 38, 96], "separ": [5, 17, 35, 73, 76, 82, 100], "septemb": [68, 69, 75], "septemp": 75, "seq_map": 23, "sequenc": 73, "seri": [39, 42, 60, 62], "serv": [0, 59, 121], "server": [73, 119, 122, 123], "servic": 121, "sesp": [3, 5, 8], "sessid": 6, "session": [73, 127, 129, 132, 133], "set": [2, 3, 4, 7, 8, 12, 13, 14, 16, 17, 18, 19, 20, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 59, 63, 64, 65, 67, 68, 70, 73, 79, 83, 86, 88, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 106, 108, 109, 111, 112, 113, 114, 115, 116, 117, 122, 123, 134, 137, 142, 143], "set_boundari": [67, 68], "set_ext": [67, 68, 70, 74, 76], "set_facecolor": 67, "set_glob": [64, 74, 76], "set_label": [67, 70, 74, 76], "set_opt": [67, 68], "set_posit": 65, "set_titl": [41, 50, 67, 70, 74, 76], "set_xlabel": [41, 65], "set_xlim": 65, "set_xtick": 41, "set_xticklabel": 41, "set_ylabel": 41, "set_ylim": 76, "set_ytick": 41, "set_yticklabel": 41, "setenv": [40, 127, 131, 133], "setup": [1, 2, 3, 6, 8, 10, 12, 15, 16, 17, 19, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 72, 91, 92, 93, 96, 108, 109, 126, 137, 138, 143], "seven": 17, "sever": [27, 60, 63, 70, 73, 92, 94, 101, 106, 111, 138, 145, 146], "sewal": 67, "sewg": 87, "sfc": [47, 74], "sglc": 8, "shade": [64, 76], "shafer": 49, "shape": [55, 64, 76], "shapefil": 59, "share": [8, 59, 71, 83, 121, 125, 132], "sharedlib_onli": 3, "sharei": [41, 74, 76], "sharex": [74, 76], "sheet": [0, 39, 40, 41, 49, 134, 135], "shell": [7, 122, 123], "shelv": 54, "shf": [74, 76], "shf_cbar": [74, 76], "shflx": [28, 29, 30, 31, 32, 33], "shift": [49, 73, 119, 122, 123], "ship": 25, "ship_surface_1750": 25, "short": [9, 14, 17, 18, 19, 65, 66, 68, 70, 73, 92, 94, 98, 99, 109, 121], "shortcut": 130, "shortnam": 20, "shortwav": [37, 49], "should": [1, 3, 4, 5, 10, 12, 14, 19, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 42, 46, 48, 49, 50, 62, 63, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 80, 91, 94, 96, 99, 101, 102, 104, 105, 108, 109, 117, 120, 127, 131, 132, 133, 137, 143], "show": [14, 24, 27, 37, 42, 46, 54, 60, 65, 70, 74, 76, 83, 117, 118, 123, 124, 125, 135, 140, 143], "showcas": 63, "shown": [4, 14, 65, 70, 72, 106, 121, 122, 123], "shr_orb_param": 49, "shrink": [64, 74, 75, 76], "sic_ocean": 67, "sic_rg": 67, "side": [49, 76], "sigma2": 74, "sign": [37, 73], "signal": 51, "signific": [27, 54, 63, 120], "significantli": 142, "similar": [22, 31, 32, 33, 42, 50, 56, 59, 64, 70, 72, 125, 130], "similarli": 70, "simpl": [8, 24, 27, 35, 43, 51, 59, 63, 64, 65, 66, 67, 118, 130], "simplest": 64, "simpli": [64, 119], "simplic": 49, "simplif": 64, "simplifi": [6, 22, 63], "simul": [1, 2, 10, 16, 17, 18, 19, 22, 23, 24, 25, 35, 37, 38, 39, 40, 43, 48, 49, 50, 51, 52, 54, 55, 59, 60, 62, 65, 68, 70, 71, 72, 73, 74, 75, 76, 82, 96, 101, 102, 105, 106, 113, 115, 127, 132, 133], "simulated_year": 106, "simulationg": [35, 43, 52], "simultan": 82, "sin": [67, 68], "sinc": [8, 11, 16, 18, 20, 36, 40, 44, 47, 53, 56, 65, 75, 121], "singl": [8, 11, 14, 18, 41, 42, 62, 63, 64, 68, 72, 77, 94, 108, 113, 115, 125, 136, 137], "sink": [42, 125], "site": [63, 65, 70, 121], "six": [73, 115], "size": [14, 36, 47, 53, 62, 64, 65, 70, 108], "sizefonti": 42, "sizefonttitl": 42, "sizefontx": 42, "skill": 51, "skip": [36, 49, 53, 86], "sky": 70, "slc": 42, "slice": [41, 67, 70, 72, 75], "slide": 126, "slight": [6, 96], "slightli": 96, "slnd": 8, "slope": 54, "slower": 142, "small": [7, 42, 50, 67], "smaller": [37, 54, 62, 68, 70], "smallest": 76, "smb": [41, 42], "smb1": 41, "smb2": 41, "smbb_clm50": 8, "smft": 55, "smyle_clm50": 8, "sname": 72, "snapshot": 98, "sno": [38, 40], "snow": [35, 37, 50, 109], "snw": 37, "so": [8, 11, 12, 13, 15, 35, 42, 50, 59, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 91, 102, 108, 112, 117, 123, 124, 125, 127, 130, 142, 143], "so2": 25, "so4_a1": 25, "so4_a2": 25, "social": 121, "socn": 8, "softwar": [13, 22, 27, 87, 121, 122, 123, 124, 126, 129], "soil": 70, "soilw": 63, "solar": [49, 50, 70], "solin": 49, "solut": [12, 16, 17, 18, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 64, 65, 67, 68, 70, 74, 75, 76, 91, 92, 93, 94, 96, 102, 104, 108, 109, 113, 115, 137, 138, 143], "solv": [24, 84], "some": [8, 11, 12, 14, 17, 20, 22, 26, 42, 54, 59, 62, 63, 65, 67, 68, 69, 70, 72, 74, 77, 80, 83, 86, 88, 98, 106, 112, 119, 120, 121, 123, 124, 125, 128, 129, 130, 143], "someth": [23, 24, 25, 38, 64, 65, 74, 76, 99, 143], "sometim": [37, 67, 74, 76, 125, 143], "somewhat": [94, 96], "somewher": 143, "soon": [9, 67], "sophia": 0, "sort": [12, 16, 18, 64, 76], "sortbi": [74, 76], "sourc": [3, 10, 17, 24, 35, 38, 52, 55, 59, 64, 70, 72, 84, 96, 121, 127, 130, 131, 133, 137, 140], "source_c": [6, 12], "sourceforg": 125, "sourcemod": [3, 7, 33, 38, 55, 137, 138, 140], "south": [42, 76], "south_lat": 64, "southern": [67, 68, 75], "southpolarstereo": 68, "sp": 43, "space": [9, 74, 76, 92, 94], "spacebar": 15, "span": 40, "spatial": [50, 59, 60, 67, 71, 125], "special": [94, 109, 122, 123, 126], "specif": [2, 8, 10, 11, 17, 22, 27, 63, 70, 72, 75, 85, 99, 108, 118], "specifi": [6, 8, 17, 22, 35, 37, 52, 64, 70, 72, 73, 74, 76, 94, 96, 99, 100, 101, 102, 104, 105, 113, 115, 125, 135, 138], "specifii": 73, "spectra": 60, "spectral_r": [41, 65], "spent": 3, "sphere": [64, 66], "spheric": 63, "spin": 25, "sponsor": 0, "spotlight": 129, "spread": [60, 76], "spun": [20, 27, 30, 42, 96], "squeez": [41, 65, 67, 68], "src": [3, 5, 6, 11, 24, 33, 38, 55, 65, 137, 138, 140], "srcroot": [3, 4, 5, 7, 8, 9, 10, 11, 12, 24, 91], "srf_emis_specifi": 25, "srof": 8, "ssc": 87, "ssec": 14, "ssh": [74, 76, 118, 119, 122, 123, 129], "ssp126_cam60": 8, "ssp126_cam60_clm50": 8, "ssp245_cam60": 8, "ssp245_cam60_clm50": 8, "ssp370_cam60": 8, "ssp370_cam60_clm50": 8, "ssp370ext_cam60": 8, "ssp5": 40, "ssp534_cam60": 8, "ssp534ext_cam60": 8, "ssp585": 60, "ssp585_cam60": 8, "ssp585_cam60_clm50": 8, "ssp585ext_cam60": 8, "sss": 76, "ssss": 104, "sst": [22, 25, 27, 29, 30, 32, 74, 76], "sst_cbar": [74, 76], "sst_cpl": 32, "sst_hadoibl_bc_0": 25, "sst_hadoibl_bc_1": 32, "sstice": 25, "sstice_data_filenam": [25, 32], "st_archiv": [4, 5, 6, 8, 9, 17, 91, 94, 99], "st_data": 64, "stabl": 72, "stack": 59, "staff": 0, "stage": [3, 59, 73, 96], "stai": [96, 102, 105], "stamp": 97, "stand": [42, 125], "standard": [8, 19, 26, 37, 49, 50, 63, 67, 69, 72, 74, 76, 77, 78, 91, 98, 113, 116, 125], "start": [0, 5, 6, 11, 13, 17, 22, 25, 26, 27, 29, 37, 41, 49, 59, 63, 68, 70, 71, 72, 73, 76, 93, 96, 97, 101, 104, 109, 118, 120, 122, 123, 129], "start_year": 72, "startdat": 25, "startup": [91, 95, 97, 104, 105], "state": [12, 24, 38, 41, 51, 63, 70, 74, 76, 96, 137], "statement": 98, "statist": [109, 125], "statu": [2, 6, 12, 16, 17, 18, 48, 50], "std": [50, 74, 76], "stdout": 98, "steer": 87, "step": [1, 3, 5, 6, 7, 8, 15, 17, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 40, 42, 47, 48, 49, 50, 53, 59, 65, 67, 68, 70, 100, 111, 115, 117, 127, 131, 133, 140, 141], "steps_per_dai": 100, "stereograph": [67, 68], "still": [3, 5, 12, 42, 47, 49, 73, 96], "stock_img": [74, 76], "stop": [49, 101, 104], "stop_n": [18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 47, 48, 49, 50, 53, 54, 55, 56, 91, 92, 94, 96, 102, 104, 106, 108, 109, 113, 115, 137, 138, 143], "stop_opt": [18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 47, 48, 49, 50, 53, 54, 55, 56, 91, 92, 94, 96, 102, 104, 106, 108, 109, 113, 115, 137, 138, 143], "stopiter": 65, "storag": [49, 75], "store": [25, 62, 65, 67, 70, 74, 99, 121, 125, 134], "store_entrypoint": 65, "storebackendentrypoint": 65, "str": [65, 67, 70], "straight": 65, "straightforward": 143, "stratiform": 64, "stratiform_precip_nam": 64, "stratospher": [22, 80], "stream": [23, 40, 96, 116], "stress": [52, 138], "stretch": 67, "strftime": 65, "string": [64, 68, 72, 125, 145], "strong": [42, 87], "strongli": [87, 119, 120, 134], "structur": [1, 15, 63, 70, 71, 72, 82, 86, 99, 120, 125, 134], "stub": [39, 83], "stub_comp": [3, 5], "student": [19, 22, 27, 35, 39, 43, 51, 52, 110, 139], "studi": [51, 96], "style": [60, 63], "sub": [10, 11, 136, 140], "subdirectori": [8, 23, 24, 25, 108], "subgridscal": [67, 69], "subgroup": 91, "subject": 87, "submiss": [5, 17, 96, 99, 105], "submit": [1, 2, 6, 8, 15, 16, 17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 72, 91, 92, 93, 96, 99, 104, 105, 108, 109, 117, 122, 123, 137, 138, 143], "submit_job": 5, "submodul": [35, 72], "submssion": 105, "subplot": [41, 50, 64, 65, 67, 70, 74, 76], "subplot_kw": [50, 64, 67, 70], "subplots_adjust": 41, "subroutin": [33, 55, 136, 137, 138, 140], "subscrib": 84, "subsect": 120, "subsequ": [102, 121], "subset": [64, 68, 125], "substanti": [0, 67, 125], "success": [3, 5, 6, 9, 15, 48, 50, 145], "successfulli": [3, 5, 6, 14, 16, 18, 19, 65, 68, 70, 72, 74, 75, 76, 94, 119, 122, 123, 128, 145], "suggest": [119, 121, 134], "suit": [59, 125], "sum": [64, 67, 68, 75, 115], "summar": [106, 134, 135], "summari": [97, 106], "summer": [0, 67], "summertim": 49, "sun": [49, 86], "supercomput": [1, 59, 118], "support": [0, 12, 13, 22, 28, 40, 59, 63, 65, 80, 94, 118, 125, 126], "suppos": 136, "sure": [1, 16, 25, 46, 65, 74, 76, 91, 92, 104, 127, 133], "surfac": [0, 20, 21, 25, 26, 27, 28, 29, 30, 31, 33, 37, 39, 65, 66, 74, 76, 77, 79, 136, 137, 143], "surpris": 42, "surround": 54, "suspect": 42, "suspici": 42, "suspicion": 42, "svoc": 25, "swav": 8, "swim": [74, 76], "switch": [12, 41, 70, 96, 102], "symbol": 129, "sync": 104, "syntax": [94, 99, 120, 136], "synthes": 59, "system": [0, 7, 10, 11, 12, 17, 43, 62, 68, 70, 72, 73, 79, 82, 86, 87, 100, 119, 121, 124, 130, 145], "t": [11, 14, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 40, 49, 67, 68, 70, 72, 74, 76, 91, 92, 96, 108, 112, 113, 121, 125, 130, 137, 142, 143, 145], "t1850": 39, "t1850g": [39, 40], "t1850gg": 40, "t200": 28, "t2m": 143, "t500": [28, 136, 137], "t62_g37": [35, 36, 38, 52, 53, 56], "t750": [136, 137], "t750_minus_t500": 137, "t850": [28, 29, 30, 31, 32, 33], "t_0n140w_mean": 76, "t_0n140w_std": 76, "t_gris_ssp585_2015_2100": [40, 41, 42], "tabl": [49, 72, 120], "tag": [12, 121], "tailor": 59, "tain": 12, "taiwan_luzon": 74, "take": [13, 17, 40, 42, 48, 49, 50, 63, 72, 73, 74, 76, 87, 92, 94, 96, 104, 106, 120, 121, 136, 145], "taken": [73, 120], "talk": [42, 109], "tandem": 119, "tape": 136, "tarea": [67, 68], "target": [67, 126], "target_grid": 67, "task": [1, 5, 8, 11, 14, 46, 62, 94, 121, 125], "tavg": [3, 5], "tavg_file_freq": 116, "tavg_file_freq_opt": 116, "tavg_freq": 116, "tavg_freq_opt": 116, "tavg_nml": 116, "tc": 64, "tcoord": 64, "tcsh": [28, 29, 30, 31, 32, 33, 40, 48, 49, 50], "tcshrc": [14, 127, 131, 133], "tdat": [74, 76], "teach": 52, "team": 87, "technic": [12, 138], "techniqu": [62, 63], "technologi": 59, "tell": [3, 24, 48, 50, 91, 102, 108, 142, 143, 145], "temp": [70, 76], "temperatur": [25, 27, 28, 29, 30, 31, 33, 37, 39, 42, 65, 66, 70, 74, 75, 76, 77, 79, 125, 136, 137, 141, 143], "templat": [4, 72, 137], "tempor": [35, 52, 64, 106], "temporari": 100, "temporarili": [12, 47], "tend": 67, "tend_temp": 75, "tendenc": 75, "term": [9, 14, 17, 21, 65, 70, 73, 87, 92, 94, 98, 99], "termin": [11, 14, 49, 118, 122, 123, 124, 125, 130, 145], "terminologi": [10, 20], "terrestri": 43, "test": [0, 8, 11, 27, 34, 73, 104], "test1": 23, "test2": 24, "test3": 25, "tester": 0, "text": [23, 24, 25, 28, 29, 30, 31, 32, 33, 41, 42, 49, 50, 74, 94, 104, 123, 124, 127, 131, 133], "tg": [39, 115], "than": [3, 42, 46, 49, 50, 54, 67, 68, 72, 74, 76, 127, 130, 133], "thayer": [0, 39], "thee": 64, "thei": [6, 8, 17, 22, 35, 40, 42, 43, 49, 54, 70, 73, 74, 76, 94, 104, 105, 120, 125, 143], "them": [10, 11, 12, 23, 24, 25, 35, 41, 42, 63, 64, 68, 70, 72, 74, 76, 119, 122, 123, 124, 129], "theori": [127, 133], "therefor": [22, 47, 70, 96], "thermal": [38, 42], "thermodynam": 35, "thermospher": [22, 27], "theta": [67, 68], "thetao": 74, "thi": [1, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 21, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 81, 84, 88, 89, 91, 92, 93, 94, 96, 98, 99, 100, 102, 105, 106, 107, 108, 109, 111, 112, 113, 115, 117, 118, 119, 121, 122, 123, 124, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 140, 141, 142, 143, 145], "thick": [27, 40, 42, 68, 75], "thicker": 67, "thing": [7, 12, 62, 69, 74, 76, 77, 80, 125, 145], "think": [37, 42, 55, 68], "thinkt": 55, "third": 67, "thirti": 108, "thk": 41, "thk1": 41, "thk2": 41, "those": [23, 24, 25, 38, 42, 65, 68, 70, 72, 74, 123, 124, 127, 131, 133, 134, 145], "though": 40, "thoughput": 106, "thought": 42, "thread": 8, "threads_per_work": 72, "three": [12, 17, 20, 21, 38, 52, 67, 68, 70, 81, 90, 95, 105, 125, 127, 131, 133, 143], "threshold": [27, 109, 138], "through": [0, 6, 11, 15, 35, 38, 41, 59, 62, 68, 70, 82, 83, 84, 87, 99, 118, 119, 121, 127, 129, 130, 131, 132, 133], "throughout": [12, 70, 77, 123, 124], "throughput": [48, 49, 50, 105, 106], "throw": 67, "thu": [9, 50, 65, 67, 68, 70, 127], "thursdai": 126, "ti": 72, "tick": [65, 74, 75, 76], "tick_param": [41, 65], "ticker": [74, 76], "tide": 42, "tight": [74, 75, 76], "tilm": 25, "time": [0, 1, 2, 3, 6, 7, 15, 17, 19, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 42, 44, 45, 46, 49, 50, 52, 60, 62, 63, 64, 67, 73, 74, 75, 76, 91, 92, 94, 96, 99, 100, 101, 102, 104, 105, 108, 113, 114, 115, 116, 121, 125, 132, 137, 142, 143, 145], "time_area": 41, "time_maf": 42, "time_mass": 41, "timelin": 0, "timemax": [41, 42], "timemin": [41, 42], "timeout": 3, "timeseri": [57, 68, 70, 71, 72, 78], "timeslic": [65, 67, 68], "timestep": [36, 62, 68, 76, 90, 108, 113, 115, 125], "tindex": 136, "tip": [70, 94, 104, 137, 138, 143], "titl": [41, 42, 65, 67, 68, 70, 72, 75, 76, 81], "title0": 41, "title1": 41, "title2": 41, "tl319_t232": [47, 52], "tlai": [45, 115], "tlat": [67, 68, 75, 76, 77], "tlist": [74, 76], "tlon": [67, 68, 76], "tlong": [67, 68, 75, 76, 77], "to_dataset": 70, "to_datetimeindex": [74, 76], "todai": [49, 85, 109], "togeth": [0, 59, 94, 96], "toggl": [49, 86], "toluen": 25, "too": [18, 109, 121], "tool": [3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 17, 26, 27, 31, 32, 35, 43, 49, 51, 57, 60, 62, 63, 67, 68, 69, 70, 72, 73, 80, 83, 94, 121, 122, 123, 124, 125], "toolkit": 59, "top": [11, 22, 28, 29, 30, 31, 32, 33, 49, 65, 67, 68, 73, 76, 119, 121, 122, 123], "topic": [70, 105, 119], "topo": 31, "topo50": 31, "topograph": 31, "topographi": [31, 42], "total": [11, 28, 29, 30, 31, 32, 33, 42, 64, 67, 70, 91, 96, 102, 106], "toward": 22, "traceback": 65, "tracer": [20, 21, 51, 74], "track": [6, 7, 12, 15, 47, 121], "trade": [74, 76], "trail": 94, "transax": [67, 68, 70], "transect": 74, "transfer": [6, 14, 37, 73], "transform": [50, 59, 64, 65, 67, 68, 70, 74, 75, 76], "transform_point": 64, "transient": [22, 45], "translat": 67, "transport": [8, 54, 74, 99], "transpos": 65, "trap": 142, "travers": 49, "treatment": 94, "tree": [10, 17, 51], "trefht": [72, 143], "trend": [60, 68, 77], "triangl": 64, "triangluat": 64, "triangul": 64, "trick": [76, 109, 121, 143], "trigger": 27, "tripcolor": 64, "tripol": 67, "trop_strat_mam4_vb": 24, "tropic": [27, 109], "tropospher": 22, "troubleshoot": [143, 144], "true": [8, 41, 50, 63, 64, 65, 67, 68, 70, 74, 75, 76, 91, 94, 95, 96, 97, 98, 102, 104, 105, 114, 117, 142], "try": [5, 15, 27, 34, 37, 62, 65, 67, 68, 69, 70, 72, 73, 74, 76, 77, 94, 104, 142, 143], "ts1": 22, "ts2": 22, "ts_0": 65, "ts_data_path": 72, "ts_done": 72, "ts_output_dir": 72, "tseri": [67, 68, 70, 72], "tsk": 6, "tsmlt": 22, "tsmlt1": 22, "tsujino": [35, 52], "tue": 127, "tune": [38, 110, 117], "tunnel": 129, "tupl": 76, "turbo": 75, "turn": [8, 12, 52, 98], "tutori": [3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 59, 62, 64, 65, 68, 70, 71, 72, 74, 75, 76, 85, 86, 91, 92, 93, 96, 99, 102, 108, 109, 112, 118, 119, 121, 122, 123, 124, 126, 128, 134, 135, 137, 138, 143], "tutorial_2023_arch": [64, 65, 68, 70, 72, 92, 93], "tutorial_2024_arch": [74, 75, 76], "tutorial_2024_env": [131, 133], "tutorial_queu": [127, 133], "tv": 115, "two": [8, 11, 14, 21, 22, 26, 35, 43, 45, 46, 49, 52, 63, 64, 65, 67, 70, 72, 73, 94, 100, 104, 125, 136, 142], "txt": [11, 23, 40, 135], "type": [24, 26, 27, 30, 35, 39, 43, 46, 49, 52, 59, 62, 63, 65, 73, 74, 76, 88, 93, 94, 99, 105, 107, 119, 122, 123, 125, 127, 129, 131, 133, 136], "typic": [0, 20, 39, 40, 68, 70, 96, 100, 102, 105, 112], "u": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 18, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 65, 70, 90, 91, 92, 93, 99, 102, 108, 109, 113, 125, 137, 138, 143], "u200": 28, "u850": [28, 29, 30, 31, 32, 33], "ubct": 64, "uc": 129, "ucar": [8, 17, 22, 25, 26, 27, 42, 53, 73, 80, 109, 114, 116, 118, 119, 121, 122, 123, 129], "ucsd": 52, "uesm0013": [23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 73, 74, 76, 108, 109, 127, 131, 132, 133, 137, 138, 143], "ugrid": 63, "ulat": [67, 68, 75, 76], "ulon": [67, 68], "ulong": [75, 76], "unabl": [40, 65, 68, 70, 74, 75, 76], "uncertainti": 42, "uncom": [72, 74, 75, 76], "uncoupl": 39, "under": [0, 1, 7, 8, 17, 24, 25, 38, 42, 62, 72, 73, 93, 121, 137], "undergo": 54, "underli": 72, "understand": [12, 17, 27, 34, 42, 51, 62, 69, 73, 74, 90, 94, 96, 102, 104, 113, 115, 141, 143], "undo": [12, 130], "unexpect": [42, 116], "unfamiliar": [13, 14, 119, 134], "unifi": [72, 83], "unit": [28, 29, 30, 31, 32, 33, 41, 64, 67, 68, 69, 70, 75, 106, 108, 116, 120, 136, 137], "unitless": 70, "univers": [17, 59, 63, 121], "unix": [12, 68, 70, 72, 125, 129, 130], "unless": [8, 21], "unlik": 96, "unlimit": 108, "unstructur": 63, "unsuccess": [5, 9], "unsupport": [29, 30, 40, 44, 45, 50], "unsur": 94, "untest": [29, 30], "until": [6, 19, 74, 76, 143], "up": [0, 2, 4, 10, 11, 13, 14, 16, 17, 19, 20, 23, 24, 25, 27, 29, 30, 40, 42, 46, 50, 56, 63, 64, 65, 67, 68, 73, 92, 93, 96, 113, 115, 121, 122, 123, 134, 143], "upcom": 72, "updat": [6, 12, 14, 17, 19, 73, 76, 84, 85, 91, 92], "upon": [0, 59, 104], "upper": [64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 86, 129], "uprho_": 75, "uptheta": 75, "uptheta_": 75, "url": 73, "urrego": 38, "us": [0, 2, 3, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 41, 42, 44, 46, 48, 49, 50, 51, 53, 54, 55, 56, 57, 59, 60, 62, 63, 64, 65, 67, 68, 69, 71, 72, 73, 74, 75, 76, 77, 79, 80, 83, 84, 86, 88, 91, 92, 93, 95, 97, 99, 102, 104, 105, 108, 109, 111, 113, 115, 116, 118, 120, 121, 124, 125, 130, 131, 132, 134, 136, 137, 138, 142, 143], "usa": 31, "usag": 94, "use_cftim": 65, "use_init_interp": 8, "user": [0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 59, 63, 72, 73, 74, 79, 84, 91, 92, 93, 94, 96, 97, 99, 108, 109, 113, 118, 119, 120, 121, 122, 123, 124, 125, 129, 130, 134, 137, 138, 143], "user_nl_": 110, "user_nl_cam": [23, 24, 25, 28, 29, 30, 31, 32, 33, 92, 108, 109, 113, 115, 137, 143], "user_nl_cic": [37, 114], "user_nl_clm": [44, 45, 46, 115], "user_nl_cpl": 49, "user_nl_pop": [54, 100, 116], "user_nl_xxx": [4, 7, 117], "user_requested_queu": [4, 8], "user_requested_walltim": [4, 8], "usernam": [6, 40, 42, 63, 65, 68, 70, 73, 74, 75, 76, 118, 119, 122, 123], "userrun": 4, "users_guid": [22, 27], "userwarn": 63, "usr": [74, 76], "usr_mech_infil": 24, "usual": [1, 25, 67], "usurf": 72, "util": [10, 11, 50, 70, 74, 76, 119, 122, 123, 125], "ux": 63, "uxds_ne30x8": 63, "uxgrid": 63, "v": [5, 22, 23, 24, 25, 37, 38, 41, 42, 45, 46, 49, 50, 76, 80, 94, 108, 113, 125], "v0": 6, "v2": 6, "v6": 8, "v_dim": 76, "va": 70, "val": 94, "valid": [17, 22, 25, 27, 40, 42, 49, 51, 84, 94, 97, 113, 115, 143], "valu": [8, 14, 17, 18, 20, 32, 37, 38, 41, 42, 50, 63, 64, 65, 67, 68, 70, 74, 75, 76, 92, 93, 94, 96, 97, 98, 100, 102, 104, 108, 109, 113, 114, 115, 116, 117, 125, 127, 132, 133, 136, 137, 138, 142], "valuabl": [65, 76], "var": [14, 72, 76], "var_in": 68, "var_nam": [67, 68, 70], "var_to_keep": 68, "vari": [20, 27, 29, 30, 35, 42, 52, 67], "variabilti": 57, "variabl": [3, 12, 14, 17, 18, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 48, 49, 50, 51, 52, 54, 55, 56, 60, 62, 63, 64, 65, 67, 68, 69, 70, 72, 74, 75, 76, 77, 79, 81, 87, 88, 90, 91, 92, 93, 95, 96, 100, 101, 102, 104, 105, 108, 109, 111, 112, 114, 116, 117, 125, 139, 141, 142, 143], "variable_nam": 64, "varianc": 76, "variat": 70, "varieti": [63, 70, 125], "variou": [11, 17, 22, 27, 72, 106, 117, 142], "varlist": 76, "vars_to_plt": 67, "vast": 121, "ve": [27, 71, 76], "vector": 70, "veget": 138, "veloc": 74, "vendor_clubb_r8099_n03": 6, "veri": [22, 50, 59, 64, 67, 68, 70, 72, 73, 91, 94, 125, 143], "verifi": [35, 37, 38, 54, 55, 106, 125], "verison": 81, "versa": 37, "version": [0, 6, 8, 27, 35, 38, 39, 40, 42, 47, 50, 51, 52, 63, 68, 70, 74, 75, 76, 80, 81, 96, 102, 121], "vert": [8, 67, 68], "vertic": [21, 22, 35, 65, 66, 67, 68, 70, 74, 76], "vertinterp": 137, "vi": [38, 49, 94], "via": [8, 60, 63, 72, 78, 94, 100, 104, 116, 117], "vice": 37, "video": 59, "view": [3, 4, 5, 8, 11, 14, 26, 31, 32, 49, 59, 74, 125], "viewabl": 125, "viewer": [14, 26], "violat": 65, "viridi": [68, 70], "viscos": 76, "visibl": 46, "visit": 125, "visual": [31, 32, 46, 49, 50, 59, 67, 111, 122, 123, 124, 125, 141], "vmax": [41, 65, 67, 68, 70, 74, 75, 76], "vmin": [41, 65, 67, 68, 70, 74, 75, 76], "volum": [42, 59, 67, 68, 69], "vpn": 129, "vsnon": 67, "vstack": [67, 68], "w": [5, 8, 28, 29, 30, 31, 32, 33, 38, 41, 46, 65, 74, 75, 76], "wa": [0, 3, 5, 9, 35, 38, 39, 42, 43, 49, 52, 63, 64, 65, 67, 68, 70, 74, 75, 76, 85, 104, 112, 129, 130, 145], "waccm": [23, 24, 25, 26, 27], "wai": [6, 17, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 39, 42, 48, 49, 50, 65, 67, 70, 71, 72, 84, 96, 99, 111, 116, 117, 120, 128, 129, 142, 143], "wait": [73, 132, 143], "wall": [73, 74, 76, 106], "wallclock": [44, 45, 46, 91, 94, 96, 102, 105, 106], "wallclock_tim": 94, "walltim": [5, 74, 76, 91, 92], "walltime_format": [4, 8], "want": [1, 3, 4, 12, 13, 21, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 36, 44, 47, 49, 53, 56, 64, 65, 67, 68, 70, 72, 73, 74, 76, 84, 94, 96, 102, 104, 105, 107, 109, 112, 113, 115, 122, 123, 125, 127, 131, 132, 133, 136, 140], "warm": 42, "warmtcp": 32, "warn": [3, 40, 63, 74, 75, 76], "watch": [8, 85], "water": [42, 51, 54, 67, 75], "watermark": [74, 75, 76], "wav": [3, 8], "wav_modelio": 23, "wave": [8, 43, 65, 66, 82], "wawg": 87, "wccm": 8, "wccm_clm50": 8, "wcsc": 8, "wcsc_clm50": 8, "wct": 8, "wcts_clm50": 8, "we": [3, 8, 10, 11, 12, 13, 14, 15, 16, 18, 21, 25, 27, 28, 31, 32, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 52, 53, 56, 59, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 80, 83, 84, 85, 86, 87, 88, 90, 91, 92, 94, 96, 99, 101, 102, 104, 105, 106, 109, 111, 112, 113, 115, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 130, 132, 133, 134, 136, 138, 143, 145], "weather": [59, 68], "web": [27, 59, 70, 80, 120, 129], "webpag": [0, 26, 27, 60, 78, 79, 81, 87, 107, 111, 117], "websit": [12, 59, 70, 73, 82, 85, 107, 126], "wed": 127, "wednesdai": 127, "week": 121, "weight": [20, 64], "weighted_annual_mean": 70, "weird": 67, "welcom": [23, 28, 31, 32, 86, 87], "well": [20, 22, 23, 24, 25, 29, 41, 49, 59, 72, 73, 83, 104, 129], "were": [0, 20, 40, 49, 65, 68, 70, 72, 74, 75, 76, 104], "west_lon": 64, "western": [27, 32, 54], "wet": 108, "wg": [40, 127], "what": [12, 16, 17, 18, 20, 21, 23, 28, 29, 30, 37, 38, 41, 42, 45, 46, 48, 49, 50, 54, 55, 64, 65, 67, 68, 70, 72, 73, 74, 76, 80, 88, 92, 94, 96, 102, 104, 108, 111, 112, 113, 115, 125, 127, 131, 133, 142, 143], "whatev": 67, "when": [0, 3, 5, 10, 12, 16, 18, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 59, 62, 65, 70, 73, 76, 94, 95, 97, 98, 100, 102, 104, 105, 108, 109, 117, 119, 121, 122, 123, 130, 137, 140, 143], "whenev": 104, "where": [4, 8, 10, 11, 12, 14, 16, 17, 31, 32, 33, 50, 52, 55, 64, 65, 67, 68, 70, 73, 74, 75, 76, 96, 100, 102, 109, 118, 121, 136, 137, 138, 142], "wherebi": 22, "whether": [42, 104], "which": [0, 1, 4, 8, 12, 17, 20, 22, 25, 27, 37, 42, 48, 49, 50, 64, 65, 67, 68, 70, 72, 73, 74, 75, 76, 91, 94, 96, 102, 111, 116, 120, 121, 123, 124, 125, 130, 138, 145], "while": [3, 8, 12, 17, 27, 41, 59, 65, 67, 70, 74, 76, 84, 96, 108, 116, 120, 123, 124, 125, 128, 130], "white": [70, 86], "who": [0, 120], "whole": [22, 25, 26, 27, 70, 85, 87], "whom": 0, "why": [37, 38, 65, 67, 68, 70, 72, 76, 93, 143, 144], "wide": [51, 59, 62, 70, 129], "width": 65, "wieder": 70, "wiki": [22, 25, 52, 121], "wild": [68, 70], "wind": [28, 29, 30, 31, 32, 33, 42, 52], "window": [11, 14, 42, 49, 73, 118, 122, 123, 124], "windward_passag": 74, "winter": [67, 75, 85], "wish": [127, 131, 133], "wiso": 50, "within": [11, 23, 24, 25, 27, 35, 39, 43, 52, 70, 76, 105, 140], "without": [0, 12, 36, 42, 44, 47, 50, 53, 56, 63, 72, 113, 125, 135], "woa": 74, "won": [65, 70, 96], "word": [42, 107], "work": [0, 19, 21, 37, 46, 59, 63, 64, 70, 72, 73, 74, 80, 85, 94, 96, 118, 121, 125, 129, 130, 134, 135], "workaround": 116, "worker": [74, 76], "workflow": [11, 19, 63], "working_group": 26, "workshop": [0, 40, 85], "workspac": [1, 8, 12, 13, 16, 17, 19, 47, 73], "world": [33, 40, 49, 74, 76, 86], "worri": [12, 47], "would": [0, 42, 50, 55, 65, 67, 68, 73, 74, 76, 96, 102, 104, 129, 136, 140], "wrap_data": 70, "wrap_lon": 70, "write": [4, 23, 24, 25, 33, 46, 70, 72, 104, 136], "written": [40, 67, 68, 104, 113, 114, 115, 116, 120], "wrong": [64, 143], "ww": 3, "ww3": [3, 5, 6, 8, 11, 12], "ww3_181001": 6, "ww3a": 8, "ww3a_m": 8, "www": [8, 22, 26, 27, 80, 109, 114, 116], "www2": 53, "wy": 129, "x": [11, 27, 36, 37, 55, 65, 67, 70, 72, 74, 75, 76, 80, 102, 113, 114, 115], "x0": 65, "x11": [14, 119, 122, 123, 129, 130], "x3": 14, "x4": 14, "x5": 14, "x6": 14, "xarrai": [41, 50, 59, 63, 64, 67, 68, 74, 75, 76], "xe": 67, "xesmf": 67, "xgcm": 76, "xglc": 8, "xh": 74, "xi": 64, "xl": 76, "xlabel": [41, 42, 70], "xlim": [41, 42, 76], "xml": [3, 4, 7, 8, 15, 17, 18, 24, 25, 30, 32, 39, 40, 45, 48, 50, 90, 91, 92, 95, 96, 97, 100, 101, 102, 104, 105, 106, 113, 115, 142], "xmlchang": [17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 91, 92, 93, 104, 105, 106, 108, 109, 113, 115, 127, 132, 133, 137, 138, 142, 143], "xmlqueri": [15, 17, 24, 25, 37, 38, 48, 50, 54, 55, 56, 91, 92, 93, 104], "xmxl": 75, "xq": 74, "xr": [11, 41, 50, 64, 65, 67, 68, 70, 74, 75, 76], "xrof": 8, "xtick": 67, "xwav": 8, "xxx": [43, 45, 46, 49], "xy": [70, 118, 119, 122, 123], "xycoord": 70, "xylen": 25, "y": [37, 67, 68, 70, 72, 74, 75, 76, 114], "y0": [41, 65], "y1": 41, "yaml": 72, "yeager": [35, 52], "year": [20, 27, 28, 29, 30, 35, 36, 37, 38, 39, 40, 42, 43, 47, 48, 49, 50, 52, 53, 54, 55, 56, 60, 68, 70, 74, 76, 92, 93, 96, 102, 106, 113, 115, 121], "year1": 41, "year2": 41, "yearli": [39, 40], "yet": [40, 42, 130], "yh": 74, "yield": 65, "ylabel": 42, "ylim": 76, "yml": 72, "yorick": 46, "you": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 59, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 84, 85, 86, 88, 91, 92, 94, 96, 97, 98, 100, 102, 104, 105, 106, 107, 108, 109, 112, 113, 115, 117, 118, 119, 120, 121, 122, 123, 124, 125, 128, 129, 130, 132, 134, 135, 136, 137, 138, 140, 142, 143, 145, 146], "your": [2, 3, 4, 5, 7, 8, 9, 12, 13, 14, 15, 17, 19, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 36, 39, 40, 42, 44, 47, 48, 49, 50, 53, 56, 59, 62, 63, 64, 65, 67, 68, 71, 72, 74, 75, 76, 84, 86, 91, 92, 93, 94, 96, 101, 102, 104, 105, 106, 108, 109, 112, 113, 115, 118, 119, 121, 122, 125, 129, 130, 132, 137, 140, 143], "yourself": [15, 34, 62, 94], "yq": 74, "yr": [41, 42], "yr0": 70, "yscale": 65, "ytick": 67, "yucatan_channel": 74, "yyyi": [74, 97, 104], "z": [47, 72, 74, 75, 76], "z3": [23, 24, 25], "z500": 28, "z_1": 75, "z_2": 75, "z_t": [75, 76], "zero": [68, 70], "zl": 74, "zm_conv": 33, "zm_convr": 33, "zonal": [26, 28, 29, 30, 31, 32, 33, 52, 55], "zorder": [67, 68], "\u03b4": 50, "\u03b418o": [50, 51], "\u03b418op": 50}, "titles": ["Welcome to the CESM Tutorial", "Basics", "CESM Workflow", "Case Build", "Case Setup", "Case Submit", "Checking Your Run", "Create Clone (Advanced)", "Create New Case", "Model Output", "Workspaces", "Explore CESM Code", "Download CESM", "CESM code", "Examine History Files", "Explore Further", "Your first CESM run", "Review Questions", "Extending your run", "Exercise Overview", "Biogeochemistry", "1: Set up a BGC case", "Atmospheric chemistry", "1: Control case: running with chemistry", "2: Test case: changing the chemistry", "3: Test case: changing the emissions", "4: Visualization option with GEOV", "Atmosphere", "1: Control case: F2000climo", "2: Historical compset: FHIST", "3: Starting FHIST from spunup state in 1850", "4: Increase orographic height over the western US", "5: Modify sea surface temperature in the tropics", "6: Adjust threshold for deep convection over land", "Challenge Exercises", "Sea Ice", "1: Control case", "2: Tune the albedo", "3: Modify the snow conductivity", "Land Ice", "CISM Challenge Exercise", "Looking at the simulation", "Computing ice sheet related sea level change from a CISM simulation", "Land", "1: Control case", "2: Use the BGC model", "3: Modify input data", "5: Control case using MOM6", "1: Preindustrial control case", "2: mid-Holocene case", "3: Water isotope tracers in CESM", "Paleo", "Ocean", "1: Control case", "2: Turn off parameterization", "3: Modify wind stress", "4: Turn on the ecosystem", "Additional Topics", "ADF", "CESM analysis tools", "CVDP", "Large Ensembles", "Postprocessing data", "UXarray", "Advanced Plotting", "Basic Plotting", "Atmosphere", "Advanced Plotting", "Basic Plotting", "Sea Ice", "Basic Plotting", "Land", "CUPiD", "Diagnostics", "Basic Plotting with MOM6", "Advanced Plotting", "Basic Plotting", "Ocean", "Climate Data Gateway", "Climate Data Guide", "CESM Webpage", "Community Experiments", "What is CESM ?", "CIME (Advanced)", "Getting Help", "Getting Involved", "Introduction", "CESM Working Groups", "Simple XML Modifications", "Copying Cases", "Exercise Overview", "Exercise 1: Modify run length", "Exercise 2: Modify run type", "Exercise 3: Change physics timestep", "How to Modify XML Files (*.xml)", "Modifying the Type of Run", "Hybrid, Branch and Startup", "Variables Related to Run Type", "Other Useful XML Variables", "Overview", "Physics Timestep", "Controlling Run Length", "Changing Run Length", "Controlling the Number of Submissions", "Restarting a Run", "Starting and Stopping", "Using Timing Files", "Namelist Variables Documentation", "Modify CAM output", "Change a tuning parameter in CAM", "Exercise Overview", "Namelist Modifications", "Customizing Output", "Customize CAM output", "Customize CICE output", "Customize CLM output", "Customize POP output", "Overview", "Exercise Overview", "Prerequisites for Success", "Fortran", "Github", "NCAR Supercomputer", "NCAR Supercomputer", "Modules on NCAR HPC", "NetCDF files", "Porting", "Tutorial specific instructions", "Resources", "Terminal Windows", "Text Editors", "Tutorial one time setup", "Tutorial queue and account", "Tutorial specific instructions", "UNIX", "UNIX cheatsheet", "Source Modification Example", "Add output variable in CAM", "Modify the rain_threshold in CLM", "Exercise Overview", "Overview", "Source Modifications", "Adding debugging info", "Debugging CAM", "Exercise Overview", "The log files", "Troubleshooting runtime errors"], "titleterms": {"": 63, "1": [11, 12, 14, 21, 23, 28, 36, 44, 48, 51, 53, 58, 61, 63, 64, 65, 66, 67, 68, 69, 70, 73, 74, 75, 76, 77, 91, 94, 96, 99, 102, 104, 105, 106, 118], "1850": 30, "2": [11, 12, 14, 24, 29, 37, 41, 45, 49, 51, 54, 58, 61, 63, 65, 66, 67, 68, 69, 70, 73, 74, 75, 76, 77, 92, 94, 96, 99, 102, 104, 105, 106, 118], "2000m": 77, "2d": 41, "3": [11, 12, 14, 25, 30, 38, 46, 50, 51, 55, 63, 65, 66, 67, 69, 70, 73, 74, 76, 77, 93, 94, 96, 104], "4": [11, 14, 26, 31, 56, 63, 65, 67, 69, 70, 73, 74, 76, 77], "5": [32, 47, 73], "6": 33, "If": [127, 131, 133], "In": 0, "One": [127, 131, 133], "The": [96, 145], "about": [27, 70], "access": 63, "account": [127, 131, 132, 133], "acknowledg": 0, "ad": [136, 142], "add": [113, 115, 137], "add_default": 136, "addfld": 136, "addit": 57, "adf": [58, 65], "adjust": 33, "advanc": [7, 64, 66, 67, 69, 75, 77, 83, 86], "air": 41, "albedo": [37, 70], "alert": 85, "alreadi": [127, 131, 133], "an": [43, 70, 99, 122, 123, 127, 131, 133], "analysi": [59, 64, 66], "ani": [127, 131, 133], "annual": 70, "ar": [70, 106, 121, 123, 124], "archiv": [6, 14], "area": [11, 67, 68, 69, 70, 77], "argument": 8, "around": 118, "atmospher": [11, 22, 27, 66], "avail": [123, 124], "averag": [14, 113, 115], "awai": 126, "ax": 76, "axi": 65, "b1850": 14, "back": 104, "balanc": 41, "bash": [127, 131, 133], "basic": [1, 14, 65, 66, 68, 69, 70, 74, 76, 77, 134], "batch": 6, "befor": 127, "bgc": [20, 21, 45], "biogeochemistri": 20, "branch": 96, "build": 3, "c": [127, 131, 133], "calcul": 70, "cam": [11, 14, 22, 27, 64, 66, 108, 109, 113, 136, 137, 143], "case": [3, 4, 5, 8, 15, 21, 23, 24, 25, 28, 35, 36, 39, 43, 44, 47, 48, 49, 52, 53, 89], "casenam": 8, "casestatu": [6, 15], "casper": [122, 123], "categori": [67, 69], "cdo": 125, "cell": 73, "cesm": [0, 2, 11, 12, 13, 15, 16, 20, 47, 50, 59, 73, 80, 82, 85, 87, 99, 121], "cesm2": 8, "cesm2_3_beta17": 47, "challeng": [22, 27, 34, 40, 70], "chang": [24, 25, 42, 93, 102, 109], "cheatsheet": [134, 135], "check": [6, 15, 73, 123, 124], "checkout_extern": [12, 47], "chem": 22, "chemistri": [22, 23, 24], "cice": [35, 114], "cime": [11, 15, 83], "cism": [39, 40, 42], "climat": [78, 79, 125], "clm": [43, 115, 138], "clone": [7, 12, 47, 73], "cluster": [74, 76], "code": [11, 12, 13, 63, 127, 133], "come": 70, "command": [3, 4, 5, 7, 8, 59], "common": 83, "commun": [11, 81], "compar": 41, "compil": 132, "complex": 65, "compon": [11, 12, 22, 47, 82], "compset": [8, 15, 20, 27, 29, 35, 52], "comput": [42, 69, 77, 119], "concentr": [68, 69], "condit": 20, "conduct": 38, "continent": [74, 76], "continu": [104, 105], "continue_run": 102, "contour": [74, 76], "contribut": 70, "control": [23, 28, 36, 44, 47, 48, 53, 101, 103], "convect": 33, "convent": 20, "cookbook": 63, "copi": 89, "coupl": [20, 83], "creat": [7, 8, 12, 70], "credit": 70, "cupid": 72, "custom": [70, 112, 113, 114, 115, 116], "cvdp": 60, "dask": [74, 76], "data": [35, 46, 52, 59, 62, 63, 64, 65, 70, 74, 75, 76, 78, 79, 125], "dataset": 70, "debug": [142, 143], "deep": 33, "defin": [41, 76], "definit": [8, 15], "depth": 77, "derecho": [118, 122, 123, 127, 131, 133], "detail": [35, 39, 43, 51, 52, 76], "determin": 106, "diag_tabl": 74, "diagnost": 73, "differ": 70, "directori": [6, 11, 12, 14, 15], "discusscesm": 84, "do": 145, "document": [63, 86, 107], "download": [12, 47, 73], "each": 127, "earth": [59, 83], "easi": 70, "ecosystem": 56, "edit": 94, "editor": 130, "elai": 70, "element": 1, "emac": 130, "email": 85, "emiss": 25, "ensembl": 61, "env": 20, "environ": [1, 99, 123, 124, 127, 131, 133], "error": 146, "escomp": 121, "esd": 59, "esmf": 83, "event": 85, "examin": [11, 14], "exampl": [67, 136], "exercis": [19, 22, 27, 34, 35, 39, 40, 43, 47, 51, 52, 64, 65, 66, 68, 69, 74, 75, 76, 77, 90, 91, 92, 93, 110, 118, 139, 144], "experi": 81, "explor": [11, 14, 15], "expos": 70, "extend": 18, "extra": [70, 113, 115], "f": [22, 27], "f2000climo": 28, "fail": 145, "fastx": 129, "fhist": [29, 30], "field": [67, 69], "file": [6, 14, 15, 62, 74, 76, 94, 96, 99, 104, 106, 113, 115, 118, 125, 145], "filenam": 41, "fincl": [113, 115], "find": [22, 27], "first": [16, 65, 70, 76], "flag": [113, 115], "forc": [35, 52], "format": 70, "fortran": 120, "forum": 84, "framework": 83, "frequenc": [113, 115], "from": [30, 42, 65, 70, 129], "function": [76, 94], "fund": 0, "further": 15, "g": [35, 52], "gatewai": 78, "gener": 72, "geocat": 59, "geov": 26, "get": [75, 76, 84, 85], "git": [12, 47, 73, 121], "github": [85, 121], "global": [70, 74, 76, 77], "goal": [0, 19, 22, 27, 35, 39, 43, 51, 52, 58, 61, 63, 66, 69, 71, 77, 110, 139, 144], "grab": 65, "grid": [8, 15, 67], "group": 87, "guid": 79, "h0": 14, "had": [127, 131, 133], "have": [127, 131, 133], "heat": 77, "height": [31, 66], "help": [70, 84], "high": 119, "hist_fincl": 115, "hist_mfilt": 115, "hist_nhtfrq": 115, "histor": 29, "histori": [14, 62, 74, 113, 115], "holocen": 49, "how": [63, 94], "hpc": [119, 123, 124, 127, 131, 133], "hub": 59, "hybrid": 96, "i": [27, 35, 39, 43, 52, 70, 82, 99], "ic": [35, 39, 41, 42, 67, 68, 69], "imag": 59, "incom": 70, "increas": 31, "index": 70, "info": 142, "inform": [2, 22, 27, 70], "infrastructur": 83, "initi": [20, 59, 105], "input": [46, 64], "instruct": [127, 131, 133], "introduct": 86, "involv": 85, "isotop": 50, "job": [6, 15], "jupyt": [59, 73], "jupyterhub": [73, 119, 122, 123, 129], "kernel": 73, "knowledg": 86, "land": [33, 39, 43, 70, 71], "languag": 59, "larg": 61, "lat": [65, 66], "layer": 77, "leaf": 70, "learn": [13, 19, 22, 27, 35, 39, 43, 51, 52, 58, 61, 63, 66, 69, 71, 77, 110, 139, 144], "length": [91, 101, 102], "level": 42, "like": 41, "limit": 105, "list": 85, "load": [41, 74, 123, 124], "locat": [11, 99, 106], "log": [122, 123, 129, 145], "login": [73, 118, 119], "lon": [65, 66], "look": [11, 41, 118], "mac": 129, "machin": 8, "magick": 59, "make": [65, 66, 69, 70, 74, 76, 77], "map": [70, 74, 76, 77], "mass": 41, "maximum": 77, "mct": 83, "mean": 70, "metpi": 59, "mfilt": 113, "mid": 49, "minim": 63, "mix": 77, "model": [9, 11, 12, 45, 47, 82, 83], "modif": [88, 111, 136, 141], "modifi": [32, 38, 46, 55, 91, 92, 94, 95, 108, 138], "modul": [123, 124], "mom6": [47, 52, 74], "monitor": 6, "monthli": [14, 70], "more": [2, 22, 27], "name": 41, "namelist": [107, 111], "nano": 130, "nativ": 65, "ncar": [59, 119, 122, 123, 124, 127, 131, 133], "ncdump": 125, "ncl": 59, "nco": 125, "ncview": 125, "netcdf": 125, "new": [8, 123, 124], "next": 70, "nhtfrq": 113, "nicer": 76, "notebook": [70, 73, 74, 75, 76], "now": 70, "number": [102, 103], "object": [13, 70], "ocean": [20, 52, 77], "off": 54, "one": 131, "open": [14, 73], "oper": 125, "option": 26, "orograph": 31, "other": 98, "outfld": 136, "output": [9, 21, 35, 43, 52, 64, 66, 108, 112, 113, 114, 115, 116, 137], "over": [31, 33, 74, 76], "overview": [10, 19, 22, 27, 90, 99, 110, 117, 118, 139, 140, 144], "pacif": [74, 76], "packag": 41, "paleo": 51, "panopoli": 59, "paramet": [64, 109], "parameter": 54, "path": [41, 63], "pc": 129, "per": [67, 69, 77], "perform": 119, "person": 0, "physic": [93, 100], "plot": [41, 64, 65, 66, 67, 68, 69, 70, 74, 75, 76, 77], "point": [70, 126], "polar": [68, 69], "pop": [21, 52, 116], "port": [122, 123, 126], "post": [35, 43, 52], "postprocess": 62, "practic": 127, "precipit": 14, "preindustri": 48, "prerequisit": 119, "previou": 104, "print": 70, "process": [35, 43, 52], "profil": 77, "project": [0, 15, 59, 63, 68, 69, 127, 132, 133], "putti": 129, "pythia": [59, 63], "python": 59, "question": 17, "queue": [15, 127, 132, 133], "quick": 65, "radiat": 70, "rain_threshold": 138, "read": 70, "refer": [35, 39, 43, 52], "reflect": 70, "region": [74, 76, 77], "regrid": 69, "relat": [42, 67, 69, 97], "remap": [67, 69], "resolut": [8, 15], "resourc": [63, 128], "restart": [96, 104], "resubmit": 102, "revers": 65, "review": 17, "run": [6, 16, 18, 23, 73, 91, 92, 95, 96, 97, 101, 102, 104, 105, 122, 123, 145], "runtim": [105, 106, 146], "schedul": 6, "scienc": 59, "script": 15, "se": [64, 66], "sea": [32, 35, 42, 67, 68, 69], "search": 94, "seri": [41, 68, 70, 72], "set": [1, 10, 21, 22, 41, 74, 75, 76, 105, 127, 131, 133], "setup": [4, 127, 131, 133], "sheet": 42, "shell": [127, 131, 133], "sign": 20, "simpl": [70, 88], "simul": [41, 42], "singl": 70, "snow": [38, 67, 69], "softwar": 59, "some": [76, 134], "sourc": [136, 141], "special": [127, 131, 132, 133], "specif": [20, 21, 127, 133], "spunup": 30, "stamp": 65, "start": [30, 105], "startup": 96, "state": 30, "step": [11, 12, 14, 73, 118], "stop": 105, "stop_n": 105, "stop_opt": 105, "storag": 77, "stress": 55, "style": 65, "subgroup": 94, "submiss": [102, 103], "submit": 5, "subsect": [58, 61], "success": 119, "sum": 70, "supercomput": [122, 123], "support": 8, "surfac": [14, 32, 41], "swcf": 65, "syntax": [3, 4, 5, 7, 8], "system": [59, 83, 118, 122, 123], "t": [39, 65], "tag": 47, "take": 126, "tcsh": [127, 131, 133], "temperatur": [14, 32, 41], "termin": [119, 129], "test": [16, 18, 22, 24, 25, 37, 38, 45, 46, 54, 55], "text": 130, "thei": 106, "thi": [0, 86], "thick": [41, 67, 69], "three": 96, "threshold": 33, "time": [41, 65, 68, 69, 70, 72, 77, 106, 127, 131, 133], "timeseri": [62, 77], "timestep": [93, 100], "tip": 3, "tool": 59, "toolkit": 83, "topic": 57, "total": [68, 69], "tracer": [50, 67, 69], "tropic": 32, "troubl": [127, 131, 133], "troubleshoot": 146, "tune": [37, 109], "turn": [54, 56], "tutori": [0, 73, 127, 131, 132, 133], "type": [92, 95, 96, 97], "u": [31, 74, 76], "understand": [16, 18, 37, 38, 45, 46, 54, 55, 70], "unit": 20, "unix": [119, 134, 135], "up": [1, 21, 74, 75, 76, 104, 127, 131, 133], "upper": 77, "us": [35, 39, 43, 45, 47, 52, 70, 94, 96, 98, 106, 119, 122, 123, 127, 129, 133], "user": [41, 127, 131, 133], "uxarrai": 63, "v": [62, 96], "variabl": [20, 94, 97, 98, 99, 106, 107, 113, 115, 136, 137], "version": 12, "versu": 69, "vi": 130, "via": [65, 129], "view": [35, 43, 52], "vim": 130, "visual": [26, 63, 70, 86], "waccm": 22, "water": 50, "webpag": 80, "websit": 63, "weight": 70, "welcom": 0, "western": 31, "what": [27, 35, 39, 43, 52, 82, 99, 106, 121, 123, 124, 145], "when": [96, 145], "where": 106, "why": 63, "wind": 55, "window": [119, 129], "winter": 77, "work": 87, "workflow": [1, 2], "workspac": [10, 11], "would": 41, "xarrai": [65, 70], "xmg": 129, "xml": [20, 88, 94, 98, 99], "xmlchang": 94, "xmlqueri": 94, "y": 65, "year": 41, "yearli": 0, "you": [41, 127, 131, 133], "your": [1, 6, 10, 11, 16, 18, 35, 37, 38, 41, 43, 45, 46, 52, 54, 55, 70, 73, 123, 124, 127, 131, 133], "zonal": [65, 66]}}) \ No newline at end of file
CommandDescriptionOptionsExamples
lsList files and directories.-l: Long format listing.
-a: Include hidden files.
ls -l
displays files and directories with detailed information.

ls -a shows all files and directories, including hidden ones.
cdChange directory.N/Acd /path/to/directory
changes the current directory to the specified path.
pwdPrint current working directory.N/Apwd
displays the current working directory.
mkdirCreate a new directory.N/Amkdir my_directory
creates a new directory named "my_directory".
rmRemove files and directories.-r: Remove directories recursively.
-f: Force removal without confirmation.
rm file.txt
deletes the file named "file.txt".
rm -r my_directory
deletes the directory "my_directory" and its contents.
rm -f file.txt
forcefully deletes the file "file.txt" without confirmation.
cpCopy files and directories.-r: Copy directories recursively.cp -r directory destination
copies the directory "directory" and its contents to the specified destination.
cp file.txt destination
copies the file "file.txt" to the specified destination.
mvMove/rename files and directories.N/Amv file.txt new_name.txt
renames the file "file.txt" to "new_name.txt".
mv file.txt directory
moves the file "file.txt" to the specified directory.
findSearch for files and directories.-name: Search by filename.find /path/to/search -name “*.txt”
searches for all files with the extension “.txt” in the specified directory.