From 4471984e63f1c016384d7d31b1ada7c26ba69fa1 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 16 Mar 2018 13:48:52 +0000 Subject: [PATCH 01/34] Remove cylc logic from tutorial scripts. --- .../cylc-forecasting-suite/bin/forecast | 25 +++++----------- .../cylc-forecasting-suite/lib/python/util.py | 7 +---- etc/tutorial/cylc-forecasting-suite/suite.rc | 17 ++++++++--- etc/tutorial/runtime-tutorial/runtime | 29 ++++++++++++------- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/etc/tutorial/cylc-forecasting-suite/bin/forecast b/etc/tutorial/cylc-forecasting-suite/bin/forecast index 07fb6940d7..0e42abc49f 100755 --- a/etc/tutorial/cylc-forecasting-suite/bin/forecast +++ b/etc/tutorial/cylc-forecasting-suite/bin/forecast @@ -35,16 +35,6 @@ import util MI2KM = 1.609344001 # Conversion between miles and kilometers. -# The default location of the rainfall file output by the "get_rainfall" task. -DEFAULT_RAINFALL_FILE = os.path.join( - os.environ.get('CYLC_SUITE_WORK_DIR'), - os.environ.get('CYLC_TASK_CYCLE_POINT'), 'get_rainfall', 'rainfall.csv') -# The default location of the wind files output by "gather_observations". -DEFAULT_WIND_FILE_TEMPLATE = os.path.join( - os.environ.get('CYLC_SUITE_WORK_DIR'), '{cycle}', - 'consolidate_observations', 'wind_{xy}.csv') - - def get_wind_data(wind_file_path, wind_cycles): """Return wind field data for the provided cycle points. @@ -187,11 +177,12 @@ def main(forecast_interval, forecast_itterations): spline_level = int(os.environ.get('SPLINE_LEVEL', 0)) weighting = map(float, os.environ.get('WEIGHTING', '1').split(',')) - # Get the locations of the wind / rainfall data files. - rainfall_file = os.environ.get('RAINFALL_FILE', DEFAULT_RAINFALL_FILE) + # Get file paths. + rainfall_file = os.environ['RAINFALL_FILE'] wind_cycles = os.environ['WIND_CYCLES'].split() - wind_file_template = os.environ.get('WIND_FILE_TEMPLATE', - DEFAULT_WIND_FILE_TEMPLATE) + wind_file_template = os.environ['WIND_FILE_TEMPLATE'] + map_file = os.environ['MAP_FILE'] + map_template = os.environ['MAP_TEMPLATE'] # Get wind data from specified cycles. wind_data = get_wind_data(wind_file_template, wind_cycles) @@ -219,10 +210,8 @@ def main(forecast_interval, forecast_itterations): util.write_csv(forecast_name + '.csv', forecast) # Generate html page from forecast data. - util.generate_html_map( - os.environ['CYLC_TASK_LOG_ROOT'] + '-map.html', forecasts, - domain, resolution - ) + util.generate_html_map(map_file, map_template, forecasts, domain, + resolution) if __name__ == '__main__': diff --git a/etc/tutorial/cylc-forecasting-suite/lib/python/util.py b/etc/tutorial/cylc-forecasting-suite/lib/python/util.py index a192f8934f..81b4596a90 100644 --- a/etc/tutorial/cylc-forecasting-suite/lib/python/util.py +++ b/etc/tutorial/cylc-forecasting-suite/lib/python/util.py @@ -272,12 +272,7 @@ def parse_domain(domain): } -def generate_html_map(filename, data, domain, resolution): - template_file = os.path.join( - os.environ['CYLC_SUITE_RUN_DIR'], - 'lib', - 'template', - 'map.html') +def generate_html_map(filename, template_file, data, domain, resolution): with open(template_file, 'r') as template: with open(filename, 'w+') as html_file: html_file.write(jinja2.Template(template.read()).render( diff --git a/etc/tutorial/cylc-forecasting-suite/suite.rc b/etc/tutorial/cylc-forecasting-suite/suite.rc index 67511785de..17cbf0feb7 100644 --- a/etc/tutorial/cylc-forecasting-suite/suite.rc +++ b/etc/tutorial/cylc-forecasting-suite/suite.rc @@ -77,16 +77,25 @@ [[forecast]] script = forecast 60 5 # Generate 5 forecasts at 60 minute intervals. [[[environment]]] + # The path to the files containing wind data (the {variables} will + # get substituted in the forecast script). + WIND_FILE_TEMPLATE = """ + $CYLC_SUITE_WORK_DIR/{cycle}/consolidate_observations/wind_{xy}.csv + """ # List of cycle points to process wind data from. WIND_CYCLES = """ $CYLC_TASK_CYCLE_POINT $(cylc cyclepoint --offset-hours=-3) $(cylc cyclepoint --offset-hours=-6) """ - # The cyclepoint 3 hours before the present one. - PT3H = $(cylc cyclepoint --offset-hours=-3) - # The cyclepoint 6 hours before the present one. - PT6H = $(cylc cyclepoint --offset-hours=-6) + # The path to the rainfall file. + RAINFALL_FILE = """ + $CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv + """ + # Create the html map file in the task's log directory. + MAP_FILE = "${CYLC_TASK_LOG_ROOT}-map.html" + # The path to the template file used to generate the html map. + MAP_TEMPLATE = "$CYLC_SUITE_RUN_DIR/lib/template/map.html" [[post_process]] # Generate a forecast for the location 60 minutes in the future. diff --git a/etc/tutorial/runtime-tutorial/runtime b/etc/tutorial/runtime-tutorial/runtime index 1f935de2a3..3374c51f4a 100644 --- a/etc/tutorial/runtime-tutorial/runtime +++ b/etc/tutorial/runtime-tutorial/runtime @@ -24,22 +24,31 @@ [[forecast]] script = forecast 60 5 # Generate 5 forecasts at 60 minute intervals. [[[environment]]] - # List of cycle points to process wind data from. - WIND_CYCLES = """ - $CYLC_TASK_CYCLE_POINT - $(cylc cyclepoint --offset-hours=-3) - $(cylc cyclepoint --offset-hours=-6) - """ - # The cyclepoint 3 hours before the present one. - PT3H = $(cylc cyclepoint --offset-hours=-3) - # The cyclepoint 6 hours before the present one. - PT6H = $(cylc cyclepoint --offset-hours=-6) # Add the `python` directory to the PYTHONPATH. PYTHONPATH="$CYLC_SUITE_RUN_DIR/lib/python:$PYTHONPATH" # The dimensions of each grid cell in degrees. RESOLUTION = 0.2 # The area to generate forecasts for (lng1, lat1, lng2, lat2) DOMAIN = -12,48,5,61 # Do not change! + # The path to the files containing wind data (the {variables} will + # get substituted in the forecast script). + WIND_FILE_TEMPLATE = """ + $CYLC_SUITE_WORK_DIR/{cycle}/consolidate_observations/wind_{xy}.csv + """ + # List of cycle points to process wind data from. + WIND_CYCLES = """ + $CYLC_TASK_CYCLE_POINT + $(cylc cyclepoint --offset-hours=-3) + $(cylc cyclepoint --offset-hours=-6) + """ + # The path to the rainfall file. + RAINFALL_FILE = """ + $CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv + """ + # Create the html map file in the task's log directory. + MAP_FILE = "${CYLC_TASK_LOG_ROOT}-map.html" + # The path to the template file used to generate the html map. + MAP_TEMPLATE = "$CYLC_SUITE_RUN_DIR/lib/template/map.html" [[post_process_exeter]] # Generate a forecast for Exeter 60 minutes in the future. From 0f7826763bc1d337174382979338489993203eb0 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 16 Mar 2018 13:49:11 +0000 Subject: [PATCH 02/34] rose introduction. --- sphinx/index.rst | 3 +- sphinx/tutorial/rose/index.rst | 62 ++++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/sphinx/index.rst b/sphinx/index.rst index 17e16fc8bc..54b3012249 100644 --- a/sphinx/index.rst +++ b/sphinx/index.rst @@ -10,8 +10,7 @@ Rose Documentation ================== Rose is a system for writing, editing and running application configurations. - -.. TODO - Add "What Is Rose" link when written. +:ref:`What Is Rose`? .. image:: img/rose-logo.png :width: 250px diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index b3eac25443..fdd9dc23d9 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -1,10 +1,68 @@ + .. include:: ../../hyperlinks.rst + :start-line: 1 + Rose Tutorial ============= -This section will cover the rose application. +.. _What Is Rose: + +What Is Rose? +------------- + +Rose is a system for creating, editing and running rose configurations. + +Rose also contains other optional tools for: + +* Version control. +* Suite discovery and management. +* Validating and tranforming rose configurations. +* Tools for interfacing with cylc. + + +What Is A Rose Configuration? +----------------------------- + +:term:`rose configurations ` are directories containing a +rose configuration file along with other optional assets which define behaviour +such as: + +* Executables. +* File installation. +* Environment variables. + +Rose configurations may be used standalone or alternatively in combination with +the `cylc`_ workflow engine. There are two types of rose configuration for use +with `cylc`_: + +:term:`rose application configuration` + A runnable rose configuration which executes a defined command. +:term:`rose suite configuration` + A rose configuration designed to run :term:`cylc suites `. + For instance it may be used to define Jinja2 variables for use in the + ``suite.rc`` file. + + +Why Use Rose Configurations? +---------------------------- + +With rose configurations the inputs and environment required for a particular +purpose can be encapsulated in a simple human-readable configuration. + +Configuration settings can have metadata associated with them which may be used +for multiple purposes including automatic checking and transforming. + +Rose configurations can be edited either using a text editor or with +the :ref:`command-rose-config-edit` GUI which makes use of metadata for display +and on-the-fly validation purposes. + +.. TODO - add rose edit screenshot. + +.. TODO - rename rose config-edit to rose edit. + .. toctree:: :name: rose-tutorial - :maxdepth: 2 + :caption: Contents + :maxdepth: 1 furthertopics/index From 09fcb60303c10e7e5b1667da89df60189f47c17a Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 16 Mar 2018 13:50:27 +0000 Subject: [PATCH 03/34] rose applications. --- bin/rose-tutorial | 2 +- etc/tutorial/forecast-script/forecast | 1 + etc/tutorial/forecast-script/util.py | 1 + etc/tutorial/map-template/map-template.html | 1 + etc/tutorial/test-data/rainfall.csv | 65 +++++ etc/tutorial/test-data/wind_0_x.csv | 65 +++++ etc/tutorial/test-data/wind_0_y.csv | 65 +++++ sphinx/glossary.rst | 26 +- sphinx/tutorial/rose/applications.rst | 265 ++++++++++++++++++++ sphinx/tutorial/rose/index.rst | 1 + 10 files changed, 488 insertions(+), 4 deletions(-) create mode 120000 etc/tutorial/forecast-script/forecast create mode 120000 etc/tutorial/forecast-script/util.py create mode 120000 etc/tutorial/map-template/map-template.html create mode 100644 etc/tutorial/test-data/rainfall.csv create mode 100644 etc/tutorial/test-data/wind_0_x.csv create mode 100644 etc/tutorial/test-data/wind_0_y.csv create mode 100644 sphinx/tutorial/rose/applications.rst diff --git a/bin/rose-tutorial b/bin/rose-tutorial index 86e4f1259a..3da7488acb 100755 --- a/bin/rose-tutorial +++ b/bin/rose-tutorial @@ -47,7 +47,7 @@ fi # Prompt user if directory exists. if [[ -d $DIRECTORY ]]; then - while read -p "Directory ~/cylc-run/$1 exists, overwrite it (y/n)? " usr + while read -p "Directory $DIRECTORY exists, overwrite it (y/n)? " usr do case "${usr}" in [Yy]) diff --git a/etc/tutorial/forecast-script/forecast b/etc/tutorial/forecast-script/forecast new file mode 120000 index 0000000000..b4f5fa2a56 --- /dev/null +++ b/etc/tutorial/forecast-script/forecast @@ -0,0 +1 @@ +../cylc-forecasting-suite/bin/forecast \ No newline at end of file diff --git a/etc/tutorial/forecast-script/util.py b/etc/tutorial/forecast-script/util.py new file mode 120000 index 0000000000..09688714cb --- /dev/null +++ b/etc/tutorial/forecast-script/util.py @@ -0,0 +1 @@ +../cylc-forecasting-suite/lib/python/util.py \ No newline at end of file diff --git a/etc/tutorial/map-template/map-template.html b/etc/tutorial/map-template/map-template.html new file mode 120000 index 0000000000..8e48dea1ff --- /dev/null +++ b/etc/tutorial/map-template/map-template.html @@ -0,0 +1 @@ +../cylc-forecasting-suite/lib/template/map.html \ No newline at end of file diff --git a/etc/tutorial/test-data/rainfall.csv b/etc/tutorial/test-data/rainfall.csv new file mode 100644 index 0000000000..ae1d85c5c1 --- /dev/null +++ b/etc/tutorial/test-data/rainfall.csv @@ -0,0 +1,65 @@ +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.20, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 2.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 5.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 3.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.23, 1.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.00, 0.00, 0.00, 0.00, 0.00, 1.00, 2.00, 1.00, 1.00, 1.33, 1.50, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.00, 2.43, 3.00, 2.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.00, 0.00, 0.00, 0.00, 0.00, 2.00, 1.00, 2.67, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.25, 1.67, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 2.50, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.08, 1.31, 0.00, 0.00, 1.17, 1.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 2.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.40, 1.25, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 1.00, 1.73, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.83, 1.60, 1.00, 1.39, 2.06, 2.46, 2.16, 1.33, 1.67, 1.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 1.00, 1.47, 1.33, 1.00, 1.00, 1.00, 2.14, 0.00, 1.29, 1.55, 1.97, 2.11, 1.54, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.19, 1.00, 0.00, 1.64, 2.19, 2.55, 2.73, 2.83, 2.85, 3.15, 3.39, 3.36, 2.06, 2.03, 1.69, 3.11, 3.80, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 2.00, 1.14, 1.22, 2.03, 1.92, 1.23, 0.00, 1.00, 1.34, 2.27, 3.21, 2.32, 1.38, 1.13, 1.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.07, 1.26, 1.87, 2.37, 2.20, 2.40, 2.02, 1.42, 2.69, 2.27, 2.97, 3.36, 2.17, 4.09, 3.59, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.50, 1.71, 1.80, 1.65, 1.25, 1.05, 1.83, 1.56, 1.50, 1.83, 2.30, 2.45, 1.30, 1.22, 1.38, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.07, 1.44, 1.85, 2.25, 1.85, 1.70, 1.50, 2.06, 1.58, 2.00, 2.00, 3.00, 4.17, 3.15, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.28, 2.67, 2.39, 2.15, 2.70, 1.81, 1.83, 2.19, 2.64, 1.90, 1.52, 1.26, 2.18, 1.77, 1.38, 1.27, 2.00, 3.00, 1.67, 1.33, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.52, 2.21, 2.53, 2.26, 2.47, 2.69, 2.14, 2.00, 2.60, 2.33, 4.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.33, 1.91, 1.54, 1.48, 1.32, 1.63, 1.52, 3.10, 2.86, 2.34, 2.68, 1.27, 1.06, 1.89, 2.50, 2.77, 3.34, 2.11, 1.50, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.33, 1.83, 2.14, 2.08, 1.78, 2.78, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.57, 1.00, 1.13, 1.45, 1.96, 2.08, 1.00, 1.00, 1.00, 1.44, 1.58, 1.23, 2.27, 2.33, 1.65, 1.94, 1.50, 1.00, 0.00, 0.00, 1.00, 3.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.67, 1.00, 1.73, 1.57, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.19, 1.03, 1.38, 1.80, 1.83, 1.89, 2.10, 3.04, 2.95, 1.83, 1.43, 1.40, 1.55, 2.17, 1.81, 1.79, 2.00, 2.70, 1.41, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.40, 2.13, 1.12, 1.00, 0.00, 0.00, 0.00, 1.07, 1.20, 3.00, 1.00, 1.58, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.52, 1.69, 1.60, 1.58, 1.50, 1.56, 1.67, 1.17, 1.54, 1.81, 2.21, 1.87, 1.72, 1.11, 1.46, 1.76, 1.60, 2.54, 3.27, 2.48, 2.81, 2.67, 1.50, 1.86, 2.00, 1.86, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.31, 1.18, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.17, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.50, 1.25, 1.83, 2.15, 1.92, 2.21, 2.04, 1.69, 2.42, 2.60, 1.98, 2.27, 1.73, 1.28, 1.28, 1.91, 1.52, 1.75, 3.85, 3.27, 4.73, 3.88, 3.45, 1.70, 2.06, 1.55, 1.17, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.00, 0.00, 0.00, 0.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.29, 1.12, 1.22, 1.76, 1.86, 2.67, 2.57, 3.07, 3.06, 2.67, 2.74, 2.81, 3.52, 2.36, 2.98, 3.19, 2.60, 2.18, 3.62, 3.76, 2.45, 2.32, 1.17, 1.55, 1.41, 2.20, 1.36, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.38, 1.00, 1.00, 1.00, 1.04, 1.00, 1.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.33, 1.93, 1.54, 1.00, 1.34, 2.17, 2.54, 1.88, 2.10, 1.85, 1.90, 2.25, 2.92, 3.12, 3.27, 3.62, 3.06, 3.33, 3.31, 3.46, 2.98, 2.88, 2.52, 1.95, 1.20, 0.00, 1.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.00, 1.00, 1.08, 1.58, 1.71, 1.46, 1.53, 1.44, 1.19, 1.04, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.50, 1.83, 1.00, 1.44, 2.10, 1.10, 1.10, 1.41, 1.16, 1.05, 1.12, 1.25, 2.94, 2.64, 2.42, 3.24, 3.34, 3.43, 3.55, 3.07, 3.05, 2.76, 2.00, 2.12, 2.38, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.03, 1.21, 1.11, 1.76, 2.26, 2.52, 2.52, 2.26, 2.10, 1.86, 1.62, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 2.43, 0.00, 0.00, 1.50, 1.81, 2.04, 1.55, 1.15, 0.00, 1.00, 1.09, 2.00, 3.00, 0.00, 1.00, 2.17, 2.47, 3.15, 4.19, 3.79, 2.79, 1.98, 1.27, 1.16, 1.07, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.17, 1.22, 1.36, 2.25, 2.73, 2.62, 2.46, 2.44, 2.69, 3.06, 3.31, 4.79, 5.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.14, 0.00, 0.00, 3.33, 2.00, 1.67, 2.56, 2.70, 2.83, 2.62, 3.18, 2.98, 2.86, 1.93, 1.20, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.57, 2.40, 2.48, 2.55, 2.29, 2.10, 2.10, 1.90, 1.94, 3.31, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.00, 1.25, 1.29, 1.06, 0.00, 1.00, 1.50, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.06, 1.71, 2.35, 3.08, 3.31, 3.40, 3.19, 2.96, 2.83, 1.93, 2.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.00, 0.00, 0.00, 0.00, 0.00, 2.67, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00, 1.56, 2.07, 1.68, 1.52, 1.76, 1.53, 1.50, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 2.83, 0.00, 1.75, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.60, 4.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 +0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 diff --git a/etc/tutorial/test-data/wind_0_x.csv b/etc/tutorial/test-data/wind_0_x.csv new file mode 100644 index 0000000000..778c20ae79 --- /dev/null +++ b/etc/tutorial/test-data/wind_0_x.csv @@ -0,0 +1,65 @@ +7.93, 7.87, 7.81, 7.75, 7.68, 7.61, 7.53, 7.45, 7.37, 7.28, 7.19, 7.09, 6.98, 6.88, 6.76, 6.65, 6.52, 6.40, 6.27, 6.13, 6.00, 5.86, 5.71, 5.57, 5.43, 5.29, 5.16, 5.03, 4.91, 4.80, 4.71, 4.63, 4.57, 4.53, 4.51, 4.51, 4.52, 4.56, 4.60, 4.65, 4.71, 4.77, 4.84, 4.91, 4.97, 5.03, 5.09, 5.14, 5.19, 5.24, 5.28, 5.32, 5.35, 5.39, 5.42, 5.46, 5.49, 5.53, 5.57, 5.61, 5.65, 5.70, 5.74, 5.79, 5.85, 5.91, 5.96, 6.02, 6.09, 6.15, 6.22, 6.28, 6.35, 6.41, 6.48, 6.54, 6.61, 6.67, 6.74, 6.80, 6.86, 6.92, 6.98, 7.04, 7.09, 7.15 +7.97, 7.91, 7.85, 7.79, 7.72, 7.65, 7.57, 7.49, 7.40, 7.31, 7.21, 7.11, 7.00, 6.89, 6.77, 6.65, 6.52, 6.39, 6.25, 6.11, 5.96, 5.81, 5.66, 5.50, 5.35, 5.19, 5.04, 4.90, 4.77, 4.64, 4.54, 4.45, 4.38, 4.34, 4.32, 4.32, 4.35, 4.39, 4.45, 4.51, 4.58, 4.66, 4.74, 4.81, 4.88, 4.95, 5.02, 5.07, 5.13, 5.17, 5.22, 5.26, 5.29, 5.33, 5.36, 5.39, 5.43, 5.46, 5.50, 5.54, 5.58, 5.63, 5.68, 5.73, 5.79, 5.85, 5.91, 5.98, 6.04, 6.11, 6.18, 6.25, 6.32, 6.39, 6.46, 6.52, 6.59, 6.66, 6.73, 6.79, 6.85, 6.92, 6.98, 7.04, 7.10, 7.15 +8.01, 7.95, 7.89, 7.83, 7.76, 7.69, 7.61, 7.53, 7.44, 7.35, 7.25, 7.14, 7.03, 6.91, 6.79, 6.66, 6.53, 6.39, 6.24, 6.09, 5.93, 5.77, 5.60, 5.43, 5.26, 5.09, 4.92, 4.76, 4.61, 4.47, 4.35, 4.25, 4.18, 4.13, 4.11, 4.12, 4.16, 4.21, 4.28, 4.36, 4.45, 4.54, 4.63, 4.72, 4.80, 4.88, 4.95, 5.01, 5.06, 5.11, 5.16, 5.20, 5.23, 5.26, 5.30, 5.33, 5.36, 5.39, 5.43, 5.47, 5.51, 5.56, 5.61, 5.67, 5.73, 5.79, 5.86, 5.93, 6.00, 6.07, 6.14, 6.22, 6.29, 6.36, 6.43, 6.51, 6.58, 6.65, 6.72, 6.78, 6.85, 6.91, 6.98, 7.04, 7.10, 7.16 +8.06, 8.00, 7.94, 7.88, 7.81, 7.73, 7.66, 7.57, 7.48, 7.39, 7.28, 7.18, 7.06, 6.94, 6.81, 6.68, 6.54, 6.39, 6.23, 6.07, 5.90, 5.73, 5.55, 5.36, 5.18, 4.99, 4.80, 4.62, 4.45, 4.29, 4.15, 4.03, 3.94, 3.89, 3.88, 3.90, 3.94, 4.02, 4.11, 4.21, 4.32, 4.43, 4.53, 4.63, 4.72, 4.81, 4.88, 4.95, 5.00, 5.05, 5.10, 5.14, 5.17, 5.20, 5.23, 5.26, 5.29, 5.32, 5.36, 5.40, 5.44, 5.49, 5.54, 5.60, 5.67, 5.73, 5.80, 5.88, 5.95, 6.03, 6.10, 6.18, 6.26, 6.34, 6.41, 6.49, 6.56, 6.64, 6.71, 6.78, 6.85, 6.91, 6.98, 7.04, 7.10, 7.16 +8.11, 8.05, 7.99, 7.93, 7.86, 7.79, 7.71, 7.62, 7.53, 7.43, 7.33, 7.22, 7.10, 6.98, 6.84, 6.70, 6.55, 6.40, 6.24, 6.06, 5.88, 5.70, 5.50, 5.30, 5.10, 4.89, 4.68, 4.48, 4.28, 4.09, 3.92, 3.79, 3.68, 3.63, 3.61, 3.64, 3.71, 3.81, 3.92, 4.05, 4.18, 4.31, 4.43, 4.54, 4.65, 4.74, 4.82, 4.89, 4.95, 5.00, 5.04, 5.08, 5.11, 5.13, 5.16, 5.18, 5.21, 5.24, 5.28, 5.31, 5.36, 5.41, 5.47, 5.53, 5.60, 5.67, 5.75, 5.82, 5.90, 5.99, 6.07, 6.15, 6.23, 6.31, 6.39, 6.47, 6.55, 6.63, 6.70, 6.77, 6.84, 6.91, 6.98, 7.05, 7.11, 7.17 +8.16, 8.11, 8.05, 7.99, 7.92, 7.84, 7.76, 7.68, 7.59, 7.49, 7.38, 7.27, 7.15, 7.02, 6.88, 6.74, 6.58, 6.42, 6.25, 6.06, 5.87, 5.68, 5.47, 5.25, 5.03, 4.80, 4.56, 4.33, 4.10, 3.88, 3.68, 3.52, 3.39, 3.32, 3.32, 3.36, 3.46, 3.58, 3.73, 3.89, 4.04, 4.20, 4.34, 4.46, 4.58, 4.68, 4.76, 4.84, 4.90, 4.95, 4.99, 5.02, 5.04, 5.07, 5.09, 5.11, 5.13, 5.16, 5.19, 5.23, 5.27, 5.33, 5.39, 5.46, 5.53, 5.61, 5.69, 5.77, 5.86, 5.94, 6.03, 6.12, 6.20, 6.29, 6.37, 6.46, 6.54, 6.62, 6.70, 6.77, 6.85, 6.92, 6.99, 7.05, 7.12, 7.18 +8.22, 8.17, 8.11, 8.05, 7.98, 7.91, 7.83, 7.74, 7.65, 7.55, 7.44, 7.33, 7.20, 7.07, 6.93, 6.78, 6.62, 6.45, 6.27, 6.08, 5.88, 5.66, 5.44, 5.21, 4.96, 4.71, 4.45, 4.19, 3.92, 3.66, 3.42, 3.22, 3.06, 2.98, 2.98, 3.05, 3.18, 3.35, 3.53, 3.73, 3.91, 4.09, 4.25, 4.39, 4.52, 4.62, 4.72, 4.79, 4.85, 4.90, 4.93, 4.96, 4.98, 4.99, 5.01, 5.02, 5.04, 5.06, 5.09, 5.13, 5.18, 5.24, 5.30, 5.37, 5.45, 5.54, 5.62, 5.71, 5.81, 5.90, 5.99, 6.09, 6.18, 6.27, 6.36, 6.45, 6.53, 6.61, 6.69, 6.77, 6.85, 6.92, 6.99, 7.06, 7.13, 7.19 +8.29, 8.24, 8.18, 8.12, 8.05, 7.98, 7.90, 7.81, 7.72, 7.62, 7.51, 7.39, 7.27, 7.13, 6.98, 6.83, 6.66, 6.49, 6.30, 6.10, 5.89, 5.67, 5.43, 5.18, 4.92, 4.64, 4.35, 4.05, 3.75, 3.44, 3.15, 2.89, 2.69, 2.58, 2.58, 2.69, 2.87, 3.10, 3.34, 3.57, 3.79, 3.99, 4.17, 4.33, 4.47, 4.58, 4.68, 4.75, 4.81, 4.85, 4.88, 4.90, 4.91, 4.92, 4.93, 4.93, 4.94, 4.96, 4.99, 5.03, 5.08, 5.14, 5.21, 5.29, 5.37, 5.46, 5.56, 5.66, 5.76, 5.86, 5.96, 6.06, 6.16, 6.25, 6.35, 6.44, 6.53, 6.61, 6.70, 6.78, 6.85, 6.93, 7.00, 7.07, 7.14, 7.21 +8.35, 8.30, 8.25, 8.19, 8.12, 8.05, 7.97, 7.89, 7.80, 7.69, 7.58, 7.47, 7.34, 7.20, 7.05, 6.89, 6.72, 6.54, 6.34, 6.14, 5.92, 5.68, 5.43, 5.17, 4.89, 4.59, 4.27, 3.94, 3.59, 3.23, 2.88, 2.54, 2.27, 2.12, 2.13, 2.30, 2.56, 2.86, 3.15, 3.43, 3.69, 3.92, 4.12, 4.29, 4.43, 4.55, 4.65, 4.72, 4.77, 4.81, 4.84, 4.85, 4.85, 4.84, 4.84, 4.83, 4.84, 4.85, 4.87, 4.91, 4.96, 5.03, 5.10, 5.19, 5.29, 5.39, 5.49, 5.60, 5.71, 5.82, 5.93, 6.03, 6.14, 6.24, 6.33, 6.43, 6.52, 6.61, 6.70, 6.78, 6.86, 6.94, 7.02, 7.09, 7.16, 7.22 +8.43, 8.38, 8.33, 8.27, 8.21, 8.14, 8.06, 7.97, 7.88, 7.78, 7.67, 7.55, 7.42, 7.28, 7.13, 6.97, 6.79, 6.60, 6.40, 6.19, 5.96, 5.72, 5.46, 5.18, 4.88, 4.57, 4.23, 3.86, 3.47, 3.06, 2.63, 2.19, 1.81, 1.57, 1.61, 1.88, 2.25, 2.64, 3.00, 3.33, 3.62, 3.87, 4.08, 4.26, 4.41, 4.53, 4.63, 4.70, 4.75, 4.78, 4.79, 4.79, 4.78, 4.76, 4.74, 4.72, 4.72, 4.72, 4.74, 4.78, 4.83, 4.91, 4.99, 5.09, 5.20, 5.31, 5.43, 5.55, 5.66, 5.78, 5.90, 6.01, 6.12, 6.22, 6.33, 6.43, 6.52, 6.62, 6.71, 6.79, 6.88, 6.96, 7.03, 7.11, 7.18, 7.24 +8.50, 8.46, 8.41, 8.35, 8.29, 8.22, 8.15, 8.07, 7.97, 7.87, 7.76, 7.64, 7.51, 7.37, 7.22, 7.05, 6.87, 6.68, 6.48, 6.26, 6.02, 5.77, 5.50, 5.22, 4.91, 4.57, 4.22, 3.83, 3.41, 2.95, 2.45, 1.91, 1.35, 0.93, 1.02, 1.49, 2.01, 2.49, 2.91, 3.27, 3.58, 3.84, 4.07, 4.25, 4.41, 4.53, 4.62, 4.69, 4.73, 4.75, 4.75, 4.74, 4.71, 4.67, 4.64, 4.60, 4.58, 4.57, 4.59, 4.63, 4.69, 4.77, 4.87, 4.99, 5.11, 5.23, 5.36, 5.49, 5.62, 5.75, 5.87, 5.99, 6.11, 6.22, 6.33, 6.43, 6.53, 6.63, 6.72, 6.81, 6.89, 6.97, 7.05, 7.13, 7.20, 7.27 +8.58, 8.54, 8.50, 8.44, 8.39, 8.32, 8.25, 8.17, 8.08, 7.98, 7.87, 7.75, 7.62, 7.47, 7.32, 7.15, 6.97, 6.78, 6.57, 6.34, 6.10, 5.85, 5.57, 5.28, 4.96, 4.62, 4.25, 3.85, 3.41, 2.93, 2.39, 1.79, 1.11, 0.32, 0.56, 1.30, 1.92, 2.44, 2.89, 3.27, 3.59, 3.86, 4.08, 4.27, 4.42, 4.54, 4.63, 4.69, 4.72, 4.73, 4.72, 4.68, 4.64, 4.58, 4.52, 4.47, 4.43, 4.41, 4.42, 4.46, 4.53, 4.63, 4.74, 4.87, 5.01, 5.16, 5.30, 5.44, 5.58, 5.72, 5.85, 5.98, 6.10, 6.22, 6.33, 6.44, 6.54, 6.64, 6.73, 6.83, 6.91, 7.00, 7.08, 7.15, 7.22, 7.29 +8.67, 8.63, 8.59, 8.54, 8.49, 8.42, 8.35, 8.28, 8.19, 8.09, 7.98, 7.86, 7.73, 7.59, 7.43, 7.26, 7.08, 6.88, 6.67, 6.45, 6.20, 5.94, 5.67, 5.37, 5.05, 4.71, 4.34, 3.94, 3.50, 3.02, 2.50, 1.93, 1.32, 0.83, 0.94, 1.48, 2.03, 2.53, 2.96, 3.33, 3.64, 3.91, 4.13, 4.31, 4.46, 4.57, 4.65, 4.70, 4.72, 4.71, 4.69, 4.64, 4.57, 4.49, 4.40, 4.32, 4.25, 4.22, 4.22, 4.26, 4.35, 4.47, 4.61, 4.76, 4.92, 5.08, 5.24, 5.40, 5.55, 5.69, 5.83, 5.97, 6.10, 6.22, 6.34, 6.45, 6.56, 6.66, 6.76, 6.85, 6.94, 7.02, 7.10, 7.18, 7.25, 7.32 +8.76, 8.73, 8.69, 8.64, 8.59, 8.53, 8.47, 8.39, 8.31, 8.21, 8.11, 7.99, 7.86, 7.71, 7.56, 7.39, 7.21, 7.01, 6.80, 6.57, 6.32, 6.06, 5.79, 5.49, 5.17, 4.83, 4.47, 4.08, 3.66, 3.22, 2.75, 2.27, 1.83, 1.56, 1.60, 1.91, 2.32, 2.74, 3.12, 3.46, 3.75, 4.00, 4.21, 4.38, 4.51, 4.61, 4.68, 4.72, 4.73, 4.71, 4.66, 4.59, 4.50, 4.39, 4.27, 4.15, 4.05, 3.99, 3.99, 4.04, 4.15, 4.30, 4.47, 4.65, 4.83, 5.01, 5.19, 5.36, 5.52, 5.68, 5.83, 5.97, 6.10, 6.23, 6.35, 6.47, 6.58, 6.68, 6.78, 6.88, 6.97, 7.05, 7.13, 7.21, 7.29, 7.36 +8.85, 8.83, 8.79, 8.75, 8.71, 8.65, 8.59, 8.52, 8.44, 8.35, 8.24, 8.12, 8.00, 7.85, 7.70, 7.53, 7.34, 7.15, 6.93, 6.70, 6.46, 6.20, 5.93, 5.63, 5.32, 5.00, 4.65, 4.28, 3.89, 3.49, 3.09, 2.71, 2.39, 2.21, 2.23, 2.41, 2.70, 3.03, 3.34, 3.64, 3.90, 4.12, 4.31, 4.46, 4.58, 4.67, 4.73, 4.76, 4.75, 4.72, 4.65, 4.56, 4.44, 4.30, 4.14, 3.97, 3.83, 3.73, 3.71, 3.79, 3.93, 4.12, 4.33, 4.54, 4.75, 4.96, 5.15, 5.34, 5.51, 5.67, 5.83, 5.98, 6.12, 6.25, 6.37, 6.49, 6.61, 6.71, 6.81, 6.91, 7.00, 7.09, 7.17, 7.25, 7.32, 7.40 +8.95, 8.93, 8.90, 8.87, 8.83, 8.78, 8.72, 8.65, 8.58, 8.49, 8.39, 8.27, 8.15, 8.01, 7.85, 7.68, 7.50, 7.30, 7.09, 6.86, 6.62, 6.36, 6.09, 5.80, 5.50, 5.19, 4.86, 4.52, 4.17, 3.81, 3.47, 3.17, 2.93, 2.80, 2.80, 2.91, 3.11, 3.36, 3.61, 3.85, 4.07, 4.27, 4.43, 4.57, 4.67, 4.75, 4.79, 4.81, 4.79, 4.74, 4.66, 4.54, 4.40, 4.22, 4.02, 3.80, 3.58, 3.42, 3.39, 3.50, 3.71, 3.95, 4.21, 4.46, 4.70, 4.92, 5.13, 5.33, 5.51, 5.68, 5.84, 6.00, 6.14, 6.28, 6.40, 6.53, 6.64, 6.75, 6.85, 6.95, 7.04, 7.13, 7.21, 7.29, 7.36, 7.44 +9.05, 9.04, 9.02, 8.99, 8.95, 8.91, 8.86, 8.80, 8.73, 8.64, 8.54, 8.43, 8.31, 8.17, 8.01, 7.85, 7.66, 7.46, 7.25, 7.03, 6.79, 6.54, 6.27, 5.99, 5.71, 5.41, 5.10, 4.78, 4.47, 4.16, 3.87, 3.62, 3.43, 3.33, 3.31, 3.38, 3.52, 3.70, 3.90, 4.09, 4.27, 4.44, 4.58, 4.69, 4.78, 4.84, 4.87, 4.87, 4.84, 4.78, 4.68, 4.55, 4.38, 4.17, 3.93, 3.64, 3.34, 3.07, 3.00, 3.19, 3.50, 3.82, 4.12, 4.41, 4.67, 4.91, 5.13, 5.33, 5.53, 5.71, 5.87, 6.03, 6.18, 6.31, 6.44, 6.57, 6.68, 6.79, 6.90, 6.99, 7.09, 7.17, 7.26, 7.34, 7.41, 7.48 +9.16, 9.15, 9.13, 9.11, 9.09, 9.05, 9.01, 8.95, 8.89, 8.81, 8.71, 8.61, 8.48, 8.35, 8.19, 8.02, 7.84, 7.64, 7.43, 7.21, 6.97, 6.73, 6.47, 6.20, 5.92, 5.64, 5.35, 5.07, 4.78, 4.51, 4.27, 4.06, 3.90, 3.81, 3.78, 3.82, 3.91, 4.04, 4.19, 4.34, 4.49, 4.62, 4.74, 4.83, 4.90, 4.95, 4.96, 4.95, 4.91, 4.83, 4.73, 4.58, 4.40, 4.17, 3.89, 3.56, 3.18, 2.75, 2.55, 2.96, 3.38, 3.76, 4.09, 4.40, 4.67, 4.92, 5.15, 5.37, 5.56, 5.74, 5.91, 6.07, 6.22, 6.36, 6.49, 6.62, 6.73, 6.84, 6.95, 7.04, 7.14, 7.22, 7.31, 7.39, 7.46, 7.53 +9.27, 9.27, 9.26, 9.25, 9.23, 9.20, 9.16, 9.12, 9.06, 8.98, 8.89, 8.79, 8.67, 8.53, 8.38, 8.21, 8.03, 7.83, 7.62, 7.40, 7.17, 6.93, 6.68, 6.42, 6.16, 5.89, 5.62, 5.36, 5.10, 4.86, 4.65, 4.47, 4.33, 4.24, 4.21, 4.22, 4.28, 4.37, 4.48, 4.60, 4.71, 4.82, 4.91, 4.98, 5.04, 5.07, 5.07, 5.05, 5.00, 4.91, 4.80, 4.64, 4.45, 4.22, 3.94, 3.61, 3.22, 2.81, 2.65, 3.01, 3.42, 3.80, 4.14, 4.44, 4.72, 4.97, 5.21, 5.42, 5.62, 5.80, 5.97, 6.13, 6.28, 6.42, 6.55, 6.68, 6.79, 6.90, 7.00, 7.10, 7.19, 7.28, 7.36, 7.44, 7.51, 7.58 +9.38, 9.38, 9.39, 9.38, 9.37, 9.36, 9.33, 9.29, 9.24, 9.17, 9.09, 8.99, 8.87, 8.74, 8.58, 8.42, 8.23, 8.04, 7.83, 7.61, 7.38, 7.14, 6.89, 6.65, 6.39, 6.14, 5.89, 5.65, 5.42, 5.20, 5.01, 4.85, 4.72, 4.64, 4.60, 4.60, 4.63, 4.69, 4.77, 4.85, 4.94, 5.02, 5.09, 5.15, 5.18, 5.20, 5.19, 5.16, 5.10, 5.01, 4.89, 4.74, 4.55, 4.33, 4.07, 3.77, 3.47, 3.21, 3.14, 3.32, 3.62, 3.95, 4.26, 4.54, 4.81, 5.06, 5.29, 5.50, 5.69, 5.88, 6.05, 6.20, 6.35, 6.49, 6.62, 6.74, 6.86, 6.97, 7.07, 7.17, 7.26, 7.34, 7.42, 7.50, 7.57, 7.64 +9.49, 9.51, 9.52, 9.52, 9.52, 9.52, 9.50, 9.47, 9.43, 9.37, 9.29, 9.20, 9.08, 8.95, 8.80, 8.63, 8.44, 8.25, 8.04, 7.82, 7.59, 7.36, 7.12, 6.88, 6.64, 6.40, 6.16, 5.94, 5.72, 5.53, 5.35, 5.21, 5.09, 5.01, 4.96, 4.95, 4.96, 5.00, 5.05, 5.11, 5.17, 5.23, 5.28, 5.32, 5.34, 5.34, 5.33, 5.29, 5.23, 5.14, 5.02, 4.87, 4.70, 4.49, 4.26, 4.02, 3.80, 3.63, 3.59, 3.70, 3.91, 4.17, 4.44, 4.70, 4.95, 5.18, 5.40, 5.60, 5.79, 5.97, 6.13, 6.29, 6.44, 6.57, 6.70, 6.82, 6.93, 7.04, 7.14, 7.24, 7.32, 7.41, 7.49, 7.56, 7.63, 7.70 +9.61, 9.63, 9.65, 9.67, 9.68, 9.69, 9.68, 9.66, 9.63, 9.58, 9.51, 9.42, 9.31, 9.17, 9.02, 8.85, 8.66, 8.46, 8.25, 8.03, 7.81, 7.58, 7.34, 7.11, 6.88, 6.65, 6.43, 6.22, 6.02, 5.84, 5.68, 5.54, 5.43, 5.35, 5.30, 5.27, 5.27, 5.29, 5.32, 5.36, 5.40, 5.44, 5.47, 5.50, 5.51, 5.50, 5.48, 5.43, 5.37, 5.28, 5.17, 5.03, 4.87, 4.70, 4.50, 4.31, 4.15, 4.04, 4.01, 4.09, 4.24, 4.44, 4.66, 4.89, 5.11, 5.33, 5.53, 5.73, 5.91, 6.08, 6.24, 6.39, 6.53, 6.66, 6.79, 6.91, 7.02, 7.12, 7.22, 7.31, 7.40, 7.48, 7.56, 7.63, 7.70, 7.77 +9.72, 9.75, 9.79, 9.82, 9.84, 9.86, 9.87, 9.87, 9.85, 9.81, 9.74, 9.66, 9.54, 9.41, 9.25, 9.08, 8.89, 8.68, 8.47, 8.25, 8.02, 7.80, 7.57, 7.34, 7.12, 6.90, 6.69, 6.49, 6.31, 6.14, 5.99, 5.86, 5.75, 5.67, 5.61, 5.58, 5.57, 5.57, 5.58, 5.60, 5.63, 5.65, 5.67, 5.68, 5.68, 5.67, 5.64, 5.59, 5.53, 5.45, 5.34, 5.22, 5.08, 4.93, 4.77, 4.62, 4.50, 4.42, 4.40, 4.46, 4.57, 4.73, 4.92, 5.11, 5.31, 5.50, 5.69, 5.87, 6.04, 6.21, 6.36, 6.50, 6.64, 6.77, 6.89, 7.00, 7.11, 7.21, 7.31, 7.40, 7.48, 7.56, 7.64, 7.71, 7.77, 7.84 +9.83, 9.88, 9.92, 9.97, 10.01, 10.04, 10.07, 10.08, 10.07, 10.04, 9.99, 9.91, 9.80, 9.66, 9.50, 9.31, 9.12, 8.91, 8.69, 8.47, 8.24, 8.02, 7.79, 7.57, 7.35, 7.15, 6.95, 6.76, 6.58, 6.42, 6.28, 6.16, 6.05, 5.97, 5.91, 5.87, 5.84, 5.83, 5.84, 5.84, 5.85, 5.87, 5.87, 5.87, 5.87, 5.85, 5.82, 5.77, 5.71, 5.63, 5.53, 5.42, 5.30, 5.17, 5.05, 4.93, 4.84, 4.78, 4.77, 4.82, 4.91, 5.03, 5.18, 5.35, 5.52, 5.70, 5.87, 6.04, 6.19, 6.35, 6.49, 6.63, 6.76, 6.88, 7.00, 7.11, 7.21, 7.31, 7.40, 7.49, 7.57, 7.64, 7.72, 7.79, 7.85, 7.91 +9.94, 10.00, 10.06, 10.12, 10.17, 10.23, 10.27, 10.30, 10.31, 10.30, 10.25, 10.17, 10.06, 9.92, 9.75, 9.56, 9.35, 9.13, 8.91, 8.68, 8.46, 8.23, 8.01, 7.79, 7.58, 7.38, 7.19, 7.01, 6.84, 6.69, 6.55, 6.44, 6.34, 6.25, 6.19, 6.14, 6.11, 6.09, 6.08, 6.08, 6.08, 6.08, 6.08, 6.07, 6.06, 6.04, 6.00, 5.96, 5.90, 5.82, 5.74, 5.64, 5.54, 5.43, 5.33, 5.24, 5.17, 5.13, 5.12, 5.16, 5.23, 5.33, 5.46, 5.60, 5.75, 5.91, 6.06, 6.21, 6.36, 6.50, 6.64, 6.77, 6.89, 7.01, 7.12, 7.22, 7.32, 7.41, 7.50, 7.58, 7.66, 7.73, 7.80, 7.87, 7.93, 7.99 +10.05, 10.12, 10.19, 10.26, 10.34, 10.41, 10.48, 10.53, 10.56, 10.56, 10.53, 10.45, 10.34, 10.18, 10.00, 9.80, 9.58, 9.35, 9.12, 8.89, 8.66, 8.44, 8.22, 8.00, 7.80, 7.61, 7.42, 7.25, 7.09, 6.94, 6.81, 6.70, 6.60, 6.52, 6.46, 6.41, 6.37, 6.34, 6.33, 6.31, 6.31, 6.30, 6.29, 6.28, 6.26, 6.23, 6.20, 6.15, 6.10, 6.03, 5.96, 5.87, 5.79, 5.70, 5.62, 5.54, 5.49, 5.46, 5.46, 5.49, 5.55, 5.64, 5.74, 5.86, 5.99, 6.13, 6.27, 6.40, 6.54, 6.67, 6.79, 6.91, 7.03, 7.14, 7.24, 7.34, 7.43, 7.52, 7.61, 7.68, 7.76, 7.83, 7.90, 7.96, 8.02, 8.07 +10.15, 10.23, 10.31, 10.40, 10.50, 10.59, 10.68, 10.76, 10.82, 10.85, 10.82, 10.75, 10.62, 10.46, 10.26, 10.03, 9.80, 9.56, 9.33, 9.09, 8.86, 8.63, 8.42, 8.21, 8.01, 7.82, 7.64, 7.48, 7.32, 7.19, 7.06, 6.95, 6.86, 6.78, 6.71, 6.66, 6.62, 6.59, 6.56, 6.54, 6.53, 6.52, 6.50, 6.49, 6.47, 6.44, 6.40, 6.36, 6.31, 6.25, 6.19, 6.12, 6.04, 5.97, 5.90, 5.84, 5.80, 5.78, 5.78, 5.81, 5.86, 5.93, 6.02, 6.13, 6.24, 6.36, 6.48, 6.61, 6.73, 6.85, 6.96, 7.07, 7.18, 7.28, 7.38, 7.47, 7.56, 7.64, 7.72, 7.79, 7.86, 7.93, 7.99, 8.05, 8.11, 8.16 +10.24, 10.33, 10.43, 10.53, 10.65, 10.77, 10.89, 11.00, 11.09, 11.14, 11.14, 11.06, 10.92, 10.73, 10.51, 10.26, 10.01, 9.76, 9.52, 9.28, 9.04, 8.82, 8.60, 8.40, 8.21, 8.02, 7.85, 7.69, 7.55, 7.41, 7.30, 7.19, 7.10, 7.02, 6.95, 6.90, 6.86, 6.82, 6.79, 6.77, 6.75, 6.74, 6.72, 6.70, 6.68, 6.65, 6.62, 6.58, 6.53, 6.48, 6.42, 6.36, 6.30, 6.24, 6.19, 6.14, 6.11, 6.10, 6.10, 6.12, 6.17, 6.23, 6.31, 6.39, 6.49, 6.60, 6.71, 6.82, 6.92, 7.03, 7.14, 7.24, 7.34, 7.43, 7.52, 7.61, 7.69, 7.76, 7.84, 7.91, 7.97, 8.03, 8.09, 8.15, 8.20, 8.25 +10.32, 10.42, 10.53, 10.65, 10.78, 10.93, 11.08, 11.23, 11.36, 11.46, 11.48, 11.39, 11.22, 11.00, 10.74, 10.47, 10.21, 9.94, 9.69, 9.45, 9.21, 8.99, 8.78, 8.58, 8.39, 8.21, 8.05, 7.90, 7.76, 7.63, 7.52, 7.42, 7.33, 7.25, 7.19, 7.13, 7.09, 7.05, 7.02, 7.00, 6.98, 6.96, 6.94, 6.92, 6.90, 6.87, 6.84, 6.80, 6.76, 6.72, 6.67, 6.62, 6.57, 6.52, 6.48, 6.44, 6.42, 6.41, 6.41, 6.43, 6.47, 6.52, 6.59, 6.66, 6.75, 6.84, 6.93, 7.03, 7.13, 7.23, 7.32, 7.41, 7.50, 7.59, 7.67, 7.75, 7.82, 7.89, 7.96, 8.03, 8.09, 8.14, 8.20, 8.25, 8.30, 8.34 +10.39, 10.50, 10.62, 10.75, 10.90, 11.06, 11.24, 11.44, 11.63, 11.79, 11.84, 11.74, 11.52, 11.24, 10.95, 10.65, 10.37, 10.10, 9.84, 9.60, 9.37, 9.15, 8.94, 8.75, 8.56, 8.39, 8.24, 8.09, 7.96, 7.84, 7.73, 7.63, 7.55, 7.48, 7.41, 7.36, 7.32, 7.28, 7.25, 7.22, 7.20, 7.18, 7.16, 7.14, 7.12, 7.09, 7.07, 7.03, 7.00, 6.96, 6.92, 6.88, 6.84, 6.80, 6.76, 6.74, 6.72, 6.71, 6.72, 6.74, 6.77, 6.81, 6.87, 6.93, 7.01, 7.09, 7.17, 7.25, 7.34, 7.43, 7.51, 7.59, 7.67, 7.75, 7.83, 7.90, 7.96, 8.03, 8.09, 8.15, 8.20, 8.26, 8.31, 8.35, 8.40, 8.44 +10.45, 10.56, 10.69, 10.82, 10.98, 11.16, 11.37, 11.60, 11.85, 12.10, 12.23, 12.07, 11.76, 11.43, 11.10, 10.79, 10.50, 10.23, 9.97, 9.73, 9.50, 9.29, 9.09, 8.90, 8.72, 8.56, 8.41, 8.27, 8.15, 8.03, 7.93, 7.84, 7.76, 7.69, 7.63, 7.58, 7.54, 7.50, 7.47, 7.45, 7.42, 7.40, 7.39, 7.37, 7.35, 7.32, 7.30, 7.27, 7.24, 7.21, 7.18, 7.14, 7.11, 7.08, 7.05, 7.03, 7.02, 7.01, 7.02, 7.04, 7.06, 7.10, 7.15, 7.21, 7.27, 7.34, 7.41, 7.48, 7.56, 7.63, 7.71, 7.78, 7.85, 7.92, 7.99, 8.05, 8.11, 8.17, 8.22, 8.28, 8.33, 8.37, 8.42, 8.46, 8.50, 8.54 +10.50, 10.61, 10.73, 10.88, 11.04, 11.22, 11.44, 11.68, 11.97, 12.31, 12.65, 12.29, 11.90, 11.53, 11.19, 10.88, 10.59, 10.32, 10.07, 9.83, 9.61, 9.41, 9.22, 9.04, 8.87, 8.72, 8.58, 8.45, 8.33, 8.22, 8.12, 8.04, 7.96, 7.90, 7.84, 7.79, 7.75, 7.72, 7.69, 7.67, 7.65, 7.63, 7.61, 7.60, 7.58, 7.56, 7.54, 7.52, 7.49, 7.47, 7.44, 7.41, 7.39, 7.36, 7.34, 7.33, 7.32, 7.31, 7.32, 7.33, 7.36, 7.39, 7.43, 7.48, 7.53, 7.59, 7.65, 7.71, 7.78, 7.84, 7.91, 7.97, 8.03, 8.09, 8.15, 8.21, 8.26, 8.31, 8.36, 8.41, 8.45, 8.49, 8.53, 8.57, 8.61, 8.64 +10.53, 10.64, 10.76, 10.90, 11.06, 11.24, 11.44, 11.67, 11.94, 12.22, 12.38, 12.19, 11.86, 11.53, 11.21, 10.92, 10.64, 10.39, 10.14, 9.92, 9.71, 9.52, 9.33, 9.16, 9.01, 8.86, 8.73, 8.61, 8.50, 8.40, 8.31, 8.23, 8.16, 8.10, 8.05, 8.00, 7.97, 7.94, 7.91, 7.89, 7.87, 7.86, 7.84, 7.83, 7.82, 7.80, 7.79, 7.77, 7.75, 7.73, 7.71, 7.69, 7.67, 7.65, 7.63, 7.62, 7.61, 7.61, 7.62, 7.63, 7.65, 7.68, 7.71, 7.75, 7.80, 7.85, 7.90, 7.95, 8.00, 8.06, 8.11, 8.17, 8.22, 8.27, 8.32, 8.37, 8.42, 8.46, 8.51, 8.55, 8.58, 8.62, 8.65, 8.69, 8.72, 8.74 +10.54, 10.65, 10.77, 10.90, 11.05, 11.21, 11.39, 11.59, 11.79, 11.96, 12.03, 11.93, 11.71, 11.45, 11.17, 10.91, 10.66, 10.42, 10.20, 9.99, 9.79, 9.61, 9.44, 9.28, 9.13, 9.00, 8.87, 8.76, 8.66, 8.57, 8.49, 8.41, 8.35, 8.29, 8.25, 8.21, 8.18, 8.15, 8.13, 8.11, 8.10, 8.08, 8.07, 8.07, 8.06, 8.05, 8.04, 8.02, 8.01, 8.00, 7.98, 7.97, 7.95, 7.94, 7.93, 7.92, 7.92, 7.92, 7.92, 7.93, 7.95, 7.97, 8.00, 8.03, 8.07, 8.10, 8.15, 8.19, 8.23, 8.28, 8.33, 8.37, 8.41, 8.46, 8.50, 8.54, 8.58, 8.62, 8.65, 8.68, 8.72, 8.75, 8.78, 8.80, 8.83, 8.85 +10.55, 10.65, 10.76, 10.88, 11.01, 11.16, 11.31, 11.46, 11.61, 11.71, 11.74, 11.67, 11.52, 11.32, 11.09, 10.87, 10.64, 10.43, 10.23, 10.04, 9.86, 9.69, 9.53, 9.38, 9.25, 9.12, 9.01, 8.91, 8.81, 8.73, 8.66, 8.59, 8.53, 8.49, 8.44, 8.41, 8.38, 8.36, 8.34, 8.33, 8.32, 8.31, 8.31, 8.30, 8.30, 8.30, 8.29, 8.29, 8.28, 8.27, 8.26, 8.25, 8.24, 8.23, 8.23, 8.22, 8.22, 8.22, 8.22, 8.23, 8.25, 8.26, 8.28, 8.31, 8.34, 8.37, 8.40, 8.43, 8.47, 8.50, 8.54, 8.58, 8.61, 8.65, 8.68, 8.71, 8.74, 8.77, 8.80, 8.83, 8.85, 8.88, 8.90, 8.92, 8.94, 8.96 +10.55, 10.64, 10.74, 10.85, 10.96, 11.08, 11.21, 11.32, 11.42, 11.49, 11.50, 11.44, 11.33, 11.17, 11.00, 10.81, 10.61, 10.43, 10.24, 10.07, 9.91, 9.75, 9.61, 9.48, 9.36, 9.24, 9.14, 9.05, 8.96, 8.89, 8.82, 8.76, 8.71, 8.67, 8.64, 8.61, 8.59, 8.57, 8.56, 8.55, 8.55, 8.55, 8.55, 8.55, 8.55, 8.55, 8.55, 8.55, 8.55, 8.55, 8.55, 8.54, 8.54, 8.53, 8.53, 8.53, 8.53, 8.53, 8.53, 8.54, 8.54, 8.56, 8.57, 8.59, 8.61, 8.63, 8.65, 8.68, 8.71, 8.73, 8.76, 8.78, 8.81, 8.84, 8.86, 8.89, 8.91, 8.93, 8.95, 8.97, 8.99, 9.01, 9.03, 9.04, 9.06, 9.07 +10.54, 10.62, 10.71, 10.80, 10.90, 11.00, 11.10, 11.19, 11.26, 11.30, 11.30, 11.25, 11.16, 11.04, 10.89, 10.74, 10.57, 10.41, 10.25, 10.10, 9.95, 9.82, 9.69, 9.57, 9.46, 9.35, 9.26, 9.18, 9.10, 9.04, 8.98, 8.93, 8.89, 8.85, 8.83, 8.81, 8.79, 8.78, 8.78, 8.77, 8.78, 8.78, 8.79, 8.79, 8.80, 8.81, 8.82, 8.82, 8.83, 8.83, 8.84, 8.84, 8.84, 8.84, 8.84, 8.84, 8.84, 8.84, 8.84, 8.84, 8.85, 8.85, 8.86, 8.87, 8.89, 8.90, 8.91, 8.93, 8.95, 8.96, 8.98, 9.00, 9.01, 9.03, 9.05, 9.06, 9.08, 9.09, 9.11, 9.12, 9.13, 9.14, 9.16, 9.17, 9.18, 9.19 +10.52, 10.59, 10.67, 10.75, 10.84, 10.92, 10.99, 11.06, 11.11, 11.13, 11.13, 11.09, 11.02, 10.92, 10.80, 10.67, 10.53, 10.39, 10.25, 10.12, 9.99, 9.87, 9.75, 9.65, 9.55, 9.46, 9.38, 9.30, 9.24, 9.18, 9.13, 9.09, 9.06, 9.03, 9.01, 9.00, 8.99, 8.99, 8.99, 9.00, 9.01, 9.02, 9.03, 9.04, 9.06, 9.07, 9.09, 9.10, 9.11, 9.12, 9.13, 9.14, 9.14, 9.15, 9.15, 9.15, 9.15, 9.15, 9.15, 9.15, 9.15, 9.15, 9.16, 9.16, 9.16, 9.17, 9.18, 9.18, 9.19, 9.20, 9.20, 9.21, 9.22, 9.23, 9.24, 9.24, 9.25, 9.26, 9.26, 9.27, 9.28, 9.28, 9.29, 9.29, 9.30, 9.30 +10.50, 10.57, 10.63, 10.70, 10.77, 10.84, 10.90, 10.95, 10.98, 11.00, 10.99, 10.95, 10.89, 10.81, 10.71, 10.61, 10.49, 10.37, 10.25, 10.14, 10.03, 9.92, 9.82, 9.73, 9.64, 9.56, 9.49, 9.43, 9.37, 9.33, 9.29, 9.25, 9.23, 9.21, 9.20, 9.19, 9.19, 9.20, 9.21, 9.22, 9.24, 9.25, 9.28, 9.30, 9.32, 9.34, 9.36, 9.39, 9.40, 9.42, 9.44, 9.45, 9.46, 9.47, 9.47, 9.47, 9.47, 9.47, 9.47, 9.47, 9.46, 9.46, 9.46, 9.45, 9.45, 9.44, 9.44, 9.44, 9.44, 9.43, 9.43, 9.43, 9.43, 9.43, 9.43, 9.43, 9.42, 9.42, 9.42, 9.42, 9.42, 9.42, 9.42, 9.42, 9.42, 9.42 +10.48, 10.54, 10.60, 10.65, 10.71, 10.76, 10.81, 10.85, 10.87, 10.88, 10.87, 10.84, 10.79, 10.72, 10.64, 10.55, 10.46, 10.36, 10.25, 10.16, 10.06, 9.97, 9.88, 9.80, 9.73, 9.66, 9.60, 9.55, 9.50, 9.46, 9.43, 9.41, 9.39, 9.38, 9.38, 9.38, 9.39, 9.40, 9.42, 9.44, 9.47, 9.50, 9.53, 9.56, 9.59, 9.62, 9.65, 9.68, 9.70, 9.73, 9.75, 9.77, 9.78, 9.79, 9.80, 9.80, 9.80, 9.80, 9.80, 9.79, 9.78, 9.77, 9.76, 9.75, 9.74, 9.72, 9.71, 9.70, 9.69, 9.67, 9.66, 9.65, 9.64, 9.63, 9.62, 9.61, 9.60, 9.59, 9.58, 9.57, 9.57, 9.56, 9.55, 9.54, 9.54, 9.53 +10.45, 10.51, 10.56, 10.61, 10.66, 10.70, 10.74, 10.76, 10.78, 10.78, 10.77, 10.75, 10.70, 10.65, 10.58, 10.51, 10.43, 10.34, 10.26, 10.17, 10.09, 10.01, 9.94, 9.87, 9.81, 9.75, 9.71, 9.66, 9.63, 9.60, 9.58, 9.57, 9.56, 9.56, 9.56, 9.57, 9.59, 9.61, 9.64, 9.67, 9.70, 9.74, 9.78, 9.82, 9.86, 9.90, 9.94, 9.97, 10.01, 10.04, 10.07, 10.09, 10.11, 10.12, 10.13, 10.14, 10.14, 10.14, 10.13, 10.12, 10.10, 10.09, 10.07, 10.05, 10.03, 10.00, 9.98, 9.96, 9.94, 9.91, 9.89, 9.87, 9.85, 9.83, 9.81, 9.79, 9.78, 9.76, 9.74, 9.73, 9.71, 9.70, 9.69, 9.67, 9.66, 9.65 +10.43, 10.48, 10.52, 10.56, 10.60, 10.64, 10.67, 10.69, 10.70, 10.70, 10.69, 10.67, 10.64, 10.59, 10.53, 10.47, 10.41, 10.34, 10.27, 10.19, 10.13, 10.06, 10.00, 9.94, 9.89, 9.85, 9.81, 9.78, 9.75, 9.73, 9.72, 9.72, 9.72, 9.73, 9.74, 9.76, 9.79, 9.82, 9.86, 9.90, 9.94, 9.99, 10.03, 10.08, 10.13, 10.18, 10.23, 10.28, 10.32, 10.36, 10.39, 10.42, 10.45, 10.47, 10.48, 10.49, 10.49, 10.48, 10.47, 10.45, 10.43, 10.41, 10.38, 10.35, 10.32, 10.29, 10.26, 10.22, 10.19, 10.16, 10.13, 10.10, 10.06, 10.04, 10.01, 9.98, 9.95, 9.93, 9.90, 9.88, 9.86, 9.84, 9.82, 9.80, 9.78, 9.76 +10.41, 10.45, 10.49, 10.53, 10.56, 10.59, 10.61, 10.63, 10.64, 10.64, 10.63, 10.61, 10.58, 10.54, 10.50, 10.45, 10.39, 10.34, 10.28, 10.22, 10.16, 10.11, 10.06, 10.01, 9.97, 9.94, 9.91, 9.89, 9.88, 9.87, 9.86, 9.87, 9.88, 9.90, 9.92, 9.95, 9.99, 10.03, 10.07, 10.12, 10.18, 10.23, 10.29, 10.35, 10.41, 10.47, 10.53, 10.59, 10.64, 10.69, 10.73, 10.77, 10.80, 10.82, 10.84, 10.84, 10.84, 10.83, 10.82, 10.80, 10.77, 10.74, 10.70, 10.66, 10.62, 10.58, 10.54, 10.49, 10.45, 10.40, 10.36, 10.32, 10.28, 10.24, 10.20, 10.17, 10.13, 10.10, 10.07, 10.04, 10.01, 9.98, 9.95, 9.93, 9.90, 9.88 +10.39, 10.43, 10.46, 10.49, 10.52, 10.55, 10.57, 10.58, 10.59, 10.59, 10.58, 10.56, 10.54, 10.51, 10.47, 10.43, 10.39, 10.34, 10.29, 10.25, 10.20, 10.16, 10.12, 10.09, 10.06, 10.03, 10.01, 10.00, 10.00, 10.00, 10.00, 10.02, 10.04, 10.07, 10.10, 10.14, 10.18, 10.24, 10.29, 10.35, 10.42, 10.49, 10.56, 10.63, 10.70, 10.77, 10.84, 10.91, 10.97, 11.03, 11.08, 11.13, 11.16, 11.19, 11.20, 11.21, 11.21, 11.20, 11.18, 11.15, 11.12, 11.07, 11.03, 10.98, 10.93, 10.87, 10.82, 10.76, 10.71, 10.65, 10.60, 10.55, 10.49, 10.44, 10.40, 10.35, 10.31, 10.27, 10.23, 10.19, 10.15, 10.12, 10.09, 10.06, 10.03, 10.00 +10.38, 10.41, 10.44, 10.47, 10.49, 10.51, 10.53, 10.54, 10.55, 10.55, 10.54, 10.53, 10.51, 10.48, 10.45, 10.42, 10.39, 10.35, 10.31, 10.28, 10.24, 10.21, 10.18, 10.16, 10.14, 10.12, 10.11, 10.11, 10.12, 10.13, 10.14, 10.17, 10.20, 10.23, 10.28, 10.33, 10.38, 10.44, 10.51, 10.58, 10.66, 10.74, 10.82, 10.91, 10.99, 11.08, 11.16, 11.24, 11.31, 11.38, 11.44, 11.49, 11.54, 11.57, 11.59, 11.59, 11.59, 11.57, 11.55, 11.51, 11.47, 11.42, 11.36, 11.30, 11.24, 11.17, 11.10, 11.03, 10.97, 10.90, 10.83, 10.77, 10.71, 10.65, 10.59, 10.54, 10.48, 10.43, 10.39, 10.34, 10.30, 10.26, 10.22, 10.18, 10.15, 10.11 +10.36, 10.39, 10.42, 10.44, 10.46, 10.48, 10.50, 10.51, 10.51, 10.51, 10.51, 10.50, 10.49, 10.47, 10.45, 10.42, 10.39, 10.37, 10.34, 10.31, 10.29, 10.26, 10.24, 10.23, 10.22, 10.21, 10.21, 10.22, 10.23, 10.25, 10.28, 10.31, 10.35, 10.40, 10.45, 10.51, 10.58, 10.65, 10.73, 10.81, 10.90, 11.00, 11.09, 11.19, 11.29, 11.39, 11.48, 11.58, 11.66, 11.74, 11.81, 11.88, 11.92, 11.96, 11.98, 11.99, 11.98, 11.96, 11.93, 11.89, 11.83, 11.77, 11.70, 11.63, 11.55, 11.47, 11.39, 11.31, 11.23, 11.15, 11.07, 11.00, 10.92, 10.85, 10.79, 10.72, 10.66, 10.60, 10.55, 10.49, 10.44, 10.40, 10.35, 10.31, 10.27, 10.23 +10.35, 10.38, 10.40, 10.42, 10.44, 10.46, 10.47, 10.48, 10.49, 10.49, 10.49, 10.48, 10.47, 10.46, 10.44, 10.43, 10.41, 10.39, 10.37, 10.35, 10.33, 10.32, 10.31, 10.30, 10.30, 10.31, 10.31, 10.33, 10.35, 10.38, 10.41, 10.46, 10.51, 10.56, 10.63, 10.70, 10.77, 10.86, 10.95, 11.04, 11.15, 11.25, 11.36, 11.48, 11.59, 11.70, 11.81, 11.92, 12.02, 12.12, 12.20, 12.27, 12.33, 12.37, 12.39, 12.40, 12.39, 12.37, 12.32, 12.27, 12.21, 12.13, 12.05, 11.96, 11.87, 11.77, 11.68, 11.58, 11.49, 11.40, 11.31, 11.22, 11.14, 11.05, 10.98, 10.90, 10.83, 10.77, 10.70, 10.64, 10.59, 10.53, 10.48, 10.43, 10.38, 10.34 +10.34, 10.37, 10.39, 10.41, 10.43, 10.44, 10.46, 10.47, 10.47, 10.48, 10.48, 10.47, 10.47, 10.46, 10.45, 10.44, 10.42, 10.41, 10.40, 10.39, 10.38, 10.38, 10.37, 10.38, 10.38, 10.40, 10.41, 10.44, 10.47, 10.50, 10.55, 10.60, 10.66, 10.72, 10.80, 10.88, 10.97, 11.06, 11.17, 11.28, 11.39, 11.51, 11.64, 11.77, 11.90, 12.03, 12.15, 12.28, 12.40, 12.50, 12.60, 12.68, 12.75, 12.80, 12.82, 12.83, 12.82, 12.78, 12.73, 12.67, 12.59, 12.50, 12.40, 12.30, 12.19, 12.08, 11.97, 11.86, 11.75, 11.64, 11.54, 11.44, 11.35, 11.25, 11.17, 11.08, 11.00, 10.93, 10.86, 10.79, 10.73, 10.66, 10.61, 10.55, 10.50, 10.45 +10.34, 10.36, 10.38, 10.40, 10.41, 10.43, 10.44, 10.45, 10.46, 10.47, 10.47, 10.47, 10.47, 10.46, 10.46, 10.45, 10.45, 10.44, 10.43, 10.43, 10.43, 10.43, 10.44, 10.45, 10.47, 10.49, 10.51, 10.54, 10.58, 10.63, 10.68, 10.74, 10.81, 10.88, 10.97, 11.06, 11.16, 11.27, 11.38, 11.51, 11.64, 11.77, 11.91, 12.06, 12.20, 12.35, 12.50, 12.64, 12.78, 12.90, 13.02, 13.11, 13.19, 13.24, 13.27, 13.28, 13.26, 13.22, 13.16, 13.08, 12.98, 12.88, 12.76, 12.64, 12.51, 12.38, 12.26, 12.13, 12.01, 11.89, 11.77, 11.66, 11.55, 11.45, 11.35, 11.26, 11.17, 11.09, 11.01, 10.93, 10.86, 10.80, 10.73, 10.67, 10.62, 10.56 +10.33, 10.35, 10.37, 10.39, 10.41, 10.42, 10.44, 10.45, 10.46, 10.46, 10.47, 10.47, 10.47, 10.47, 10.47, 10.47, 10.47, 10.47, 10.47, 10.48, 10.48, 10.49, 10.51, 10.52, 10.55, 10.57, 10.61, 10.65, 10.70, 10.75, 10.81, 10.88, 10.96, 11.04, 11.14, 11.24, 11.35, 11.47, 11.60, 11.73, 11.88, 12.03, 12.19, 12.35, 12.52, 12.69, 12.85, 13.02, 13.17, 13.32, 13.45, 13.56, 13.65, 13.71, 13.74, 13.75, 13.72, 13.67, 13.59, 13.50, 13.39, 13.26, 13.12, 12.98, 12.84, 12.69, 12.55, 12.40, 12.26, 12.13, 12.00, 11.88, 11.76, 11.64, 11.54, 11.43, 11.34, 11.24, 11.16, 11.08, 11.00, 10.92, 10.85, 10.79, 10.73, 10.67 +10.33, 10.35, 10.37, 10.39, 10.40, 10.42, 10.43, 10.45, 10.46, 10.46, 10.47, 10.48, 10.48, 10.49, 10.49, 10.50, 10.50, 10.51, 10.51, 10.52, 10.54, 10.55, 10.57, 10.60, 10.63, 10.66, 10.70, 10.75, 10.81, 10.87, 10.94, 11.02, 11.10, 11.20, 11.30, 11.41, 11.53, 11.67, 11.81, 11.96, 12.12, 12.29, 12.46, 12.64, 12.83, 13.02, 13.21, 13.40, 13.58, 13.75, 13.90, 14.03, 14.13, 14.20, 14.24, 14.24, 14.21, 14.14, 14.05, 13.93, 13.80, 13.65, 13.49, 13.33, 13.16, 13.00, 12.83, 12.67, 12.52, 12.37, 12.22, 12.09, 11.96, 11.83, 11.71, 11.60, 11.50, 11.40, 11.30, 11.21, 11.13, 11.05, 10.97, 10.90, 10.84, 10.77 +10.33, 10.35, 10.37, 10.39, 10.40, 10.42, 10.43, 10.45, 10.46, 10.47, 10.48, 10.49, 10.50, 10.51, 10.51, 10.52, 10.53, 10.54, 10.56, 10.57, 10.59, 10.61, 10.64, 10.67, 10.71, 10.75, 10.80, 10.85, 10.92, 10.98, 11.06, 11.15, 11.24, 11.35, 11.46, 11.58, 11.72, 11.86, 12.01, 12.18, 12.35, 12.54, 12.73, 12.93, 13.14, 13.36, 13.57, 13.78, 13.99, 14.19, 14.36, 14.51, 14.63, 14.71, 14.76, 14.76, 14.71, 14.63, 14.52, 14.38, 14.22, 14.04, 13.86, 13.67, 13.48, 13.30, 13.11, 12.93, 12.76, 12.60, 12.44, 12.29, 12.15, 12.01, 11.89, 11.77, 11.65, 11.54, 11.44, 11.35, 11.26, 11.17, 11.09, 11.01, 10.94, 10.87 +10.33, 10.35, 10.37, 10.39, 10.41, 10.42, 10.44, 10.45, 10.47, 10.48, 10.49, 10.50, 10.51, 10.53, 10.54, 10.55, 10.57, 10.58, 10.60, 10.62, 10.65, 10.68, 10.71, 10.75, 10.79, 10.84, 10.89, 10.95, 11.02, 11.10, 11.18, 11.28, 11.38, 11.49, 11.61, 11.75, 11.89, 12.05, 12.21, 12.39, 12.58, 12.78, 13.00, 13.22, 13.45, 13.69, 13.93, 14.17, 14.41, 14.64, 14.84, 15.02, 15.16, 15.26, 15.31, 15.30, 15.25, 15.15, 15.01, 14.84, 14.65, 14.44, 14.23, 14.01, 13.80, 13.59, 13.39, 13.19, 13.00, 12.82, 12.65, 12.49, 12.33, 12.19, 12.05, 11.92, 11.80, 11.69, 11.58, 11.47, 11.38, 11.29, 11.20, 11.12, 11.04, 10.97 +10.34, 10.36, 10.38, 10.39, 10.41, 10.43, 10.45, 10.46, 10.48, 10.49, 10.51, 10.52, 10.54, 10.55, 10.57, 10.58, 10.60, 10.62, 10.65, 10.67, 10.70, 10.74, 10.77, 10.82, 10.87, 10.92, 10.98, 11.05, 11.12, 11.21, 11.30, 11.40, 11.51, 11.63, 11.76, 11.91, 12.06, 12.23, 12.41, 12.60, 12.80, 13.02, 13.26, 13.50, 13.75, 14.02, 14.29, 14.57, 14.84, 15.10, 15.34, 15.55, 15.72, 15.83, 15.89, 15.88, 15.81, 15.68, 15.51, 15.30, 15.08, 14.84, 14.59, 14.35, 14.11, 13.88, 13.65, 13.44, 13.23, 13.04, 12.85, 12.68, 12.51, 12.36, 12.21, 12.07, 11.94, 11.82, 11.71, 11.60, 11.50, 11.40, 11.31, 11.22, 11.14, 11.07 +10.34, 10.36, 10.38, 10.40, 10.42, 10.44, 10.46, 10.47, 10.49, 10.51, 10.52, 10.54, 10.56, 10.58, 10.60, 10.62, 10.64, 10.67, 10.69, 10.72, 10.76, 10.80, 10.84, 10.89, 10.94, 11.00, 11.07, 11.14, 11.22, 11.31, 11.41, 11.52, 11.64, 11.77, 11.91, 12.06, 12.22, 12.40, 12.59, 12.80, 13.02, 13.25, 13.50, 13.77, 14.05, 14.34, 14.64, 14.95, 15.26, 15.56, 15.85, 16.10, 16.30, 16.44, 16.50, 16.49, 16.39, 16.23, 16.02, 15.77, 15.51, 15.23, 14.95, 14.68, 14.41, 14.15, 13.90, 13.67, 13.45, 13.24, 13.04, 12.85, 12.68, 12.52, 12.36, 12.21, 12.08, 11.95, 11.83, 11.71, 11.61, 11.51, 11.41, 11.32, 11.24, 11.16 +10.35, 10.37, 10.39, 10.41, 10.43, 10.45, 10.47, 10.49, 10.50, 10.52, 10.54, 10.56, 10.58, 10.60, 10.63, 10.65, 10.68, 10.71, 10.74, 10.77, 10.81, 10.86, 10.90, 10.96, 11.02, 11.08, 11.15, 11.23, 11.32, 11.42, 11.52, 11.64, 11.76, 11.90, 12.04, 12.20, 12.38, 12.56, 12.76, 12.98, 13.22, 13.47, 13.73, 14.02, 14.32, 14.64, 14.98, 15.33, 15.68, 16.03, 16.36, 16.67, 16.91, 17.09, 17.16, 17.13, 17.01, 16.80, 16.54, 16.24, 15.93, 15.61, 15.29, 14.98, 14.69, 14.41, 14.14, 13.89, 13.65, 13.43, 13.22, 13.02, 12.84, 12.66, 12.50, 12.35, 12.21, 12.07, 11.94, 11.83, 11.71, 11.61, 11.51, 11.42, 11.33, 11.24 +10.36, 10.38, 10.40, 10.42, 10.44, 10.46, 10.48, 10.50, 10.52, 10.54, 10.56, 10.59, 10.61, 10.63, 10.66, 10.69, 10.72, 10.75, 10.79, 10.82, 10.87, 10.92, 10.97, 11.03, 11.09, 11.16, 11.24, 11.32, 11.41, 11.51, 11.62, 11.74, 11.87, 12.02, 12.17, 12.34, 12.52, 12.71, 12.93, 13.15, 13.40, 13.67, 13.95, 14.26, 14.58, 14.93, 15.30, 15.68, 16.08, 16.48, 16.88, 17.24, 17.55, 17.77, 17.86, 17.82, 17.65, 17.38, 17.06, 16.70, 16.33, 15.96, 15.61, 15.27, 14.95, 14.64, 14.36, 14.09, 13.84, 13.60, 13.38, 13.18, 12.98, 12.80, 12.63, 12.47, 12.32, 12.18, 12.05, 11.93, 11.81, 11.70, 11.60, 11.50, 11.41, 11.33 +10.37, 10.39, 10.41, 10.43, 10.45, 10.48, 10.50, 10.52, 10.54, 10.56, 10.59, 10.61, 10.64, 10.66, 10.69, 10.72, 10.76, 10.79, 10.83, 10.87, 10.92, 10.97, 11.03, 11.09, 11.16, 11.23, 11.31, 11.40, 11.50, 11.60, 11.72, 11.85, 11.98, 12.13, 12.29, 12.46, 12.65, 12.85, 13.07, 13.31, 13.57, 13.85, 14.15, 14.47, 14.81, 15.18, 15.58, 16.00, 16.45, 16.90, 17.37, 17.81, 18.20, 18.49, 18.61, 18.54, 18.31, 17.96, 17.56, 17.13, 16.70, 16.29, 15.90, 15.53, 15.18, 14.85, 14.55, 14.27, 14.00, 13.76, 13.53, 13.32, 13.12, 12.93, 12.75, 12.59, 12.43, 12.29, 12.15, 12.03, 11.91, 11.79, 11.69, 11.59, 11.49, 11.40 +10.38, 10.40, 10.43, 10.45, 10.47, 10.49, 10.51, 10.54, 10.56, 10.58, 10.61, 10.64, 10.66, 10.69, 10.72, 10.76, 10.79, 10.83, 10.88, 10.92, 10.97, 11.03, 11.09, 11.15, 11.22, 11.30, 11.39, 11.48, 11.58, 11.69, 11.81, 11.94, 12.08, 12.23, 12.40, 12.58, 12.77, 12.98, 13.21, 13.45, 13.72, 14.01, 14.32, 14.65, 15.01, 15.41, 15.83, 16.28, 16.77, 17.28, 17.81, 18.35, 18.85, 19.24, 19.42, 19.31, 18.97, 18.51, 18.01, 17.51, 17.02, 16.57, 16.14, 15.75, 15.38, 15.04, 14.72, 14.43, 14.15, 13.90, 13.66, 13.44, 13.23, 13.04, 12.86, 12.69, 12.54, 12.39, 12.25, 12.12, 11.99, 11.88, 11.77, 11.67, 11.57, 11.48 +10.40, 10.42, 10.44, 10.46, 10.48, 10.51, 10.53, 10.55, 10.58, 10.61, 10.63, 10.66, 10.69, 10.72, 10.76, 10.79, 10.83, 10.87, 10.92, 10.97, 11.02, 11.08, 11.14, 11.21, 11.29, 11.37, 11.46, 11.55, 11.66, 11.77, 11.89, 12.03, 12.17, 12.33, 12.50, 12.68, 12.88, 13.09, 13.33, 13.58, 13.85, 14.14, 14.46, 14.81, 15.18, 15.59, 16.03, 16.50, 17.02, 17.58, 18.18, 18.81, 19.45, 20.01, 20.28, 20.09, 19.59, 18.98, 18.38, 17.81, 17.28, 16.79, 16.34, 15.92, 15.54, 15.19, 14.86, 14.56, 14.28, 14.02, 13.78, 13.55, 13.34, 13.14, 12.96, 12.79, 12.63, 12.48, 12.33, 12.20, 12.07, 11.96, 11.84, 11.74, 11.64, 11.55 +10.41, 10.43, 10.45, 10.48, 10.50, 10.52, 10.55, 10.57, 10.60, 10.63, 10.66, 10.69, 10.72, 10.75, 10.79, 10.83, 10.87, 10.91, 10.96, 11.01, 11.07, 11.13, 11.20, 11.27, 11.35, 11.43, 11.52, 11.62, 11.73, 11.85, 11.97, 12.11, 12.25, 12.41, 12.59, 12.77, 12.97, 13.19, 13.43, 13.68, 13.96, 14.25, 14.58, 14.93, 15.31, 15.72, 16.17, 16.66, 17.20, 17.78, 18.42, 19.12, 19.88, 20.67, 21.22, 20.80, 20.04, 19.30, 18.63, 18.01, 17.45, 16.94, 16.48, 16.05, 15.66, 15.30, 14.97, 14.66, 14.38, 14.12, 13.87, 13.64, 13.43, 13.23, 13.05, 12.87, 12.71, 12.55, 12.41, 12.27, 12.15, 12.03, 11.91, 11.81, 11.70, 11.61 +10.42, 10.44, 10.47, 10.49, 10.52, 10.54, 10.57, 10.59, 10.62, 10.65, 10.68, 10.71, 10.75, 10.78, 10.82, 10.86, 10.91, 10.95, 11.00, 11.06, 11.12, 11.18, 11.25, 11.32, 11.40, 11.49, 11.58, 11.69, 11.79, 11.91, 12.04, 12.18, 12.33, 12.49, 12.66, 12.85, 13.05, 13.27, 13.51, 13.76, 14.04, 14.34, 14.66, 15.01, 15.39, 15.81, 16.25, 16.74, 17.28, 17.86, 18.51, 19.21, 19.99, 20.83, 21.60, 20.99, 20.15, 19.39, 18.71, 18.09, 17.53, 17.02, 16.56, 16.13, 15.74, 15.38, 15.05, 14.74, 14.46, 14.19, 13.95, 13.72, 13.51, 13.31, 13.12, 12.94, 12.78, 12.62, 12.48, 12.34, 12.21, 12.09, 11.98, 11.87, 11.77, 11.67 +10.44, 10.46, 10.48, 10.51, 10.53, 10.56, 10.59, 10.61, 10.64, 10.67, 10.71, 10.74, 10.78, 10.81, 10.85, 10.90, 10.94, 10.99, 11.04, 11.10, 11.16, 11.23, 11.30, 11.37, 11.46, 11.54, 11.64, 11.74, 11.85, 11.97, 12.10, 12.24, 12.39, 12.56, 12.73, 12.92, 13.12, 13.34, 13.58, 13.83, 14.10, 14.40, 14.72, 15.06, 15.44, 15.84, 16.28, 16.76, 17.27, 17.83, 18.43, 19.07, 19.74, 20.36, 20.70, 20.46, 19.88, 19.24, 18.62, 18.05, 17.52, 17.03, 16.58, 16.16, 15.78, 15.43, 15.10, 14.80, 14.51, 14.25, 14.01, 13.78, 13.57, 13.37, 13.18, 13.00, 12.84, 12.68, 12.54, 12.40, 12.27, 12.15, 12.03, 11.92, 11.82, 11.72 +10.45, 10.47, 10.50, 10.52, 10.55, 10.58, 10.61, 10.63, 10.66, 10.70, 10.73, 10.77, 10.80, 10.84, 10.88, 10.93, 10.98, 11.03, 11.08, 11.14, 11.20, 11.27, 11.34, 11.42, 11.50, 11.59, 11.69, 11.80, 11.91, 12.03, 12.16, 12.30, 12.45, 12.61, 12.79, 12.97, 13.18, 13.39, 13.62, 13.88, 14.14, 14.44, 14.75, 15.08, 15.45, 15.84, 16.25, 16.70, 17.18, 17.70, 18.23, 18.78, 19.30, 19.71, 19.91, 19.78, 19.41, 18.93, 18.41, 17.90, 17.42, 16.97, 16.54, 16.15, 15.78, 15.44, 15.12, 14.82, 14.55, 14.29, 14.05, 13.82, 13.61, 13.42, 13.23, 13.05, 12.89, 12.74, 12.59, 12.45, 12.32, 12.20, 12.08, 11.97, 11.87, 11.77 +10.46, 10.49, 10.51, 10.54, 10.57, 10.60, 10.62, 10.65, 10.69, 10.72, 10.75, 10.79, 10.83, 10.87, 10.91, 10.96, 11.01, 11.06, 11.12, 11.18, 11.24, 11.31, 11.38, 11.46, 11.55, 11.64, 11.74, 11.84, 11.96, 12.08, 12.21, 12.35, 12.50, 12.66, 12.83, 13.02, 13.22, 13.43, 13.66, 13.90, 14.17, 14.45, 14.75, 15.07, 15.42, 15.79, 16.18, 16.60, 17.03, 17.49, 17.95, 18.40, 18.79, 19.09, 19.21, 19.14, 18.89, 18.53, 18.12, 17.69, 17.26, 16.85, 16.46, 16.09, 15.74, 15.42, 15.11, 14.83, 14.56, 14.31, 14.07, 13.85, 13.65, 13.45, 13.27, 13.09, 12.93, 12.78, 12.63, 12.50, 12.37, 12.24, 12.13, 12.02, 11.91, 11.82 diff --git a/etc/tutorial/test-data/wind_0_y.csv b/etc/tutorial/test-data/wind_0_y.csv new file mode 100644 index 0000000000..a4bfa3127b --- /dev/null +++ b/etc/tutorial/test-data/wind_0_y.csv @@ -0,0 +1,65 @@ +11.45, 11.43, 11.40, 11.38, 11.35, 11.32, 11.29, 11.26, 11.23, 11.19, 11.16, 11.12, 11.08, 11.04, 11.00, 10.95, 10.91, 10.86, 10.81, 10.76, 10.71, 10.66, 10.60, 10.55, 10.50, 10.45, 10.40, 10.35, 10.30, 10.25, 10.21, 10.18, 10.14, 10.11, 10.09, 10.07, 10.05, 10.03, 10.02, 10.00, 9.99, 9.97, 9.95, 9.93, 9.91, 9.89, 9.86, 9.84, 9.81, 9.78, 9.75, 9.73, 9.70, 9.68, 9.66, 9.64, 9.63, 9.62, 9.61, 9.62, 9.62, 9.64, 9.66, 9.68, 9.71, 9.74, 9.78, 9.82, 9.86, 9.90, 9.95, 10.00, 10.05, 10.10, 10.15, 10.20, 10.25, 10.30, 10.35, 10.40, 10.44, 10.49, 10.54, 10.58, 10.63, 10.67 +11.47, 11.44, 11.42, 11.39, 11.36, 11.34, 11.31, 11.27, 11.24, 11.20, 11.17, 11.13, 11.09, 11.05, 11.00, 10.96, 10.91, 10.86, 10.81, 10.76, 10.70, 10.65, 10.59, 10.53, 10.48, 10.42, 10.37, 10.31, 10.26, 10.21, 10.17, 10.13, 10.09, 10.06, 10.04, 10.02, 10.00, 9.99, 9.97, 9.96, 9.95, 9.93, 9.91, 9.90, 9.87, 9.85, 9.82, 9.79, 9.76, 9.73, 9.70, 9.67, 9.64, 9.61, 9.58, 9.56, 9.55, 9.54, 9.53, 9.54, 9.54, 9.56, 9.58, 9.60, 9.64, 9.67, 9.71, 9.76, 9.80, 9.85, 9.90, 9.95, 10.01, 10.06, 10.11, 10.17, 10.22, 10.27, 10.33, 10.38, 10.43, 10.48, 10.53, 10.58, 10.62, 10.67 +11.48, 11.46, 11.43, 11.41, 11.38, 11.35, 11.32, 11.29, 11.25, 11.22, 11.18, 11.14, 11.10, 11.06, 11.01, 10.96, 10.91, 10.86, 10.81, 10.75, 10.70, 10.64, 10.58, 10.52, 10.46, 10.39, 10.33, 10.28, 10.22, 10.17, 10.12, 10.08, 10.04, 10.01, 9.99, 9.97, 9.95, 9.94, 9.93, 9.92, 9.91, 9.89, 9.88, 9.86, 9.83, 9.81, 9.78, 9.75, 9.71, 9.67, 9.64, 9.60, 9.57, 9.53, 9.51, 9.48, 9.46, 9.45, 9.45, 9.45, 9.46, 9.47, 9.50, 9.52, 9.56, 9.60, 9.64, 9.69, 9.74, 9.80, 9.85, 9.91, 9.97, 10.02, 10.08, 10.14, 10.19, 10.25, 10.31, 10.36, 10.41, 10.47, 10.52, 10.57, 10.62, 10.66 +11.50, 11.48, 11.45, 11.42, 11.40, 11.37, 11.34, 11.30, 11.27, 11.23, 11.20, 11.15, 11.11, 11.07, 11.02, 10.97, 10.92, 10.87, 10.81, 10.75, 10.69, 10.63, 10.57, 10.50, 10.44, 10.37, 10.30, 10.24, 10.18, 10.12, 10.07, 10.02, 9.98, 9.95, 9.93, 9.91, 9.90, 9.89, 9.89, 9.88, 9.87, 9.86, 9.84, 9.82, 9.80, 9.77, 9.74, 9.70, 9.66, 9.62, 9.58, 9.53, 9.49, 9.46, 9.42, 9.39, 9.37, 9.36, 9.35, 9.35, 9.36, 9.38, 9.41, 9.44, 9.48, 9.52, 9.57, 9.63, 9.68, 9.74, 9.80, 9.86, 9.92, 9.99, 10.05, 10.11, 10.17, 10.23, 10.29, 10.35, 10.40, 10.46, 10.51, 10.56, 10.61, 10.66 +11.52, 11.49, 11.47, 11.44, 11.42, 11.39, 11.36, 11.32, 11.29, 11.25, 11.21, 11.17, 11.13, 11.08, 11.03, 10.98, 10.93, 10.87, 10.81, 10.75, 10.69, 10.62, 10.56, 10.49, 10.42, 10.34, 10.27, 10.20, 10.13, 10.07, 10.01, 9.96, 9.92, 9.88, 9.86, 9.85, 9.84, 9.84, 9.84, 9.84, 9.83, 9.82, 9.81, 9.79, 9.76, 9.73, 9.69, 9.65, 9.61, 9.56, 9.51, 9.46, 9.42, 9.37, 9.33, 9.30, 9.27, 9.26, 9.25, 9.25, 9.26, 9.28, 9.31, 9.35, 9.39, 9.44, 9.50, 9.56, 9.62, 9.68, 9.75, 9.82, 9.88, 9.95, 10.02, 10.08, 10.15, 10.21, 10.27, 10.33, 10.39, 10.45, 10.50, 10.56, 10.61, 10.66 +11.54, 11.51, 11.49, 11.46, 11.44, 11.41, 11.38, 11.34, 11.31, 11.27, 11.23, 11.19, 11.14, 11.10, 11.05, 10.99, 10.94, 10.88, 10.82, 10.76, 10.69, 10.62, 10.55, 10.48, 10.40, 10.32, 10.24, 10.17, 10.09, 10.02, 9.95, 9.89, 9.84, 9.81, 9.79, 9.78, 9.78, 9.79, 9.79, 9.80, 9.80, 9.79, 9.78, 9.76, 9.73, 9.69, 9.65, 9.61, 9.56, 9.50, 9.45, 9.39, 9.33, 9.28, 9.24, 9.20, 9.16, 9.14, 9.13, 9.13, 9.15, 9.17, 9.21, 9.25, 9.30, 9.36, 9.42, 9.49, 9.56, 9.63, 9.70, 9.77, 9.84, 9.92, 9.99, 10.06, 10.12, 10.19, 10.26, 10.32, 10.38, 10.44, 10.50, 10.55, 10.61, 10.66 +11.56, 11.53, 11.51, 11.49, 11.46, 11.43, 11.40, 11.36, 11.33, 11.29, 11.25, 11.21, 11.16, 11.12, 11.07, 11.01, 10.95, 10.89, 10.83, 10.76, 10.69, 10.62, 10.55, 10.47, 10.39, 10.30, 10.22, 10.13, 10.04, 9.96, 9.88, 9.82, 9.76, 9.73, 9.71, 9.71, 9.72, 9.73, 9.75, 9.76, 9.76, 9.76, 9.75, 9.73, 9.70, 9.66, 9.61, 9.56, 9.50, 9.44, 9.38, 9.31, 9.25, 9.18, 9.13, 9.08, 9.04, 9.02, 9.01, 9.01, 9.02, 9.05, 9.09, 9.14, 9.20, 9.27, 9.34, 9.41, 9.49, 9.57, 9.65, 9.73, 9.80, 9.88, 9.96, 10.03, 10.10, 10.17, 10.24, 10.31, 10.37, 10.43, 10.49, 10.55, 10.61, 10.66 +11.58, 11.56, 11.53, 11.51, 11.48, 11.45, 11.42, 11.39, 11.35, 11.32, 11.28, 11.23, 11.19, 11.14, 11.09, 11.03, 10.97, 10.91, 10.84, 10.78, 10.70, 10.63, 10.55, 10.46, 10.38, 10.29, 10.19, 10.10, 10.00, 9.91, 9.82, 9.74, 9.67, 9.63, 9.62, 9.63, 9.65, 9.68, 9.70, 9.72, 9.73, 9.73, 9.72, 9.70, 9.67, 9.63, 9.57, 9.52, 9.45, 9.38, 9.30, 9.23, 9.15, 9.08, 9.01, 8.96, 8.91, 8.88, 8.87, 8.87, 8.89, 8.92, 8.97, 9.03, 9.10, 9.17, 9.25, 9.34, 9.42, 9.51, 9.60, 9.68, 9.77, 9.85, 9.93, 10.01, 10.09, 10.16, 10.23, 10.30, 10.37, 10.43, 10.49, 10.55, 10.61, 10.67 +11.60, 11.58, 11.56, 11.53, 11.51, 11.48, 11.45, 11.42, 11.38, 11.34, 11.30, 11.26, 11.21, 11.16, 11.11, 11.05, 10.99, 10.93, 10.86, 10.79, 10.72, 10.64, 10.55, 10.47, 10.37, 10.28, 10.18, 10.07, 9.96, 9.85, 9.75, 9.65, 9.57, 9.52, 9.51, 9.53, 9.58, 9.62, 9.66, 9.69, 9.71, 9.71, 9.70, 9.68, 9.64, 9.59, 9.54, 9.47, 9.40, 9.31, 9.23, 9.14, 9.05, 8.96, 8.88, 8.82, 8.76, 8.73, 8.71, 8.71, 8.74, 8.78, 8.84, 8.91, 8.99, 9.07, 9.17, 9.26, 9.36, 9.45, 9.55, 9.64, 9.73, 9.82, 9.91, 9.99, 10.07, 10.15, 10.22, 10.30, 10.36, 10.43, 10.50, 10.56, 10.62, 10.67 +11.63, 11.61, 11.58, 11.56, 11.53, 11.51, 11.48, 11.44, 11.41, 11.37, 11.33, 11.29, 11.24, 11.19, 11.14, 11.08, 11.02, 10.95, 10.89, 10.81, 10.73, 10.65, 10.57, 10.47, 10.38, 10.27, 10.17, 10.05, 9.93, 9.81, 9.69, 9.56, 9.45, 9.39, 9.38, 9.44, 9.51, 9.58, 9.63, 9.67, 9.69, 9.69, 9.68, 9.66, 9.62, 9.57, 9.50, 9.43, 9.34, 9.25, 9.15, 9.05, 8.94, 8.84, 8.74, 8.66, 8.60, 8.55, 8.54, 8.54, 8.57, 8.62, 8.69, 8.78, 8.87, 8.97, 9.08, 9.18, 9.29, 9.40, 9.50, 9.60, 9.70, 9.79, 9.89, 9.97, 10.06, 10.14, 10.22, 10.29, 10.36, 10.43, 10.50, 10.56, 10.62, 10.68 +11.65, 11.63, 11.61, 11.59, 11.56, 11.54, 11.51, 11.48, 11.44, 11.40, 11.36, 11.32, 11.27, 11.22, 11.17, 11.11, 11.05, 10.98, 10.91, 10.84, 10.76, 10.67, 10.58, 10.49, 10.39, 10.28, 10.17, 10.05, 9.92, 9.79, 9.64, 9.49, 9.34, 9.23, 9.24, 9.35, 9.46, 9.54, 9.61, 9.65, 9.68, 9.68, 9.67, 9.65, 9.60, 9.55, 9.47, 9.39, 9.29, 9.19, 9.07, 8.95, 8.83, 8.70, 8.59, 8.49, 8.41, 8.36, 8.34, 8.35, 8.39, 8.45, 8.54, 8.64, 8.75, 8.87, 8.99, 9.11, 9.23, 9.34, 9.46, 9.57, 9.67, 9.77, 9.87, 9.96, 10.05, 10.14, 10.22, 10.29, 10.37, 10.44, 10.51, 10.57, 10.63, 10.69 +11.68, 11.66, 11.64, 11.62, 11.59, 11.57, 11.54, 11.51, 11.48, 11.44, 11.40, 11.36, 11.31, 11.26, 11.20, 11.15, 11.08, 11.02, 10.95, 10.87, 10.79, 10.70, 10.61, 10.51, 10.41, 10.30, 10.18, 10.06, 9.93, 9.78, 9.63, 9.46, 9.28, 9.08, 9.14, 9.30, 9.44, 9.54, 9.61, 9.65, 9.68, 9.68, 9.67, 9.64, 9.59, 9.53, 9.45, 9.35, 9.25, 9.12, 8.99, 8.85, 8.71, 8.56, 8.42, 8.30, 8.20, 8.14, 8.11, 8.13, 8.18, 8.27, 8.38, 8.50, 8.63, 8.77, 8.90, 9.04, 9.17, 9.30, 9.42, 9.54, 9.65, 9.75, 9.86, 9.95, 10.05, 10.13, 10.22, 10.30, 10.38, 10.45, 10.52, 10.58, 10.65, 10.71 +11.71, 11.69, 11.67, 11.65, 11.63, 11.60, 11.58, 11.55, 11.51, 11.48, 11.44, 11.39, 11.35, 11.30, 11.24, 11.18, 11.12, 11.05, 10.98, 10.91, 10.82, 10.74, 10.64, 10.55, 10.44, 10.33, 10.21, 10.09, 9.96, 9.81, 9.66, 9.50, 9.34, 9.21, 9.23, 9.35, 9.46, 9.56, 9.62, 9.67, 9.69, 9.69, 9.68, 9.64, 9.59, 9.52, 9.43, 9.32, 9.20, 9.07, 8.92, 8.75, 8.58, 8.41, 8.24, 8.09, 7.97, 7.89, 7.86, 7.88, 7.96, 8.07, 8.20, 8.35, 8.51, 8.67, 8.82, 8.97, 9.12, 9.25, 9.39, 9.51, 9.63, 9.74, 9.85, 9.95, 10.05, 10.14, 10.23, 10.31, 10.39, 10.46, 10.53, 10.60, 10.66, 10.73 +11.74, 11.72, 11.70, 11.68, 11.66, 11.64, 11.61, 11.58, 11.55, 11.52, 11.48, 11.44, 11.39, 11.34, 11.29, 11.23, 11.16, 11.10, 11.02, 10.95, 10.87, 10.78, 10.69, 10.59, 10.48, 10.37, 10.26, 10.14, 10.01, 9.87, 9.73, 9.59, 9.47, 9.39, 9.39, 9.45, 9.53, 9.61, 9.66, 9.70, 9.71, 9.71, 9.69, 9.65, 9.59, 9.51, 9.41, 9.30, 9.17, 9.01, 8.85, 8.66, 8.47, 8.26, 8.05, 7.86, 7.70, 7.60, 7.56, 7.60, 7.71, 7.86, 8.03, 8.21, 8.39, 8.58, 8.75, 8.92, 9.07, 9.22, 9.36, 9.50, 9.62, 9.74, 9.85, 9.96, 10.05, 10.15, 10.24, 10.32, 10.40, 10.48, 10.55, 10.62, 10.68, 10.75 +11.77, 11.75, 11.74, 11.72, 11.70, 11.68, 11.65, 11.62, 11.59, 11.56, 11.52, 11.48, 11.44, 11.39, 11.33, 11.27, 11.21, 11.14, 11.07, 11.00, 10.91, 10.83, 10.73, 10.64, 10.54, 10.43, 10.32, 10.20, 10.08, 9.95, 9.83, 9.71, 9.62, 9.56, 9.55, 9.58, 9.63, 9.68, 9.72, 9.74, 9.75, 9.74, 9.71, 9.66, 9.60, 9.51, 9.41, 9.28, 9.14, 8.97, 8.79, 8.58, 8.35, 8.11, 7.86, 7.62, 7.41, 7.27, 7.22, 7.29, 7.44, 7.64, 7.86, 8.08, 8.29, 8.50, 8.69, 8.87, 9.04, 9.20, 9.35, 9.49, 9.62, 9.74, 9.86, 9.97, 10.07, 10.16, 10.26, 10.34, 10.42, 10.50, 10.57, 10.64, 10.71, 10.77 +11.80, 11.79, 11.77, 11.76, 11.74, 11.72, 11.69, 11.67, 11.64, 11.61, 11.57, 11.53, 11.49, 11.44, 11.38, 11.33, 11.26, 11.20, 11.12, 11.05, 10.97, 10.88, 10.79, 10.70, 10.60, 10.49, 10.38, 10.27, 10.16, 10.05, 9.94, 9.84, 9.76, 9.71, 9.70, 9.71, 9.73, 9.76, 9.78, 9.79, 9.79, 9.77, 9.74, 9.69, 9.61, 9.52, 9.41, 9.28, 9.12, 8.95, 8.74, 8.52, 8.26, 7.99, 7.69, 7.38, 7.09, 6.88, 6.83, 6.94, 7.17, 7.43, 7.71, 7.97, 8.21, 8.44, 8.65, 8.84, 9.02, 9.19, 9.35, 9.49, 9.63, 9.75, 9.87, 9.98, 10.09, 10.19, 10.28, 10.37, 10.45, 10.53, 10.60, 10.67, 10.73, 10.80 +11.83, 11.82, 11.81, 11.79, 11.78, 11.76, 11.74, 11.71, 11.69, 11.66, 11.62, 11.58, 11.54, 11.49, 11.44, 11.38, 11.32, 11.25, 11.18, 11.11, 11.03, 10.94, 10.85, 10.76, 10.66, 10.56, 10.46, 10.36, 10.25, 10.15, 10.06, 9.97, 9.90, 9.86, 9.83, 9.83, 9.84, 9.85, 9.86, 9.86, 9.84, 9.82, 9.78, 9.72, 9.64, 9.54, 9.43, 9.29, 9.13, 8.94, 8.72, 8.48, 8.20, 7.89, 7.55, 7.18, 6.79, 6.46, 6.36, 6.58, 6.92, 7.27, 7.59, 7.89, 8.16, 8.41, 8.63, 8.84, 9.02, 9.20, 9.36, 9.51, 9.65, 9.78, 9.90, 10.01, 10.11, 10.21, 10.31, 10.39, 10.48, 10.56, 10.63, 10.70, 10.77, 10.83 +11.87, 11.86, 11.85, 11.83, 11.82, 11.80, 11.78, 11.76, 11.74, 11.71, 11.67, 11.64, 11.59, 11.55, 11.50, 11.44, 11.38, 11.31, 11.24, 11.17, 11.09, 11.01, 10.92, 10.83, 10.74, 10.64, 10.54, 10.45, 10.35, 10.26, 10.17, 10.10, 10.04, 9.99, 9.96, 9.95, 9.94, 9.94, 9.93, 9.92, 9.90, 9.87, 9.82, 9.76, 9.68, 9.58, 9.45, 9.31, 9.14, 8.95, 8.73, 8.47, 8.19, 7.86, 7.48, 7.06, 6.59, 6.07, 5.84, 6.31, 6.77, 7.18, 7.55, 7.86, 8.15, 8.41, 8.64, 8.85, 9.04, 9.22, 9.38, 9.54, 9.68, 9.81, 9.93, 10.04, 10.15, 10.25, 10.34, 10.43, 10.51, 10.59, 10.66, 10.73, 10.80, 10.86 +11.90, 11.89, 11.89, 11.88, 11.86, 11.85, 11.83, 11.81, 11.79, 11.76, 11.73, 11.70, 11.65, 11.61, 11.56, 11.50, 11.44, 11.38, 11.31, 11.23, 11.16, 11.08, 10.99, 10.90, 10.81, 10.72, 10.63, 10.54, 10.45, 10.37, 10.29, 10.22, 10.16, 10.12, 10.08, 10.06, 10.05, 10.03, 10.02, 10.00, 9.97, 9.93, 9.88, 9.81, 9.72, 9.62, 9.50, 9.35, 9.18, 8.99, 8.76, 8.51, 8.22, 7.89, 7.52, 7.10, 6.63, 6.14, 5.95, 6.36, 6.81, 7.22, 7.58, 7.90, 8.19, 8.44, 8.68, 8.89, 9.08, 9.26, 9.42, 9.58, 9.72, 9.85, 9.97, 10.08, 10.19, 10.29, 10.38, 10.47, 10.55, 10.63, 10.70, 10.77, 10.84, 10.90 +11.94, 11.93, 11.93, 11.92, 11.91, 11.90, 11.88, 11.87, 11.85, 11.82, 11.79, 11.76, 11.72, 11.67, 11.62, 11.57, 11.51, 11.44, 11.38, 11.30, 11.23, 11.15, 11.07, 10.98, 10.90, 10.81, 10.72, 10.64, 10.56, 10.48, 10.40, 10.34, 10.28, 10.24, 10.20, 10.17, 10.15, 10.13, 10.10, 10.08, 10.04, 10.00, 9.94, 9.87, 9.78, 9.67, 9.55, 9.41, 9.24, 9.05, 8.83, 8.58, 8.30, 7.99, 7.65, 7.27, 6.90, 6.59, 6.50, 6.70, 7.02, 7.37, 7.69, 7.99, 8.27, 8.52, 8.74, 8.95, 9.14, 9.32, 9.48, 9.63, 9.77, 9.90, 10.02, 10.13, 10.24, 10.34, 10.43, 10.52, 10.60, 10.68, 10.75, 10.82, 10.88, 10.94 +11.97, 11.97, 11.97, 11.96, 11.95, 11.95, 11.93, 11.92, 11.90, 11.88, 11.85, 11.82, 11.78, 11.74, 11.69, 11.64, 11.58, 11.51, 11.45, 11.37, 11.30, 11.22, 11.14, 11.06, 10.98, 10.90, 10.82, 10.73, 10.66, 10.58, 10.52, 10.45, 10.40, 10.35, 10.31, 10.28, 10.25, 10.22, 10.19, 10.16, 10.12, 10.07, 10.01, 9.94, 9.85, 9.74, 9.62, 9.48, 9.32, 9.13, 8.92, 8.69, 8.43, 8.15, 7.85, 7.54, 7.26, 7.06, 7.00, 7.11, 7.33, 7.60, 7.87, 8.14, 8.39, 8.62, 8.84, 9.04, 9.22, 9.40, 9.55, 9.70, 9.84, 9.96, 10.08, 10.19, 10.30, 10.39, 10.49, 10.57, 10.65, 10.73, 10.80, 10.87, 10.93, 10.99 +12.01, 12.01, 12.01, 12.00, 12.00, 12.00, 11.99, 11.98, 11.96, 11.94, 11.92, 11.89, 11.85, 11.81, 11.76, 11.71, 11.65, 11.58, 11.52, 11.45, 11.37, 11.30, 11.22, 11.14, 11.06, 10.99, 10.91, 10.83, 10.76, 10.69, 10.63, 10.57, 10.51, 10.47, 10.43, 10.39, 10.35, 10.32, 10.29, 10.25, 10.20, 10.15, 10.09, 10.01, 9.93, 9.82, 9.70, 9.57, 9.41, 9.24, 9.05, 8.83, 8.60, 8.35, 8.10, 7.85, 7.64, 7.50, 7.45, 7.52, 7.67, 7.87, 8.10, 8.33, 8.55, 8.76, 8.96, 9.15, 9.33, 9.49, 9.64, 9.78, 9.91, 10.04, 10.15, 10.26, 10.36, 10.46, 10.55, 10.63, 10.71, 10.78, 10.85, 10.92, 10.98, 11.04 +12.04, 12.05, 12.05, 12.05, 12.05, 12.05, 12.04, 12.04, 12.03, 12.01, 11.99, 11.96, 11.92, 11.88, 11.83, 11.78, 11.72, 11.66, 11.59, 11.52, 11.45, 11.38, 11.30, 11.22, 11.15, 11.07, 11.00, 10.93, 10.86, 10.79, 10.73, 10.68, 10.62, 10.58, 10.53, 10.49, 10.46, 10.42, 10.38, 10.34, 10.29, 10.24, 10.17, 10.10, 10.01, 9.92, 9.80, 9.67, 9.53, 9.37, 9.19, 8.99, 8.79, 8.58, 8.36, 8.17, 8.00, 7.90, 7.86, 7.91, 8.01, 8.17, 8.35, 8.54, 8.73, 8.92, 9.11, 9.28, 9.44, 9.60, 9.74, 9.88, 10.00, 10.12, 10.23, 10.34, 10.44, 10.53, 10.61, 10.70, 10.77, 10.84, 10.91, 10.97, 11.03, 11.09 +12.08, 12.08, 12.09, 12.09, 12.10, 12.10, 12.10, 12.10, 12.09, 12.08, 12.06, 12.03, 12.00, 11.96, 11.91, 11.85, 11.79, 11.73, 11.66, 11.60, 11.52, 11.45, 11.38, 11.31, 11.23, 11.16, 11.09, 11.02, 10.96, 10.89, 10.84, 10.78, 10.73, 10.68, 10.64, 10.60, 10.56, 10.52, 10.48, 10.44, 10.39, 10.33, 10.27, 10.20, 10.11, 10.02, 9.91, 9.79, 9.66, 9.51, 9.35, 9.17, 9.00, 8.81, 8.64, 8.48, 8.35, 8.27, 8.24, 8.27, 8.35, 8.47, 8.61, 8.77, 8.94, 9.10, 9.27, 9.43, 9.58, 9.72, 9.85, 9.98, 10.10, 10.22, 10.32, 10.42, 10.52, 10.60, 10.69, 10.77, 10.84, 10.91, 10.97, 11.03, 11.09, 11.15 +12.11, 12.12, 12.13, 12.14, 12.14, 12.15, 12.16, 12.16, 12.16, 12.15, 12.13, 12.11, 12.07, 12.03, 11.98, 11.93, 11.87, 11.80, 11.74, 11.67, 11.60, 11.53, 11.46, 11.39, 11.32, 11.25, 11.18, 11.12, 11.05, 10.99, 10.94, 10.89, 10.84, 10.79, 10.75, 10.71, 10.66, 10.62, 10.58, 10.54, 10.49, 10.43, 10.37, 10.30, 10.22, 10.13, 10.03, 9.92, 9.80, 9.66, 9.52, 9.37, 9.21, 9.06, 8.91, 8.78, 8.68, 8.62, 8.59, 8.61, 8.67, 8.76, 8.88, 9.01, 9.15, 9.30, 9.44, 9.58, 9.72, 9.85, 9.98, 10.10, 10.21, 10.32, 10.42, 10.51, 10.60, 10.69, 10.77, 10.84, 10.91, 10.98, 11.04, 11.10, 11.15, 11.21 +12.15, 12.16, 12.17, 12.18, 12.19, 12.20, 12.21, 12.22, 12.22, 12.22, 12.21, 12.18, 12.15, 12.11, 12.06, 12.00, 11.94, 11.87, 11.81, 11.74, 11.67, 11.60, 11.53, 11.47, 11.40, 11.33, 11.27, 11.21, 11.15, 11.09, 11.04, 10.99, 10.94, 10.90, 10.85, 10.81, 10.77, 10.73, 10.69, 10.64, 10.59, 10.54, 10.48, 10.41, 10.34, 10.25, 10.16, 10.06, 9.95, 9.83, 9.70, 9.57, 9.43, 9.30, 9.18, 9.08, 8.99, 8.94, 8.92, 8.93, 8.98, 9.05, 9.14, 9.25, 9.37, 9.50, 9.63, 9.75, 9.88, 10.00, 10.11, 10.22, 10.33, 10.43, 10.52, 10.61, 10.70, 10.78, 10.85, 10.92, 10.99, 11.05, 11.11, 11.17, 11.22, 11.27 +12.18, 12.19, 12.20, 12.22, 12.24, 12.25, 12.27, 12.28, 12.29, 12.29, 12.28, 12.26, 12.23, 12.18, 12.13, 12.07, 12.01, 11.94, 11.88, 11.81, 11.74, 11.67, 11.61, 11.54, 11.48, 11.42, 11.36, 11.30, 11.24, 11.19, 11.14, 11.09, 11.04, 11.00, 10.96, 10.92, 10.88, 10.84, 10.80, 10.75, 10.70, 10.65, 10.60, 10.53, 10.46, 10.38, 10.30, 10.21, 10.11, 10.00, 9.89, 9.77, 9.66, 9.55, 9.45, 9.36, 9.29, 9.25, 9.23, 9.24, 9.27, 9.33, 9.41, 9.50, 9.60, 9.71, 9.82, 9.93, 10.04, 10.15, 10.26, 10.36, 10.45, 10.55, 10.63, 10.72, 10.80, 10.87, 10.94, 11.01, 11.07, 11.13, 11.19, 11.24, 11.29, 11.34 +12.21, 12.22, 12.24, 12.26, 12.28, 12.30, 12.32, 12.34, 12.36, 12.37, 12.37, 12.35, 12.31, 12.26, 12.20, 12.14, 12.07, 12.01, 11.94, 11.87, 11.81, 11.74, 11.68, 11.62, 11.55, 11.50, 11.44, 11.38, 11.33, 11.28, 11.23, 11.19, 11.15, 11.10, 11.06, 11.02, 10.99, 10.95, 10.91, 10.87, 10.82, 10.77, 10.72, 10.66, 10.59, 10.52, 10.45, 10.36, 10.27, 10.18, 10.08, 9.98, 9.88, 9.79, 9.71, 9.63, 9.58, 9.54, 9.52, 9.53, 9.56, 9.60, 9.67, 9.74, 9.83, 9.92, 10.02, 10.11, 10.21, 10.31, 10.41, 10.50, 10.59, 10.67, 10.75, 10.83, 10.90, 10.97, 11.04, 11.10, 11.16, 11.21, 11.27, 11.32, 11.36, 11.41 +12.23, 12.25, 12.27, 12.29, 12.32, 12.34, 12.37, 12.40, 12.43, 12.45, 12.45, 12.43, 12.39, 12.33, 12.27, 12.20, 12.13, 12.07, 12.00, 11.93, 11.87, 11.81, 11.75, 11.69, 11.63, 11.57, 11.52, 11.47, 11.42, 11.37, 11.33, 11.29, 11.25, 11.21, 11.17, 11.13, 11.10, 11.06, 11.02, 10.98, 10.94, 10.89, 10.84, 10.79, 10.73, 10.67, 10.60, 10.52, 10.45, 10.36, 10.28, 10.19, 10.11, 10.03, 9.96, 9.90, 9.85, 9.82, 9.81, 9.81, 9.83, 9.87, 9.92, 9.98, 10.05, 10.13, 10.22, 10.30, 10.39, 10.48, 10.56, 10.64, 10.72, 10.80, 10.88, 10.95, 11.01, 11.08, 11.14, 11.20, 11.25, 11.30, 11.35, 11.40, 11.44, 11.48 +12.26, 12.28, 12.30, 12.32, 12.35, 12.38, 12.41, 12.45, 12.49, 12.52, 12.53, 12.51, 12.46, 12.40, 12.33, 12.26, 12.19, 12.12, 12.05, 11.99, 11.93, 11.87, 11.81, 11.76, 11.70, 11.65, 11.60, 11.55, 11.51, 11.46, 11.42, 11.38, 11.35, 11.31, 11.28, 11.24, 11.21, 11.17, 11.14, 11.10, 11.06, 11.02, 10.98, 10.93, 10.88, 10.82, 10.76, 10.69, 10.62, 10.55, 10.48, 10.41, 10.34, 10.27, 10.21, 10.16, 10.12, 10.09, 10.08, 10.08, 10.10, 10.13, 10.17, 10.22, 10.28, 10.35, 10.42, 10.50, 10.57, 10.65, 10.72, 10.80, 10.87, 10.94, 11.00, 11.07, 11.13, 11.19, 11.24, 11.29, 11.34, 11.39, 11.44, 11.48, 11.52, 11.56 +12.28, 12.30, 12.32, 12.35, 12.37, 12.41, 12.45, 12.49, 12.54, 12.60, 12.62, 12.59, 12.52, 12.45, 12.37, 12.30, 12.23, 12.17, 12.10, 12.04, 11.98, 11.93, 11.87, 11.82, 11.77, 11.72, 11.68, 11.63, 11.59, 11.55, 11.52, 11.48, 11.45, 11.42, 11.38, 11.35, 11.32, 11.29, 11.26, 11.23, 11.19, 11.16, 11.12, 11.07, 11.03, 10.98, 10.92, 10.87, 10.81, 10.74, 10.68, 10.62, 10.56, 10.50, 10.45, 10.41, 10.38, 10.35, 10.34, 10.34, 10.36, 10.38, 10.41, 10.46, 10.51, 10.57, 10.63, 10.69, 10.75, 10.82, 10.89, 10.95, 11.01, 11.08, 11.14, 11.19, 11.25, 11.30, 11.35, 11.40, 11.44, 11.48, 11.52, 11.56, 11.60, 11.63 +12.30, 12.32, 12.34, 12.36, 12.39, 12.43, 12.47, 12.52, 12.57, 12.64, 12.71, 12.64, 12.55, 12.48, 12.40, 12.33, 12.27, 12.20, 12.14, 12.09, 12.03, 11.98, 11.93, 11.88, 11.84, 11.80, 11.75, 11.72, 11.68, 11.64, 11.61, 11.58, 11.55, 11.52, 11.49, 11.46, 11.44, 11.41, 11.38, 11.35, 11.32, 11.29, 11.26, 11.22, 11.18, 11.14, 11.09, 11.04, 10.99, 10.94, 10.89, 10.84, 10.79, 10.74, 10.70, 10.66, 10.63, 10.61, 10.60, 10.60, 10.61, 10.63, 10.66, 10.69, 10.73, 10.78, 10.83, 10.89, 10.94, 11.00, 11.05, 11.11, 11.17, 11.22, 11.27, 11.32, 11.37, 11.42, 11.46, 11.50, 11.54, 11.58, 11.62, 11.65, 11.68, 11.71 +12.32, 12.33, 12.36, 12.38, 12.41, 12.44, 12.48, 12.52, 12.57, 12.63, 12.66, 12.62, 12.55, 12.48, 12.42, 12.35, 12.29, 12.23, 12.18, 12.13, 12.08, 12.03, 11.99, 11.94, 11.90, 11.87, 11.83, 11.79, 11.76, 11.73, 11.70, 11.67, 11.65, 11.62, 11.60, 11.58, 11.56, 11.53, 11.51, 11.49, 11.46, 11.43, 11.40, 11.37, 11.34, 11.30, 11.27, 11.23, 11.18, 11.14, 11.10, 11.05, 11.01, 10.97, 10.94, 10.91, 10.88, 10.86, 10.86, 10.85, 10.86, 10.88, 10.90, 10.93, 10.96, 11.00, 11.04, 11.08, 11.13, 11.18, 11.23, 11.27, 11.32, 11.37, 11.41, 11.46, 11.50, 11.54, 11.58, 11.61, 11.65, 11.68, 11.71, 11.74, 11.77, 11.80 +12.33, 12.35, 12.37, 12.39, 12.41, 12.44, 12.48, 12.51, 12.55, 12.58, 12.59, 12.57, 12.53, 12.48, 12.42, 12.36, 12.31, 12.26, 12.21, 12.17, 12.12, 12.08, 12.04, 12.00, 11.97, 11.93, 11.90, 11.87, 11.84, 11.82, 11.79, 11.77, 11.75, 11.73, 11.71, 11.69, 11.67, 11.66, 11.64, 11.62, 11.60, 11.58, 11.56, 11.53, 11.50, 11.48, 11.44, 11.41, 11.38, 11.34, 11.31, 11.27, 11.24, 11.21, 11.18, 11.15, 11.13, 11.12, 11.11, 11.10, 11.11, 11.12, 11.14, 11.16, 11.18, 11.21, 11.25, 11.28, 11.32, 11.36, 11.40, 11.44, 11.48, 11.52, 11.55, 11.59, 11.63, 11.66, 11.69, 11.72, 11.75, 11.78, 11.81, 11.83, 11.86, 11.88 +12.34, 12.36, 12.38, 12.40, 12.42, 12.44, 12.47, 12.50, 12.52, 12.54, 12.54, 12.53, 12.50, 12.46, 12.42, 12.37, 12.33, 12.28, 12.24, 12.20, 12.16, 12.13, 12.09, 12.06, 12.03, 12.00, 11.97, 11.95, 11.93, 11.91, 11.89, 11.87, 11.85, 11.84, 11.82, 11.81, 11.80, 11.78, 11.77, 11.76, 11.74, 11.73, 11.71, 11.69, 11.67, 11.65, 11.63, 11.60, 11.58, 11.55, 11.52, 11.49, 11.47, 11.44, 11.42, 11.39, 11.38, 11.36, 11.36, 11.35, 11.35, 11.36, 11.37, 11.39, 11.41, 11.43, 11.46, 11.48, 11.51, 11.54, 11.58, 11.61, 11.64, 11.67, 11.70, 11.73, 11.76, 11.79, 11.81, 11.84, 11.86, 11.89, 11.91, 11.93, 11.95, 11.97 +12.36, 12.37, 12.38, 12.40, 12.42, 12.44, 12.46, 12.48, 12.50, 12.51, 12.51, 12.50, 12.48, 12.45, 12.41, 12.38, 12.34, 12.30, 12.27, 12.23, 12.20, 12.17, 12.14, 12.12, 12.09, 12.07, 12.05, 12.03, 12.01, 11.99, 11.98, 11.97, 11.95, 11.94, 11.93, 11.93, 11.92, 11.91, 11.90, 11.90, 11.89, 11.88, 11.87, 11.86, 11.85, 11.83, 11.82, 11.80, 11.78, 11.76, 11.74, 11.72, 11.70, 11.68, 11.66, 11.64, 11.63, 11.61, 11.61, 11.60, 11.60, 11.60, 11.61, 11.62, 11.63, 11.65, 11.67, 11.69, 11.71, 11.73, 11.75, 11.78, 11.80, 11.82, 11.85, 11.87, 11.89, 11.91, 11.93, 11.95, 11.97, 11.99, 12.01, 12.02, 12.04, 12.05 +12.37, 12.38, 12.39, 12.41, 12.42, 12.44, 12.45, 12.47, 12.48, 12.48, 12.48, 12.47, 12.46, 12.44, 12.41, 12.38, 12.35, 12.32, 12.29, 12.27, 12.24, 12.22, 12.19, 12.17, 12.15, 12.13, 12.12, 12.10, 12.09, 12.08, 12.07, 12.06, 12.06, 12.05, 12.05, 12.05, 12.04, 12.04, 12.04, 12.04, 12.04, 12.04, 12.03, 12.03, 12.02, 12.02, 12.01, 12.00, 11.99, 11.97, 11.96, 11.94, 11.93, 11.91, 11.90, 11.89, 11.87, 11.86, 11.85, 11.85, 11.85, 11.84, 11.85, 11.85, 11.86, 11.87, 11.88, 11.89, 11.90, 11.92, 11.93, 11.95, 11.97, 11.98, 12.00, 12.01, 12.03, 12.04, 12.06, 12.07, 12.09, 12.10, 12.11, 12.12, 12.13, 12.14 +12.38, 12.39, 12.40, 12.41, 12.42, 12.44, 12.45, 12.46, 12.47, 12.47, 12.47, 12.46, 12.45, 12.43, 12.41, 12.39, 12.37, 12.35, 12.32, 12.30, 12.28, 12.26, 12.24, 12.23, 12.21, 12.20, 12.19, 12.18, 12.17, 12.17, 12.16, 12.16, 12.16, 12.16, 12.16, 12.17, 12.17, 12.17, 12.18, 12.19, 12.19, 12.19, 12.20, 12.20, 12.20, 12.20, 12.20, 12.20, 12.20, 12.19, 12.18, 12.18, 12.17, 12.16, 12.15, 12.13, 12.12, 12.11, 12.11, 12.10, 12.09, 12.09, 12.09, 12.08, 12.08, 12.09, 12.09, 12.09, 12.10, 12.11, 12.11, 12.12, 12.13, 12.14, 12.15, 12.16, 12.17, 12.17, 12.18, 12.19, 12.20, 12.21, 12.21, 12.22, 12.23, 12.23 +12.39, 12.40, 12.41, 12.42, 12.43, 12.44, 12.45, 12.45, 12.46, 12.46, 12.46, 12.45, 12.45, 12.43, 12.42, 12.40, 12.39, 12.37, 12.35, 12.34, 12.32, 12.31, 12.29, 12.28, 12.27, 12.27, 12.26, 12.26, 12.26, 12.25, 12.26, 12.26, 12.27, 12.27, 12.28, 12.29, 12.30, 12.31, 12.32, 12.33, 12.35, 12.36, 12.37, 12.38, 12.39, 12.40, 12.40, 12.41, 12.41, 12.41, 12.41, 12.41, 12.41, 12.40, 12.39, 12.39, 12.38, 12.37, 12.36, 12.35, 12.34, 12.33, 12.32, 12.32, 12.31, 12.31, 12.30, 12.30, 12.30, 12.30, 12.30, 12.30, 12.30, 12.30, 12.30, 12.30, 12.30, 12.31, 12.31, 12.31, 12.31, 12.32, 12.32, 12.32, 12.32, 12.32 +12.40, 12.41, 12.42, 12.42, 12.43, 12.44, 12.45, 12.45, 12.46, 12.46, 12.46, 12.45, 12.45, 12.44, 12.43, 12.42, 12.41, 12.39, 12.38, 12.37, 12.36, 12.35, 12.35, 12.34, 12.34, 12.33, 12.33, 12.33, 12.34, 12.34, 12.35, 12.36, 12.37, 12.38, 12.40, 12.41, 12.43, 12.45, 12.47, 12.49, 12.51, 12.53, 12.54, 12.56, 12.58, 12.60, 12.61, 12.62, 12.64, 12.64, 12.65, 12.65, 12.65, 12.65, 12.65, 12.64, 12.64, 12.63, 12.62, 12.60, 12.59, 12.58, 12.57, 12.55, 12.54, 12.53, 12.52, 12.51, 12.50, 12.49, 12.48, 12.47, 12.47, 12.46, 12.45, 12.45, 12.44, 12.44, 12.44, 12.43, 12.43, 12.43, 12.42, 12.42, 12.42, 12.42 +12.41, 12.42, 12.43, 12.43, 12.44, 12.45, 12.45, 12.46, 12.46, 12.46, 12.46, 12.46, 12.46, 12.45, 12.45, 12.44, 12.43, 12.42, 12.42, 12.41, 12.40, 12.40, 12.40, 12.40, 12.40, 12.40, 12.41, 12.41, 12.42, 12.43, 12.45, 12.46, 12.48, 12.50, 12.52, 12.54, 12.56, 12.59, 12.61, 12.64, 12.67, 12.70, 12.72, 12.75, 12.78, 12.80, 12.82, 12.84, 12.86, 12.88, 12.89, 12.90, 12.91, 12.91, 12.91, 12.90, 12.90, 12.89, 12.88, 12.86, 12.85, 12.83, 12.81, 12.79, 12.77, 12.75, 12.73, 12.72, 12.70, 12.68, 12.67, 12.65, 12.63, 12.62, 12.61, 12.60, 12.58, 12.57, 12.56, 12.55, 12.54, 12.54, 12.53, 12.52, 12.51, 12.51 +12.42, 12.43, 12.44, 12.44, 12.45, 12.46, 12.46, 12.47, 12.47, 12.47, 12.47, 12.47, 12.47, 12.47, 12.46, 12.46, 12.46, 12.45, 12.45, 12.45, 12.45, 12.45, 12.45, 12.46, 12.46, 12.47, 12.48, 12.49, 12.51, 12.52, 12.54, 12.56, 12.59, 12.61, 12.64, 12.67, 12.70, 12.73, 12.76, 12.80, 12.83, 12.87, 12.91, 12.94, 12.98, 13.01, 13.04, 13.07, 13.10, 13.12, 13.14, 13.15, 13.17, 13.17, 13.17, 13.17, 13.17, 13.16, 13.14, 13.12, 13.10, 13.08, 13.06, 13.03, 13.01, 12.98, 12.95, 12.93, 12.90, 12.87, 12.85, 12.83, 12.80, 12.78, 12.76, 12.74, 12.72, 12.71, 12.69, 12.67, 12.66, 12.65, 12.63, 12.62, 12.61, 12.60 +12.44, 12.44, 12.45, 12.46, 12.46, 12.47, 12.47, 12.48, 12.48, 12.48, 12.49, 12.49, 12.49, 12.49, 12.49, 12.49, 12.49, 12.49, 12.49, 12.49, 12.50, 12.50, 12.51, 12.52, 12.53, 12.54, 12.56, 12.57, 12.59, 12.61, 12.64, 12.67, 12.69, 12.73, 12.76, 12.80, 12.83, 12.87, 12.92, 12.96, 13.00, 13.05, 13.09, 13.14, 13.18, 13.22, 13.26, 13.30, 13.34, 13.37, 13.39, 13.42, 13.43, 13.44, 13.45, 13.45, 13.44, 13.43, 13.41, 13.39, 13.37, 13.34, 13.31, 13.28, 13.24, 13.21, 13.17, 13.14, 13.10, 13.07, 13.04, 13.00, 12.97, 12.94, 12.92, 12.89, 12.86, 12.84, 12.82, 12.80, 12.78, 12.76, 12.74, 12.72, 12.71, 12.69 +12.45, 12.46, 12.47, 12.47, 12.48, 12.48, 12.49, 12.49, 12.50, 12.50, 12.50, 12.51, 12.51, 12.51, 12.51, 12.52, 12.52, 12.53, 12.53, 12.54, 12.54, 12.55, 12.57, 12.58, 12.59, 12.61, 12.63, 12.65, 12.68, 12.71, 12.74, 12.77, 12.80, 12.84, 12.88, 12.93, 12.97, 13.02, 13.07, 13.12, 13.17, 13.23, 13.28, 13.34, 13.39, 13.44, 13.49, 13.54, 13.58, 13.62, 13.66, 13.69, 13.71, 13.72, 13.73, 13.73, 13.72, 13.71, 13.69, 13.67, 13.64, 13.60, 13.56, 13.52, 13.48, 13.44, 13.39, 13.35, 13.31, 13.26, 13.22, 13.18, 13.14, 13.11, 13.07, 13.04, 13.00, 12.97, 12.94, 12.92, 12.89, 12.87, 12.84, 12.82, 12.80, 12.78 +12.47, 12.47, 12.48, 12.49, 12.49, 12.50, 12.51, 12.51, 12.52, 12.52, 12.53, 12.53, 12.53, 12.54, 12.54, 12.55, 12.56, 12.56, 12.57, 12.58, 12.59, 12.61, 12.62, 12.64, 12.66, 12.68, 12.71, 12.74, 12.77, 12.80, 12.83, 12.87, 12.91, 12.96, 13.01, 13.06, 13.11, 13.17, 13.23, 13.29, 13.35, 13.41, 13.48, 13.54, 13.60, 13.67, 13.73, 13.79, 13.84, 13.89, 13.93, 13.97, 13.99, 14.01, 14.02, 14.02, 14.02, 14.00, 13.98, 13.95, 13.91, 13.87, 13.82, 13.77, 13.72, 13.67, 13.62, 13.56, 13.51, 13.46, 13.41, 13.36, 13.31, 13.27, 13.22, 13.18, 13.14, 13.11, 13.07, 13.04, 13.00, 12.98, 12.95, 12.92, 12.90, 12.87 +12.49, 12.49, 12.50, 12.51, 12.51, 12.52, 12.52, 12.53, 12.54, 12.54, 12.55, 12.56, 12.56, 12.57, 12.58, 12.59, 12.59, 12.61, 12.62, 12.63, 12.65, 12.66, 12.68, 12.70, 12.73, 12.76, 12.79, 12.82, 12.85, 12.89, 12.93, 12.98, 13.03, 13.08, 13.13, 13.19, 13.25, 13.32, 13.38, 13.45, 13.52, 13.60, 13.67, 13.75, 13.82, 13.90, 13.97, 14.04, 14.10, 14.16, 14.21, 14.25, 14.29, 14.31, 14.32, 14.33, 14.32, 14.30, 14.27, 14.24, 14.19, 14.14, 14.09, 14.03, 13.97, 13.90, 13.84, 13.78, 13.71, 13.65, 13.59, 13.53, 13.48, 13.43, 13.37, 13.33, 13.28, 13.24, 13.19, 13.16, 13.12, 13.08, 13.05, 13.02, 12.99, 12.96 +12.50, 12.51, 12.52, 12.52, 12.53, 12.54, 12.55, 12.55, 12.56, 12.57, 12.57, 12.58, 12.59, 12.60, 12.61, 12.62, 12.63, 12.65, 12.66, 12.68, 12.70, 12.72, 12.74, 12.77, 12.80, 12.83, 12.86, 12.90, 12.94, 12.98, 13.03, 13.08, 13.14, 13.20, 13.26, 13.32, 13.39, 13.46, 13.54, 13.62, 13.70, 13.79, 13.87, 13.96, 14.05, 14.13, 14.22, 14.30, 14.37, 14.44, 14.50, 14.56, 14.60, 14.62, 14.64, 14.64, 14.63, 14.61, 14.58, 14.53, 14.48, 14.42, 14.35, 14.28, 14.21, 14.14, 14.06, 13.99, 13.92, 13.85, 13.78, 13.71, 13.65, 13.58, 13.52, 13.47, 13.42, 13.37, 13.32, 13.27, 13.23, 13.19, 13.15, 13.12, 13.08, 13.05 +12.52, 12.53, 12.54, 12.54, 12.55, 12.56, 12.57, 12.58, 12.58, 12.59, 12.60, 12.61, 12.62, 12.63, 12.65, 12.66, 12.68, 12.69, 12.71, 12.73, 12.75, 12.78, 12.80, 12.83, 12.87, 12.90, 12.94, 12.98, 13.03, 13.08, 13.13, 13.19, 13.25, 13.31, 13.38, 13.45, 13.53, 13.61, 13.70, 13.79, 13.88, 13.98, 14.08, 14.17, 14.27, 14.37, 14.47, 14.57, 14.65, 14.74, 14.81, 14.87, 14.92, 14.95, 14.97, 14.97, 14.96, 14.93, 14.89, 14.84, 14.77, 14.70, 14.63, 14.55, 14.46, 14.38, 14.29, 14.20, 14.12, 14.04, 13.96, 13.88, 13.81, 13.74, 13.67, 13.61, 13.55, 13.49, 13.44, 13.39, 13.34, 13.29, 13.25, 13.21, 13.17, 13.14 +12.54, 12.55, 12.56, 12.57, 12.57, 12.58, 12.59, 12.60, 12.61, 12.62, 12.63, 12.64, 12.66, 12.67, 12.68, 12.70, 12.72, 12.74, 12.76, 12.78, 12.81, 12.84, 12.87, 12.90, 12.94, 12.98, 13.02, 13.07, 13.12, 13.17, 13.23, 13.29, 13.36, 13.43, 13.51, 13.59, 13.67, 13.76, 13.86, 13.96, 14.06, 14.17, 14.28, 14.39, 14.51, 14.62, 14.73, 14.84, 14.94, 15.04, 15.12, 15.19, 15.25, 15.29, 15.31, 15.31, 15.30, 15.26, 15.21, 15.15, 15.08, 14.99, 14.90, 14.81, 14.71, 14.61, 14.51, 14.42, 14.32, 14.23, 14.14, 14.05, 13.97, 13.89, 13.82, 13.75, 13.68, 13.62, 13.56, 13.50, 13.45, 13.40, 13.35, 13.30, 13.26, 13.22 +12.56, 12.57, 12.58, 12.59, 12.60, 12.61, 12.62, 12.63, 12.64, 12.65, 12.66, 12.68, 12.69, 12.71, 12.72, 12.74, 12.76, 12.78, 12.81, 12.83, 12.86, 12.89, 12.93, 12.97, 13.01, 13.05, 13.10, 13.15, 13.20, 13.26, 13.33, 13.39, 13.47, 13.55, 13.63, 13.72, 13.81, 13.91, 14.02, 14.13, 14.24, 14.36, 14.48, 14.61, 14.74, 14.87, 15.00, 15.12, 15.24, 15.35, 15.45, 15.53, 15.60, 15.64, 15.67, 15.67, 15.65, 15.61, 15.55, 15.47, 15.39, 15.29, 15.18, 15.07, 14.96, 14.85, 14.74, 14.63, 14.52, 14.42, 14.32, 14.22, 14.13, 14.04, 13.96, 13.88, 13.81, 13.74, 13.67, 13.61, 13.55, 13.50, 13.44, 13.39, 13.35, 13.30 +12.58, 12.59, 12.60, 12.61, 12.62, 12.63, 12.64, 12.66, 12.67, 12.68, 12.70, 12.71, 12.73, 12.74, 12.76, 12.78, 12.81, 12.83, 12.86, 12.89, 12.92, 12.95, 12.99, 13.03, 13.07, 13.12, 13.17, 13.23, 13.29, 13.35, 13.42, 13.50, 13.58, 13.66, 13.75, 13.85, 13.95, 14.06, 14.17, 14.29, 14.42, 14.55, 14.69, 14.83, 14.98, 15.12, 15.27, 15.41, 15.55, 15.68, 15.79, 15.89, 15.97, 16.02, 16.05, 16.05, 16.02, 15.97, 15.90, 15.81, 15.70, 15.59, 15.47, 15.34, 15.21, 15.08, 14.96, 14.83, 14.71, 14.60, 14.49, 14.38, 14.28, 14.19, 14.10, 14.01, 13.93, 13.86, 13.79, 13.72, 13.65, 13.59, 13.54, 13.48, 13.43, 13.39 +12.61, 12.62, 12.63, 12.64, 12.65, 12.66, 12.67, 12.68, 12.70, 12.71, 12.73, 12.74, 12.76, 12.78, 12.80, 12.83, 12.85, 12.88, 12.91, 12.94, 12.97, 13.01, 13.05, 13.10, 13.14, 13.19, 13.25, 13.31, 13.37, 13.44, 13.52, 13.60, 13.68, 13.77, 13.87, 13.97, 14.08, 14.20, 14.33, 14.46, 14.60, 14.74, 14.89, 15.05, 15.21, 15.37, 15.54, 15.70, 15.86, 16.01, 16.14, 16.26, 16.35, 16.41, 16.44, 16.44, 16.41, 16.35, 16.26, 16.15, 16.03, 15.89, 15.75, 15.60, 15.46, 15.31, 15.17, 15.04, 14.90, 14.78, 14.66, 14.54, 14.43, 14.33, 14.23, 14.14, 14.05, 13.97, 13.89, 13.82, 13.75, 13.69, 13.63, 13.57, 13.52, 13.46 +12.63, 12.64, 12.65, 12.66, 12.67, 12.69, 12.70, 12.71, 12.73, 12.74, 12.76, 12.78, 12.80, 12.82, 12.84, 12.87, 12.90, 12.93, 12.96, 12.99, 13.03, 13.07, 13.11, 13.16, 13.21, 13.26, 13.32, 13.39, 13.46, 13.53, 13.61, 13.69, 13.78, 13.88, 13.99, 14.10, 14.21, 14.34, 14.48, 14.62, 14.77, 14.93, 15.09, 15.26, 15.44, 15.63, 15.81, 16.00, 16.18, 16.35, 16.51, 16.65, 16.75, 16.83, 16.86, 16.86, 16.82, 16.74, 16.63, 16.50, 16.35, 16.20, 16.03, 15.87, 15.70, 15.54, 15.38, 15.23, 15.09, 14.95, 14.82, 14.69, 14.58, 14.47, 14.36, 14.26, 14.17, 14.08, 14.00, 13.92, 13.85, 13.78, 13.71, 13.65, 13.59, 13.54 +12.65, 12.66, 12.67, 12.69, 12.70, 12.71, 12.73, 12.74, 12.76, 12.78, 12.79, 12.82, 12.84, 12.86, 12.88, 12.91, 12.94, 12.97, 13.01, 13.04, 13.08, 13.13, 13.17, 13.22, 13.28, 13.33, 13.40, 13.46, 13.54, 13.61, 13.70, 13.79, 13.88, 13.99, 14.10, 14.22, 14.34, 14.48, 14.62, 14.77, 14.93, 15.10, 15.29, 15.47, 15.67, 15.88, 16.09, 16.30, 16.50, 16.70, 16.89, 17.05, 17.18, 17.27, 17.31, 17.30, 17.24, 17.15, 17.01, 16.86, 16.68, 16.50, 16.31, 16.13, 15.94, 15.76, 15.59, 15.42, 15.27, 15.12, 14.97, 14.84, 14.71, 14.60, 14.48, 14.38, 14.28, 14.19, 14.10, 14.02, 13.94, 13.87, 13.80, 13.73, 13.67, 13.61 +12.67, 12.69, 12.70, 12.71, 12.73, 12.74, 12.76, 12.77, 12.79, 12.81, 12.83, 12.85, 12.87, 12.90, 12.93, 12.95, 12.99, 13.02, 13.06, 13.09, 13.14, 13.18, 13.23, 13.28, 13.34, 13.40, 13.47, 13.54, 13.62, 13.70, 13.79, 13.88, 13.98, 14.09, 14.21, 14.33, 14.46, 14.61, 14.76, 14.92, 15.09, 15.28, 15.47, 15.68, 15.89, 16.12, 16.35, 16.59, 16.83, 17.06, 17.28, 17.47, 17.62, 17.73, 17.78, 17.76, 17.69, 17.57, 17.41, 17.22, 17.01, 16.80, 16.59, 16.37, 16.17, 15.97, 15.78, 15.60, 15.43, 15.27, 15.12, 14.98, 14.84, 14.72, 14.60, 14.49, 14.38, 14.29, 14.19, 14.11, 14.03, 13.95, 13.88, 13.81, 13.74, 13.68 +12.70, 12.71, 12.72, 12.74, 12.75, 12.77, 12.78, 12.80, 12.82, 12.84, 12.86, 12.89, 12.91, 12.94, 12.97, 13.00, 13.03, 13.07, 13.10, 13.15, 13.19, 13.24, 13.29, 13.34, 13.40, 13.47, 13.54, 13.61, 13.69, 13.78, 13.87, 13.97, 14.07, 14.19, 14.31, 14.44, 14.58, 14.73, 14.89, 15.06, 15.24, 15.44, 15.65, 15.87, 16.10, 16.35, 16.61, 16.87, 17.14, 17.41, 17.67, 17.90, 18.09, 18.22, 18.28, 18.26, 18.16, 18.00, 17.80, 17.58, 17.33, 17.09, 16.85, 16.61, 16.38, 16.17, 15.96, 15.77, 15.59, 15.42, 15.26, 15.11, 14.97, 14.83, 14.71, 14.59, 14.48, 14.38, 14.28, 14.19, 14.11, 14.03, 13.95, 13.88, 13.81, 13.75 +12.72, 12.73, 12.75, 12.76, 12.78, 12.80, 12.81, 12.83, 12.85, 12.87, 12.90, 12.92, 12.95, 12.98, 13.01, 13.04, 13.07, 13.11, 13.15, 13.19, 13.24, 13.29, 13.35, 13.40, 13.47, 13.53, 13.60, 13.68, 13.76, 13.85, 13.95, 14.05, 14.16, 14.28, 14.40, 14.54, 14.69, 14.84, 15.01, 15.19, 15.38, 15.59, 15.81, 16.05, 16.30, 16.57, 16.85, 17.14, 17.45, 17.76, 18.06, 18.34, 18.58, 18.74, 18.82, 18.78, 18.65, 18.45, 18.20, 17.93, 17.64, 17.36, 17.09, 16.83, 16.58, 16.35, 16.13, 15.92, 15.73, 15.55, 15.38, 15.23, 15.08, 14.94, 14.81, 14.69, 14.58, 14.47, 14.37, 14.27, 14.19, 14.10, 14.02, 13.95, 13.88, 13.82 +12.74, 12.76, 12.77, 12.79, 12.81, 12.82, 12.84, 12.86, 12.88, 12.91, 12.93, 12.96, 12.98, 13.01, 13.05, 13.08, 13.12, 13.16, 13.20, 13.24, 13.29, 13.34, 13.40, 13.46, 13.52, 13.59, 13.67, 13.75, 13.83, 13.92, 14.02, 14.13, 14.24, 14.36, 14.49, 14.64, 14.79, 14.95, 15.12, 15.31, 15.51, 15.73, 15.96, 16.21, 16.47, 16.76, 17.07, 17.39, 17.73, 18.08, 18.44, 18.78, 19.08, 19.29, 19.39, 19.34, 19.16, 18.89, 18.58, 18.25, 17.93, 17.61, 17.31, 17.03, 16.76, 16.51, 16.28, 16.06, 15.86, 15.67, 15.50, 15.33, 15.18, 15.04, 14.90, 14.78, 14.66, 14.55, 14.45, 14.35, 14.26, 14.17, 14.09, 14.02, 13.94, 13.88 +12.77, 12.78, 12.80, 12.81, 12.83, 12.85, 12.87, 12.89, 12.91, 12.94, 12.96, 12.99, 13.02, 13.05, 13.08, 13.12, 13.16, 13.20, 13.24, 13.29, 13.34, 13.39, 13.45, 13.51, 13.58, 13.65, 13.73, 13.81, 13.90, 13.99, 14.09, 14.20, 14.32, 14.44, 14.58, 14.72, 14.88, 15.04, 15.22, 15.42, 15.62, 15.85, 16.09, 16.35, 16.63, 16.93, 17.25, 17.60, 17.97, 18.37, 18.78, 19.19, 19.57, 19.87, 20.00, 19.92, 19.66, 19.31, 18.93, 18.54, 18.17, 17.82, 17.50, 17.19, 16.91, 16.65, 16.41, 16.18, 15.97, 15.78, 15.60, 15.43, 15.27, 15.13, 14.99, 14.86, 14.74, 14.63, 14.52, 14.42, 14.33, 14.24, 14.15, 14.08, 14.00, 13.93 +12.79, 12.80, 12.82, 12.84, 12.86, 12.88, 12.90, 12.92, 12.94, 12.97, 13.00, 13.02, 13.05, 13.09, 13.12, 13.16, 13.20, 13.24, 13.29, 13.33, 13.39, 13.44, 13.50, 13.57, 13.63, 13.71, 13.79, 13.87, 13.96, 14.06, 14.16, 14.27, 14.39, 14.52, 14.65, 14.80, 14.96, 15.13, 15.31, 15.51, 15.72, 15.95, 16.20, 16.46, 16.75, 17.07, 17.40, 17.77, 18.17, 18.60, 19.06, 19.54, 20.03, 20.45, 20.67, 20.52, 20.13, 19.67, 19.21, 18.77, 18.37, 17.99, 17.65, 17.33, 17.04, 16.77, 16.52, 16.29, 16.07, 15.87, 15.69, 15.51, 15.35, 15.20, 15.06, 14.93, 14.81, 14.69, 14.58, 14.48, 14.39, 14.30, 14.21, 14.13, 14.06, 13.99 +12.81, 12.83, 12.85, 12.86, 12.88, 12.90, 12.93, 12.95, 12.97, 13.00, 13.03, 13.06, 13.09, 13.12, 13.16, 13.20, 13.24, 13.28, 13.33, 13.38, 13.43, 13.49, 13.55, 13.61, 13.68, 13.76, 13.84, 13.92, 14.02, 14.11, 14.22, 14.33, 14.45, 14.58, 14.72, 14.87, 15.03, 15.20, 15.39, 15.59, 15.80, 16.03, 16.28, 16.55, 16.85, 17.17, 17.51, 17.89, 18.30, 18.75, 19.24, 19.78, 20.36, 20.96, 21.38, 21.06, 20.48, 19.92, 19.40, 18.93, 18.50, 18.11, 17.76, 17.43, 17.13, 16.86, 16.60, 16.37, 16.15, 15.95, 15.76, 15.59, 15.42, 15.27, 15.13, 15.00, 14.87, 14.75, 14.64, 14.54, 14.44, 14.35, 14.27, 14.18, 14.11, 14.04 +12.83, 12.85, 12.87, 12.89, 12.91, 12.93, 12.95, 12.98, 13.00, 13.03, 13.06, 13.09, 13.12, 13.16, 13.19, 13.23, 13.28, 13.32, 13.37, 13.42, 13.47, 13.53, 13.59, 13.66, 13.73, 13.81, 13.89, 13.98, 14.07, 14.17, 14.27, 14.39, 14.51, 14.64, 14.78, 14.93, 15.09, 15.26, 15.45, 15.65, 15.87, 16.10, 16.35, 16.62, 16.91, 17.23, 17.58, 17.95, 18.36, 18.81, 19.31, 19.85, 20.44, 21.09, 21.68, 21.21, 20.57, 19.98, 19.46, 18.99, 18.56, 18.17, 17.82, 17.49, 17.19, 16.92, 16.66, 16.43, 16.21, 16.01, 15.82, 15.65, 15.48, 15.33, 15.19, 15.05, 14.93, 14.81, 14.70, 14.59, 14.49, 14.40, 14.31, 14.23, 14.15, 14.08 +12.86, 12.87, 12.89, 12.91, 12.93, 12.96, 12.98, 13.01, 13.03, 13.06, 13.09, 13.12, 13.15, 13.19, 13.23, 13.27, 13.31, 13.36, 13.41, 13.46, 13.51, 13.57, 13.64, 13.70, 13.78, 13.85, 13.94, 14.02, 14.12, 14.22, 14.32, 14.44, 14.56, 14.69, 14.83, 14.98, 15.14, 15.32, 15.50, 15.70, 15.91, 16.14, 16.39, 16.66, 16.95, 17.26, 17.60, 17.96, 18.36, 18.79, 19.25, 19.74, 20.25, 20.72, 20.98, 20.80, 20.36, 19.87, 19.40, 18.96, 18.55, 18.18, 17.83, 17.51, 17.22, 16.95, 16.70, 16.47, 16.25, 16.05, 15.87, 15.69, 15.53, 15.38, 15.23, 15.10, 14.97, 14.86, 14.74, 14.64, 14.54, 14.45, 14.36, 14.28, 14.20, 14.12 +12.88, 12.90, 12.92, 12.94, 12.96, 12.98, 13.01, 13.03, 13.06, 13.09, 13.12, 13.15, 13.19, 13.22, 13.26, 13.30, 13.35, 13.39, 13.44, 13.50, 13.55, 13.61, 13.68, 13.75, 13.82, 13.90, 13.98, 14.07, 14.16, 14.26, 14.37, 14.48, 14.60, 14.74, 14.87, 15.02, 15.18, 15.35, 15.54, 15.73, 15.94, 16.17, 16.41, 16.67, 16.95, 17.25, 17.58, 17.92, 18.29, 18.68, 19.09, 19.51, 19.91, 20.23, 20.38, 20.28, 20.00, 19.63, 19.23, 18.85, 18.48, 18.13, 17.80, 17.50, 17.22, 16.96, 16.72, 16.49, 16.28, 16.08, 15.90, 15.73, 15.56, 15.41, 15.27, 15.14, 15.01, 14.89, 14.78, 14.68, 14.58, 14.49, 14.40, 14.31, 14.24, 14.16 +12.90, 12.92, 12.94, 12.96, 12.98, 13.01, 13.03, 13.06, 13.09, 13.12, 13.15, 13.18, 13.22, 13.25, 13.29, 13.33, 13.38, 13.43, 13.48, 13.53, 13.59, 13.65, 13.71, 13.78, 13.86, 13.93, 14.02, 14.11, 14.20, 14.30, 14.41, 14.52, 14.64, 14.77, 14.91, 15.06, 15.21, 15.38, 15.56, 15.75, 15.96, 16.18, 16.41, 16.66, 16.93, 17.22, 17.52, 17.84, 18.18, 18.52, 18.88, 19.22, 19.53, 19.75, 19.85, 19.79, 19.60, 19.33, 19.01, 18.68, 18.35, 18.04, 17.74, 17.46, 17.19, 16.94, 16.71, 16.49, 16.29, 16.10, 15.92, 15.75, 15.59, 15.44, 15.30, 15.17, 15.04, 14.93, 14.82, 14.71, 14.61, 14.52, 14.43, 14.35, 14.27, 14.20 diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index d21a545669..db6d8bc090 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -661,6 +661,21 @@ Glossary When a cylc detects that a suite has stalled an email will be sent to the user. Human interaction is required to escape a stalled state. + rose configuration + Rose configurations are directories containing a rose configuration + file along with other optional files and directories. + + The two types of rose configuration relevant to cylc suites are: + + * :term:`rose application configuration` + * :term:`rose suite configuration` + + See also: + + * :ref:`Rose Configurations` + * :ref:`Optional Configuration Tutorial + ` + rose app rose application configuration A rose application configuration (or rose app) is a directory containing @@ -675,10 +690,15 @@ Glossary * Input files e.g. namelists (:rose:conf:`rose-app.conf[namelist:NAME]`) * Metadata for the application (:rose:file:`rose-meta.conf`). - see also: + See also: * :ref:`Rose Applications` + application directory + The application directory is the folder in which the + :rose:file:`rose-app.conf` file is located in a :term:`rose application + configuration`. + rose suite configuration A rose suite configuration is a :rose:file:`rose-suite.conf` file along with other optional files and directories which configure the way in @@ -692,7 +712,7 @@ Glossary :rose:conf:`rose-suite.conf|root-dir`, :rose:conf:`rose-suite.conf[file:NAME]`). - see also: + See also: * :ref:`Rose Suites` @@ -727,6 +747,6 @@ Glossary Metadata does not affect the running of an :term:`application ` or :term:`cylc suite`. - see also: + See also: * :ref:`Metadata` diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst new file mode 100644 index 0000000000..18ce0664f0 --- /dev/null +++ b/sphinx/tutorial/rose/applications.rst @@ -0,0 +1,265 @@ +.. include:: ../../hyperlinks.rst + :start-line: 1 + +Rose Applications +================= + +The cylc ``suite.rc`` file allows us to define environment variables for use by +:term:`tasks ` e.g: + +.. code-block:: cylc + + [runtime] + [[hello_world]] + script = echo "Hello ${WORLD}!" + [[[environment]]] + WORLD = Earth + +As a task grows in complexity it could require: + +* More environment variables. +* Input files. +* Scripts and libraries. + +A rose application or rose app is a runnable :term:`rose configuration` which +executes a defined commmand. + +Rose applications provide a convenient way to encapsulate all of this +configuration, storing it all in one place to make it easier to handle and +maintain. + + +.. _Rose Configurations: + +Rose Configurations +------------------- + +Rose configurations are directories containing a rose configuration file along +with other optional files and directories. + +All rose configuration files use the same format which is based on the `INI`_ +file format. + +* Comments start with a ``#`` character. +* Settings are written as ``key=value`` pairs. +* Sections are written inside square brackets i.e. ``[section-name]`` + +Unlike the :ref:`cylc file format `: + +* Sections cannot be nested. +* Settings should not be indented. +* Comments must start on a new line (i.e. you cannot have inline comments). +* There should not be spaces around the ``=`` operator in a ``key=value`` pair. + +.. code-block:: rose + + # Comment. + setting=value + + [section] + key=value + multi-line-setting=multi + =line + =value + +Throughout this tutorial we will refer to settings in the following format: + +* ``file`` - would refer to a rose configuration file. +* ``file|setting`` - would refer to a setting in a rose configuration file. +* ``file[section]`` - would refer to a section in a rose configuration file. +* ``file[section]setting`` - would refer to a setting in a section in a rose + configuration file. + + +Application Configurations +-------------------------- + +An application configuration is a directory containing a +:rose:file:`rose-app.conf` file. Application configurations are also refered to +as applications or apps. + +The command to execute when the application is run is defined using the +:rose:conf:`rose-app.conf[command]default` setting e.g: + +.. code-block:: rose + + [command] + default=echo "Hello ${WORLD}!" + +Environment variables are specified inside the :rose:conf:`rose-app.conf[env]` +section e.g: + +.. code-block:: rose + + [env] + WORLD=Earth + +Scripts and executables can be placed in a ``bin/`` directory, they will be +automatically added to the ``PATH`` environment variable when the application +is run e.g.: + +.. code-block:: bash + :caption: bin/hello + + echo "Hello ${WORLD}!" + +.. code-block:: rose + :caption: rose-app.conf + + [command] + default=hello + +Any static input files can be placed in the ``file/`` directory. + +An application can be run using the :ref:`command-rose-app-run` command: + +.. code-block:: console + + $ rose app-run -q + Hello Earth! + + +.. _rose-applications-practical: + +.. practical:: + + .. rubric:: In this practical we will convert the ``forecast`` task from the + :ref:`weather-forecasting suite ` + into a rose application. + + Create a directory on your filesystem called ``rose-tutorial``:: + + mkdir ~/rose-tutorial + cd ~/rose-tutorial + + #. **Create a rose application** + + Create a new directory called ``forecast``, this is to be our + :term:`application directory`:: + + mkdir application-tutorial + cd application-tutorial + + #. **Move the required resources into the** ``forecast`` **application.** + + The ``forecast`` application requires three resources. + + * The ``bin/forecast`` script + * The ``lib/python/util.py`` python library + * The ``lib/template/map.html`` html template. + + Rather than leaving these resources scattered throughout the + :term:`suite directory` we can encapsulate them into the ``forecast`` + application directory. + + Copy the ``forecast`` script and ``util.py`` library into the ``bin/`` + directory by running:: + + rose tutorial forecast-script bin + + These file will be automatically added to the ``PATH`` when the + application is run. + + Copy the html template into the ``file/`` directory by running:: + + rose tutorial map-template file + + #. **Create the** :rose:file:`rose-app.conf` **file.** + + The :rose:file:`rose-app.conf` file needs to define the command to run. + Create a :rose:file:`rose-app.conf` file containing the following: + + .. code-block:: rose + + [command] + default=forecast $INTERVAL $N_FORECASTS + + The ``INTERVAL`` and ``N_FORECASTS`` environment variables need to be + defined, to do this add an :rose:conf:`rose-app.conf[env]` section: + + .. code-block:: rose + + [env] + # The interval between forecasts. + INTERVAL=60 + # The number of forecasts to run. + N_FORECASTS=5 + + #. **Move environment variables defined in the** ``suite.rc`` **file.** + + In the ``[runtime][forecast][environment]`` section of the ``suite.rc`` + file in the + :ref:`weather-forecasting suite ` + we set a few environment variables: + + * ``WIND_FILE_TEMPLATE`` + * ``WIND_CYCLES`` + * ``RAINFALL_FILE`` + * ``MAP_FILE`` + * ``MAP_TEMPLATE`` + + We will now move these into the application. This way all of the + configuration speciffic to the forecast application lives within it. + + Add the following lines to the :rose:conf:`rose-app.conf[env]` section: + + .. code-block:: rose + + # The weighting to give to the wind file from each WIND_CYCLE + # (should add up to 1). + WEIGHTING=1 + # List of cycle points to get wind data from. + WIND_CYCLES=0 + # Path to the wind files. {cycle}, {xy} will get filled in by the + # forecast script + WIND_FILE_TEMPLATE=test-data/wind_{cycle}_{xy}.csv + # Path to the rainfall file. + RAINFALL_FILE=test-data/rainfall.csv + # The path to create the html map in. + MAP_FILE=map.html + # The path to the html map template file. + MAP_TEMPLATE=map-template.html + + To start with we will run this application with test data outside of a + suite so the ``WIND_FILE_TEMPLATE`` and ``RAINFALL_FILE`` environment + variables have been set to point at files in the ``test-data`` directroy + which we will create in the next step. + + To make this application work outside of a suite we will also need to + provide the ``DOMAIN`` and ``RESOLUTION`` environment variables defined + in the ``[runtime][root][environment]`` section of the ``suite.rc`` + file. Add the following lines to the :rose:file:`rose-app.conf`: + + .. code-block:: rose + + # The dimensions of each grid cell in degrees. + RESOLUTION = 0.2 + # The area to generate forecasts for (lng1, lat1, lng2, lat2) + DOMAIN = -12,48,5,61 + + #. **Copy the test data.** + + Copy the test data files into the ``file/`` directory by running:: + + rose tutorial test-data file/test-data + + #. **Run the application.** + + All of the scripts, libraries, files and environment variables required + to make a forecast are now all provided inside this application directory. + + We should now be able to run the application. :ref:`command-rose-app-run` + will run an application in the current directory so it is a good idea to + move somewhere else before calling the command. + + Create a directory and run the application in it:: + + mkdir run + cd run + rose app-run -C ../ + + The ``-C`` argument to :ref:`command-rose-app-run` provides the path to + the application directory. + + The application should run successuly leaving behind some files. Try + opening the ``map.html`` file. diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index fdd9dc23d9..78e841f16b 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -65,4 +65,5 @@ and on-the-fly validation purposes. :caption: Contents :maxdepth: 1 + applications furthertopics/index From b8658df6a6d259a8c51135c961681bc19b911bb9 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 20 Mar 2018 16:26:08 +0000 Subject: [PATCH 04/34] rose metadata. --- etc/tutorial/metadata-tutorial/bin/forecast | 1 + etc/tutorial/metadata-tutorial/bin/util.py | 1 + .../metadata-tutorial/file/map-template.html | 1 + etc/tutorial/metadata-tutorial/file/test-data | 1 + etc/tutorial/metadata-tutorial/rose-app.conf | 27 ++ sphinx/tutorial/cylc/index.rst | 2 + sphinx/tutorial/rose/configurations.rst | 85 +++++ sphinx/tutorial/rose/index.rst | 1 + sphinx/tutorial/rose/metadata.rst | 298 ++++++++++++++++++ 9 files changed, 417 insertions(+) create mode 120000 etc/tutorial/metadata-tutorial/bin/forecast create mode 120000 etc/tutorial/metadata-tutorial/bin/util.py create mode 120000 etc/tutorial/metadata-tutorial/file/map-template.html create mode 120000 etc/tutorial/metadata-tutorial/file/test-data create mode 100644 etc/tutorial/metadata-tutorial/rose-app.conf create mode 100644 sphinx/tutorial/rose/configurations.rst create mode 100644 sphinx/tutorial/rose/metadata.rst diff --git a/etc/tutorial/metadata-tutorial/bin/forecast b/etc/tutorial/metadata-tutorial/bin/forecast new file mode 120000 index 0000000000..528c6aecc1 --- /dev/null +++ b/etc/tutorial/metadata-tutorial/bin/forecast @@ -0,0 +1 @@ +../../cylc-forecasting-suite/bin/forecast \ No newline at end of file diff --git a/etc/tutorial/metadata-tutorial/bin/util.py b/etc/tutorial/metadata-tutorial/bin/util.py new file mode 120000 index 0000000000..0cf35136b3 --- /dev/null +++ b/etc/tutorial/metadata-tutorial/bin/util.py @@ -0,0 +1 @@ +../../cylc-forecasting-suite/lib/python/util.py \ No newline at end of file diff --git a/etc/tutorial/metadata-tutorial/file/map-template.html b/etc/tutorial/metadata-tutorial/file/map-template.html new file mode 120000 index 0000000000..7810ce884c --- /dev/null +++ b/etc/tutorial/metadata-tutorial/file/map-template.html @@ -0,0 +1 @@ +../../cylc-forecasting-suite/lib/template/map.html \ No newline at end of file diff --git a/etc/tutorial/metadata-tutorial/file/test-data b/etc/tutorial/metadata-tutorial/file/test-data new file mode 120000 index 0000000000..e3350be358 --- /dev/null +++ b/etc/tutorial/metadata-tutorial/file/test-data @@ -0,0 +1 @@ +../../test-data/ \ No newline at end of file diff --git a/etc/tutorial/metadata-tutorial/rose-app.conf b/etc/tutorial/metadata-tutorial/rose-app.conf new file mode 100644 index 0000000000..d73c092e12 --- /dev/null +++ b/etc/tutorial/metadata-tutorial/rose-app.conf @@ -0,0 +1,27 @@ +[command] +default=forecast $INTERVAL $N_FORECASTS + +[env] +# The interval between forecasts. +INTERVAL=60 +# The number of forecasts to run. +N_FORECASTS=5 +# The weighting to give to the wind file from each WIND_CYCLE +# (should add up to 1). +WEIGHTING=1 +# List of cycle points to get wind data from. +WIND_CYCLES=0 +# Path to the wind files. {cycle}, {xy} will get filled in by the +# forecast script +WIND_FILE_TEMPLATE=test-data/wind_{cycle}_{xy}.csv +# Path to the rainfall file. +RAINFALL_FILE=test-data/rainfall.csv +# The path to create the html map in. +MAP_FILE=map.html +# The path to the html map template file. +MAP_TEMPLATE=map-template.html + +# The dimensions of each grid cell in degrees. +RESOLUTION = 0.2 +# The area to generate forecasts for (lng1, lat1, lng2, lat2) +DOMAIN = -12,48,5,61 diff --git a/sphinx/tutorial/cylc/index.rst b/sphinx/tutorial/cylc/index.rst index 3ae5f58f77..a20c4ffdef 100644 --- a/sphinx/tutorial/cylc/index.rst +++ b/sphinx/tutorial/cylc/index.rst @@ -1,3 +1,5 @@ +.. _Cylc Tutorial: + Cylc Tutorial ============= diff --git a/sphinx/tutorial/rose/configurations.rst b/sphinx/tutorial/rose/configurations.rst new file mode 100644 index 0000000000..9530aa7043 --- /dev/null +++ b/sphinx/tutorial/rose/configurations.rst @@ -0,0 +1,85 @@ + .. include:: ../../hyperlinks.rst + :start-line: 1 + +.. _tutorial-rose-configurations: + +Rose Configurations +=================== + +:term:`Rose configurations ` are directories containing a +rose configuration file along with other optional assets which define behaviour +such as: + +* Executables. +* File installation. +* Environment variables. + +Rose configurations may be used standalone or alternatively in combination with +the `cylc`_ workflow engine. There are two types of rose configuration for use +with `cylc`_: + +:term:`rose application configuration` + A runnable rose configuration which executes a defined command. +:term:`rose suite configuration` + A rose configuration designed to run :term:`cylc suites `. + For instance it may be used to define Jinja2 variables for use in the + ``suite.rc`` file. + + +Rose Configuration Format +------------------------- + +Rose configurations are directories containing a rose configuration file along +with other optional files and directories. + +All rose configuration files use the same format which is based on the `INI`_ +file format. + +* Comments start with a ``#`` character. +* Settings are written as ``key=value`` pairs. +* Sections are written inside square brackets i.e. ``[section-name]`` + +Unlike the :ref:`cylc file format `: + +* Sections cannot be nested. +* Settings should not be indented. +* Comments must start on a new line (i.e. you cannot have inline comments). +* There should not be spaces around the ``=`` operator in a ``key=value`` pair. + +.. code-block:: rose + + # Comment. + setting=value + + [section] + key=value + multi-line-setting=multi + =line + =value + +Throughout this tutorial we will refer to settings in the following format: + +* ``file`` - would refer to a rose configuration file. +* ``file|setting`` - would refer to a setting in a rose configuration file. +* ``file[section]`` - would refer to a section in a rose configuration file. +* ``file[section]setting`` - would refer to a setting in a section in a rose + configuration file. + + +Why Use Rose Configurations? +---------------------------- + +With rose configurations the inputs and environment required for a particular +purpose can be encapsulated in a simple human-readable configuration. + +Configuration settings can have metadata associated with them which may be used +for multiple purposes including automatic checking and transforming. + +Rose configurations can be edited either using a text editor or with +the :ref:`command-rose-config-edit` GUI which makes use of metadata for display +and on-the-fly validation purposes. + +.. TODO - add rose edit screenshot. + +.. TODO - rename rose config-edit to rose edit. + diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index 78e841f16b..7f9307d1dc 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -66,4 +66,5 @@ and on-the-fly validation purposes. :maxdepth: 1 applications + metadata furthertopics/index diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst new file mode 100644 index 0000000000..91f1b49dda --- /dev/null +++ b/sphinx/tutorial/rose/metadata.rst @@ -0,0 +1,298 @@ +Rose Metadata +============= + +Metadata can be used to provide information about settings in rose +configurations. It is used for: + +* Documenting settings. +* Performing automatic checking (e.g. type checking). +* Formatting the :ref:`command-rose-config-edit` GUI. + +Metadata can be used to ensure that configurations are valid before they are +run and to assist those who are edit the configurations. + + +The Metadata Format +------------------- + +Metadata is written in a :rose:file:`rose-meta.conf` file. This file can either +be stored inside a rose configuration in a ``meta/`` directory, or elsewhere +outside of the configuration. + +The :rose:file:`rose-meta.conf` file uses the standard +:ref:`Rose configuration format `. + +The metadata for a setting is written in a section which is named after the ID +of the setting which is the section and setting name separated by an equals +symbol. + +For example take the following application configuration. + +.. code-block:: rose + :caption: rose-app.conf + + [command] + default=echo "Hello ${WORLD}." + + [env] + WORLD=Earth + +For example if we were to write metadata for ``WORLD`` environemt variable we +would create a section called ``[env=WORLD]``. + +.. code-block:: rose + :caption: meta/rose-meta.conf + + [env=WORLD] + title=The name of the world to say hello to. + values=Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune + +This example gives the ``WORLD`` variable a title and a list of allowed values. + + +Metadata Commands +----------------- + +The :ref:`command-rose-metadata-check` command can be used to check that +metadata is valid:: + + rose metadata-check -C meta/ + +The configuration can be tested against the metadata using the +:ref:`command-rose-macro` command:: + + rose macro -V + +For example if we were to change the value of ``WORLD`` to ``Pluto`` then +``rose macro -V`` would return the following error message: + +.. code-block:: none + + Value Pluto not in allowed values ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune'] + + +Metadata Items +-------------- + +There are many metadata items, here are some of the commonly used ones: + +``title`` + Assign a title to the setting. +``description`` + Attach a short description to a setting. +``type`` + Specify the data type a setting expects, e.g. ``type=integer``. +``length`` + Specify the length of comma separated lists e.g. ``length=:`` for a + limitless list. +``range`` + Specify numberical bounds for the value of a setting e.g. ``range=1, 10`` + for a value between 1 and 10. + +For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. + + +.. practical:: + + .. rubric:: In this practical we will write metadata for the forecast app we + wrote in the :ref:`rose application practical + `. + + #. **Create the** ``forecast`` **app.** + + Create a new copy of the ``forecast`` app by running:: + + rose tutorial metadata-tutorial ~/rose-tutorial/metadata-tutorial + cd ~/rose-tutorial/metadata-tutorial + + #. **View the application in** :ref:`command-rose-config-edit`. + + The :ref:`command-rose-config-edit` command opens a GUI which displays + rose configurations. Open the ``forecast`` app:: + + rose config-edit & + + .. tip:: + + Note :ref:`command-rose-config-edit` searches for rose configuration in + the current directory, use the ``-C`` option to specify a directory. + + In the panel on the left you will see the different sections of the + :rose:file:`rose-app.conf` file. + + Click on :guilabel:`env`, here you will find all of the environment + variables. Each setting will have a hash symbol ``#`` next to its name, + these are the comments defined in the :rose:file:`rose-app.conf` file. + Hover the mouse over the hash to reveal the comment. + + Keep the :ref:`command-rose-config-edit` window open as we will use it + throught the rest of this practical. + + #. **Descriptions.** + + Now we will start writing some metadata. + + Create a ``meta/`` directory containing a :rose:file:`rose-meta.conf` + file:: + + mkdir meta + touch meta/rose-meta.conf + + In the :rose:file:`rose-app.conf` file there are comments associated with + each setting. Take these comments out of the :rose:file:`rose-app.conf` + file and add them as descriptions in the metadata. + + E.g. for the ``INTERVAL`` environment variable we could create a metadata + entry that looks like this: + + .. code-block:: rose + + [env=INTERVAL] + description=The interval between forecasts. + + Longer settings can be split over multiple lines like so: + + .. code-block:: rose + + [env=INTERVAL] + description=The interval + =between forecasts. + + Once you have finished save your work and validate the metadata using + :ref:`command-rose-metadata-check`:: + + rose metadata-check -C meta/ + + Next reload the metadata in the :ref:`command-rose-config-edit` window + using the :menuselection:`Metadata -> Refresh Metadata` menu item. + The descriptions should now display under each environment variable. + + If you don't see the description for a setting it is possible that you + miss-spelt the name of the setting in the section heading. + + #. **Length.** + + The ``DOMAIN`` and ``WEIGHTING`` settings both accept comma separated + lists of values. We can represent this in rose metadata using the + :rose:conf:`rose-meta.conf[SETTING]length` setting. + + To represent the ``DOMAIN`` setting as a list of four elements add the + following to the ``[env=DOMAIN]`` section: + + .. code-block:: rose + + length=4 + + The ``WEIGHTING`` and ``WIND_CYCLES`` settings are different as we don't + know how many items they will contain. For flexible lists we use a colon, + add the following line to the ``[env=WEIGHTING]`` and + ``[env=WIND_CYCLES`` sections: + + .. code-block:: rose + + length=: + + Validate the metadata:: + + rose metadata-check -C meta/ + + Refresh the metadata in the :ref:`command-rose-config-edit` window be + selecting :menuselection:`Metadata -> Refresh Metadata`. + The three settings we have edited should now appear as lists. + + #. **Types.** + + Next we will add type information to the metadata. + + The ``INTERVAL`` setting accepts an integer value. Add the following line + to the ``[env=INTERVAL]`` section to enforce this: + + .. code-block:: rose + + type=integer + + Validate the metadata and refresh the :ref:`command-rose-config-edit` + window. The ``INTERVAL`` setting should now appear as an integer + rather than a text field. + + In the :ref:`command-rose-config-edit` window try changing the value of + ``INTERVAL`` to a string, it shouldn't let you. + + Add similar ``type`` entries for the following settings: + + ==================== ========================= + ``integer`` settings ``real`` (float) settings + ==================== ========================= + ``INTERVAL`` ``WEIGHTING`` + ``N_FORECASTS`` ``RESOLUTION`` + ==================== ========================= + + Validate the metadata to check for errors. + + In the :ref:`command-rose-config-edit` window try changing the value of + ``RESOLUTION`` to a string, it should be marked as an error. + + #. **Values.** + + We will now add a new input to our application called ``SPLINE_LEVEL``. + This is a science setting used to determine the interpolation method + used on the rainfall data. It accepts the following values + + * ``0`` - for nearest member interpolation. + * ``1`` - for linear interpolation. + + Add this setting to the :rose:file:`rose-app.conf` file: + + .. code-block:: rose + + [env] + SPLINE_LEVEL=0 + + We can ensure that users stick to allowed values using the ``values`` + metadata item. Add the following to the :rose:file:`rose-meta.conf` file: + + .. code-block:: rose + + [env=SPLINE_LEVEL] + values=0,1 + + Validate the metadata. + + As we have made a change to the configuration (by editing the + :rose:file:`rose-app.conf` file) we will need to close and reload + the :ref:`command-rose-config-edit` GUI. + The setting should appear as a radio-button with the options ``0`` and + ``1``. + + Unfortunately ``0`` and ``1`` are not particularly descriptive, it might + not be obvious that they mean "nearest" and "linear" respectively. The + :rose:conf:`rose-meta.conf[SETTING]value-titles` metadata item can be + used to add titles to such settings to make the values clearer. + + Add the following lines to the ``[env=SPLINE_LEVEL]`` section in the + :rose:file:`rose-meta.conf` file: + + .. code-block:: rose + + value-titles=Nearest,Linear + + Validate the metadata and refresh the :ref:`command-rose-config-edit` + window. + The ``SPLINE_LEVEL`` options should now have titles which better convey + the meaning of the options. + + .. tip:: + + The :rose:conf:`rose-meta.conf[SETTING]value-hints` metadata option + can be used to provide a longer description of each option. + + #. **rose macro.** + + On the command line :ref:`command-rose-macro` can be used to check that + the configuration is compliant with the metadata. + Try editing the :rose:file:`rose-app.conf` file to introduce errors + then validating the configuration by running:: + + rose macro -V + + .. TODO - link / reference more information on rose macros. From 00606e23a05755904958f743b66c37d6e2d870a6 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 23 Mar 2018 12:37:39 +0000 Subject: [PATCH 05/34] rose/cylc cheat sheet. --- sphinx/_static/css/rtd-theme-fix.css | 82 +++++--- sphinx/cheat-sheet.rst | 198 +++++++++++++++++++ sphinx/glossary.rst | 5 +- sphinx/index.rst | 3 +- sphinx/tutorial/rose/applications.rst | 70 +++---- sphinx/tutorial/rose/index.rst | 54 +----- sphinx/tutorial/rose/metadata.rst | 2 +- sphinx/tutorial/rose/suites.rst | 269 ++++++++++++++++++++++++++ 8 files changed, 552 insertions(+), 131 deletions(-) create mode 100644 sphinx/cheat-sheet.rst create mode 100644 sphinx/tutorial/rose/suites.rst diff --git a/sphinx/_static/css/rtd-theme-fix.css b/sphinx/_static/css/rtd-theme-fix.css index 57dcebc03e..05a0f74ecc 100644 --- a/sphinx/_static/css/rtd-theme-fix.css +++ b/sphinx/_static/css/rtd-theme-fix.css @@ -23,47 +23,47 @@ * admonitions. */ .rst-content p.admonition-title .pull-left.headerlink, .rst-content div.code-block-caption .pull-left.headerlink { - margin-right:.3em + margin-right:.3em } .rst-content p.admonition-title .pull-right.headerlink, .rst-content div.code-block-caption .pull-right.headerlink { - margin-left:.3em + margin-left:.3em } .rst-content p.admonition-title .headerlink:before, .rst-content div.code-block-caption .headerlink:before { - font-family:"FontAwesome"; - display:inline-block; - font-style:normal; - font-weight:normal; - line-height:1; - text-decoration:inherit; - font-size:14px; - vertical-align:-15% - -webkit-font-smoothing:antialiased + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit; + font-size:14px; + vertical-align:-15% + -webkit-font-smoothing:antialiased } .rst-content p.admonition-title .headerlink:after, .rst-content div.code-block-caption .headerlink:after { - visibility:visible; - content:""; - font-family:FontAwesome; - display:inline-block; - color:#2980B9 + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block; + color:#2980B9 } .rst-content p.admonition-title:hover .headerlink, .rst-content div.code-block-caption:hover .headerlink { - display:inline-block + display:inline-block } .rst-content p.admonition-title .headerlink, .rst-content div.code-block-caption .headerlink { - font:normal normal normal 14px/1 FontAwesome; - text-rendering:auto; - -webkit-font-smoothing:antialiased; - -moz-osx-font-smoothing:grayscale; - display:none; - visibility:hidden; - font-size:14px; - color:#fcfcfc; - text-decoration:inherit + font:normal normal normal 14px/1 FontAwesome; + text-rendering:auto; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale; + display:none; + visibility:hidden; + font-size:14px; + color:#fcfcfc; + text-decoration:inherit } /* Fix the lack of space underneath lists inside admonitions. */ @@ -74,11 +74,33 @@ /* Add warning symbol before deprecated items. */ .deprecated p:before { - font-family:FontAwesome; - content:"\f071 "; - color: rgb(200, 90, 70); + font-family:FontAwesome; + content:"\f071 "; + color: rgb(200, 90, 70); } .deprecated p span.versionmodified{ - font-weight: bold; + font-weight: bold; +} + +/* Implement grid-table class for plain style grid layouts. */ +.grid-table { + width: 100% !important; + border: 0 !important; /* Remove table border. */ +} +.grid-table tbody tr td:first-child { + padding-left: 0 !important; /* Grid flush with the left-hand content edge. */ +} +.grid-table tbody tr td:last-child { + padding-right: 0 !important; /* Grid flush with the right-hand edge */ +} +.grid-table tbody tr td { + background-color: rgba(255,255,255,0) !important; + border: 0 !important; /* Remove cell border. */ + vertical-align: top !important; /* All content should float to the top. */ +} + +/* Tables handle their own margin, this prevents getting a double margin. */ +.grid-table div.highlight { + margin-bottom: 0; } diff --git a/sphinx/cheat-sheet.rst b/sphinx/cheat-sheet.rst new file mode 100644 index 0000000000..8e29913185 --- /dev/null +++ b/sphinx/cheat-sheet.rst @@ -0,0 +1,198 @@ +.. _Cheat Sheet: + +Cheat Sheet +=========== + +This page outlines how to perform suite operations for "pure" :term:`cylc +suites ` (*the cylc way*) and those using :term:`rose suite +configurations ` (*the rose way*). + +.. Use the "sub" lexer as the default for this file. + +.. highlight:: sub + + +.. _Starting Suites: + +Running/Interracting With Suites +-------------------------------- + +Starting Suites +^^^^^^^^^^^^^^^ + +.. list-table:: + :class: grid-table + + * - .. rubric:: The cylc way + - .. rubric:: The rose way + * - :: + + cylc validate + cylc run + - :: + + # run the suite in the current directory + rose suite-run + + # run using a custom name + rose suite-run --name + + # run a suite in another directory + rose suite-run --path + +.. _Stopping Suites: + +Stopping Suites +^^^^^^^^^^^^^^^ + +:: + + # Wait for running / submitted tasks to finish then shutdown the suite: + cylc stop + + # Kill all running / submitted tasks then shutdown the suite: + cylc stop --kill + + # Shutdown the suite now leaving any running / submitted tasks behind. + # If the suite is restarted cylc will "re-connect" with these jobs + # continuing where it left off: + cylc stop --now --now + +.. _Restarting Suites: + +Restarting Suites (from stopped) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pick up a suite where it left off after a shutdown. Cylc will "re-connect" with +any jobs from the previous run. + +.. list-table:: + :class: grid-table + + * - .. rubric:: The cylc way + - .. rubric:: The rose way + * - :: + + cylc restart + - :: + + # Restart the suite from the run + # directory (recommended): + rose suite-restart + + # Re-install the suite from the suite + # directory then restart: + rose suite-run --restart + +Restarting Suites (from running) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +*This might be needed, for instance, to upgrade a running suite to a +newer version of cylc.* + +Stop a suite leaving all running/submitted jobs unchanged, then restart the +suite without making any changes to the :term:`run directory`. Cylc will +"re-connect" with any jobs from the previous run. + +.. list-table:: + :class: grid-table + + * - .. rubric:: The cylc way + - .. rubric:: The rose way + * - :: + + cylc stop --now --now + cylc restart + - :: + + cylc stop --now --now + rose suite-restart + + +Reloading Suites +^^^^^^^^^^^^^^^^ + +Change the configuration of a running suite. + +.. list-table:: + :class: grid-table + + * - .. rubric:: The cylc way + - .. rubric:: The rose way + * - :: + + cylc reload + + - :: + + # Re-install the suite run directory then + # perform `cylc reload`: + rose suite-run --reload + + +Scanning/Inspecting Suites +-------------------------- + +List Running Suites +^^^^^^^^^^^^^^^^^^^ + +:: + + # On the command line: + cylc scan + + # Via a GUI: + cylc gscan + +Visualise A Running Suite +^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + cylc gui + +Visualise A Suite's :term:`Graph` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. list-table:: + :class: grid-table + + * - .. rubric:: The cylc way + - .. rubric:: The rose way + * - :: + + # No special steps required. + - :: + + # Only if the suite is not running: + rose suite-run -l + +:: + + cylc graph + +View A Suite's ``suite.rc`` Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. list-table:: + :class: grid-table + + * - .. rubric:: The cylc way + - .. rubric:: The rose way + * - :: + + # No special steps required. + - :: + + # Only if the suite is not running: + rose suite-run -l + +:: + + cylc get-config --sparse + + # View the "full" configuration with defaults included: + cylc get-config + + # View a specific configuration item (e.g. "[scheduling]initial cycle point"): + cylc get-config -i diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index db6d8bc090..abc0a2bb76 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -395,6 +395,7 @@ Glossary See also: * :term:`suite directory` + * :ref:`Suite Directory Vs Run Directory` * :term:`work directory` * :term:`share directory` * :term:`job log directory` @@ -672,11 +673,13 @@ Glossary See also: - * :ref:`Rose Configurations` + * :ref:`Rose Configuration Format` + * :ref:`Rose Configuration Tutorial ` * :ref:`Optional Configuration Tutorial ` rose app + rose application rose application configuration A rose application configuration (or rose app) is a directory containing a :rose:file:`rose-app.conf` file along with some other optional files diff --git a/sphinx/index.rst b/sphinx/index.rst index 54b3012249..cdba1cdaab 100644 --- a/sphinx/index.rst +++ b/sphinx/index.rst @@ -10,7 +10,7 @@ Rose Documentation ================== Rose is a system for writing, editing and running application configurations. -:ref:`What Is Rose`? +:ref:`What Is Rose `? .. image:: img/rose-logo.png :width: 250px @@ -33,6 +33,7 @@ applications. :ref:`What Is Cylc? ` installation tutorial/cylc/index tutorial/rose/index + cheat-sheet glossary diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index 18ce0664f0..8d03eca5d7 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -21,7 +21,7 @@ As a task grows in complexity it could require: * Input files. * Scripts and libraries. -A rose application or rose app is a runnable :term:`rose configuration` which +A rose application or "rose app" is a runnable :term:`rose configuration` which executes a defined commmand. Rose applications provide a convenient way to encapsulate all of this @@ -29,54 +29,14 @@ configuration, storing it all in one place to make it easier to handle and maintain. -.. _Rose Configurations: +.. _Application Configuration: -Rose Configurations -------------------- - -Rose configurations are directories containing a rose configuration file along -with other optional files and directories. - -All rose configuration files use the same format which is based on the `INI`_ -file format. - -* Comments start with a ``#`` character. -* Settings are written as ``key=value`` pairs. -* Sections are written inside square brackets i.e. ``[section-name]`` - -Unlike the :ref:`cylc file format `: - -* Sections cannot be nested. -* Settings should not be indented. -* Comments must start on a new line (i.e. you cannot have inline comments). -* There should not be spaces around the ``=`` operator in a ``key=value`` pair. - -.. code-block:: rose - - # Comment. - setting=value - - [section] - key=value - multi-line-setting=multi - =line - =value - -Throughout this tutorial we will refer to settings in the following format: - -* ``file`` - would refer to a rose configuration file. -* ``file|setting`` - would refer to a setting in a rose configuration file. -* ``file[section]`` - would refer to a section in a rose configuration file. -* ``file[section]setting`` - would refer to a setting in a section in a rose - configuration file. - - -Application Configurations --------------------------- +Application Configuration +------------------------- An application configuration is a directory containing a :rose:file:`rose-app.conf` file. Application configurations are also refered to -as applications or apps. +as "applications" or "apps". The command to execute when the application is run is defined using the :rose:conf:`rose-app.conf[command]default` setting e.g: @@ -111,11 +71,25 @@ is run e.g.: Any static input files can be placed in the ``file/`` directory. + +Running Rose Applications +------------------------- + An application can be run using the :ref:`command-rose-app-run` command: .. code-block:: console - $ rose app-run -q + $ rose app-run -q # -q for quiet output + Hello Earth! + +The application will run in the current directory so it is a good idea to run +the application elsewhere to keep run files separate. If running the rose +application from outside of the :term:`application directory` the ``-C`` option +can be used to provide the path to the rose application: + +.. code-block:: console + + $ rose app-run -q -C path/to/application Hello Earth! @@ -144,8 +118,8 @@ An application can be run using the :ref:`command-rose-app-run` command: The ``forecast`` application requires three resources. - * The ``bin/forecast`` script - * The ``lib/python/util.py`` python library + * The ``bin/forecast`` script. + * The ``lib/python/util.py`` python library. * The ``lib/template/map.html`` html template. Rather than leaving these resources scattered throughout the diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index 7f9307d1dc..2f81a4fa0a 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -1,14 +1,8 @@ - .. include:: ../../hyperlinks.rst - :start-line: 1 +.. _Rose Tutorial: Rose Tutorial ============= -.. _What Is Rose: - -What Is Rose? -------------- - Rose is a system for creating, editing and running rose configurations. Rose also contains other optional tools for: @@ -19,52 +13,12 @@ Rose also contains other optional tools for: * Tools for interfacing with cylc. -What Is A Rose Configuration? ------------------------------ - -:term:`rose configurations ` are directories containing a -rose configuration file along with other optional assets which define behaviour -such as: - -* Executables. -* File installation. -* Environment variables. - -Rose configurations may be used standalone or alternatively in combination with -the `cylc`_ workflow engine. There are two types of rose configuration for use -with `cylc`_: - -:term:`rose application configuration` - A runnable rose configuration which executes a defined command. -:term:`rose suite configuration` - A rose configuration designed to run :term:`cylc suites `. - For instance it may be used to define Jinja2 variables for use in the - ``suite.rc`` file. - - -Why Use Rose Configurations? ----------------------------- - -With rose configurations the inputs and environment required for a particular -purpose can be encapsulated in a simple human-readable configuration. - -Configuration settings can have metadata associated with them which may be used -for multiple purposes including automatic checking and transforming. - -Rose configurations can be edited either using a text editor or with -the :ref:`command-rose-config-edit` GUI which makes use of metadata for display -and on-the-fly validation purposes. - -.. TODO - add rose edit screenshot. - -.. TODO - rename rose config-edit to rose edit. - - .. toctree:: - :name: rose-tutorial :caption: Contents - :maxdepth: 1 + :maxdepth: 2 + configurations applications metadata + suites furthertopics/index diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 91f1b49dda..9ffe0c6a43 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -20,7 +20,7 @@ be stored inside a rose configuration in a ``meta/`` directory, or elsewhere outside of the configuration. The :rose:file:`rose-meta.conf` file uses the standard -:ref:`Rose configuration format `. +:ref:`Rose configuration format `. The metadata for a setting is written in a section which is named after the ID of the setting which is the section and setting name separated by an equals diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst new file mode 100644 index 0000000000..42e91dc06c --- /dev/null +++ b/sphinx/tutorial/rose/suites.rst @@ -0,0 +1,269 @@ +.. include:: ../../hyperlinks.rst + :start-line: 1 + +Rose Suites +=========== + +:term:`Rose application configurations ` +can be used to encapsulate the environment and resources required by a cylc +:term:`task`. + +Similarly :term:`rose suite configurations ` can +be used to do the same for a :term:`cylc suite`. + + +Configuration Format +-------------------- + +A rose suite configuration is a cylc :term:`suite directory` containing a +:rose:file:`rose-suite.conf` file. + +.. NOTE - The rose-suite.info is not mentioned here as it is really a rosie + feature. + +The :rose:file:`rose-suite.conf` file is written in the same +:ref:`format ` as the :rose:file:`rose-app.conf` +file. It is used to configure: + +Its main configuration sections are: + +:rose:conf:`rose-suite.conf[env]` + Environment variables for use by the whole suite. +:rose:conf:`rose-suite.conf[jinja2:suite.rc]` + `Jinja2`_ variables for use in the ``suite.rc`` file. +:rose:conf:`rose-suite.conf[file:NAME]` + Files and resources to be installed in the :term:`run directory` when the + suite is run. + +In the following example the environment variable ``GREETING`` and the +Jinja2 variable ``WORLD`` are both set in the :rose:file:`rose-suite.conf` +file. These variables can then be used in the ``suite.rc`` file: + +.. code-block:: rose + :caption: *rose-suite.conf* + + [env] + GREETING=Hello + + [jinja2:suite.rc] + WORLD=Earth + +.. code-block:: cylc + :caption: *suite.rc* + + [scheduling] + [[dependencies]] + graph = hello_{{WORLD}} + + [runtime] + [[hello_{{WORLD}}]] + script = echo "$GREETING {{WORLD}}" + + +.. _Suite Directory Vs Run Directory: + +Suite Directory Vs Run Directory +-------------------------------- + +:term:`suite directory` + The directory in which the suite is written, the ``suite.rc`` and + :rose:file:`rose-suite.conf` files live here. +:term:`run directory` + The directory in which the suite runs, the ``work``, ``share`` and ``log`` + directories live here. + +Throughout the :ref:`Cylc Tutorial` we wrote suites in the ``cylc-run`` +directory. As cylc runs suites in the ``cylc-run`` directory the +:term:`suite directory` is also the :term:`run directory` i.e. the suite runs +in the same directory in which it is written. + +With Rose we develop suites in a separate directory to the one in which they +run meaning that the :term:`suite directory` is separate from the +:term:`run directory`. This helps keep the suite separate from its output and +means that you can safely work on a suite and its resources whilst it is +running. + +.. note:: + + Using cylc it is possible to separate the :term:`suite directory` and + :term:`run directory` using the ``cylc register`` command. Note though + that suite resources e.g. scripts in the ``bin/`` directory will remain in + the :term:`suite directory` so cannot safely be edited whilst the suite is + running. + + +Running Rose Suite Configurations +--------------------------------- + +Rose :ref:`Application Configurations ` are run using +:ref:`command-rose-app-run`, Rose Suite Configurations are run using +:ref:`command-rose-suite-run`. + +When a suite configuration is run: + +* The :term:`suite directory` is coppied into the ``cylc-run`` directory where + it becomes the :term:`run directory`. +* Any files defined in the :rose:file:`rose-suite.conf` file are installed. +* Jinja2 variables defined in the :rose:file:`rose-suite.conf` file are added + to the top of the ``suite.rc`` file. +* The cylc suite is run. + +.. digraph:: Example + :align: center + + graph [rankdir="LR", fontname="sanz"] + node [fontname="sanz", shape="none"] + edge [color="blue"] + + bgcolor="none" + size="7,5" + ranksep=0.75 + + subgraph cluster_suite_directory { + label="Suite Directory" + fontsize=17 + fontname="sanz bold" + style="dashed" + suite_rc_suite_dir [label="suite.rc"] + rose_suite_conf_suite_dir [label="rose-suite.conf"] + bin_suite_dir [label="bin/"] + } + + subgraph cluster_run_directory { + label="Run Directory" + fontsize=17 + fontname="sanz bold" + style="dashed" + suite_rc_run_dir [label="suite.rc"] + rose_suite_conf_run_dir [label="rose-suite.conf"] + files_run_dir [label="installed files"] + bin_run_dir [label="bin/"] + work [label="work/"] + share [label="share/"] + log [label="log/"] + } + + jinja2 [label="Prepend Jinja2", + shape="box", + fontcolor="blue", + color="blue"] + install_files [label="Install Files", + shape="box", + fontcolor="blue", + color="blue"] + + suite_rc_suite_dir -> jinja2 -> suite_rc_run_dir + rose_suite_conf_suite_dir -> jinja2 [style="dashed", arrowhead="empty"] + rose_suite_conf_suite_dir -> rose_suite_conf_run_dir + rose_suite_conf_suite_dir -> install_files [style="dashed", + arrowhead="empty"] + install_files -> files_run_dir + bin_suite_dir -> bin_run_dir + +Like :ref:`command-rose-app-run`, :ref:`command-rose-suite-run` will look for a +configuration to run in the current directory. The command can be run +from other locations using the ``-C`` argument:: + + rose suite-run -C /path/to/suite/configuration/ + + +Rose Applications In Rose Suite Configurations +---------------------------------------------- + +In cylc suites, rose applications are placed in an ``app/`` directory which +is copied across to run directory with the rest of the suite by +:ref:`command-rose-suite-run` when the suite configuration is run. + +When we run rose applications in cylc suites we use the +:ref:`command-rose-task-run` command rather than the +:ref:`command-rose-app-run` command. + +When run, :ref:`command-rose-task-run` searches for an application with the same +name as the cylc task in the ``app/`` directory. + +The :ref:`command-rose-task-run` command also interfaces with cylc to provide +a few useful environment variables (see the +:ref:`command line reference ` for details). The +application will run in the :term:`work directory` the same as a regular cylc +task. + +In this example the ``hello`` task will run the application located in +``app/hello/``: + +.. code-block:: cylc + :caption: *suite.rc* + + [runtime] + [[hello]] + script = rose task-run + +.. code-block:: rose + :caption: *app/hello/rose-app.conf* + + [command] + default=echo "Hello World!" + +The name of the application to run can be overridden using the ``--app-key`` +command line option or the :envvar:`ROSE_TASK_APP` environment variable. For +example the ``greetings`` :term:`task` will run the ``hello`` :term:`app ` in the task defined below. + +.. code-block:: cylc + :caption: *suite.rc* + + [runtime] + [[greetings]] + script = rose task-run --app-key hello + + +Start, Stop, Restart +-------------------- + +Under rose, suites will run using the name of the suite directory. For instance +if you run :ref:`command-rose-suite-run` on a suite in the directory +``~/foo/bar`` then it will run with the name ``bar``. + +The name can be overridden using the ``--name`` option i.e: + +.. code-block:: sub + + rose suite-run --name + +Start + Suites must be run using the :ref:`command-rose-suite-run` command which + in turn calls the ``cylc run`` command. +Stop + Suites can be stopped using the ``cylc stop `` as for regular + cylc suites. +Restart + There are two options for restarting: + + * To pick up where the suite left off use :ref:`command-rose-suite-restart`, + No changes will be made to the run directory. *This is usually the + recommended option.* + * To restart picking up changes made in the suite directory use the + ``--restart`` option with :ref:`command-rose-suite-run`. + +.. note:: + + :ref:`command-rose-suite-run` installs suites to the run directory + incrementally so if you change a file and restart the suite using + ``rose suite-run --restart`` only the changed file will be re-installed. + This process is strictly constructive, any files deleted in the suite + directory will *not* be removed from the run directory. To force + :ref:`command-rose-suite-run` to perform a complete rebuild, use the + ``--new`` option. + +.. highlight:: bash + + +Rose Bush +--------- + + +.. practical:: + + foo + + + From 887f7ed06c0f09e897de1b90de99801b0b2f1822 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Wed, 28 Mar 2018 10:54:07 +0100 Subject: [PATCH 06/34] tutorial suite, pass cycle point offsets. --- .../bin/consolidate-observations | 2 ++ etc/tutorial/cylc-forecasting-suite/bin/forecast | 15 ++++++++++++++- .../cylc-forecasting-suite/lib/python/util.py | 2 ++ etc/tutorial/cylc-forecasting-suite/suite.rc | 8 ++------ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/etc/tutorial/cylc-forecasting-suite/bin/consolidate-observations b/etc/tutorial/cylc-forecasting-suite/bin/consolidate-observations index 9122dc206c..fe90317307 100755 --- a/etc/tutorial/cylc-forecasting-suite/bin/consolidate-observations +++ b/etc/tutorial/cylc-forecasting-suite/bin/consolidate-observations @@ -27,6 +27,8 @@ def plot_wind_data(wind_x, wind_y, x_range, y_range, x_coords, y_coords, z_coords): """Generate a 2D vector plot of the wind data if matplotlib is installed.""" try: + import matplotlib + matplotlib.use('Agg') import matplotlib.pyplot as plt except ImportError: print 'matplotlib not installed: plotting disabled.' diff --git a/etc/tutorial/cylc-forecasting-suite/bin/forecast b/etc/tutorial/cylc-forecasting-suite/bin/forecast index 0e42abc49f..73293fde85 100755 --- a/etc/tutorial/cylc-forecasting-suite/bin/forecast +++ b/etc/tutorial/cylc-forecasting-suite/bin/forecast @@ -27,6 +27,7 @@ Environment Variables: """ import os +from subprocess import Popen, PIPE import sys import util @@ -168,6 +169,17 @@ def push_rainfall(rainfall, wind_data, step, resolution, spline_level): spline_level) +def get_cyclepoint(offset_hours): + """Calculate a cyclepoint from a relative offset. + + Run the system call `cylc cyclepoint --offset-hours ` + """ + return Popen( + ['cylc', 'cyclepoint', '--offset-hours', str(int(offset_hours))], + stdout=PIPE + ).communicate()[0].strip() + + def main(forecast_interval, forecast_itterations): # Get suite settings. domain = util.parse_domain(os.environ['DOMAIN']) @@ -179,7 +191,8 @@ def main(forecast_interval, forecast_itterations): # Get file paths. rainfall_file = os.environ['RAINFALL_FILE'] - wind_cycles = os.environ['WIND_CYCLES'].split() + wind_cycles = [get_cyclepoint(offset) for offset in + os.environ['WIND_CYCLES'].split(',')] wind_file_template = os.environ['WIND_FILE_TEMPLATE'] map_file = os.environ['MAP_FILE'] map_template = os.environ['MAP_TEMPLATE'] diff --git a/etc/tutorial/cylc-forecasting-suite/lib/python/util.py b/etc/tutorial/cylc-forecasting-suite/lib/python/util.py index 81b4596a90..7dcb020211 100644 --- a/etc/tutorial/cylc-forecasting-suite/lib/python/util.py +++ b/etc/tutorial/cylc-forecasting-suite/lib/python/util.py @@ -175,6 +175,8 @@ def spline_1(pos_x, pos_y, z_val): def plot_vector_grid(filename, x_grid, y_grid): try: + import matplotlib + matplotlib.use('Agg') import matplotlib.pyplot as plt except ImportError: print 'Plotting diasbled' diff --git a/etc/tutorial/cylc-forecasting-suite/suite.rc b/etc/tutorial/cylc-forecasting-suite/suite.rc index 17cbf0feb7..22f175bae8 100644 --- a/etc/tutorial/cylc-forecasting-suite/suite.rc +++ b/etc/tutorial/cylc-forecasting-suite/suite.rc @@ -82,12 +82,8 @@ WIND_FILE_TEMPLATE = """ $CYLC_SUITE_WORK_DIR/{cycle}/consolidate_observations/wind_{xy}.csv """ - # List of cycle points to process wind data from. - WIND_CYCLES = """ - $CYLC_TASK_CYCLE_POINT - $(cylc cyclepoint --offset-hours=-3) - $(cylc cyclepoint --offset-hours=-6) - """ + # Offset in hours to cycles to process wind data from. + WIND_CYCLES = 0, -3, -6 # The path to the rainfall file. RAINFALL_FILE = """ $CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv From 16a8f07998dbb70c4aa3eca7ecc893300603dd77 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Wed, 28 Mar 2018 10:54:37 +0100 Subject: [PATCH 07/34] rose suite configurations. --- .../rose-suite-tutorial/app/forecast/bin | 1 + .../rose-suite-tutorial/app/forecast/file | 1 + .../app/forecast/meta/rose-meta.conf | 44 ++ .../app/forecast/rose-app.conf | 17 + .../bin/consolidate-observations | 1 + .../rose-suite-tutorial/bin/get-observations | 1 + .../rose-suite-tutorial/bin/get-rainfall | 1 + .../rose-suite-tutorial/bin/post-process | 1 + etc/tutorial/rose-suite-tutorial/lib/python | 1 + etc/tutorial/rose-suite-tutorial/suite.rc | 1 + etc/tutorial/runtime-tutorial/runtime | 7 +- ...wind_0_x.csv => wind_20171101T0000Z_x.csv} | 0 ...wind_0_y.csv => wind_20171101T0000Z_y.csv} | 0 sphinx/tutorial/rose/applications.rst | 11 +- sphinx/tutorial/rose/metadata.rst | 2 + sphinx/tutorial/rose/suites.rst | 385 ++++++++++++++++-- 16 files changed, 422 insertions(+), 52 deletions(-) create mode 120000 etc/tutorial/rose-suite-tutorial/app/forecast/bin create mode 120000 etc/tutorial/rose-suite-tutorial/app/forecast/file create mode 100644 etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf create mode 100644 etc/tutorial/rose-suite-tutorial/app/forecast/rose-app.conf create mode 120000 etc/tutorial/rose-suite-tutorial/bin/consolidate-observations create mode 120000 etc/tutorial/rose-suite-tutorial/bin/get-observations create mode 120000 etc/tutorial/rose-suite-tutorial/bin/get-rainfall create mode 120000 etc/tutorial/rose-suite-tutorial/bin/post-process create mode 120000 etc/tutorial/rose-suite-tutorial/lib/python create mode 120000 etc/tutorial/rose-suite-tutorial/suite.rc rename etc/tutorial/test-data/{wind_0_x.csv => wind_20171101T0000Z_x.csv} (100%) rename etc/tutorial/test-data/{wind_0_y.csv => wind_20171101T0000Z_y.csv} (100%) diff --git a/etc/tutorial/rose-suite-tutorial/app/forecast/bin b/etc/tutorial/rose-suite-tutorial/app/forecast/bin new file mode 120000 index 0000000000..3308734b48 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/app/forecast/bin @@ -0,0 +1 @@ +../../../metadata-tutorial/bin/ \ No newline at end of file diff --git a/etc/tutorial/rose-suite-tutorial/app/forecast/file b/etc/tutorial/rose-suite-tutorial/app/forecast/file new file mode 120000 index 0000000000..fec7c89332 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/app/forecast/file @@ -0,0 +1 @@ +../../../metadata-tutorial/file/ \ No newline at end of file diff --git a/etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf b/etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf new file mode 100644 index 0000000000..2cb66413f5 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf @@ -0,0 +1,44 @@ +[env=INTERVAL] +type=integer +description=The interval between forecasts. + +[env=N_FORECASTS] +type=integer +description=The number of forecasts to run. + +[env=WEIGHTING] +type=real +description=The weighting to give to the wind file from each WIND_CYCLE + =(should add up to 1). +length=: + +[env=WIND_CYCLES] +description=List of cycle points to get wind data from. +length=: + +[env=WIND_FILE_TEMPLATE] +description=Path to the wind files. {cycle}, {xy} will get filled in by the + =forecast script + +[env=RAINFALL_FILE] +description=Path to the rainfall file. + +[env=MAP_FILE] +description=The path to create the html map in. + +[env=MAP_TEMPLATE] +description=The path to the html map template file. + +[env=SPLINE_LEVEL] +values=0,1 +value-titles=Nearest,Linear + + +[env=RESOLUTION] +type=real +description=The dimensions of each grid cell in degrees. +length=4 + +[env=DOMAIN] +description=The area to generate forecasts for (lng1, lat1, lng2, lat2) +length=4 diff --git a/etc/tutorial/rose-suite-tutorial/app/forecast/rose-app.conf b/etc/tutorial/rose-suite-tutorial/app/forecast/rose-app.conf new file mode 100644 index 0000000000..e20d261ec2 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/app/forecast/rose-app.conf @@ -0,0 +1,17 @@ +[command] +default=forecast $INTERVAL $N_FORECASTS + +[env] +INTERVAL=60 +N_FORECASTS=5 +WEIGHTING=1 +WIND_CYCLES=0 +WIND_FILE_TEMPLATE=test-data/wind_{cycle}_{xy}.csv +RAINFALL_FILE=test-data/rainfall.csv +MAP_FILE=map.html +MAP_TEMPLATE=map-template.html +SPLINE_LEVEL=0 + +CYLC_TASK_CYCLE_POINT=20171101T0000Z +RESOLUTION=0.2 +DOMAIN=-12,48,5,61 diff --git a/etc/tutorial/rose-suite-tutorial/bin/consolidate-observations b/etc/tutorial/rose-suite-tutorial/bin/consolidate-observations new file mode 120000 index 0000000000..b771b5c4bc --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/bin/consolidate-observations @@ -0,0 +1 @@ +../../cylc-forecasting-suite/bin/consolidate-observations \ No newline at end of file diff --git a/etc/tutorial/rose-suite-tutorial/bin/get-observations b/etc/tutorial/rose-suite-tutorial/bin/get-observations new file mode 120000 index 0000000000..06d0fa6ee1 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/bin/get-observations @@ -0,0 +1 @@ +../../cylc-forecasting-suite/bin/get-observations \ No newline at end of file diff --git a/etc/tutorial/rose-suite-tutorial/bin/get-rainfall b/etc/tutorial/rose-suite-tutorial/bin/get-rainfall new file mode 120000 index 0000000000..dc41bcd0fc --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/bin/get-rainfall @@ -0,0 +1 @@ +../../cylc-forecasting-suite/bin/get-rainfall \ No newline at end of file diff --git a/etc/tutorial/rose-suite-tutorial/bin/post-process b/etc/tutorial/rose-suite-tutorial/bin/post-process new file mode 120000 index 0000000000..c33f4e0805 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/bin/post-process @@ -0,0 +1 @@ +../../cylc-forecasting-suite/bin/post-process \ No newline at end of file diff --git a/etc/tutorial/rose-suite-tutorial/lib/python b/etc/tutorial/rose-suite-tutorial/lib/python new file mode 120000 index 0000000000..6b9d2c638d --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/lib/python @@ -0,0 +1 @@ +../../cylc-forecasting-suite/lib/python/ \ No newline at end of file diff --git a/etc/tutorial/rose-suite-tutorial/suite.rc b/etc/tutorial/rose-suite-tutorial/suite.rc new file mode 120000 index 0000000000..b3ab366761 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/suite.rc @@ -0,0 +1 @@ +../cylc-forecasting-suite/suite.rc \ No newline at end of file diff --git a/etc/tutorial/runtime-tutorial/runtime b/etc/tutorial/runtime-tutorial/runtime index 3374c51f4a..697710bb54 100644 --- a/etc/tutorial/runtime-tutorial/runtime +++ b/etc/tutorial/runtime-tutorial/runtime @@ -36,11 +36,8 @@ $CYLC_SUITE_WORK_DIR/{cycle}/consolidate_observations/wind_{xy}.csv """ # List of cycle points to process wind data from. - WIND_CYCLES = """ - $CYLC_TASK_CYCLE_POINT - $(cylc cyclepoint --offset-hours=-3) - $(cylc cyclepoint --offset-hours=-6) - """ + WIND_CYCLES = 0, -3, -6 + # The path to the rainfall file. RAINFALL_FILE = """ $CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv diff --git a/etc/tutorial/test-data/wind_0_x.csv b/etc/tutorial/test-data/wind_20171101T0000Z_x.csv similarity index 100% rename from etc/tutorial/test-data/wind_0_x.csv rename to etc/tutorial/test-data/wind_20171101T0000Z_x.csv diff --git a/etc/tutorial/test-data/wind_0_y.csv b/etc/tutorial/test-data/wind_20171101T0000Z_y.csv similarity index 100% rename from etc/tutorial/test-data/wind_0_y.csv rename to etc/tutorial/test-data/wind_20171101T0000Z_y.csv diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index 8d03eca5d7..fbd382826c 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -202,14 +202,19 @@ can be used to provide the path to the rose application: To make this application work outside of a suite we will also need to provide the ``DOMAIN`` and ``RESOLUTION`` environment variables defined in the ``[runtime][root][environment]`` section of the ``suite.rc`` - file. Add the following lines to the :rose:file:`rose-app.conf`: + file as well as the ``CYLC_TASK_CYCLE_POINT`` environment variable + provided by cylc when it runs a task. + + Add the following lines to the :rose:file:`rose-app.conf`: .. code-block:: rose + # The cycle point for the test data + CYLC_TASK_CYCLE_POINT=20171101T0000Z # The dimensions of each grid cell in degrees. - RESOLUTION = 0.2 + RESOLUTION=0.2 # The area to generate forecasts for (lng1, lat1, lng2, lat2) - DOMAIN = -12,48,5,61 + DOMAIN=-12,48,5,61 #. **Copy the test data.** diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 9ffe0c6a43..0545573c0d 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -1,3 +1,5 @@ +.. _tutorial-rose-metadata: + Rose Metadata ============= diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 42e91dc06c..d33f293cd5 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -1,8 +1,8 @@ .. include:: ../../hyperlinks.rst :start-line: 1 -Rose Suites -=========== +Rose Suite Configurations +========================= :term:`Rose application configurations ` can be used to encapsulate the environment and resources required by a cylc @@ -99,14 +99,18 @@ Rose :ref:`Application Configurations ` are run using :ref:`command-rose-app-run`, Rose Suite Configurations are run using :ref:`command-rose-suite-run`. +.. _rose-suite-run-stages: + When a suite configuration is run: -* The :term:`suite directory` is coppied into the ``cylc-run`` directory where - it becomes the :term:`run directory`. -* Any files defined in the :rose:file:`rose-suite.conf` file are installed. -* Jinja2 variables defined in the :rose:file:`rose-suite.conf` file are added - to the top of the ``suite.rc`` file. -* The cylc suite is run. +#. The :term:`suite directory` is coppied into the ``cylc-run`` directory where + it becomes the :term:`run directory`. +#. Any files defined in the :rose:file:`rose-suite.conf` file are installed. +#. Jinja2 variables defined in the :rose:file:`rose-suite.conf` file are added + to the top of the ``suite.rc`` file. +#. The cylc suite is validated. +#. The cylc suite is run. +#. The cylc gui is launched. .. digraph:: Example :align: center @@ -166,6 +170,196 @@ from other locations using the ``-C`` argument:: rose suite-run -C /path/to/suite/configuration/ +The ``--local-install-only`` command line option will cause the suite +to be installed (only on your local machine not on any job hosts) and +validated but not run (i.e. :ref:`steps 1, 2 and 3 `). + + +Start, Stop, Restart +-------------------- + +Under rose, suites will run using the name of the suite directory. For instance +if you run :ref:`command-rose-suite-run` on a suite in the directory +``~/foo/bar`` then it will run with the name ``bar``. + +The name can be overridden using the ``--name`` option i.e: + +.. code-block:: sub + + rose suite-run --name + +:ref:`Starting Suites` + Suites must be run using the :ref:`command-rose-suite-run` command which + in turn calls the ``cylc run`` command. +:ref:`Stopping Suites` + Suites can be stopped using the ``cylc stop `` as for regular + cylc suites. +:ref:`Restarting Suites` + There are two options for restarting: + + * To pick up where the suite left off use :ref:`command-rose-suite-restart`. + No changes will be made to the run directory. *This is usually the + recommended option.* + * To restart picking up changes made in the suite directory use the + ``--restart`` option with :ref:`command-rose-suite-run`. + +See the :ref:`Cheat Sheet` for more information. + +.. note:: + + :ref:`command-rose-suite-run` installs suites to the run directory + incrementally so if you change a file and restart the suite using + ``rose suite-run --restart`` only the changed file will be re-installed. + This process is strictly constructive, any files deleted in the suite + directory will *not* be removed from the run directory. To force + :ref:`command-rose-suite-run` to perform a complete rebuild, use the + ``--new`` option. + + +.. practical:: + + .. rubric:: In this tutorial we will create a rose Suite Configuration for + the :ref:`Weather Forecasting Suite`. + + #. **Create A New Suite.** + + Create a copy of the :ref:`weather forecasting suite + ` by running:: + + rose tutorial rose-suite-tutorial ~/rose-tutorial/rose-suite-tutorial + cd ~/rose-tutorial/rose-suite-tutorial + + Set the initial and final cycle points as :ref:`in previous tutorials + `. + + #. **Create A Rose Suite Configuration.** + + Create a blank :rose:file:`rose-suite.conf` file:: + + touch rose-suite.conf + + You now have a rose suite configuration. A :rose:file:`rose-suite.conf` + file does not need to have anything in it but it is required to run + :ref:`command-rose-suite-run`. + + There are three things defined in the ``suite.rc`` file which it might be + useful to be able to configure: + + ``station`` + The list of weather stations to gather observations from. + ``RESOLUTION`` + The spatial resolution of the forecast model. + ``DOMAIN`` + The geographical limits of the model. + + Define these settings in the :rose:file:`rose-suite.conf` file by adding + the following lines: + + .. code-block:: rose + + [jinja2:suite.rc] + station="camborne", "heathrow", "shetland", "belmullet" + + [env] + RESOLUTION=0.2 + DOMAIN=-12,48,5,61 + + Note that `Jinja2`_ strings must be quoted. + + #. **Write Suite Metadata.** + + Create a ``meta/rose-meta.conf`` file and write some metadata for the + settings defined in the :rose:file:`rose-suite.conf` file. + + * ``station`` is a list of un-limited length. + * ``RESOLUTION`` is a "real" number. + * ``DOMAIN`` is a list of four integers. + + .. tip:: + + For the ``RESOLUTION`` and ``DOMAIN`` settings you can copy the + metadata you wrote in the :ref:`Metadata Tutorial + `. + + .. spoiler:: Solution warning + + .. code-block:: rose + + [jinja2:suite.rc=station] + length=: + + [env=RESOLUTION] + type=real + + [env=DOMAIN] + length=4 + type=integer + + Validate the metadata:: + + rose metadata-check -C meta/ + + Open the :ref:`command-rose-config-edit` GUI. You should see + :guilabel:`suite conf` in the panel on the left-hand side of the window. + This will contain the environment and Jinja2 variables we have just + defined. + + #. **Use Suite Variables In The** ``suite.rc`` **File.** + + Next we need to make use of these settings in the ``suite.rc`` file. + + We can delete the ``RESOLUTION`` and ``DOMAIN`` settings in the + ``[runtime][root][environment]`` section which would otherwise override + the variables we have just defined in the :rose:file:`rose-suite.conf` + file. + + .. code-block:: diff + + [runtime] + [[root]] + # These environment variables will be available to all tasks. + [[[environment]]] + # Add the `python` directory to the PYTHONPATH. + PYTHONPATH="$CYLC_SUITE_RUN_DIR/lib/python:$PYTHONPATH" + - # The dimensions of each grid cell in degrees. + - RESOLUTION = 0.2 + - # The area to generate forecasts for (lng1, lat1, lng2, lat2). + - DOMAIN = -12,48,5,61 # Do not change! + + We can write out the list of stations using the `Jinja2`_ ``join`` + filter to write the commas between the list items: + + .. code-block:: diff + + [cylc] + UTC mode = True + [[parameters]] + # A list of the weather stations we will be fetching observations from. + - station = camborne, heathrow, shetland, belmullet + + station = {{ station | join(", ") }} + # A list of the sites we will be generating forecasts for. + site = exeter + + #. **Install The Suite.** + + Running ``rose suite-run`` will cause the suite to be installed, + validated and run. + + The ``--local-install-only`` command line option will cause the suite + to be installed (only on your local machine not on any job hosts) and + validated but not run. + + Install the suite:: + + rose suite-run --local-install-only + + Inspect the installed suite, you will find it in:: + + ~/cylc-run/rose-suite-tutorial + + You shuld find all files contained in the :term:`suite directory` as well + as the :term:`run directory` folders ``log``, ``work`` and ``share``. + Rose Applications In Rose Suite Configurations ---------------------------------------------- @@ -204,7 +398,7 @@ In this example the ``hello`` task will run the application located in default=echo "Hello World!" The name of the application to run can be overridden using the ``--app-key`` -command line option or the :envvar:`ROSE_TASK_APP` environment variable. For +command line option or the :envvar:`ROSE_TASK_APP` environment variable. For example the ``greetings`` :term:`task` will run the ``hello`` :term:`app ` in the task defined below. @@ -216,54 +410,157 @@ app>` in the task defined below. script = rose task-run --app-key hello -Start, Stop, Restart --------------------- +.. TODO - Rose Bush -Under rose, suites will run using the name of the suite directory. For instance -if you run :ref:`command-rose-suite-run` on a suite in the directory -``~/foo/bar`` then it will run with the name ``bar``. + Rose provides a utility for viewing the status and logs for cylc suites called + Rose Bush. Rose Bush displays suite information in web-pages -The name can be overridden using the ``--name`` option i.e: -.. code-block:: sub +.. practical:: - rose suite-run --name + .. rubric:: In this practical we will take the ``forecast`` rose application + that we developed in the :ref:`Metadata Tutorial ` + and integrate it into the :ref:`Weather Forecasting Suite + `. -Start - Suites must be run using the :ref:`command-rose-suite-run` command which - in turn calls the ``cylc run`` command. -Stop - Suites can be stopped using the ``cylc stop `` as for regular - cylc suites. -Restart - There are two options for restarting: - - * To pick up where the suite left off use :ref:`command-rose-suite-restart`, - No changes will be made to the run directory. *This is usually the - recommended option.* - * To restart picking up changes made in the suite directory use the - ``--restart`` option with :ref:`command-rose-suite-run`. + Move into the suite directory from the previous practical:: -.. note:: + cd ~/rose-tutorial/rose-suite-tutorial - :ref:`command-rose-suite-run` installs suites to the run directory - incrementally so if you change a file and restart the suite using - ``rose suite-run --restart`` only the changed file will be re-installed. - This process is strictly constructive, any files deleted in the suite - directory will *not* be removed from the run directory. To force - :ref:`command-rose-suite-run` to perform a complete rebuild, use the - ``--new`` option. + You will find a copy of the ``forecast`` application located in + ``app/forecast``. -.. highlight:: bash + #. **Create A "test" Configuration For The** ``forecast`` **Application.** + We have configured the ``forecast`` application to use test data. We will + now adjust this configuration to make it work with real data generated by + the cylc suite. It is useful to keep the ability to run the application + using test data so we won't delete this configuration but, instead we + will move it into an :ref:`Optional Configuration`. This way we can run + the application in "test mode" or "live mode". -Rose Bush ---------- + Optional configurations are covered in more detail in the + :ref:`Optional Configurations + Tutorial `, for now all we need to + know is that they enable use to store alternative configurations. + Create an optional configuration called ``test`` inside the ``forecast`` + application:: -.. practical:: + mkdir app/forecast/opt + touch app/forecast/opt/rose-app-test.conf + + This optional configuration is a regular rose configuration file, its + settings will override those in the :rose:file:`rose-app.conf` file if + requested. + + Move the following environment variables from the + ``app/forecast/rose-app.conf`` file into an ``[env]`` + section in the ``app/forecast/opt/rose-app-test.conf`` file: + + * ``WEIGHTING`` + * ``WIND_CYCLES`` + * ``WIND_FILE_TEMPLATE`` + * ``RAINFALL_FILE`` + * ``MAP_FILE`` + * ``CYLC_TASK_CYCLE_POINT`` + * ``RESOLUTION`` + * ``DOMAIN`` + + .. spoiler:: Solution warning + + The ``rose-app-test.conf`` file should look like this: + + .. TODO - load this file from the tutorials directory + + .. code-block:: rose + + [env] + WEIGHTING=1 + WIND_CYCLES=0 + WIND_FILE_TEMPLATE=test-data/wind_{cycle}_{xy}.csv + RAINFALL_FILE=test-data/rainfall.csv + MAP_FILE=map.html + CYLC_TASK_CYCLE_POINT=20171101T0000Z + RESOLUTION=0.2 + DOMAIN=-12,48,5,61 + + Run the application in "test" mode by providing the option + ``--opt-conf-key=test`` to the :ref:`command-rose-app-run` command:: + + mkdir app/forecast/run + cd app/forecast/run + rose app-run --opt-conf-key=test -C ../ + cd ../../../ + + You should see the stdout output of the rose application. If there are + any errors they will be marked with the ``[FAIL]`` prefix. + + #. **Integrate The** ``forecast`` **Application Into The Suite.** + + We can now configure the ``forecast`` application to work with real data. + + We have moved the map template file (``map-template.html``) into the + ``forecast`` application so we can delete the ``MAP_TEMPLATE`` + environment variable from the ``forecast`` section of the + ``suite.rc`` file. + + Copy the remaining environment variables defined in the ``forecast`` + task of the ``suite.rc`` file into the :rose:file:`rose-app.conf` file + of the ``forecast`` application. + + TODO - remove tripple quotes in cylc tutorial + + Remember, in rose configuration files: + + * We don't use spaces around the equals ``=`` operator. + * Environment variables shouldn't be quoted. + + .. TODO -- what what, point this out earlier! + + Your :rose:file:`rose-app.conf` file should now look like this: + + .. code-block:: rose + + [env] + INTERVAL=60 + N_FORECASTS=5 + MAP_TEMPLATE=map-template.html + SPLINE_LEVEL=0 + WIND_FILE_TEMPLATE=$CYLC_SUITE_WORK_DIR/{cycle}/consolidate_observations/wind_{xy}.csv + WIND_CYCLES=0, -3, -6 + RAINFALL_FILE=$CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv + # Create the html map file in the task's log directory. + MAP_FILE=${CYLC_TASK_LOG_ROOT}-map.html + + Finally we need to change the ``forecast`` task to run + :ref:`command-rose-task-run`. Change the ``script`` setting, the runtime + section for the ``forecast`` task should now look like this: + + .. code-block:: cylc + + [[forecast]] + script = rose task-run + + #. **Make Changes To The Configuration.** + + Open the :ref:`command-rose-config-edit` GUI and navigate to the + :guilabel:`suite conf > env` panel. + + Change the ``RESOLUTION`` variable to ``0.1`` + + Navigate to the :guilabel:`forecast > env` panel. + + Add a new variable called ``WEIGHTING`` and set it to the values:: + + 0.7, 0.2, 0.1 + + #. **Run The Suite.** - foo + :: + rose suite-run + The ``cylc gui`` should open, the suite should run and complete. + .. TODO - view output in rose bush From a0a89a97c81710dc76e43811c0410574de803e73 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Wed, 4 Apr 2018 14:56:09 +0100 Subject: [PATCH 08/34] rose bush - temporary tutorial addition --- sphinx/tutorial/rose/img/rose-bush.png | Bin 0 -> 59666 bytes sphinx/tutorial/rose/suites.rst | 39 +++++++++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 sphinx/tutorial/rose/img/rose-bush.png diff --git a/sphinx/tutorial/rose/img/rose-bush.png b/sphinx/tutorial/rose/img/rose-bush.png new file mode 100644 index 0000000000000000000000000000000000000000..e81d3d2ba39a0a178fa6fd29401945e999872790 GIT binary patch literal 59666 zcmdqJbySqy`!|Y@s3;;00s_(viiETbjS|w0lr%_#l;VJNhjd7HBdrKXNq0(jx72&_ ze80bUy?>sw);VjPb!NGAMuxfXd*6Fs*QfUQ$;(P$+#|k+f`Wn}B`KAOjH&wL%$5w+lX6n9U#B>r#Qe0=*`U7Ouo z8)P3_^eNz6{(YqEW7pRF&kK|W!Y8P={`=}N#sAlyFBG!AnCOtbEaJMP`I=u&6&uRQ z5hW3*v>!`RsBnXIxwHe<1cQTDWZ}`EQCs)8zv6qv7B$BIT+WLs#G4W|ZSC87(sDj3 zQy93aR%Qd4c{0fig_9@~V_kcnZ*l6ko7q~gDT&~h82)z7OpCkg{~c zJ0rqttiIs?=QC4kv5n9=^h>O!>v)X2AKkfg$JN!9oIJVAxQG3rW!Lxe%1V#Dg}aEA zAD`~@Bn$njW_c@8k4A%sbmA(?%QF`hMLy*Ih$Ss6dvtK{h|?@Glw-r>J_%R8_ARwq z$IT=G*KY)sOz8>I($e__1$MT!qG~aUH$RR2cr@yqwO48|Pa)UX|= z`}^?7$er7_gNZpiT3g?amz!de3pPg&m~aRQ2^kw3ySkpyyo`1`+4;znTw2P`&CTuT z3#V>+q06S*fTs|6r(-QG4nTsUeWF`Ym;^8iCwS;{Y0owKDw&NP1yXZ8*bVQO;1ky=_6(N`bPkZf19Smho&%EYs@ z(OqJWo8z3?+EeI+tY}g{gMHNOm&UW24Sxe<@2Yxm1nW)AMR_a?<_mD3RYqL0I_5$VgR9OuP9!~RNd3roy^8(#Qoo4oXDGPJCo3+H)ey9vNb5x(P z5aW5n^gOkUA@4-GhU31N>{>l&%*>>{dGn@>j0}ZoGg**T=WE3u8rqjCR*Us@Ybs$$ zd|MAn)*cw0L?gYuZ{4{wuxj7!y|}p8*ViX3EKDUH_yVm!qk@r!W^ug2+{eeq&(Due zHsRs(caIS!XGfb`TU#&&4+Y+HRL;ddGtSM;eO}hl(*rlr$<{Vp$-6n{cPp)iIWs*y z7Mb`i0nYU;3xDe9H2BeF*xdn-?~9xir+feOmv4!i&!77CFkbC8=S6+}P4JwgDvv*H z@|LBkX-;nLoLflWm!}2~9zB2Y7z+!bWjD>w&%ZTQ`x&dWqT+g#yl$Z<3A(>u?Wd8G zlS5)9%Fe)K&wl-NV`JlOPtwK7uEBXrC}-6RQA&hlyF>a>E+-5WBTp?Q5-W_}-0GuH zvcJE-!}>4=30K$9ki$%a`zu;pipYqFviFB(baZr@niDySS| zSzXzNuMqZ9M?-_xWp5#fgj?S(cj8q@GDp~xDM`*=jTtXSs;0FKwONM#o!Otsg6=i8 ziyco5S|9%?=o=d1WMqWF?fLQJ2b|>9<;AE6VR?e~ZQ;9c_QQqRd={fmoScsBmb(ko z%a#Un6t#@hC%GB43@M>ns>YoLzL+QT`gPcg#~j?;23N0SWd&XK3}3uJF;?;R_J05V zece+F#o8K7RsP)tk*|H{7Z-^M2{5uFh1&7S$vyFy!=vZt=c6&FSO`;7)8XOaQ5l2j z?S2?y*<``Q#OH#7)8pec-@bh*lWh9g=3~cJHAZ#fD3CC7<@~-T1r2@8&+Gkl|3eXV zhksV<*{2r`uM+*pD zWzZT}T>J#tJ6xbSQ|E$jTgM-lg?_<|JY-&t zyb>W~q)+vm;kK$2XgJI^-O5Mt@bCx<3W6Whznk^S%Udthu7$#R4;`J`V)W0-iu2|9 zX-Z1Ua!)c0csNtl&(D~(wY72y&!6)0YRC(^1^nQ~b8v8AQpwLQDiU(u`7>Sb8W9oU zLT);LFUN$2jfF+K!L8ccy9GYC&5%7Qt}-SmVQ@*9m#K?0GF{Zv;Uu8kxQEQ$-5pMR zmI&62(`d2YNRh5?h1t;Q{<49-K9Y^FRNv07tf+zOimMjqw(dpm6rO8c}c3*vUMerlDQq*iX@r5Vw`%OYf`M8X`6Y^Ax zh>3_U_Bz>KzkV$d{D{YPq3u@)Ih%G3G6Q=s2Ll5GuD0mw*H2h!3OTg2v>UTntj;<^z5k?yt8nT3We7H6Q z^(a9d9}ln2<6?YZzz(i#v!-&WaO)?D-0Ue7Y~?(asOV@iUVD0K>hy*NkD*-USF{n< z*Ed({)hk2HQ!;+%-dd+^;ZL_qaNiX!&d!EKMMWhh2D#fGZ)w94ccgxbXllFFqqBs} zI^2sUx@*Gt+?99cdV)2%lEeJ!wJQ)ze356VVaH1$nD>a{fb!GQ{<7j(0VdscK#=5L z+oykbKjRb$>HAo^e%o9-OYW(6IcbpWMN~$5t=*!qInpGT9mT~xs{F8>iOxiloE~*4 zIFVZ&MHH{mQN{1&%Z}{?mwNNggFu+Fu=eiW4GRy4qIWU-nY`=w?}?}$Xgq0YX;xD; z8AU}QSnN-qo*t|Y9IlV-$|f6>_+wuAp`jlA!KF~bB~f%+cx=|g_WRYBCwfiDyJ)E} z)suMaZr3{efr7uVFj(tkjqJ@=FM~Cvt)nyD+xy*+9qyd9p`oF^zU`myAGw|_$A?5m z6R5Har_wVp?j@zVy87waSygOmKtN}@R0I|RrkH^1kp+~FokfI7 zU{DYXGxL263}t0yF|=E^Zn?O)*c2QdZBCSzm%of*js5cFF|yKPEIcyO9=f;%!XTbR z?3_3^g&$_JO{@R5qc?{JARnl`R7hI6q;r^LqjECSwXvU0Q>FPGBPjBnA0{uuw|%d1#+Z#%~qa0mwn z&W|rfOAPLKBTko-J-IAKciW6(eaAwNZ_&C5skM-Mudl-9Er}>W5PsSseaI1^;XV}r7*Kd=&IFI-_z-3 z;z^h7Re&`H=R!O6TxH(2Qx7r!pyZ~4R`=}ZRkE87wjFCOgr)oW8P8M_U#SUpa2S?o z>su|dEzhjvv|-Gi_BH3R2~8Zme%7b(#lrI4s!Mm=B zx^TXK4^{!jY1P=@<%|8!z{!bEQEt*lc@*yBa~t4CpZ|e!EjjnbND=v&wFQa~*52-} zUqFEC!OCkry;(qNCEhT}%S%dP`J4*t>+3TzGN5h31l#F4UHbV_o}T^LGnfj+yL1Ri zDXI3Rv>={V%E-x?nPf@orRC)^I@JJq#q))>X79{3Vs?d?Ql_0E??y@J9M0?uliLYB zPtY}3sfD3eK~F6%(?Ny?2S3=3b$|Po)^Q#4jLuJ#nB7oPT>N%-5T(a;XM`%&O2pJ~ zUDw7`<>>M5eSGmgv@Q88j3Wv;7$_wQfFBS097bD<&p}d!$VN_IB@?Ohzd{I0#V|2L?qHHJYgRHdGWx%wHNgC5rv+b} zn|tfHs-ilk`j2US9V#b&LLUL1UW34E=k1#?EgCTT7-(+Z&rT9Kz(U9_5wl*DlhNSg zqP0~dXMT;njWB75*p2$8h3x(0XbD4@=!I1GS3KJET;l8gDRhAQ(`T2oZ3a?)iJ$oDY_3J#~ zue7gUm%CzrM(Lb{RKR_+spp9nK(iqEn6gH7*00I0yLSFiXTH%0-^1Jq%nHx@qKY2n86yt?3)%Q&66 zy(-xbVdDj&H|bJS(EUg#crE|ZyzJHPU z7*|q9%9~;&I#Fn5ATPVY$X4_pIOFp99VE?+ke5RZS=8r;I>VHx|%D;Sxek1{mKqlyWm`_fQ>C2ZdZESWw z+|czW!NPi@ug`AKdY_-BPoomi?tpsaBxAvW(0#kWSRMSPf+ObKA-`VPz;$=71-cb< z_l3npY{bT$S)B$qB69LZvmwR}m4yoPk)y3CriE8Z@`81!-c5sp2f(nPACCt00y2n< z#G?>mqtIy2l1GU{oc5WS zncu%H*M|!d3{H%JKR|H@LaVbb%RaZCZ zr@pkQ9@uyv;j7EK_jmMI!*%Jfqt89Z*0PZV&2NX7(!t>n)-dXwJLCfI@oJ?>2?#3T z9tj8tY?#&5)cjrSjM?Ac9~c;@vYrV}qHPA3~U2l<+k-?xiSZI%c+q|$~ zxRI0F->>k`$9K?DfY1XJY;JCb%7>O5LPt+N{qoQY@ziXP9wsUT!5^@EE2mtoId-pPB;)k#2i=uOW zaV90b+<8zm8$}{771jLrk2kBUtG$M0BqdY&Og`Pg^f=lWizo_@hyb8)7qzLi3QhPZMU3OsZnGy z^_e@#YtP2sesEx5qFC=IpjIGZ#dgcG&{U3o>rA^zQsX#UM~G71jT7st9)_~{v#BXC zF!1m3c2B&5{KH#fUq2!31!n(Ck!rtv+u8I>>^p-R@?q<%_YYCD>Z1YazgjMACB?Bn z0%e$jWEpI#2H}rOg4UxLVRQW_J%SfXDk2hSyV`9_hK0KnMQb|xdM}yQMLZ7AzxD`4 z4cX8-$7{waYH*h}s<0$}yf7}zOHZYDXQBux<45@JS@kD-{58G!d)SjCpb5|lTB8U8 zar^$m9YBwr?d=pu$E`_qB_$4^#(-eu;<Rjk}YtD0Q6%ih0`1PBE|DZ91 zV_8;;mxM+|2{>+iiHsbC3+A?(T$!K$nwt89^BxV3pXcRiR&4B;4+hB+P{8>3Ye2+b zwS>fq%nDU2iT6+8-{sb5K-#Z?tOQNX=0X7tN~j==6p-^^5lKm3SdTD1ot>RAz|!B% zHgQ`|Z_G3%Z|7+}?da&ZZjaswb&x0Ej0gJrgGu>(rWA0e-;1pXy3I4tC&QeC^`VfX zq^mn))EWJnK2qrF95+6W$)piFZDvgk5UYr7L)F5H;(!mhw6Ff~xmMQeZ9Ep%F8aOg z$uFQSk2K{Vo=F-d`VS1H&A+c4lk)OFci+UFFR9Ub}wLuBDm2-zY-DW$}lX zApv(^N`8)xj9&5*Cl)&nVFdxMkR6k&YgMps%N2( zr-#pe`vwGPmc9L5?|O_B;{1#8Dd}2je0QofEid2qr0bxw`bV?C(~0^!xlGdgtmShq z%a+U7i>&k~NmDfr<_9Z%Cj;a%EaoF8Wpv?TVLbLLy(I>}OgJ>4VP4NOHntE?X`aw8 zN0rk_X$=jRzvH=6Q&YRUyJt2}aE0Yi;aJWbTvb*zktfx4Hz@Exc7-3JT90odXy^P>e#tcdSBw6G>Lh&qi`NfHNhfkIoW+H4StNXr5*0sQzG^mL z?9asg-BBQG@2!>c#Ok{*lkvRDUfc86&ILRq6`UI9kwFjhzLGsNF(PgMoL`vAuTLE) z#CMm=B#@tRGe`9m^1we9uaUq?B4YkzF~zt7g~*&DQfMIw0L z3&j7Qp0|ySje)1|?+CzOGq>0gZKI>#@&fu4jf{;wt^3X%EQdNK*El7I+iT9a z`M#IFeb-LV#Vs38o*fSY-)EzkncSrQA;W+Dk>|x+uK(kXs$M`IOyHkc+foUhl7g? z=me;p#_QL!tE(C_sN*aU(1!Hy13*{0nik+Q3 zJw5&4@DQ%c9}5UDu4;FpXgTdY3=#@FA|gL5VrV8%qbMmU-Q3;pq9RlY{e^Z34oUb9 z+zf_RyB`mNJu)wZ?F3Q=bV>vo$QQs`DUtBO@C%^0T3A{F*S4Pg_AvtpDFDz4&=x`e z1r3Ny(5)>BKcEHdnuv;uLw|gxhxczUOSp}+RGStW($LV1;$a`r@(TzQ6chmc_sa^M zJATC4aL9)I|3GO|Sd zWV6VhzkAd5*(kl9UXyMdUCLedz2IUr?#esmygf$^1M1H=WgdLD4wAH z!X!%MFzttfo!nN}r|!Mst)$hvbWIbKfv}dC6sea1m1TbX_|3`AEGsK3_#6i8v1$)2 zxAzM8`D%bwgW|f8*r`VR* zsGzPaGcz}@vYJ|3Sy|cI@&MQY^cJQ%sG4Y)*fT8t#rKM!TSFnILaG#M<)oy9CMPE+ zC9%?LITyQ1o0+YJ)4T)(Nt>R~RI6-Es9g7%3`F&AQ1pwpZ{$lhJ^SVIeJyuwN5*G) z#Sit-Jn~L%)=Hqf0diq@a1ig&qm6|H4zs~*fE&iZ!n7T_Z=oPSP9N=gFIjh3qS z(}(Bz^TCmkD`*!$wy7i9*Vfi}cz8gwg1G|%tkC7j{Qhze=!6Fc2mJ#BfHMN84Bync zo!UA(e@jZz0mL19zAd9FygoO{p~_Cd*{s;sjr-`48#F{OuYY7@e!~cpa9f@H{c9VH z3KydSqR9C8-?gDUAQU4*L$eHS+=2Z-lY0{RRMpjUGBToKVhA5TbYAWzg`17+?Tle7 z5#e-f;B?-3!x+`UEnw_(|F!{OujB2Rn3$ODsoLX-Dr?nzHHsCzDCnw+^mr~Vr${6c zpGjqKczEuvU=~R8nORxSV!OazxR&WvRp&#JMx|12mhP&+92m_zIXjDqj%I%t2=H4b zo@*2Ie-;*&!^1;DRxRg)6>PKR26M$bd|@ED1H{HgfMf$>2rCLM4xY5Owpv=%P+cG- zbH?vKrlZ)zlEd8`Ol;9Ffdhg@Ff%wPnl<3GIj*dvG`OTeX@Pyk2r~IATEJ!sii)@a zQlg@$N3ZX=+P`@5LSLWKb&~awbyc|G>(`%MF(zPa6crS{ym||_o~`k`e{__d+AiTv zK5PC1YxZ*qx!GUL4IkJ1n(^1T?9lJss{vkWU|;~QOm`yR*hp~gQ33|aCcH z-@c7T0fq*+STI5z9n!E+0n&oZ4>X1X3955MbhP-_K0G|UrluyV$!{gjyZXpp(zI;Q zmHv|j0FpC$N=-wvIn$^sD{BRYloDf<9j@2#zcm73Hu{!=uLs0_>!})Vta}e0Tzd$x zUKbV?fCd$}t3D(ojLFWO#l=k|oILs|f3J#EkVG40^bMx`=Y>t-voSts@UEq|i zi^iZFe`A3zy?_(dAH+TZ0q6*{vr9i; z-|ws+9f~DDZ@G<%+La_gBBwuXMbn<$4tbCvTz_bjfc*}1;`Qs0tpk#bq6 zDJdxd&4(rRjGevsqo}z#lcR#Bsw%hBmX^goqkD^;exj5?;y+a;%S{!{&GSM+Ft;)8 z{JXX5VG@9pL&d}tfQm|9OV?@y z%p31s3up(uy-x%L5@oaI^J`J<#qSu-7kn!#E8AJ(&}%}a3>$6q^hAcHrp^L)$40z; z`__88?niiq`OIB#PmowmvUfmo1|{Rmt4#35y9?0$-+@OMzrGi3wlP{VDq(qBK9JYJ zSns%%^wFbY_ovWiz`v*%a}ph;>{h<+CzMb@^=?t&_yMzwjg1AW;cQ0T45B`e-Vaz! zWycfef~$jR{uv{0-gYN2u&{v62wdQ`hK6+3fVW|AP*00TIlh5|bA(JHFMdy-V((K~ z$rN6-bykX2dGwxw)YKakhE`U=+TmXyoX`?LSVE;rm{fKHh5GIYRwNh}sHksZe&FHb zGvM8;ob2s=H;^d<{IMHsiLNg2RfhWe$4d-8hlOEBr=+F*Ltzh14L-#{Inq z#yC8la}N^1wO}E@*Vv!|{Rb@-s>KnGMK0#q*S$Sk?0YkdubT>WbMx{HuD~)kz}y!P zd>HoS%L&{)Sm97TKsH@jUq_ef@sZJfDJ35b=$C4h{}11ju~OUOj%K zwyp2S~YjM;v+!wgM}R7I#IEWTz94;7Ib^=$oma!1q-Qn?{=b?R13AL`)rEJ-pjl^}^En&Jp@24RvMPo8}D zNzrzOei}-xH4_Cr-ajyqgOjr!e0z`rKVy=2Uz&78GQbabVSYdxhcpT(O@RDDeh1(Pt_iw_pLlkH@o8$7v@+vCgx@@Bc#f>~!qNPGG7e&!>va{bA^;4w* zFho9oAO>Ov2$Q3oJSFA{MY@fxI?p~_C`!KP0;>$!3&+B_4A{Ow7C?r`PDw$bNKZ@i zqB{`~qjPwH&GlKa_9*ck>9(lBuV7_)d3hxz=<6UZiJ%3M3z5ZN_r%CRaFWU}@hz>g_upV@Wn^U;sH&BfmKHA)jpAxxA+F6#E359#&Y#mw#^&aou_AJQ zI9#;=9Gu$Q+tE^CGMt^AB|o?Mhax>I%NRmBqod9s8yy_}prcqFyNyAN#ILBXCZe$4 zUy^~OiKnM$!!7V+P2od-|87a*FR83-#dS+)7UV9ikKYP>Krb5qJ4a@7+^NZ-4j1~x zT?!7vw$N(}($o}+_yu%?hK2^`N>=(NL=8^2g5L{Cz70v-&9?5QBZQXLB%Dy}t0gG? zC8rLOD^)=$*GSP=50+XFKGdxj7&% z{hrk7+S;;TH^aihN=iyb#q3E*6QMu6Tk2IzGkp7YX=CFN2}v!ieMmBG*e;!)?w80( zK%D{56(66Mn)*?|hmK#Mb!zGYf-m40!30uLR0NxXDohd-bvN`6G6zPV`#L*c%F4>h z@7SpLbH6`P-T2nM^#OrqD*ODuWgjG14OLZRef=i=5-9z*G06fw*S#pg#ku7`!!@m- z_md7A&Ga*=bsFiIx{8X*&D-}SWo5z0s16LgpC}s>71c5=Nlh*4RSAnE!P_r5xK$i| zl!qw>>_4!QN)Al;U3I^8vzq;K4Kj&cURe0U^Tt6B3cUB{&s1&_JzOE`Gbp>2k0`3c zB&kVA;-RoXnCJG{T4;E9)80mt9T&<6>brI5ywIlw1nMF91FRONA~?xJM6uvbu(7di zoM4lXn1f}%&=v*~CB*MwD(B|pK!di1)I`E*XuIKt_gko*vk4&-|G8H_SohG-R%RN7 z!X%YmzaDFF=R1qV;P>9(zr4JJ<=5NS$H2;}qM#7R>#zoL+4JPKz2jq;2DD+4m6esh zf=Pin&TG}*5o37rY|;x}&G7|pwdjescG_se%SHhMk0xZz}g@a#55 zpF&y*05otdCZ@c`%fINgxgAXO^pYYXH~Df)evZD~nP|orkXqY#K#vSvLPEvTj^`cq z1B8f;aQ}O7?K>0}ZVhB%Udo{R6{i#;%ak@L(@7oc{2UF9vHh9>7s8~1IndeGW-(nC zyI;*FOo3A>hOMH9dr)eApKDiHOQ7a=JzD~*|M(9bDvhP*m}=T;q|=5cAxV~GWepf} zmONgzR9I*bxgsMY1DLO%pa8xQtV{Ar>5+dstqaX4e&7pvdeC#5E!1b1j; z1eRM~P7XF2DsfOIRCxg(WEu4b3^`vnH@DKVGN3vk^(z&|s|=Pe{;3ylYWPWI8ne>P zV!Sm86gLNgMw=(k&`~~+rQT_*DR9+ikKK$5I~0KQ5M(soGbajc2ZZbE_UfUD zit;D^PLG$Pq@0VRWMIQjMyJYcp7g1#t*I>PsbOyNv?PTeNeZ&(4fVtha#+SFFOF~g zA7Uoj{r@c$O8(z|-ZwQ>pV#?63f!OC7f-mjJV4x6CA_xfuOHv5Flp!hN0|)8Vn;~o z>NZ|Wbc@T&|5qit$y@)=#G(y_$+fz2-YW{TS(|O1a1EwQ{p4JvTVrzM&m$9NPCc9U z`mdOHLbgNhrE{W$|5}T!&@z&{V!As|uS6~4eq?i$aTQHrue+-7e=pFD?nJKHUDh1$ zEIKKQ(^sI!O0q8XO!j|&k}P}@*OM>$GvR7W2acYWKHXaCZ>y`tzsuKuNPXY=*X%$! z8aw=i?=JE6XigU-d_@nN`pn`VdAQg8wMYx)*cMdfIsfat zePO?A^?qYpj&{p)c)Ei3>rlnmn|GD;-)VQ$<%Km*y6x$mx-ej2ALBGBBkE0~QvE|23 z*G4~YF27M+!DZd759&W1tOb}25z!iIUyB%PJ+x+0#ThpaRCSg{I4YTKIGZljUysx+ zPybpbTC~OM57et)!q^Uy=TjjJ5AW;HaHQ0Ov%ITPlh;E_YpD7zYVwDYWlz4aTUm=P z!?gFVI=*?2jV^lvPuH8M&kRYB?07yUzQ4auEVMPNu6b-1qP~9LR za$R{L&v%Im-3$Ilz0}apFko^ON-ESxef^V}b5m!MTMtb`5-CyLNZo3OKpI4oNwfuv7{MTkY!neTU__bgIXj<#yt%i(&&k07%AfJ?xC+o8;5ZnNCoEr= zqk|Wgpj&nAeVUDRS;QDuip8fo3*0F3!_t4E?m2nk%vK^9jo7Ok(p|9_Oe%WubiwmV zd$)a5?p9P#?j9bw>!<4AdTd0`vkpvwuC^kJjjs$>``;Sq41{0?59>NtIfQ#B`CIe~ znQq-I_Yl15)>5@uMKeIkyJ+t>yUSsAmo*9gU3H`6yNC$kAV3I(aEhQUMsauX9PMqr zr@KWYnDxu8lRQzwk)A(7<)zblk@8IQL(UhS?jHy)PatDg_x`X0ATR_g(NclO0h?KZ z=!Tyt0Cljm0ITaWc$1hmC zj+16*lC5iK{BgI_Qb+P!+6mX(K)H~=0@>|#PUgG!mAPNE$)0NHg}FPrSrwWtcU^u< zUJSocdhpy--CABUqo%r~OdJx+%qSIJY%is>3uE}l<@Bn+2kXic zrWU8vsMLGWLPyDsF+8!7?^*?t-1fpMjfYdV9nafq`F61IIQncw(CR&}F1uo%LAD1n z|DYm(EC3MOQuP7cUXW`owjDoWfyfU*X3+Z@;LVUP1>-?YQSlRkVQ^pa(e2gGCpVax0Ok%jMPL;G+FhLb108D2NG$(X3=SNM z%Y2s$nwMG{KfB`@ghHOVuPp1QGh8iD$&~+j0}{DxA}^@a#@5zCCcPKP1X@TSy0&z6y*dg~DfFyV zg@wCTW*xDYn>Dr;LX>^Mkyv?Tq2D>8sUSCCYPJ{YCvw;yVD4GHQ@GWrNb6nHX+BbZ z<6ggEZo*))-Dh7FjXsU3{reiCwo)q!>vuf5OY!E$vZ@m>d|-~h`d&p{=i;yO)!J{R z5j~fVuEHg>`<@*J4Z~}8hMY{f$*T=3{V+}Wu85HGl13ptPYyO}LBTvPm5GJwL53p4W~*dtsHS~Ru1z8bNwTVNCkOCHLJ?JbizF#0M;BYCoY{A41fpa1ym|a1boGDv$@mBtiT7Do+ojG2yNWM;z#qAYlIrB3YiD-G!_P zgfeD+{xrB24#x~Z!)lxekYC3Li=W;?9qF?(! z0l!)sVnWJ;4Fn02#Kc4}?Lf2mj0NZ(N-`OrV?Gdbm{>2Rzcu!P%dkB^KMzjR;-UkH z7Z!T<_6NX;wY9V$UbDKqe7w>}^{<%%{c00-$jr|VOlwwX)9~6Lwc z9e{vr`NmQQxAF9F+t3HGR*>VtQ^E%RN5Z|;?1#%t@KQe3CC?{yU^P#r;NJcFhU~F* zn~mw|hI7q+PzN0B>^eI-<_d^sw%V(xsF1K{f!nA955y)Rp~k=O1+80_Ej>W4QDPjL zn9$VF7zZ<9YD$2D;-j^613IYIM?ut}pfNGMq>W&Re4yPHEW@;3RK#x;8q5*9Vv-5b zCG68wJPOgM2#u{_31J@#qwG1$ujHq~&Clrj_F}$ z$>2NmB=8JCq-S`zGBuR~>ZjdQbF(P27eYyv78bPEZKf#>7a^&x?g9g@nE7hCR&HH6tFv{6TQcM)ohJ>7mIryn8an4r9?3fnE{7@+ zRM>YF4E4!nT>7M$Z1b#4jiQtW7^vrp6z?#Tn0B3F&v5x=Jwfc93s$&Nvc}A6+*2{L zjS*7jXU(_VE}vZUiO!Df|77=BzU}-@2`2{2wrw6;(Iau#4{>nJ6mmnOHEypC{ZQG+ zJ3lRhxorQf^!M^h6`x$y`Tbxq!yvPsM|W+W%BQ#$np^36+zsalE3PZ@@h;t%A@5u% z$git;dy(WuXrG-b-G*S=*jAxsswi$9)1u1CpOzF!s<)G=z_;sI!$#od+hZg6tlZud zU6y34#4zqpY(}mOvfm=w>(Z-#i?QzQ=^)Htz8aX~so?66)G6{=mmXr^H8z~e&1 zzTG4!aLRa_aC+*8pY^NfpP&@LR-x+$RQotCOX7(31PHQ+VIT8P!)*nP13DgT8{~Wb z`~;$%b*#`)d^OIdrF$lxo{JVh!giL$kR2tuHE6@?9YhaWbFU<@L?B-j8z&lM8 zbdRe_e76KbKe(HPI`tY5Omg0xgWwUk0sBi@N=nT`#5^SLBpCO0=Ow@nhd~0}6(m@= zwg)6!fmK~#ylN>!K9&TLU0v-0pBon!2S@}2?08=bZ$P2pT%ye`g;4I&tMcDWis4f8=F-*|${2K)n(0sAuTPN|Upg92R# z5m)xut~XBzShYrrbU%}MD|J!`=Bw%#E zaldk>_vb5Q=%?6mpn6-4OuZ+7O)v06fIkJ(s48_aUB`0atnNan{W=Oh@wRebIhu%)(&K*`w!=m$_x?m zl90JX9#+?Re7NB-hDJp*=EXbvTsSvCw~Vb%6G%U1QFSno4X?HHx!O;k(t!zBavKl#_1JYYODj^MeMmWHvLg zk1tB`!kN91Sinn#cAk8aeC#~2GUK9&WNB`DEg8ge&W1O{S&>ON;-Y4D<{E1pHF)JV zoA@!;0{4@*okIhII`hG=sgNWQdlq}Kb3NtrC>({sx3}#Eq711pTy&jq`}}`2_&|fy z{rR=y|pj$jd^FhSdMz(UCYB5Yr&o^ai^!TU#?hr%F#3 zefe^IMAy^k$>lyNJsq7BD17kCw?9$P(MdeUA|@gE`ST|L zX1e_+yZYksrM z#>NJeHd`ATVKi9aQ}GN*|C0sSgouGNBRzPqoP&TVAQJ;SIr6jS51`J$3)I`UVYR_d zT5I5v5LpD}{KW208l&8){LXfEX10H!NR%)dG#|}aW}L7OSRF+sz4Caw;^dd-^*$@5 zMWa4+QKBC780s96jC3vfsbL@c&?o@&W)+RNs59g3JvaBMzcCXOOq}9Cu~im`*WRKf zq7$dY@&||p^C0GDW9cxz!V8Y{Ta$RRnjW+P%33nUF-Y^~AstW-&{AQ`>c*aojm=Y6 z3Iv!Qun`O!4Vjiki3}~>^JJ|AX^{%~_II3Eh63#2h3tDZj&DFs8V7>DES-$6sGGh} z46Q^{Ok9d3z#9!UQb#KQYmQj+o^Dl620lfzVQQRsiF=UmaPB@6vBlr)_Y-Rani@rQ zT{E_aKMy&tbd;cVcTCV$7jL&eRnJZPJY-IlCiJVcSuGR7h?%f9cW*2Vd z3-hwam9Q?n z!qRnt**}u>(w;+^kAFrw8WEm>#Y0EO!BN#A9d=Uqk{0_w$+ZK9~zl8->m3k ztkG@ZA8|}G3Eow$!M*+c`ZIY?pFGLV&BYn4tj-lrl?P2{XmAj=193SeTAxX5ZlEVj zMdVR|(_z~{A}$wlCBvg*&+85vkNHTUgS|b!+sV6HVl#l)A8y>#($+4qrgL&~ve;{E zOZb~hx2!DStUKBDMo=cJB{Qn}a0G#-%vt`(GeLW#8KUwIEP|f-A6D}dBZcZSq7bwl z3X=C}*E>4vXm6K!w-b-a?Yr=9x`?|x`{cqYxP4ixFGj?G1mC}Cjwdc>IdVwXJ(k-M zD|xkI<6u}k7p4Ta4!*NnBF!;JVzl<(1<;_g zsQ*FG*Oqsyd{-Q=S27~%@(kH}ML-#WcA~l*zbE$g^jDfjkANID!a*i*uxUJt+_bUh z(I`<=ziQN?=3szLaII+*a7YXp*nea zlVj=!0K7b2W2g)UcNL1FnJOB2#J_c+=bx{d$Qkco*Q7gqHl#vdU~2nBnW?~%`05v~ zn0k&ktGKMYm|IYg$!RTS@B1X#{qZws4xBdGNuP4YYs&n%hj}gHCt(M~!JJu5n2%dZ z4+^{AlW&AW#|QCK&u$aH<4>S@NdYT~Zh7QB=bWJDo2;t!uhJB_q`wDe7L+hfc_YW2 zgr>}W3!na?@^$MB!P?tr$E=A^nd)U9)3E-~P}&v~kBtC)54lL#v=|Z)0A4cz0RiZo zMm;hsP_-b}1epV1`*bpKqN(x^?~99x-Evfdz*H-%qK~&X#5t~aW4DD;j9w`0DyT+Y z+D-qV3Mpl6Y@>?s?Oq}_mxvEc|u1@hKj>V zIHr&LkCeuw{tQBwibqAyHlJ5rYJg@+W|_m;EWfDX=5Yts6mwM}Pj0qj-A7yW2nVL) zPRzV;G!q5usFJ@OApvG~u6x?~;4*+3?vdnfPOM=@48e>&_63jk(z$z)=r+mA&yRwo z8CY`D`QmmxoAu?b@hLyPV?P?OKhw#%HH0}scuS7l*Ap-xY1g2~yEFETcbyf6gm%Ao zKb2^PEJP4{`p12@%_DAi z48O$G=og_TQ%9%^VI|W9S&;QBUIUTf;9!WWxj_-1_TDemlFJj zj0yblgzcc?;~Ga2pf#x7fK2egpC325xvOBy70|HjtRKX-YoMLM1`F8Wi-!8o2%qGN zJ?~LC&h1Y&un7tX2&63FHy{ug2>Cgf1n~725H%D*gVY#Ms||?6!REBUkdTm|AOVl_ zZx78!q+sJlR&MV5*(PuJ0t-H+GgScLDjWVZ5}Y;kGt05kjMCEZsxCO}Lhg8P zstDx9!X&T1!r^*X5DpGIe2d5Q(ahT+q`e#~?5P4*_7eo^f`Vk!)E=J6q&Eq8Uh=cC z!FQAtWoF)XEtCUDaJ3*sN0$XrJdmmY0|MB+gbhnz=sX|6H~f-AJQ5Ka{MKwV%&GQy z_ZP7?-Dt$Uq}}ZbgQG55Rdfv1fUCOm^O2m3F;BZo=^57T8yk%d%7$a)HklG=43ZHN zha-lVkFE1%;Da?W_lCqXX#zxcNGAWXZNoYx z@-5FnT#NPiI3?j%G1kp922R!!O;XpaPRTIGSEq9OFRm<~xJ^(Sdu31smgwG`YmQ%b zl8vM=!G&c|wWgyJ_05A&>7}~QvDe3M2Scy%<~ehNpC<}`#kw2eswlC>_`g_t>!>Qb z?p@dxL}}>|1SBLxy4}*<9n#(1q97fT($d`}t)zf}bc0B@bP1fv^FHtI8{c1NoN>+` z>d@_AbF=ro)|&I0R~RX>lle-8>;>-hs?|;3pY%@j)NH+jn@~>4nJeNY(u1eZD35r0rC9?RRWb{f65TjSaeFkMcOsc+q{R#xc2AAD;1<6E!l{Rt`;^FaGfSKICbH~Ko{OVvxrhz{q zSVZYHO4&=9ATI8!u#6g}9<$Z?E=vF9s`EI0f<%oPoh$UZ;SK>MHrlGf?6UUX8-ype zphE@eWuNbkvQ-1E0Mg;-yo{OVk(<8g-^Ry39mj3sv?F^YEr_6m_DsYqNu~49dFbKI z-lu4z-njzHHqEHcs~dlMP~BgTzk9Amu7M#K`;OWKp0i56e95=GXiuYO{2AoJE3b-a z85p!1Tx@~ae19f56QJ^r&Q28Lo#4pAl})>jbS#-x&4)PQCr?^sNVzUZY@5I6PQ)88 zOh2sW5(ue1DE%wgvEjs^BN9_i{e3Vi7*~$XdiKY{E-;xX=a3LPNYe=&OUPbG)h)4c zI}3b)%J(CPR9;;%s(9R!ARW7Sk)IMX)Yi8aI0592CmDeF!Jv8Yf}0SF~YW&ic< zO;T=!8wZ#sSHxxP@>t0gXI)uyPkGMFXSLZiw^tXYLpo}^_}`Wr^%B%B93`~HcwRgS zI-^i07T_%>w<0wbQb<`bZu%46NycqOD&t*CIp{O_ttB76-2?ZaR^vbXM*#zVD7dKj z%!}|&fuW6fmJ@bU_{K!{O`TgX$%Zor%nz6-D6aooquK(aSnuK$465(ky$jwdg}6t4 zY9PJ^GK8C@GrVXGgG}32SQA@L<@w^LfGH)jxe__jatpx`qKiDLE9uwBiL zNhC72R^5?eNRy16WSMb6F`6>L!;GUZ|MSV874|m;@x}b-6JAkCZ$e(jzwy&qwD|!+ z?%ci%2VVYEkw~34ty}eaQ-t_`xg}(oB>{w1g+b`uxt69TD~{fz2?i~)T0+lz`?Y11 zW^k2Efq?;!w~T`RXokq_%6^yO9-r6$^W+TyTGg>hmZy)<<5HhMZQE~{xxXRhsxxc7s3d>p#GfbAlGmVc zHGKKnI?MSPhUHyL($}eF7oA6n#s6OYuZ*bKyG6WCU)J0#WVYUGsAzc46Ja7%Qc14o zv78qwxaR!U>2&5NcB8wHAE5LRVCvJ;JXZMkQ+(Sba3-i}BrYDl6Zmm*-}LBJ4V~4o zfmsZ1{6Cx@_#PgbgY}>P#$m5ZgrIR%ZAs(AKu*p6x)I6u&7L)syVeq2C3B@@*6qB_#4V)=#t_x>l-JS}m{{?G>gofxYG zCYvusDT_IVhxAcLvt1`Nr60bbUUAaDbn|^~TFiAk+@+}B@@9x(Dbrb!l*u#q+fO=5 zl}m;*!VMct8{abMc|L{D|KaSk5A)u9=+x8t`%KH$wVn03BjsM(x9o}!hn@4Xwo?1q z%@y{vcpd6Nbe-e13FZ%4Qyb3{Cc5KStbH0SO|0hJ4uyohlF8$l409(6b(fJG$=sfi z)$)8RoMUdbV@GyoJ)0ZwM+@F)x8oaDH|}@9&FkvcrtS(o4qnG4!Xjl(;;NiG{>HXb z^kd4^QA9o{?8^Gj`Nl;Bl@rHo!G1|}aW+*@&r)9k>qbFI(*rcL9r-pmc*LTp3=Iq% zXp})!0QFB{k#3N$1JKlg^wZtd1;Rw|_sarIa=qbx($q2yP$M)!!bFHgL;8Bj&;;17h-Z;{-}M9+EleBfxdY+^p$> zcW8LH5~@AWqCmCv=Z_6&-pVpl_`Op;eNxrYDap&jM@Rp)xCmy2r!b)ccoGyxaBzdT zRQX^FB$Ng}C=y%i4@!R&HIEvUcp;@tKUijD-%p8S!}!C&ZeNs@cKabKc4-8w)Mots zm-gNG%4hj>t(%*n!)=j~1jlk>t$&}Qb+{+I5z$@0tapw1!AF= z;VIvEM^SUEYJ!`Y;)KM3+WMrRCTt~0PzC}MZUBcNoBpr%NGC3t?;jUj3s zI`wBltgo;u?SuB$LR8pOmG(~FW#y1?Cz?_e9j0!MSWo12{!m6m34HtX5wvC$u+z$dz>GPOs-UT*Zy5`$=*S(E)y!lP~URvLW z@eO*c3m)7iTLK}A^ASQKIy8G(RO>Z!UOm0NF;CNB zG74kG#aYIPwuRkT2CenY&7|n)Yl9F#yk5lrIKBt^j0xaO0JXst)(7b8=Dg17pXK;J z3po_!!$1Jy1cpIp&`t1}90@S~93F-izWpp!9<5-p0~Q(R5&M!jU-I%^z^wr^epkz_ z<_(hoPYh5bT|lv}GWUX=eGaZ6fz^Dm$CCAZ#N0k+}9!opT_rTsfq=XPQZGYVp-M)&qjM$~g8)*iRkgN*&L_ zeZEP5=#k-{VcTatLTI)6-VpQt5XldPnO+v0`|O1mD5)AZiCa)9&mcWN&)6MxS%X8 zFOzWE`F6UW2g8q}A|%uf^yKpLJs=cVuxYSZff@zeTSY14p^c9b=Y^pO=+Kz-UcK`9 zgD4oED$cjIx|$of-!G9!h06BGmRYpFK+EQU%>UU}KB@kK5#{U<$CrI2dR|wZ8OvX7c{yB$d!@(cVCV zguR$m`@t#(lir>CesNq%o*qh`A9PFN^Jw7Y+?1E6>*L9@u+Xx~_AquWTKB#Yi(L>$QAdYk8f$ z77XiA4G$Y8UAN+b8BuCX=uE7SXZb{pe`cjiY&AGB-YyCM)M(|VJ(*i98g{^vhQ1p{ zwf^+pIzM%BKdm{u4T&q(d6Hyd_Af`l54NuW=yTM@iY(P;)F1r@g3VR$juh^^w^V#A z%62b*1@}=En`{iPn+O>OB3y?xdvW+7lVbZUZ6q?SV)}y^QL0~EcX*D}KT1X<6mI%O z)_oNHs=HPo8~FGUJ-5ESvfmVEyxDivta0?@v2f&@iBYJOxVqlNlrm8S_qbg&x~n=L z&k|w=n>v=+MCoXpIJcux$YL#1=T zdJu#<rW%-0Zqfg$Vfe#$x)593DWFY#bcpJv|$s==r_t0wQn_ zeBfrYfo=!TFGlrB0I096f9vnXL`A)Xb5KU6A13>49UbJpCmxp|PyW5Lv$M9w38Kn` z1cEY602g?9c&5Qvt1SSdWkVE>I&hu=zU&{swBi`F2uMK^QRlp)ZD0T-fEBnkq3fsA zxi}~X2Phb8LR&*aM;A`WE-fRo1E(BP8Z`O6Nt_iKHvoNxjs|Qo+ZT2Ljx}Ibd-W;} zZ5fN~+NTG)%14jXn&~LScne{c3wk+FasX!r;62Xu&&dIBmJWh~z^_-ytUIzuuJC40 zXwMQjlDfFM0ws}%%R%%Bx*8;aoumO|#QhLQRb`7*-k# zWTvFZ%YfY_SWB9i! z6zE8>6TyEzoF)4xI+OPYPD*$E!=JA{V3W^I2^)VZ($-UEMTlyBJg|(2VUAhV%jWzx z#PXsbpM6M$0_*DRn|nYETML;GGlsvcIXB~rg6<*2RHtwpqD_WCkE?SovUNdXd%*dv zw%SGF*a16In(vBIMsjGT(T}{;d;UHBMFvlNF;i7SiA!?Jtr-Zr;V_XZisku3R4h|RKuz`jO?wM;F2!KmEKvhZzr3d&y0v`(|XhI8@`~Cb# zX>dThySM<$^NBC8(!xD6i;GDBu*AowIkZ%vG*V)%sI~w594E9=`>_$b-DfY?*FF4< zgrzcDp~Fs+w(unGn(5?lOKqagGj~m~i^>=z7oxy`nx6`>j5T&OW~ef2!?aS^QY zY_x_k)w`3!-_0bF<4}JRm3DYOlKO~aK+v{a)}v}D+&$P##E)#XtS++Rs#oIb@k;t` ztD?x7p=CvFF?0M$b*S1}K~tfnFp^(Aflz356;^!8N0ly?VcGFNWBX+MRCn4b=3JEX z5R_dcjTsTo+1SrYRt6S`AB*}PLGJc_zVjK?l&#-?DYC?euKtZxeLr>3TXU~0Bqzr$uZ znVFFRI$IXUb;YhF%1@HZ0K$QMeg{SxIoa8KZU>@f??9PV091hMCB41fr&k6989YqP z$b^JCfC*s{^1AL(G^{0m12Ev9i~txxfrTAlVz9(vIReuNE41$o6L@QYH^ayH_*(cH zz@ypO*qWfZf{G3#L6Tx(a5BkANW4Z;Qc+<9*aF<&K*k6D=cmBQhgH0oo34Gdw$W0TL$JjVZ#Z$f9Gy&r(GGCMR2ZDd6#Db_M#pS(I z4lT}9E@_TKo0bSY&A0rFU5J7_HDAn+h2UQ~ADgJZAn|{VG{QXbA;EgX=WVCZ7ea-s zix`z`%*H~8NS)zf=Bd4cPnSn5dH7F%+qT|Y&1%SXRXfhE3*0iKzu5ac{CA9b;@%G1 zZ<~PZ*&-kMd+&YFnVDRs?t{Eg1PR$#22j~I$Ea^^mVVWy^YLa;OjEwi(<7Y30kfi#AoP6QQp50bvhQR0jYWPz z$3h*r%e5+zLUo6yIJrlMvm-3~^6re{6QVIeB;-z3dJ|gSrl&pv=pYis!7&0`O0iNX z$v_(ebOQ2^9Ke9xtXeEG(PVH2%W&Yne*gY`a4@o6Z*8s7SkKALtqz!?Y?@ne;DXN! z_*%f1q53OmX%*$<)VS^&F&y(N@PiQm45k=ieKN#>GkienJeVuN-MF@~v9Yw|hn@iZ zr`Vd|VMTDY`S}xwUNtqx0CR)868-bVT9s<{vI&cU`5RC^j*cq(M*LZq6}gFyfU_AY zZ{X~zH@K7~CMNp(i_HBnb{6F=gv$iCpU%$vWMH>LK^r4Z{*huT&}8L4*#Q*f^3>RH zB`;rIF9=boiN3z#sL^p^mU{gQs8}Q59(O5<0O&>Q3(tT zG&PBQ1R^FcF%YnJU672)wJ%a3(fm8j*3?6%wb2sSA(`rr+1qU&hU;jk76VcrY<`j7vnw z#GBckvR--ke9q5P`h-{AUt!odO1H6Wf}fK?f|l_AbUdO<`R72a|icEizaY`IJ+cc)HC2 zi~@&+)yLVVhU>qTWQoG6-+Z*Wq!%9PjH`ZwvEEUK${a>L{9>Y=weTl#-gxt35`hzU zNm^~M>c*Tj&%-LGY{nO0NPXI;UI{r!&6gI5mJX<5l*10$lC7}mLIOpdwuF@mM+$|z3EUy@ax zxjW>MS@RSW8kXj`CmtfwxVrNN-d1aReKT8XlXM{eRqymp6m`JSA>o(JsziNWV}@-n zi8HWDfnp1cS7(wC@hoy*8xEq6qM#e$R$md;&>(atV|^>2#~=olGeCb^<%UBIDxs+< zcjz0(H#=c^8y$DGQgA!Gv$LZ^8m9T6eulahN>QXV7!c2Y=R)<*7%)LfgEIz%GP;8B z2UlZwA2|l)sFJysUBGTaJFlx`YoP$2ul z`lXx-q$Warrg{Iad9l30b_1)^{ZL^n?SdCCUYNo}B-b+dai}B}$k5^J)SZ{RzeVaE z`sj9-9Ya7$irzE3*RS8NPBIA#@AaF43pHenT!6t5$O%d`YrzZyot2d}Pe%}_BDjp& z50Q|-$Q0(Z@R&)G*fB4NQ<}s(t}IXPk?Ajx>dixT_$h+KT4jSufx}i~3pTzysi$tk zPg;+uM&7SgaPlx?ln7ASoW84Y)~T{R-Qw|j%S->XgzafF?0@{;JC2(R4<6GZleNtU z$#fo84|u9gdGPH!=2k>optRP{kP&7^3>n`lEn^3)gU z4pD}m{eFDXP;>q8y6^o9=~px5QQ-v%>bo37sATiGcShf2R*MbXcwlg=B4)p^GO!aj zsoSN?Z0Wj;Ei_kob-3K8a!4H3Xq25p?%P_Ik>AvMH|Z#04)uE+vYIe9Is)+ES4Iiv zMon5TOVi6@B)_IM?dQYB#3U)CA51qGO>nVLr{T(;sUzxg^=JR?N)7+yWz3R__v6cv z4s&q(sKS$=ir7(}y%=|mCJkpixomq%thC-v+7LryO&Aj&wpUPR#2_O;@e3URc&-eJ zW!`{P6?UzMkBOP!E$O3G`PZ}bxjh92_bkPPkyvYN?P))))mGJKb9x6L@Xcw&d)Ma30G6O`8`#&(_a8KYFU2OXJ2V+^H&VgBFIemJBf%3s zzNXKg-$2Q#ipQ2%lzXDvNw?Hve0)rISQ;rxF;8rG%jXS1l5pllZV5&kXv8GgtrV4U z1NXv}hr~&@8geUCRBAG+>6KZyxw&7zZiVmgjFQq42G}6&H#_g_4tQLVVV{;Uq)=!F z#=mfE`dWifl0t<)Rt_leU`14x@)BXPKAZIg!XjS+Kv3)_3G%NXk%Jg{Im zH&~gmttGtd9#l~oN1r#zDv@t}gH|<~r(1rT{aGG$gweU$L&7IsIj#4lynQpggtfN< zJ{dR)4RSa~rHyjU5qsj*x3IhY{hC}>t0YylT-VK={g52frtgAfg`}z3JRvynJ1-5? zMKz(@`-4;}_PauQzVp2FmEQ#$;Hiwrdn?Xbd0S(4En1=H!PD=kS+9`NSoOCu7!6;j zb6}8Ap?0im5nJJ8rKd9kj17)j;EnJWK@1URrL*EFjX4niZa{YRi*jQNJ zjPV1qK#Gs=3Zru&lK`HTgfIwl+~xp>W0=lYOnbE4q=9*X}*TNc`gGSA>k( zm+E#Gv?zG$J|>DV>Sha9D?-c6vE@CpR8SUNON9_MOVIgJe8Fth+oQCPCg{TRk~PcissxFwZKdE0Rm8)~JcXx6 zNKa4%o57%|Lm1AlU5s1Sgvs#9*~-w}CO$yP{}g=XQfZj3@cFjo(ay1l^^2zIZ@sT9i&IH;G#WjTPp^N_P1EC` z)jUqt&Sme2`{U2SEfUyE;~T)U1|Cp2m<-<^QjwMYiep|?Qv?3}EWw96W4QjUP|CZz zgZ7LY92l9HN?}z3p$Ymzn6g9a$ZsI>R8>~OS?#x%dY5V3f~|TKHLeFzb`U_(hQPBo zZ+@}Qc>rhW_vWStl+3{1_l+ni*@1ZrSaICCbqgdSaR~{uP8z0j2FAuYSy_&7R)Fm} z7}_Z*D}$TvKfXHn4?pDOEO91M~%%xLW+)lZH5gBbw<$klwUO0m?S5q=-s+~`&z6AW%~TQEy(BR#WU@okB3B< zad5bU*S$WyhKCoS5?)@WIu(Knxl*q^2$(CNoF@ZL83ThfM+$q4g^Zsa$hoC zbs5k@!RaUFp=8E@U=3`F`eO*chYueL-VSJtNrd%kUD3XC;KV%QQt6s$@CJp~a9~S* zf!sISHBl;x&C)U~wVkNhYKDZ|y#R~Efi|#|W{@30Och!yd-MqEz?2NdibTp{vAu zq2~*x;^5;CR(@wQ&T~*U6{}THad9PldjnV=2L}iGwK+{S5XPXc0ztRT0pLT@ zvtpIgy@`tpCkIskSYfHDDJdCRSv3I(4bBSCN0&KW+Zh#STYxL(1c4A?>GWNEE(a5k zs=s;j#L3hIbS0otm!GOu9hjV)mG0@Bw*g~K(6K`1LX^c-xnjcbkU}JIwctYF<;8M_ zuBm@co2s=EmL?`&z)u|tNWe0#3vk$Vupjs#(nP&5;F{^dWCAV`210OTffv#$g@3Y% z$57Z#hhKeoiq~-&=U*_N8{J^W!v`oVTgse1^wq62nionhOA$Yq~g^^1ZXhj^oJz zTN^xDCeG6-HlW>I^A;fqvuD@F)Y~Ux-cK9a!8i_Dhw-jSLr!4G?KVAzSw`Lj_36H) zjeNN{--loC{WLrVq2ZoO1H`5QuElvY%l$#rdeEr3I{R5{5+Ox|Jq)a!?&t734idAyGt!p4>0LI9RQdS|p_g8Q;s68JA zydL_ta3anY1LizMGm-i8FDXSyGUNrH6Cu13vN)JvD+cW~jN}2;zOB)I_S)RU(D z*h`r*ZlY8G6bQCi$CKN@6tZH%sL}X`BgKSqTygy0cU&y>a6)AuNB*k}Wor5PU-4n~ zSG>1xoT09%yxJvwQ{|RkeXu0S|MEdwiU)@;j*m! zlK=fh^kC?E3JHrd$1z-|pZ=c_tbW0=fwm1;Q~$Xv z_~b7GkU%V*5uO|>qXZaloU*&ln~(gJ|2wMLS3%AHzQq3>=L?b7#mywmK3jsqmF3SzvQnbbYMu)YkGz6kWe7K^%p;{ovjr`Y7@gGi=8)@7>Z5&cz?TkyO)UiP%vqF%I|F1w%K^xM4OyslO#fP1MB6 zN?#(qSrwxCd=$oape39Y`vfXtFrmDJf0sX-T39WtCL@f*P4<`+`(&IY^_q?1$|K{m zu`_YQh12*pw^ryOS;9|ujew9GnH8=E+{&j{grDuxGRvAmr+SIKeULaRG*$L@s)=(`GrIIAFVD`+VL1+cciitAFFdeUE*x0TWlcmd z*@K#`x3`y-nOVKsA|3)npWg(L!U3=(VxyyT3ku*P_ks}(2hp~^!PWa*kgI|^LL$m* zH>V&FoRvXW1})#|;F{O%CMY?;BN8Y)6e82!;6M&C2S90J-FIdx!F~zGQs5d7$!Rd% zz0P&{_0`#1k3sVdb3F9DIFA_Xc43SPLu%{`2k?-)R$f5x98~{c%@3rlN^qsV&V2m| zcir{8_@OIE)WQ1^>YdK6E>i%enU|~Mdna5tjeVa!B6DcYy&UsRFF(V9F1ks_o1a_D z7d?(~+?JPr+cf4@Jo>y9OHXH^#ER7MQ1fo#nd({3KQt)2%$!{oMg`xWGc9M0yM9Zd zMHh}Su^&`PCA`IqtLVA+EwoN7DETYs3?@$9(=f4hx#f$Vk)>6>X|Z15>c9VI{n=0br3l9c1U|$y`fuc)sf>iy(J%i#Qk07RPRbp=XKpqxnA}gWU=dL{$xbymuW6))P-YEh z4B$GR?o!<9c(8+<(oxW7{6d2hDJ?x=xgtKxUqQlm;O?!;ZN2L12TSXiB{K@iebe;U z%i8@Q455db6T7HXUOJ}njH6BD6n=%+WcqQe>6c_Y-OT!zFSVWHlNElU!8!RMpz~C8 zgW#rEr2lK2@h^o2R|-wTg2XW9U}TgD3xM_jY*ixNn*}h#J7H{UXJ=Oj>T)n*f=t@$ z&@;l%;NnP2YX*r6;ARcDF??teqM|3NLN|1f03!4Cy;FDvDNGJPtODIa@V$uXYlE6# zuuNM?1;Gboc0ef%1D7P29)n~YwvsZK0|V3zwqvfR0K@ssgEKh%=QUidV^x5^sf1ge z?GjH>Oi=COJJQj^+0NRFl=hc4mOS3Za_y(o!dCwbU2uQ?cJBdxQ4+n1y*Hj|OtsNT z_U_UBs35}sP^RiXH9qRxyoq%b!*Yhr#{zJFqy!yYqn25c>~fYV06(wb>pPZ->aEmqSW*$ue;zc8kTN zIEnR(!xb2)mA)~pvEk*HoW;M^HnMRa|A5;nSVVnRbAG`r+qGnsUxh=khoP=#KszDr2dL3Pue!;$|t*pEZb2w1NfayQ%MSonZt$BO;`$0tP1n!{u`Cvwe zo!E;LssT?xN-$<1WHV4hmJa|NAUfA=gFoi|l*?-Da;>d&9QMSN@%0<(2Si2Gg>PP* zN6B#R6gL}U|E!AsuFLQN7)MLSDXdq{UM4HHl$J!+C6Z+Mbdg^1Y@$um-DAGnI6ws& zBT89td)Y1G69TBYdZnKz?@ewqL~!-i{cUcuFituy!=Y&OKC}hZ4A6_5NW2wrg zotZOzIrpub>HnI*5<&|igd_cD>dW6LN`6~SFFownv*~JingrH`Eh6rbQ5-6OLy^^t zO0$6;;m?Zyasg1MqA@R=rH5-*0w-AQ;?%9Q-MY6tzRi^ol+{elgf^OXk8enn5KNuk zVuVp!zmiNBgK;ihfpnOz?lXGrHTu10=mDo=ZiPv=|I#$J4|Ig6`TadxK z2Qj$_%1C4v=9}S-$`n{!;>sNeu^CZ{U!@01xoxm(^0K4E`m3X{$iHeiGuaE0VzZI;Nybo`ey>LL>N7aB!%8nglO4QXZF5u&Llm z2KGTYXza+Z?Vv$84_iAHkezUG{n3B#pF&TLf{J>yyL$?>4>Pm2=ARJhfPs&{2Hrz% z2dlvP&?8h(P-s3|FMuqNYqp4x5G55A`89EeABN8mstMRYv3CB2D)1->2?!up9Ypv< zBqYTJ1@4g0;rkOjRCqu(8FmZcG$2ch2ns?}J>(*S{z@d=Z5g$aPjp=uptEgA`n@(y z>`RIV=Ugt6XXy+&O*}?F@O15C63PwCvCY5QE!fopp$KxuT_BJeXhcvPi@3%SC`$2>Gu4gNbDJzxOSKCA{jk} zn0GgCg@21xNAkz+5+p(tZ8a<=sXN>ErYTQilk*L>nv62NM3w1gCgL0AT6#pEbx4nt z1}`|i^h)fu)Ci}hm-b@_ppVwVS`>)ly+T$S;bWV8{k$rV;_on7c3nR9DXqx%S=aX* zLKAAiFNAVpF5#C6-@+=RrzbTgSZ^M=!PbY}<-1EFj8lHm5X~5S?HxQ}Q4JyAva&xR zxrCUQ7(PTGyasxj85qELJ`>($NYkvTti;B_3F^4ES4O}+INsY!&%;ARM)8*!Jp0cf zb{Zz*&kl=-BDIHEDr$AmUTUD5lzBuuM!eS+(%)EcZeHAasH9KD!9Z$w5tAsVfU+{{ z{p_U^iArQ%Ecwmwrx?3XIW6`SP3JKAKg-oE?Yi^#L&@gKS$wb;#o?W3%9pS!4KD?L z(fhDY!);EJ;yn?e30X9in!+g0D07a+Oy7SOTuW9pLRpzG?>ODLH>75%L+XZSPy%6t z6tx4Q3TaW)Zf3)j#(r<2ahgFB5`W!#F{SfU1x8_DE{Yc z8|vn;UaV-=8bZ%*l~-D4rbJ0gA&twscWYxLNePpIUi-r#+V}ogWcFVE_9KKzNX1RW zYK{b>@4$Y6>b>>hUKKle`;F+lHnI0oRA_7;uj!s@7FIt-rXT4{Y)MeNSz}N{#Wc!p zX{HQ6d;>dZ%t}Rz)DDxskwv_>QWq*C_dFbp6KoCe#nBhbQe=ozDeD*zJ39 zABR|n^P@Tr9+!O#ZoD9{6^>GBw?N-O;ul+Y9Vl<9}%)`PSwbmy#;R=nC^nqR|`A?V9Wwki!H#tuDMK5 zz(H#FK!haKJ}5Uqs+lvi24?SIR2Pww61|fSC?fL83-H*7m}iguUUpc>o=_qHoc8G9 zLzvq^_3a43rjH(lUMu1t%@YRFYs64vY(^U9S6$=H@FPheFUV41p#=`oL+H#||J-_m3YTl3wS2Fx)=9w#54h z8N+~5PRhLnt_)B~(WhD#c47Mia~wXzHa`!5^N2K%nOXrn336p%nSxy68fqe&kQN-8 z-#-N-sq2nJOKS#(1uyLuMS+ph6%7=NHuVgX+uPEwfXxU1Qi)c*GMG8qEs2A|0BUE6 zQ0n65HM_3XQ zSL^tc*c2*@*#r^*Ev?O#Kzn>VL?B!Rd)WLoi{in z{uDA_rI8Fo6>{q#v@(JmgTF^!!(W{1nQffb%4F?dL$Xm|L7LYch=c=aVWP=M5pz~l z;Tu8*zrKUsQU94-N+V$g0!fNk?`-V7oh!-%u1oIh_{>mJ|zH_9%Drf=dv)ib4W z;SloppWPq%oCc>m=yI)4?LHR~St@Am8?D6~cO*Qp)bt4%$ohbd^fPSZH0}MvdwAbZ z-zWjMQ%rfP_U{O8d9On>&K-3J)1C3$$3PqlQ$L+rOV;|O`w!dAS6_}m9A=F3$fH^w zFIqk>bN>qdv`R;`{u&9{|Ln~BEt!UoKq**Ifa3n@QW9CB5Dbv>!YJ1(31?9RHEQAh~ium z)a74NxspR{0)#O=BxHL?#^Uw&MAVikQO>d4oY>TR`sZV*c{q^#0- zp0Iw^-jOt-i4nvz%E%BTW8!k@n<>3Hd5#$*D%em`gqrm}m|T9p9~UVf-$GZqjf+f+ zT<4;VFVAj0r_8;3DlwFfKm*R-T6e>xM^`vi<#{9cjo$Yl{!A!Lbx%%7N$8r3tAASw z_T`pPBuJ~K^$~d6Iu8_EbcC7N6~3~vygaOk6dpA#t>n%HFv1PKyZUO97TZ@=u9vV7 zOHQ>HfrKpM(?Sp{@YaSyQ5OCgcu4>MQO+#3%624ArRVoP;M80uU~CIppzgF>>{WR; zotW=7KQ)23fKo=_MGH!V$4xU6D{t!r#GXvsW3&0aaNN<<9la|oN67zlV^uoWlA52b zDa(-AP_^V`6&@i5jg?e%SG4m2x~0drom0o=l`&-WbWEF$?!`TJ`FksTWEQC2$Gz`% zWOxtDhbP%v)qEsnpDYNKjMY@`V~gI&vkknHl=h(|^Ba{S=C?jk*6*)&q+fx)DeFT> ze}1ukwG_VIAd25Qb-}HhlO&1#W=n$Jh9X~`E$6YIXUN7uWy4_waA(4wxrd{X2dOY6SyH*XV z7WRJt(wU0Nvun~BymSs^!NX}eZ^JRa{zMf@^nVC15EkUC!W0r3nwXHlWj3WJ^famq zME|f5U3f?m>lvypG8j@&(sOdg1E*okU8fh6mUa+qSDrDnw!6FAB8Lf6J)p*b7sn8Y z3fS02hlUiuEvKdBH|$8@2mu!EunJ)!DJr%$TJgG}sH&nT!HTcMYGv=`gVi-x$4e(S zq_k|DzMU@0Ud!ocC5a4t)M(ppxHj&Kr}oZ&40O56?9+p*`9){6W6A#H7Qer>b07}ZLXZ9wtY-qpoMAMO+KoBt3% zcOH+dsFWd`jh^@>Ons@1DGc#AI}!^cO_vo;cpzWl##V9QX~e|9V)w(*wl;)N8;L1l7@!v~2kb&0npam3=~j zw)=aKUM7fJQ<$6k)l0j+wpK_`uykS*PLV>W7!QKXp$G(OB7Bmth2Fj81HpVC}fdY1Gq;GDz+%ar4Lzjj@K3^g`7%4feE zQoi@hW8uObq)Zf;VlJsM0#7&~06kPV3Jyhzsr=z+ZtKt)IS5x<*eyk=fCUMmZNycU zW$BQ#2~4Wpfi@A;#U?f{6w6LLY$nU7n6~drKEkibEg34ad2{OM_<6= z-`?JCaTf$e4LDX_`@c0NvzjZ5ii%oUF+_D?YaeCGQn!p~F1}XCu_D`0ik#uF>qM9m6)c&KY3j&M2!H-hHwv6n?dMsAa=v z^NT|gb7*S(qgKbE@67H^Ns5?CWb%G|YtJmF^QUvc5{o!g$f{5N306a4WkpXsgVFD1 zQlO-rnMVdfKfcvjl5nqaLu<26j>#>;r}n#+tNeaAdJv%B_VnQcE%+N|Cf1o$$E13v z>msiM8!XcoQWEbbmMoeT$U@rnha&U}@?oR?UIbS`Z$`7xr;3wL0VWfElvS*XTRh5W z@^W(VFew4q7TC4>2;ecj5dgH@21gjEfUp5VlK?$XOKWSF0drgr&A#7l+Skdg2`7{w+f#$hsf3!Zglh){Hc`0J73T%`VDE_r7)lVvzhv$gJX^`zA zRz7@VU?rQkB?W96_Mts*v@bkORZZP>W!0jYehv<|g4oj3_%33T+{C{wAnxOHB$__) z&CI3|yJRpCLRoPk-flg|y@ z`ie8Vb+x=%L9E@Xp{=-@UKdB-^6wBmU>`wZlb0ygYrJHNvvuo)QAzn(Y_6=i5sLpr z%PS-rxxnfV`3d5SFXOWm8YKa&Eg+cCRvxr2!!ybE>6{PCYKDP9q{g=ZZ|y3_cNy1b zEs@5FMKk8hhiM9iyPpaZ`s@iURrmx z2QHf#YwuKLY2E4X_j^_I)uGmte)@9Wywsf?>DtjRkEyV?lKDiptDN|RW=ALQM+U*M za#S(mDLWXEqH=uBPP%xL4UDZ?A(w!E^APZCe`udUR6!z{DxL*KbzmT10)NA79iFMK@G9;-`=>mxQITofvFd`8o;?t6%{z6b{!%;pKa|aD33<>QS|R} zqIGF}5|~Xx(sBoQ)zVK$w^9A>jKqH8jfU|8h^rtUv#xdyz%xB( zgqxbFuD7fA<}Z;&e`y^b$#JgTxibCvA5?QUx%AjmEKa(mPt*@+JPDs}`jtFl!S*E$ z`~b#a3IR8r>RM12v)W&m;sP90S=Gwj?XC8@0BY!NH0|-J-DV>*2YoHH)AhM7#fuXj z=d#d@qyrJoKr|Y0`uft$olr;J`DS|>A)TI1$juxrRMR5_t`TsPC~t49tp!?vi6T5O zAAK$;(7=$n(;=6okx-j{4u_>P%^%Y{)6QqX~u@gA8 z$0;^FE@&B~!s?dszwqo?k4+{ec$K-w(YC1 zMlB?jc=3k1wgQRvzu1l}1TzcZd*|DT4OBJg7}5r!=A@xzsxazRFE>E;5kPwM=&?2@ zI9xz{z&Fs-ft3mTSq(f#fL6fh8iL`+;Mj!$Ba}MV9`|;&VA=qf6_(UXCZ<2ob^$^J z0nTVBD1@M0K;!>w1N=*1l>%UX@BIs4b^#0YmXAQj02n+qz-bOIJ7iJ`UU+KiO;>4E zq{Kb~1Dl9E3F`UDvez*O&MUO9jsv7vzn{2cRc!Uqgm0%$z_)pYM1h;mQ^g8T$R z6hSkn_CR`hiJ^UP(7ri<7|K3~NdUbv4Bf0_NGS&ZI+K(8^Y?J0R}i@6FogqewX(Xp z$zQ*$U`0Xb?eE`qzfwhEjpgR$alq^z@{wF(wBpsd53e7k{T0rfa$UUuRZnBwi*s}j zS?A9OlexCWRM)8XJ0V$WsUv)d}05%m4&xTRl}l=uk8C% z$)t!dP01CVphH^>H%i>o^BXZBFF_Erq0{ReYYVSEspBlIzJ`-Tc9(IDXmV)seo>RVCGpLhmvlucs+n91Q8?L^Y;8Fl z_5_(5+jl&p5jxd!}iIf@hySZ4xH;ALhglF+MY|O_BB!ool}R_XNo=! z-ODMt+Kghi+k{3q3VNHp?s9nDJ$AfeAh#P@0qXuO4X&s3MJwq2d~8|5Z&GCa0((@I zt;2oKx9hcorw-;`&75dbew?$g$isSy--LZc>`S>Rv`v@>WvGL_y&&`!k=;g=5Zm-}RlIa8Cn=9y9lp5;3%r|uqiUh-i-#YcN8OmNKjw~vIFY^G{rjc!|H+^u@@ z>_N+SI!77#8ci;Q4>w7Sxca|t0Q5Y{DN!#23=By=Z?4__H#(kYI8T3me=mr=oKJhM z&3!9Piuhe3YM5iS#V1=*w999JuST?EGAq=wbQDCKa}8IM@mD#eY*VoO7b-hErg@WxP%ku^pYtbIqqKU;;!;u^St-3FQrX;k^lV6Q#qmc!ti4L{jIFz@09fa zc_#b;*+2M1|M}LnWxBW5;KTU$clQXn(Y*itTh}~~G4Fal`_H$Yo}uAArTouhrnp`4 zP5G~H{ePcM2bLRn<<#4;|JP%se7=4i`8hOnG1z@853o5OjSbvJ&GS(on;5(VR|;;X z+h2WLNN_*?Yk~Y6OM8#G&yMyK72}oPKcB)s&-H)k^8Qr6o7U}Vj^Sip;awJ)@}Uy_ zCEaLV+@Sv}mz1cf&#p1Q|3BAFiucnug~aBO7|HWM(>r!#cI8+WR@@2q8t+;C=F#!b zUGY)Q{Lj0`A(g`1%KzYuKac|3hf@O*0Kku0j<}T$Mz7ow<4T8?N$@j8w z^GNaHUVaiO=PE;eONWw54uyj4*=N&^9Zw39J1u3OSr}j=DW!F;U4=ziPLA3$3ma;7 z?5?|pMfq4n1ATqPut~#!bw6wo_!Mw}RRbYv$W*L%S)F%{OYCeac7S}lhQXqA>Q>pJ z)<;LKwaWWF@TiuOuEAL+y5Fzemd95qAM$*r?Vp{H9sec%WBN@bB|U?>h@Z8b^+1CQ z>z|8z{X9ZynAD8ZafO7MS$vd8|JPVd9r2a-EWj-QXG+V7u%s}|ihCGLnl%2F6Zo(9 z+y|bz-b#M@ir7mVkNIqMQDsqt9Wh7zqsG7F= zKU@I54Jxf@MZXH;G`odR_9mU^LUdC2H6R>hy6nm=JQj`&)>XY-e`TgKYJ>pi9Io%kZl!b8y!5c<18YX>bj<4sdgl5A{1UR~&%nTZK6)D>!Ku~k*hph^Z0 zS#4$D-$RcF7!4pdP|t#I3Q(tD4i9yD%j^~?D&eDFa0QnU1Q`uYnaemh8 zttAr0#L{qw*ZW0t30R~3`GP`sWsTQ$Jn;Syl2epS3Lk0_vn~(ceM`-IV4<$2LD#ST z++s{AH?f?(5@q&H%Dr2WH8(OCrO&65duQCXL`>qX=9XmLzTlx_x!C2jg?Ueq^M=lIv-I7*bV+EeEw-ZJ07tYk1zVI5ds3F6*rmO{i_XX>J&TP&mPg znO^~Xq7JV(Uo8fGy01Gw^~&V+Sow# z&72(cAH_`kz9%uWZ$48`M9~pSMm9V)|!6dj^df#8_bA;mJr!60!+Ht`>aikiG$9LlE^gJ{3$y*W#;J z#Zrb*0?f)q%~;9_ZlI3!_J(e}Sjq=)3Fr>5yFQGE&!2#Rs$)>J6o4C;4iFO&4Udh% z6dkN|&}|9b;En>8WDPV85QPUr)$k@LPXX}d=H&&U@HF&%ckvbhW!b*~i`{3)6DaAR z-30AMZB0#2k^nZMT5gdT7}!~C(0TlGH3!62l7$OZO9GQKwa%x0u=KEV)DeV-m;;kQ z(7CoXDfT|Iz#0D0w^YlCzVhREzFT7!26=m2vLnmYMhk6vtWLq^ng+OJ5IU|lZ4^<_ zJk~2VyC_-cmaLaaFUq@HTbuU&N_k#+w8?38s5{;aTW+4++1Y zp2^(KJ=(Os-%7XbPW?yEua}v}Ux;gy=zRRzuAwcuZDlV##ft$F3};YN!TKQ~iGgGX zLn9-YFvm3?a|?whCNj~`%>VtX3T|!?PsW?rqwy_0eGZ(6K)-VDo`)1IFgrPggpxH_ zV9oLU>NqGZU)HET-{=b5jrg*ZX4f*7MYk}(C=l79<9f<1-IXmLMJ;Xrvm-zKY}Y~E zluq%m*zx!QgN{Ya|yca;xoDkP>O^t60VmA6(8+h0)p4mI-(F3$b%t3#$0W zx^QO;?*qvv@F*dhKFzwDfl*Nv| zzq6{>_i*Tyi`~IuQ6JGWH|5S9&niVsZ}tSc@R_@Kst)sI;c>PDRaV5oWRgAU>Tf!R zm)o(`5}FrM7DTkp*dGa1C;0H6n}1^p>_$OWYh%0{b)V4%fyw39TLYxjFC66w)^_Iz zA3Ir9(?2RPIY@L^H+*om`w_?5bEBAr+(4P)cydxpTZ^%b5-LaNuT%ion_EJ(A93FO zs+tGA1&D<}3DMNl1apQ3=&+zj7BJE&839%jOv{{}Jb7Yau@2rT(AWXB4PBiNGE$u% zUB#t>y$_g#h{u;Nv<;hzDk?(IxxgeB<^$~P>`?8m{{5Skmj@-=0$48a@$%jzB4X64 z8HUFPukewP+u4zg(@>eR0tu&a8V2?~ZEf@q9_0Khj}9#LK_U#}HNa7?AO9SEuJ-$; zdNJX169joB9o-U_-DIew_NKi<0aMZ?XiGIHG3k_pE^#=hW9#wq*-N2lzxv7!WyPcp zeVZ&1esqtJM=#C9G9o{x#%Hr3IzAasfJ}_xOAY~+u-3Slet6};rcn5%>2-?{3V!&U}5Wq_SOj!E+7lLLt!Ey#V zJp@rx8v#>+KU;?|-%gG z@*^sXnL859#!(pr!U?6~j(O4F@(RmF1AiO`^?f-W>=8{8i=cK1^ZFRTcqA^vg#6J| zvvJb%O+X9RsQFq&Q8>AHV-{t+e z8Q8P}g6L+xirl^FBtO+S7s(%c^e#4Fe}p1)LdI!1VlqXMP&$v>cYNwV9d_T!^5Or znpG9&{^$T4GvB{|570?nT^)e^!URADJUcss(RD2>L0|^_{rhGh|2hr$p+VsSk#nHC z!ok7ZlGF%g~KB!RY?+a^A{yS8vQhK1o1`0E=O%&)ARfT0@7aL>BL9+n9LO4+Lz z7@?$`CIFAYZJZMCH$x)@+l5(Og=UeiD6ncElu~r{HL!ii$=5-43yG9Kebo2CFYETK z_DShq0)TN6(%paz%dg-VS_il&W#|YT)<8D|0)mi`&}5RopWi2LtJKIyMc|&Bnm(MW zOYun#2{mKZ6ZE?e9XyN3*K$u7C=un`ExXb^7*{r@36FiGTSSNk^#f`4bN|>B6=D_ zLj@N-oool@*C)yaPUnv`7|}&)9wggyFP#WQ^zuJy(q%zBNJ%w?&u8QK?%pI^%@U>k zgH}#2-co(*VRLm4eEXBM9Xshx364p6b`RU z;-e_2J*~={7CN{s8r)9)_CuD9C@Eb}~51*gqyq-?2>FdQ)=X^CVEfp+w95joD}RtAy;GaSoF`IEma;=OoNf z&qkf{A|9JOqMsSE)%q0r+Lxm!J3fs1goIHP{jy4Xp#1xJt8Y(g%(o~LiPYreJ4APP ziF+8WpOKdgC**A#lF|4daONL(M2MWW-eP|l>89O}g975@FMyH4lrC%&=D6Z1qv53*52H#HZ$t4a+wy26*Oqs~gq!xd+L3=MiM zEG)pb4Vg!mx)&%C<>l!ehV@ED0KNt_DFpeB!uOzXQC3zi1C$Ta#0A|>9ru=hUn2zSL49$l9ZH$iV&hXC@3goGZexN>}p0XkxzIG(0sxa{}NI!D!L3>yv%_u zx6lNC-@3YUcmfopcJx?h_x$V~q{>lk&0<~!!q~ya6e-8@bar(CE@T8N7(%7Iyo4pNE}Cy-O+%CkFUWdf;t1?q zpz!&8_yAO}hxGKo>SY3xf8Zp7@-`lVR4OZZ%9B8U3s{}Ej}O&Z+UL(jb}KKz!{r}l z@(XYUkmr4+<*E8>_sE_c3aIS}5#))oB1W3*$s9_V9;7q3<#~zYGhX$Jg3_ zP;E6-YBp3l<8dFzFnBcGZ}wId2YDjnsk&!u);R5v#_BYI8|0cdFf*mxZ16IeT`~Ng z-HG(~#%J^LFYTa&@b$*R3_WkYRd!}g(9|L8e;4na5Tz3Dmwum4 z7xLp!5SYl+7(l&*Akh8;{c;|vdeHSlssCLig<2XNnRBh$Gu5KOMZO0I)I1=yCg;yg zh0S1piq)ytfbTXVg2bc7joqFxF`r7U%KJR=OK$o!;@7Vgfz{o)#z*zjuEdN{%Y_0816d75!eVTEi+_GkRpABI=2%Bq=H$MK!lB)QkB%*vv%(MUJFc91Di zo6!r3^Q|8D{LtF-c2Mn)F;S#eL(DdPuDWm%=}fvbtxh5iG3{_xYi+JXSHTUbAo0T8 zB859fU!Kv-eBoQUl`VmSeCTDk*&x>NSmN=WyN~H3hROh zoOHgZKQ?NxzYekWA8vm~EknOS7~ZNWwci_~wenE1;IP19F_Y%Sp@AT6gg$?<1a;NP zdz#{;5Ap1e(~4E@kOoyqn!a#kbTIB78kRFR&j+R!uxQ{;GweyI1OYot8!!zuU>*UX zBT&@#_ru`f-R@st!!-lR5^^DPb5}rKxqVfNTeBK;#K*a~2i_{{G@H z(Sx%Z-lkSE^@HH*SP3!lSuZYPO(}a_nQmw(EhRaTCyIQtj%IGAbURR_nKCpJika*h zo!O!X`n4+fanr`z&>RWVMNTy9zEjJhogbi{AGBv38A>94Uh^P^iV#6?XfI~OR21jo z$QV)xpc_r)h>xFos{PqV>|#;PKY6e9c3V?I+>hmpF2l5MQ)3EDf+Y`V>I)*<>%w-m znlJ_6V%cKvl8}(xzJ0V&e^KYOBL-w%S=sAOP^azw@Ww8;m~h@-jfD*wqHv+G0RbYo z-(EwW6x%kl^52*Ax49Cn~WL*)YGypBzOILChSf$2gW4GL^1hlLx<}1 zKR&*2S^C{GwsG#Hl}aya%_{$(z!dv*ZELi%@Ev_F?Q;~QDP3h94B=*8nb7p6-0*GW zC}&Td+}{e6E=&zM`6ASvt7$W>Y@mp7)2jjbF7WU@8jgw7wqXjsRViM}SOo3OcpKIw zS4oUCUtZr5t*+)!g*)D-QGWTwYp)L)^~YOn(1&&kryf=fjp5p4rU$O5GnLJMbi5<) ze_@PcjrH_xWpmOyH5Z0OauVW~Wo=F0F2YKmi6OtDuY!4q&EwbY)il=1>+CrT zRm;+LeUyJ#ln4saR(4W~Y6CN()yD&rzLD;U%t=$H$`g(3$96h!cT4P~)I@$;)0GQ_H0egNM=c1y{rYutX9u)O{$Q49 zc@itB{ISO2%i6~E;_}HZxyTGN+;40zBXcaigtE%#eEC)D&>}8>ZASp7HRO-B;kNS1 zL79SNNA?zOXiNry=iRc_PxMTDk)%a~u476oXE#QorOBYWJ24Dynq~P`wT&$+AjHxt zqcOdsje&Jz(Ih89t53hM*FExQ))k=^wRictzjT$ z31&rWFU4&5?mI?(%lK$!c`>*X5fKq5!w#-rFr9O$nszxUtfaO!Ojmy_y+J|Au7{z*?q!u6C5z9{b#z zD>>#+J@-z|i<>T_7qVm-t_$+hTf;RQdGD-}Ul(YJk{w82FCFS)G>>y;@o(3S&yloD zG`Z?{f_!gIKL{0cKWYySo~<*dJbeP^p4BQEzu{)|0w(>-rzX zBdf>9&K6ebKE=gs024#M%bVy1p)Vl0dv_q{UP?u%b}3koj-G$Z-L`fzKQ|W^t^Q)Z zZ9Z+n+_ep|fuO&ilLeh>(IXYAEPuq z5V3$o3qWD^4i3-%ImU-_^)6_#nsn<$Y1 z4({t@a^dK2Tc<%22-U{;d<^skH5AVoZ%RgCpW^ql1oX5N)G!o$k$^7*q3m4@sCC1- zQSQFKC^T-PDI|mG{3+M*)5YRySC4V>Mt9_HF4uw8q3xY@Jv$z(1DeTG1Q92g9Fhp; z^9VW|A#+Nh5|$ZR7}GqFTppXJ_6vVK8b~h_XeHXY*-gLWE`N!=lj9 z#W+*dSUE1XjCfklE9^(*n6|h(CPer}c$iajXc(M1~kV~afOKaWQsj~AL?h?Fcfzx}Omz^!`{2+O7 z`xucv!^5Z0_=daN`g}cjV)~gqw0W+~o=w~RO-$V1)GR4Qz=9MXFFOni)@D zyl?`&DgWL3k%X;0W5;y8MK^m$|4@Ct7iJK940=%7=vwFH1H-UGGGV|IA~qG z6HeH_YvDih^U+X;MMZ(}t=-ya8309yhmOeJ=Y{o|j}7>HCI#Rt1V0pW3Jx}gh3q}D=UxlF8y-&cC+Tm3~MKla>yXzJuK|!VGrg$#U*iv_jMq(O0HJ}S){ZGLEtrUI%oGKgqxO5Y zK=kV!wMyZ)27Q2|>(q(UcqUoDnC&3@+EWyUs_xRa+P(!9Rbbyx{+ZbEJt&88{0Ai3GOf zZ9*&6+Ydhb-buAr@uK&aw|uB-hG%_-s$G7qKf~ui1QQufvgVc&mBqK*q|gjfbX2tK z_=rcvOL1JP2_`=RJ`fLIY6OOh(o$2ONlKc+hus!X!OS76YzO3Q(8HYob_#Lb-z+9f z%*=3*PjKYJ9Lb9N)srV4IsyQJ#>U3Nhho4M3%3Nw0Owu7g_Dbcp&h(9U%q@yPyYs7 z5J0CG2u6Bfcm^m82pPS+ynwC=58|Lf!S_5s<|vCnwvMo8WM;x3x_nzv@ywIC5m=eGT0U6C3-| zv;|(^pKvOv%srPbYakkf3)^dW9@sg76bB?rHf^8vAD4>E>FH^BG}!7vPR#-tfXM1p z{RIqCE$IH?2{9n*?&8{e5Cq8k1z#fR z%x;-Q_g>iwNg!8q@WTt4_~mr-oXHh!AvXC)^<}-9!-1Vgv>IwYH87M|u6261xx1vu zPi|?znG$25<$6ne>pxro>7yq<^lIyRvbBot5XobpAT00(d3&Eaq$LsxWG?E`TGLhr z*Pc%=Vb_s3Yv_A`MQY#B(4zE_?oe!de5FZ+iMTNeBB3Ec*hyG&r}$l)&`)0Jw=tAA zFzuHj6Gnw*x0xT=oxhY`=0c@QK$nsHpaMjEEiDK%cr$1G>b|J_5Y=_nyPi1 zk&jz-l%b}u_W7Ah`aRg0J~FC#o<4fx{>+U8AgDA?X58Ag_xIjxF3(1zy54es=9lM_ z2Va&GSl2w!Yk`jiqvq4IgDKcp;e_TOm44;m`99?{8aV?HVo8VvnJ( zUeMCg!u#WXfx# z+&?X!f53SMWRjJoy{y~LqVMzme3^dy(?>zuzoN=Q)$YH!RwCsNO}K10p0mky?=^ul z_Am0&2dv2(B>#7LQUAL%EHQ0uP%`anaH0O!^^qQLA_$nOSWW~rs93)HwduEAW6pnbuV{ag%+RXP1iDJf<|YNy z_Mp7@Z_3mqYwGnC*K4CaW+W#cn~J|U{5gRY+!6bz^i_rH?*3X@IrCRl9V(+f;f2?I z|6k*t`SpxsmU&p9(~!-q^BHM6SnvJ zB_s`(>6us;RvX4|*tBMaRw~*qPIMxv{Ogi7OlOr_4w&fa?CH@TRRhbVVSu3nkN)< zw2MQE{uN7UW$-&FDJ0GB+S>K4ZYGIim-c_s&#i;Etuz(A?jzqFhSg-_V0AdgnX&G; zRkgWyylr`tKQAbzyS)85bVKtz^*-wn&|TdVbp;2N#CJ#WVR+$oxViIt0w$2`j~_1x z=I7>O`KVO1!vgTZ0Q*p;AB*hmGuIwaliu`pz>xN z78qe@GkWL1To95JxAb<~DJZQT-eCQTdgTg8vRdDz?+(H?*$dktkWK`nTtRmMrzvcq z1B>~AZ(xD|B08XB*(`L0M@5Z;$g!-9)8tSSI9bW==h?ZrigI$F*bF*gZo+a)3P?C` z=R`(EW-Bd20SFh5jrjTdUq(Fw@eAT#ASALYmYwxhkWL~5M1ploc5rYvfQFCsO*NK+ z*2+s<@|A!PhrN8gl_+YkJhvl)GF9V!QgD}^!Wa-BZFWv^bUg0v(i1ZbuhzvWplLl<@*g%>!{6Y zp2?dJKF3VP6 z5}Z&+fdGM`+|aWF4i)1SeP^{SM~$p&Q$jfC_rduD++5+%LphU^O-e`r+m%^J?1J6^ie^Zb1G^dk)nWSV zl>F#bgrmK2E>_uU=Rt61Z++5CmVXWQ&bdT)zM1&&-?~3a>NXgtwjTcVG@>6u zZq%uW2Jt?|INkdC=X|B(o6MK!Z>#XGy`!?OK$%TpX8tz|PRnJ%U`|~n{aYoS7URz2 z(xI5eTt!hI##3@!@zisAY!pdVz48{RNgPDyo*s*WaXPm;Cz`ROacDoO!^PRzog=Oa z!Xz`i6S4E)tn2dR>f}HYn)>FQ`o_fQgJvfz9`f=A0sf|K6A5D}G2*~(%<4FcwEKjW zgLZL|gU6<~OYva9n^LtWA<>@wTyz{5K*P5873BkL9m+a4O3WY8#iSE+Uem6rPViF< z4S@G4thG8*P0Y7a)VK0TJv*daUYOhx``eRCI8;NEC*5ssiq~C{|K_aEV-8O=%(~7W zju9H=?qACO9F|y?Q9>q&+tGZ?o#ekudlqQe{$zp8V2xW+R0PI-msVadvNPrwC1D5u zH$X9@<2V?=c$=U96l6X??fGX3{uj{)Mxj~LF-b{oV5|*Jf50n%`Q;i2{vm?>E}jvr zIJkL$pl}8?5fEJxK7M?up-~M#1CtE_m&3Q79SMG{{O+TQxFx5;4( zw@_IB_<*U;b_9SBNU+B}FaPj=S(jO>JT+Q2^J68bZy`G*Zb~hicK-L7?KG}e^HVM9 zj$FmCd+5W)bIN6>E=T77BDZ~$EeoTbHpu=UY;(+A@mFJjW^qWMD^IZOyWoSa;Ac%* zFCHx5-WvEc*X=P%(7=204HS zeiYYht8n!Pu8f}T3r-t;dIwC8ALz&vYqztYwBA?cbf=q(fkAzS15vA3qn`c77Gs2- z*E9JYHT(xW;tu~v8~kk0FDJu%tHZRumVt*<9U;i8yMG?{a4jDrsUl zNzlxsw>dJfCHXZHSgFpjM*9h0t`mMduK{M!7GUJu4eB^?O7$=MmKUZ;8m}fWFBdQt z@_{pEYP}}%tanFY0F_!W*Km27h}Y{XQn6X;cyu(hY9Z8xLD=9B+q>g=tme+|FqVXG zO-*yIiHqno?ga(3glJpVN_Na%5NtM&Ry9t)g*C^>$T%QGi7)rya@+{cSMc$dgQ@l0 z$`6QGGXg!(!UB*;2`DJ8BVby!zq2!YGZxe#&>ldh1RQYSzXd6ZvB}A>Da!*PhKs8l z77_R|?3mNAv9VE8H$hPG)YJvcs9wxK^Y=w6md$>37}grBVgM&nEnMl_ySgBe5W3^K z^mKjTEkj=i=OqdPSx94$e_PcV78?uhn|JQsm7)q~WMYCqnEt*do2zldWB%$nDsrgz zczB#Z!3rP^2qT5X#L)lJraEF0g6n=fvjuPiH6il?SP#Ioxp91*CAJG*D!2++fE6d` z6u~)QqD<}W5WX$%<;e`arEbZH=X0!$Un;7q^mD8lDk@x7Gfki+L_Il1T(>1^=GZg$qsJx$niD5@?FT@E{mX?F-ON%XF&C}vbRa01Ql!RzqM_tdv7b03nd zrrbUVxky{e9h9Y+DP$z$9DRYJgGBqaB0qmM2lVDx4a89B<-Pc!CoE>%b0@b|r|4?= zU&B?`d93~ zm4p;?WLqYBwRLr+_b&n51~TmP^K&RqU;?o*RsUQI4%Gx!J)ipe`m{7X5U{zq30jUo zKo)`k;S#cLfH8oAj5~&fhpUyDD9g#=FZWLdyi=KwFgoXcX_;L<-AgFt!l>MFhfmA( zjffWKP#9ja;oc5fBm-WY^jeV7(cX_3;`Fp9Fit?@AAF*gYMH-gqr|S7ux!YC!*_zW zS@*NA;D%%tD}$7t^Z!f?>czO0wDKT(QP$YRD6j5ta7cmEaAG)_?$hc1y$xwAMeIa| zPlp8w-{`1}<{iZ3O($0O=8}mAP%r5MSkmI%5g#LDUSM0z$Q|YE96??| z+ncqe8A^%~?$XWobTc11=q533e`;RPSNT~=oK0aewi`w5cNofQnEqhz^EX_CrTwMA zK<{vnk&~E(L0}c5(_$jyL1HNF`A4EiH6~Hoe@;;*Tf@VN)$Yh{dbC%)YtJvY1B-cp z##Rap&_<09LzPI1g#g}lm~7Wt(7RPOXddadjZ$P+cZhk57h0hDzu$~V%u|JMa zjEn@&xeM^Gn+8EFSS1(aX0U<#WuO0Y6 z1U&n^iHiyF6eQ!6nf%THND_dtSzsvy2M5Cz06-HqcyEP-fRhHy>@blO6%C3Y@TW=1 z%zREw5S|H`B#;RaL<%CR;Mkrp0O=W@)eKq$j4r_(uB@zn{YPY7SxL3R4`EyncxvhR z$4r`4yFdv779q%)fxLqsL_g{L0cRDm3+pNb-v04OO`U;a8O#Ahmc9do1RjC=93a!fC%?Q1K3471$O=KkRb4Hcz|Bfa zD+apgr%x$4IBa3V0WYLWZxpCbz?QU$yf4@s$4(9FAiIjOvaSq-J5<6g?#I=s8Bfej zj8bAqw9gK-R1Q~Vc1IEqSMnWHar|5~I8P3Dj_4FGWR5+Wbr7VCDRJ4Ff`oPE>!*9~ zaM?z+oy6JPN&EC4@^s{f<>NbRtkXo-@&XBp-Rcvh7kw2i81NPVv*y>+m2-4%8 zj;D)GnwJ&BP#-43qIASf%b^fG^DnwzOO65%5!EyQP4^27pW)}4&@1wGgGTv0Qf=}u z85>7luNdPll{1tJ7Dl&A{4-n*q{l|@FY{9e|}uIiZrIX~0xwg!`v1YP8PeXD^4sFods9A;kZ z-B{KpcT5?)r%Sb65!gQYRzOi!To*P%lK2MVNcs8KU-&IP$W51z_ByU7Gb?PbkU0I# z-EtYgdp*7rhal@t(x}AZMV46w1u_8ZH#X{lb{~cvxYw`8gooeeG$GRd1_ujdKfxye zybo}SYHAVz2W24gp(3x~KTXZqnHd*XS9z{qKo5dO7Et1r7BO@$c?e%jO)UnN8tsnI zN=%m0GU#=ox{j5ijh29}7AzQ{u!fzYr>6(;0C~t1(1#F@DmzqE)FOwT^1hJ~@y{+H zHV>jlfBgc0l#_Ff64m?JQvz`H#UtnUYt{v%8bgP#`XLSf0CF#~9dJnSnE)!*hYyf& z{|`Tid)&RQ6`ODv`m=wtgh-gwKY*QvxjFnYTsUNXO5nVEZATa5sThH?blqyeV^(<3zdvE6l?m~Xm}Wo ztIlW$jNK>Qd3!sjJqWkF`xAd!{+>4YY|WDauuCwfa>Tvqxay;J&!YQ8p)ExCo2m}% zGz8?X7U*SXW_X!7u|4LPQ^4N?2m%EG-bI_;0Q@-)EJ6bV8sEkS9Tq_G5d;Qglf_W5 zA(xheP~U+eB210zaAtta0~|M{a-KU3SCH+?G2wVtTcO4DTLc|-`%-H0R%6^JCtmTyotTVQlQw*sYt#&BS@7@~ zEMOkw;osA}#w%eSbt(V*{&Hmh>&a`jbv+%;-g>t}zYElZz=}mwiRCfIQhkz;{xpJ% z{#$crg#1H$8v5kg9p33Psd0lT!W2UYsFC%8h*#8kuM#fdd<>ac9C4XDHlDT#NX;wj zQtXWUa9^{lGK(_%HMMEfR8&2exg}k0WYB$6apUIb7XJ!=%fKETiqMBI+Hw--^T_5> z#J|6$7h&9(`LO@!qcxX%)h2h4&s~F-H|99#pG+lARCD;dbIX55+$`o^_DN;WF)>cm zpvAV6a_d-%SV&^berGg&Wobxfs=-@-%WeERx085kVMa%-O7sL11*vlt zUm=4%%qifMd`b?Ji#l+?1?jWpwE&>-lm|YMk%u_poLu*$EwBVAEL_wUd!P3}BmneQ zAQE}?3gj3L5byzlB=DVr^=w`5gdks4&Ghx>U{bi{SOdb9n}Ju6fx$tl%toh`8-^=h zq~6b_$)X{Y3i6Y%Bj3wp0`r%jlJYf>-64K7%QUCn2}EMcfpVxGFQ}~vVPFL1SYR`R zB0ta;*&<;3`YuF69xmYRq6rkJ3W|#V%<|VjCJiQ$07t1Z?t`EO5^A0aC_G^fC0%F5 zM*e6$Z(RdxOtSS{aEU|P@iX{r$dDgDOlhEoC4Hg*JE4g#esVW@%GSqFTz-Pe*V&q?iI#;=IiY9 zikKU{{BBbcMx}jfthaxUVkv28RyxdgBOVS0rF%nt^VH%F+R+as!o}_|L=BV|R-O*Z ziCU}p88{f^8rve@8@o)fZm1{>X^re2vE%31{J ztKtOc2-W)R0T;E7oL&SMYOF_w9ZR2Nd^cx$q2NRFC8!&!a&5R*n(=pEw+lN()YR7r zAs&3^r*sz(1|)$@!*3QA8XKc_q%^6ru6X zq)uSD7T5WnFy*F?Hn0?tVq~p`^im%!z?(KIr@U=8b8@kBmp4*V;O~0Pmtlw&=zqhp z{wY#~%4!3rfyPngGQ0)ABUcM81Dfr3ywHJvH(tj z+Oz)C`)1uUuz`mE1v{LNQA8IXDl108<#NO(oB0_o0wmws)S$-c1a7Nma1^jW%L`=N z)_i*C%+(lgvatq^V}7en^ROHOLLeA{U2-bI!oIp+xIqBY!2PS6cU^0F4X^S&fBF>V zHuXIy;^C0{hn@reAV9!(bmZQSlF3xeR)XVrGFJa_d~oaRmLvZL-F1k+Q)s%=ms32K zsK^xBG`CR`ng2j|lIRU|JZi!#wvQFEjF%F=Zuk>h+f&*D@(Z>@1(U zOGac6Tv_Ev2qt=|>1eY;w+LO2duUg#$(I!d@l~v%@3SnAM~fvd+{%oqqCcK45=IeG z^)#!pmIN7QwqBgQk9UuH&wnG-j`gL>-e=?V_13W^3cs!$itHXfG*NRQ1hmy0r&=;L ze0s&TKHguX3T3!jxPY9<^XS*WErM5a^D+*jSb1Ql!CfJ@OkOz6$Ura(VDpWN?3G zeC;`j1{0mk&7O<|Nd&ozPNIYVCvzo6E>3Qo&2J+lIzd|-G&cu%tyOUrV4)eyjE>BA|5}O$QW2mb6yOo2KPi9y4%DtVnc1+E(^7G9hRT-FS z-@bkYtRpBSWD;x+W8xQ=odFX9W2)plb4^}c9V-~KD%{sGIbFV83_bC=nlw$CJt>GmKf30vsbT8 z)*o5i4ieO2ZSy`wYlbNj_`zNB!(K%z zo5bjt?qW4m=h$Tp3cmBHi?d{S;h>KZ5kWhUNx!5a&CFOsw+;=rhQ=5W1>v1yRQ>t{ za;XEG!ClrK%zXiK2S;gmvjIjDv|9#yno=mNK@b>m$ob5Y)WVSI_ zN45tgjON}4;2do+&sLeb8w>j~M!z-s-RflvASsXkg^TUMM<1US(D)t_*xA|wmxlI} zny9EZ*96FRAbFX~3tC%C^tw#f$Imp6{~nx{XO#_pl%D+IPK%A`q%bzbhp68~So+o8 zePQot?h*?5ePWgOf-99oaJj;gH`e2X^RLh}%K06ZEY|k;*A3jRb3-1En1eiBd&dF# z>-0)dTXawOD4?6a$#0&LN!{R3(D_0+f>~5NuGFaNcSBZ9qC+up#tV2{;dTF@xC;B! zrG~6i7&Su&i}H;Wbo7|1VLYO?f-C&sh+)PuBHWpll8qob^rrN}QQ|o-c#~bVc8}{n z=UJ=c=CjYWExu!sBFm^;=9|^*&-<}qnCx__B^p=yu<2QxXPuOvN8<y^7Du}7qkr4Z zcN4cPuWyr%Rf*kszT!JuDbLh@HO3I*7bAtFpz(@c>u^26FZ)>}Tu)vfY_*JuSE8u3t z8f1qM02thsi2+n_VtB>PBw{u zx4ZzYrzNgPB_M{Sd z?Z7x4H9rwJ%_7rwBnT|$a~K&xeGmS!pocTi(b)vpx6Y3j#B`RXgMEDjK^k}N#Aisx ztdEpD-~3@b&BMnBDG&f^J(Z9!0RawR)KETWJx7@;u(NloA;0d`@WICi)F%!zP5z$G z16UFVcUU_O3=J>!b^tYl*IqCw=L0YvU>0_mzC^J>*aDJEXmBrJ(Ama01{5k-uL76u zo5kB8eh;JY0dznJQZqux_>`2D0sl5PGCEjHb`PLQhoXA8@Q7{}te|*#y)-4$TJ>L2 z#Ez|Kpa1=#IYCzBEB z6+x+_DG`HC-9RZU{;d3=w9il7QM~dO)`Ok%+jCCqlZBKzGZU`KvX2@MDrb3)dU@Z( z4HDv@?;N=_R%6F{Usygq)j3>lRnEoW`y}|rj<7viBEu&Wb?Wv+mbiiFr=l5DpEhCsp7bw%D9mJ~6r?=Hom<3bVpm;i}JuL>5a_uk7Y4VEGA2G#?Q%Ew}##81kK;=9BnlmS)CBlL%zwk za$?#unSJIhTACi-H~E4jL`Y4eV}Ms_;b*xl^?X_af6yIBWITut=v}N{yU=VLxfM-M zY!11i5T@oYqHAyeIQoChD>py?ca3c1fi;cmUSG^GnSGYaVp<}wHJG06e&Zp-0khfW zk8Ua7wq5#mbD?tH>J;v?wci^`=T29in*Qcfh?4Gg_a&zoLRVh4`rhl|_k_nmE{2tr zp;%g4dR=8HZ)j5BQa=WUBgXr=c9rZ4*}ZONUc&7C*Y```D=nKJd);RFi<}anwqqu% z9`BJ^X_GvCxlra#JEc&z6<%|%?aX&6Qc7p|WU!yh%Gl!ZkBLfu1&@E%R7_v|*&_pV ziJ{G*8rM5F0(>rS>3%Q%OMma*a4L35fi_<~6eCvGl~DFQ8GA|P6ULstVtI|xJtfanH=Eek+2gJXsx_@2Y23r%2+ tEDM1i1Om7LOVlNJmR)|CHyy03V1K>T)u-)J{(VLuRi3VXF6*2UngA_z*^&SN literal 0 HcmV?d00001 diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index d33f293cd5..0791ad938a 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -410,10 +410,24 @@ app>` in the task defined below. script = rose task-run --app-key hello -.. TODO - Rose Bush +Rose Bush +--------- - Rose provides a utility for viewing the status and logs for cylc suites called - Rose Bush. Rose Bush displays suite information in web-pages +.. TODO - move this into the cylc tutorial with the upcomming cylc "nameless". + +Rose provides a utility for viewing the status and logs for cylc suites called +Rose Bush. Rose Bush displays suite information in web-pages. + +.. image:: img/rose-bush.png + :alt: rose bush screenshot + :width: 100% + +If a rose bush server is provided at your site you can open the rose bush +page for a suite by running the :ref:`command-rose-suite-log` command +in the suite directory. + +Otherwise an add-hoc web-server can be set up using the +:ref:`command-rose-bush` ``start`` command. .. practical:: @@ -509,7 +523,7 @@ app>` in the task defined below. task of the ``suite.rc`` file into the :rose:file:`rose-app.conf` file of the ``forecast`` application. - TODO - remove tripple quotes in cylc tutorial + TODO - remove triple quotes in cylc tutorial Remember, in rose configuration files: @@ -557,10 +571,23 @@ app>` in the task defined below. #. **Run The Suite.** - :: + Install, validate and run the suite:: rose suite-run The ``cylc gui`` should open, the suite should run and complete. - .. TODO - view output in rose bush + #. **View Output In Rose Bush.** + + Open the rose bush page in a browser by running the following command + from within the suite directory:: + + rose suite-log + + On this page you will see the tasks run by the suite ordered from most to + least recent. Near the top you should see an entry for the ``forecast`` + task. On the right-hand side of the screen click + :guilabel:`job-map.html`. + + As this file has a ``.html`` extension rose bush will render it, + otherwise the raw text would be displayed. From 16b7310997ed7f4f910c4651af6a62f050c4087b Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 10 Apr 2018 17:21:54 +0100 Subject: [PATCH 09/34] add directive for practical extensions --- sphinx/ext/practical.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sphinx/ext/practical.py b/sphinx/ext/practical.py index 9288200167..9e8737fe68 100644 --- a/sphinx/ext/practical.py +++ b/sphinx/ext/practical.py @@ -34,13 +34,21 @@ class Practical(BaseAdmonition): """ node_class = nodes.admonition + NAME = 'Practical' + CLASSES = ['note'] def run(self): - self.options.update({'class': ['note']}) # Affects the display. - self.arguments = ['Practical'] # Sets the title of the admonition. + self.options.update({'class': self.CLASSES}) # Affects the display. + self.arguments = [self.NAME] # Sets the title of the admonition. return super(Practical, self).run() +class PracticalExtension(Practical): + """Directive for practical extension exercises.""" + NAME = 'Practical Extension' + CLASSES = ['note', 'spoiler'] + + class Spoiler(BaseAdmonition): """Directive for auto-hiden "spoiler" sections. @@ -66,5 +74,6 @@ def run(self): def setup(app): """Sphinx setup function.""" app.add_directive('practical', Practical) + app.add_directive('practical-extension', PracticalExtension) app.add_directive('spoiler', Spoiler) app.add_javascript('js/spoiler.js') # self-hiding node. From 8016d5b59a48a061c469a3740192b023103d710f Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 6 Apr 2018 12:26:29 +0100 Subject: [PATCH 10/34] rosie --- sphinx/hyperlinks.rst | 11 +- sphinx/tutorial/rose/configurations.rst | 2 +- .../tutorial/rose/img/rosie-go-annotated.png | Bin 0 -> 274573 bytes .../rose/img/rosie-go-author-search.png | Bin 0 -> 5732 bytes sphinx/tutorial/rose/img/rosie-go.png | Bin 0 -> 84212 bytes sphinx/tutorial/rose/img/rosie-go.svg | 115 +++++++ sphinx/tutorial/rose/index.rst | 1 + sphinx/tutorial/rose/rosie.rst | 304 ++++++++++++++++++ sphinx/tutorial/rose/suites.rst | 4 +- 9 files changed, 431 insertions(+), 6 deletions(-) create mode 100644 sphinx/tutorial/rose/img/rosie-go-annotated.png create mode 100644 sphinx/tutorial/rose/img/rosie-go-author-search.png create mode 100644 sphinx/tutorial/rose/img/rosie-go.png create mode 100644 sphinx/tutorial/rose/img/rosie-go.svg create mode 100644 sphinx/tutorial/rose/rosie.rst diff --git a/sphinx/hyperlinks.rst b/sphinx/hyperlinks.rst index c0a6c3619d..0d68bff9e9 100644 --- a/sphinx/hyperlinks.rst +++ b/sphinx/hyperlinks.rst @@ -13,10 +13,13 @@ .. _metomi-vms: https://github.com/metomi/metomi-vms .. _cylc: http://cylc.github.io/cylc/ .. _cylc user guide: http://cylc.github.io/cylc/documentation.html#the-cylc-user-guide -.. _Jinja2: http://jinja.pocoo.org/ .. _FCM: https://metomi.github.io/fcm/doc/ +.. _FCM User Guide: http://metomi.github.io/fcm/doc/user_guide/ +.. _Github: https://github.com/metomi/rose +.. _INI: https://en.wikipedia.org/wiki/INI_file +.. _Jinja2: http://jinja.pocoo.org/ +.. _metomi-vms: https://github.com/metomi/metomi-vms +.. _PyGTK: http://www.pygtk.org/ .. _Python: https://www.python.org/ .. _Python Regular Expressions: https://docs.python.org/2/library/re.html#regular-expression-syntax -.. _bash: https://www.gnu.org/software/bash/ -.. _PyGTK: http://www.pygtk.org/ -.. _INI: https://en.wikipedia.org/wiki/INI_file +.. _SRS: https://code.metoffice.gov.uk/ diff --git a/sphinx/tutorial/rose/configurations.rst b/sphinx/tutorial/rose/configurations.rst index 9530aa7043..c39b2dba93 100644 --- a/sphinx/tutorial/rose/configurations.rst +++ b/sphinx/tutorial/rose/configurations.rst @@ -10,7 +10,7 @@ Rose Configurations rose configuration file along with other optional assets which define behaviour such as: -* Executables. +* Execution. * File installation. * Environment variables. diff --git a/sphinx/tutorial/rose/img/rosie-go-annotated.png b/sphinx/tutorial/rose/img/rosie-go-annotated.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d524b238b33279a1b1c1f58f33e7fea9d6d148 GIT binary patch literal 274573 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

g%`kH>e35x+(V@5!s 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 LXKH&vPavWC3-@8=h6j$Gvi&Bc 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

B7nWI}P zY5hs%Ks6^MJmhy+?uKEtkgaHLY;hxstQQpM6h3y%EKZf6Ixmba2pwgj&nRX7fL|Q0t?wH*2LmyCby1L zyTm&AAJgjR(>{nFrdS&IpGfVBwAL<_tQ^K*jC+x!?|E(XP3rs#oDWS|clSqV)7#^h zCV0K2qPdJFQlubmixW4MJGHD3D2PlC-eaT)fE)$pNG1ShF0#+KfQDmDz}SD1&Iu z&NjoVtSr!P1!+B`a1E8-{u;;jQgm}BEFET@*e{WB*)FF;?TrPxXB7`)KJ6dxq-w47 zB?by*T-Q=bhssNzOma%pgm;dx9IiX7S_7y5UbFG0bhM7piM6yse}RG^@9(hAkTqHz zqFPJ#wK&f8J=FaRm&Ft1Y-A^E(4LdPEQY9%{@Pe|{$!B&=Fu>AYRl1fqm>)<=Ucze z;mpS7#+@}D$7Pi+`)0tOu5T%fn_P38JdmZ@0*=4U$Jtn*{96_5sR^SG454WeLr#9W$X%uQzdIx_Hss4#0H9R&O-g&vm|0V{>6d zgSF9-1sz{j4b0F);9gejWduo2&u8Xzs&=I^0{R!Yp4w$Z*jfJ~FY(No+nQ&b_HTSy zFdir}!+bMR$cD$V_VyW`6=Vi87P(ea^RO3ee@ z52+dJ&VSjAB#Teidp#OVyX#u9+pF%pkbSXqFC!CqcWQUO^}({bTGYn3919tt1By-Y zzWq?9Z6WJP36wmfNZ2p_N}%Moj~GcUJ0n3zAwZ8(%Nsx4zsTjbT@XI&XJimzwDR}b z`To<+`VIc@vS)MSYk7!K13g-PQ5l`3Ntv>vTVKL$ij+*Tp9SLzdx*azXG@&Q(7E;S z(Uo&Z`Xr=;IeX;5(LEZxf{*e zl~gua-qh|9$xp)D=EzUJMuf9yey*tS1ZU62rh-hAM^{Q`C+7V30`+2P$CU(cDsuj# zDZRpx6*}VcQaf3ZgGHAVMnP9ctg03dNWFM*n^(JG46>o{Zr6G?Dh+w4`R(vIj^5ml zj&_=w3O{j2z>Y1lq$OJJ0b7f`>jW7!e!;zd*As(I^^^zc#o-|TYniER1FsRe7n)qh z4sN`xbj1!qxUK+I_Wt+b>aH0+UfqL^hRbO}2+5CEr61h>*Ew1S1ercNPdXY?<8=;&BlTKehBM_}^u9_vd=o=0sX zq0~3{!m`wry=#Q>Nbk*4*D8!xPuzWOYfD@;VsXbE|IC@XE9z@k73)ZWGT^EeADP94 z_7I8>?C6kl)uJA=py1I9m2oH2Tupon*h6eAu#=UZL zO-fJC#{?G%*DuTxJ>de_B?%^I#mtR6C!co6Jk zxoyDL5BR^Sv)1b7hmT5cN<&%eVGTk8??=G;qtK544Cn);Iy;QoVFInS?+Py5qP2JD9$P zrlzQ#d(&53mcMeuNY5xzj;vWBg2s()DG>LpWK~oo4>Qzsh5pm`)U$kkucd~WK7&$6oyF^B1^s7Fom3zpdX#X<$H(U?HZxB5 zWH&t(?30f%u8hs$eSc-0YHw`3MMvjdJnVb{$p6a9*Nx1%p9VKXLfP35k(;?0YIW22 z)G z`c@B1rz%I9U9R~+Z2@RWs?+gVbow5!6O7CR+q8w(μS>pk9^ZrPr$^_+Xr_-%Vu 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 ae9E4g#(d~}GWY%8z6KCuy=on&=l=&w3?<6| literal 0 HcmV?d00001 diff --git a/sphinx/tutorial/rose/img/rosie-go.png b/sphinx/tutorial/rose/img/rosie-go.png new file mode 100644 index 0000000000000000000000000000000000000000..a5859057d30841b722a6650a889e33b727d6b032 GIT binary patch literal 84212 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�! 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 + + + + + + + + + + + + + + + Search Bar + + Show checkedout suites + + Check outsuites from theGUI + + Advanced Search + diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index 2f81a4fa0a..baed67bad0 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -21,4 +21,5 @@ Rose also contains other optional tools for: applications metadata suites + rosie furthertopics/index diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst new file mode 100644 index 0000000000..66c01d458c --- /dev/null +++ b/sphinx/tutorial/rose/rosie.rst @@ -0,0 +1,304 @@ +.. include:: ../../hyperlinks.rst + :start-line: 1 + +Rosie +===== + +Rosie is a tool for managing rose suite configurations which is included in +Rose. +The purpose of Rosie is to facilitate suite development, management and +collaboration. +Rosie: + +* Adds version control to rose suite configurations. +* Updates a database to keep track of rose suite configurations. + +.. warning:: + + This tutorial does not require specific FCM knowledge but basic version + control awareness is important. For more information on FCM version + control see the `FCM User Guide`_. + + +Version Control +--------------- + +When a rose suite configuration is managed with Rosie the :term:`suite +directory` is added to `version control`_ using `FCM`_. + +FCM is a `subversion `_ (SVN) wrapper which provides a standard working +practice for SVN projects. FCM implements all of the SVN commands as well as +additional functionality. See the `FCM User Guide`_ for more information. + + +Rosie Suites +------------ + +.. _working copy: http://svnbook.red-bean.com/en/1.7/svn.basic.in-action.html#svn.basic.in-action.wc + +A Rosie suite is a Rose suite configuration which is managed by the Rosie +system. Rosie suites can be created by the command: + +:ref:`command-rosie-create` + Create a new suite or copy an existing one. + +By default Rosie creates the `working copy`_ (local copy) of new suites in the +``~/roses`` directory though Rosie working coppies can be created elsewhere. + + +Suite Naming +------------ + +Each Rosie suite is assigned a unique name made up of a prefix followed by a +hyphen and then an identifier made up of two characters and three numbers e.g: + +.. graph:: Example + :align: center + + bgcolor = "none" + node [shape="plaintext", fontsize="11"] + edge [style="invis"] + graph [ranksep=0] + a1 [label="u", fontsize=20] + a2 [label="Prefix", fontcolor="#707070"] + b1 [label="-", fontsize=20] + b2 [label="", fontcolor="#707070"] + c1 [label="aa001", fontsize=20] + c2 [label="Unique Identifier", fontcolor="#707070"] + a1 -- a2 + b1 -- b2 + c1 -- c2 + +The prefix denotes the repository in which the suite is located. Prefixes are +site specific and are configured by the +:rose:conf:`rose.conf[rosie-id]prefix-location.PREFIX` setting. + +Within the Rose user community the "u" prefix is typically configured to point +at the `SRS`_ repository. + + +The :rose:file:`rose-suite.info` File +------------------------------------- + +All Rosie suites require a :rose:file:`rose-suite.info` file. This file provides information about the suite for use in the suite management and version control +systems. The :rose:file:`rose-suite.info` file uses the +`Rose Configuration Format `_, the main settings +are: + +``title`` + A short title for the suite. +``owner`` + The user who has control over the suite (i.e. your username). +``project`` + ??? +``access-list`` + An optional list of users who have permission to commit to the trunk of the + suite. + + +Managing Suites +--------------- + +Rosie provides commands for managing suites including: + +:ref:`command-rosie-checkout` + Creates a local copy of a suite. +:ref:`command-rosie-ls` + Lists all locally checked-out suites. +:ref:`command-rosie-lookup` + Search the suite database (using information from suite's + :rose:file:`rose-suite.info` files). + +Rosie also provides a GUI which incorporates the functionality of the above +commands called :ref:`command-rosie-go`. + +.. figure:: img/rosie-go-annotated.png + :align: center + :width: 450px + :alt: rosie go GUI + + Screenshot of the rosie go GUI. + +.. TODO - migrate the old "Rose User Guide: Rosie Go" page? + + +.. practical:: + + .. rubric:: In this practical we will add the Weather Forecasting Suite from + the previous practical to a rosie repository make some changes and commit + them to the repository. + + .. note:: + :class: tip + + For brevity this practical uses the abbreviated version of SVN commands, + e.g. ``svn st`` is the abbreviated form of ``svn status``. + FCM supports both the full and abbreviated names. + + #. **Create A New Rosie Suite.** + + First, create a blank Rosie suite in an appropriate repository. + You will probably want to use a "testing" repository if one is available + to you. + + You can specify the repository to use with the ``--prefix`` command line + option. For instance to use the (internal) MetOffice Testing Repository + supply the command line argument ``--prefix=mot``. + + .. code-block:: sub + + rosie create --prefix= + + You will then be presented with a :rose:file:`rose-suite.info` file open + in a text editor. For the ``title`` field type "Dummy Weather Forecasting + Suite" and for the ``project`` enter "tutorial". Save the file and close + the editor. + + .. tip:: + + If the text editor does not appear you may have to press enter on the + keyboard. + + Rosie will create the new suite in the ``~/roses`` directory, the exact + location will appear in the command output. Move into the suite + directory: + + .. code-block:: sub + + cd ~/roses/ + + #. **Add Files To The Suite.** + + Add the files from the Weather Forecasting Suite by running:: + + TODO + + We now need to add these files to version control. First check the SVN + status by running:: + + fcm st + + You should see a list of files with the ``?`` symbols next to them + meaning that they are un-tracked (not version controlled). Add all + un-tracked files to version control by running:: + + fcm add --check . + + Answer yes where prompted. Now check the status again:: + + fcm st + + You should see a list of files with the ``A`` character next to them + meaning "added". Finally commit the changes by running:: + + fcm ci + + A text editor will open, add a message for your commit, save the file and + close the editor. You will the be prompted whether you want to make the + commit, answer yes. + + You have now added the Weather Forecasting Suite to version control. Open + the Trac browser to see your suite:: + + fcm browse + + A web browser window will open showing the Trac page for your Rosie + suite. + + .. TODO - Note remove ?rev=xxxx to see latest revision? + + #. **Find The Suite In Rosie Go.** + + Open The :ref:`command-rosie-go` GUI:: + + rosie go & + + Open the advanced search options by clicking the add :guilabel:`+` + button in the top right-hand corner of the window. + + Search for suites which you have authored by selecting :guilabel:`author` + and filling in your username into the right-hand box: + + .. image:: img/rosie-go-author-search.png + :align: center + :alt: rosie go advanced search for author screenshot + + Press :guilabel:`Search`. You should see your suite appear with a home + icon next to it meaning that you have a local copy checked out. + + Right-click on the suite and click :guilabel:`Info`, you should see the + information defined in the :rose:file:`rose-suite.info` file. + + .. admonition:: Help + :class: tip + + If your suite does not show up select the menu item + :menuselection:`Edit --> Data Source` and ensure the repository you + committed to is checked. + + #. **Checkout The Suite.** + + Now that the suite is in the Rosie repository a working copy can be + checked out on any machine with access to the repository by doing: + + .. code-block:: sub + + rosie checkout + + Test this by deleting the working copy then checking out a new one: + + .. code-block:: sub + + cd ~/roses + rm -rf + rosie checkout + + +.. practical-extension:: + + #. **Make Changes In A Branch.** + + Next we will make a change to the suite. Rather than making the change in + the "trunk" (referred to as "master" in git terminology) we will work in a + new "branch". + + Create a new branch by running:: + + fcm bc configuration-change + + You can list all branches by running:: + + fcm bls + + Switch to your new branch:: + + fcm sw configuration-change + + Next, either by using the :ref:`command-rose-config-edit` GUI or a text + editor change the ``RESOLUTION`` setting in the + :rose:file:`rose-suite.conf` file to ``0.1``. + + Check the status of the project:: + + fcm st + + You should see the :rose:file:`rose-suite.conf` file with a ``M`` next to + it meaning modified. Commit the change by running:: + + fcm ci + + Again you will need to provide a commit message and answer yes to the + prompt. + + #. **Merge The Branch.** + + Switch back to the trunk then merge your change branch into the trunk:: + + fcm sw trunk + fcm merge change trunk + + Check the status (you should see the ``M`` symbol next to the + :rose:file:`rose-suite.conf` file) then commit the merge:: + + fcm st + fcm ci diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 0791ad938a..c731e3f2aa 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -418,10 +418,12 @@ Rose Bush Rose provides a utility for viewing the status and logs for cylc suites called Rose Bush. Rose Bush displays suite information in web-pages. -.. image:: img/rose-bush.png +.. figure:: img/rose-bush.png :alt: rose bush screenshot :width: 100% + Screenshot of a rose bush web page. + If a rose bush server is provided at your site you can open the rose bush page for a suite by running the :ref:`command-rose-suite-log` command in the suite directory. From 208032410332121b45783502573e57e62f4a74a6 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Mon, 9 Apr 2018 18:51:55 +0100 Subject: [PATCH 11/34] rose summary --- sphinx/api/command-reference.rst | 2 + sphinx/api/rose-built-in-applications.rst | 11 +- sphinx/hyperlinks.rst | 1 + sphinx/tutorial/rose/configurations.rst | 1 - .../furthertopics/date-time-manipulation.rst | 2 + sphinx/tutorial/rose/furthertopics/index.rst | 2 + sphinx/tutorial/rose/index.rst | 1 + sphinx/tutorial/rose/summary.rst | 201 ++++++++++++++++++ 8 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 sphinx/tutorial/rose/summary.rst diff --git a/sphinx/api/command-reference.rst b/sphinx/api/command-reference.rst index f1908c2fef..78bc659149 100644 --- a/sphinx/api/command-reference.rst +++ b/sphinx/api/command-reference.rst @@ -1,3 +1,5 @@ +.. _Command Reference: + Command Reference ================= diff --git a/sphinx/api/rose-built-in-applications.rst b/sphinx/api/rose-built-in-applications.rst index d8b8dd3d90..95a291c054 100644 --- a/sphinx/api/rose-built-in-applications.rst +++ b/sphinx/api/rose-built-in-applications.rst @@ -3,7 +3,6 @@ Rose Built-In Applications ========================== - Rose contains a few built-in applications providing common functionality. These applications can be run using :ref:`command-rose-task-run` or @@ -11,7 +10,15 @@ These applications can be run using :ref:`command-rose-task-run` or To use a built-in application, add the :rose:conf:`rose-app.conf|mode=KEY` setting in the application configuration, where ``KEY`` is the name of the -built-in application. +built-in application. For example to use the :rose:app:`rose_prune` built-in +application: + +.. code-block:: rose + :caption: *rose-app.conf* + + mode=rose_prune + # There may also be metadata which can be picked up using the `meta` setting. + meta=rose_prune A built-in application would normally behave very much like running an external command. The key differences are normally that: diff --git a/sphinx/hyperlinks.rst b/sphinx/hyperlinks.rst index 0d68bff9e9..d063d2cff2 100644 --- a/sphinx/hyperlinks.rst +++ b/sphinx/hyperlinks.rst @@ -13,6 +13,7 @@ .. _metomi-vms: https://github.com/metomi/metomi-vms .. _cylc: http://cylc.github.io/cylc/ .. _cylc user guide: http://cylc.github.io/cylc/documentation.html#the-cylc-user-guide +.. _cylc suite design guide: http://cylc.github.io/cylc/doc/suite-design-guide.pdf .. _FCM: https://metomi.github.io/fcm/doc/ .. _FCM User Guide: http://metomi.github.io/fcm/doc/user_guide/ .. _Github: https://github.com/metomi/rose diff --git a/sphinx/tutorial/rose/configurations.rst b/sphinx/tutorial/rose/configurations.rst index c39b2dba93..9a66a413da 100644 --- a/sphinx/tutorial/rose/configurations.rst +++ b/sphinx/tutorial/rose/configurations.rst @@ -82,4 +82,3 @@ and on-the-fly validation purposes. .. TODO - add rose edit screenshot. .. TODO - rename rose config-edit to rose edit. - diff --git a/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst b/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst index 185682cba5..2aed80af3c 100644 --- a/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst +++ b/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst @@ -1,3 +1,5 @@ +.. _rose-tutorial-datetime-manipulation: + Date and Time Manipulation ========================== diff --git a/sphinx/tutorial/rose/furthertopics/index.rst b/sphinx/tutorial/rose/furthertopics/index.rst index b981687021..36b0b55901 100644 --- a/sphinx/tutorial/rose/furthertopics/index.rst +++ b/sphinx/tutorial/rose/furthertopics/index.rst @@ -1,3 +1,5 @@ +.. _Rose Further Topics: + Further Topics ============== diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index baed67bad0..6d6f2c0091 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -22,4 +22,5 @@ Rose also contains other optional tools for: metadata suites rosie + summary furthertopics/index diff --git a/sphinx/tutorial/rose/summary.rst b/sphinx/tutorial/rose/summary.rst new file mode 100644 index 0000000000..2c9f20fc40 --- /dev/null +++ b/sphinx/tutorial/rose/summary.rst @@ -0,0 +1,201 @@ +.. include:: ../../hyperlinks.rst + :start-line: 1 + +Summary +======= + +Suite Structure +--------------- + +So far we have covered: + +* Cylc suites. +* Rose suite configurations. +* Rosie suites. + +The relationship between them is as follows: + +.. graph:: Example + :align: center + + ranksep = 0 + bgcolor = none + size = "7, 5" + + node [shape="plaintext", fontcolor="#606060", fontname="sans"] + edge [style="invis"] + + subgraph cluster_1 { + label = "Cylc Suite" + fontsize="20" + fontcolor="#5050aa" + fontname="sans" + labelloc="r" + "suite.rc" [fontsize="18", fontname="mono", fontcolor"black"] + "rcinfo" [label="Defines the workflow\nin terms of tasks\nand dependencies"] + "suite.rc" -- "rcinfo" + + subgraph cluster_2 { + label = "Rose Suite Configuration" + "rose-suite.conf" [fontsize="18", fontname="mono", fontcolor"black"] + "confinfo" [label="Defines Jinja2 variables for\nthesuite.rc and environment\nvariable for use throughout\nthe suite"] + "rose-suite.conf" -- "confinfo" + + subgraph cluster_3 { + label = "Rosie Suite" + "rose-suite.info" [fontsize="18", fontname="mono", fontcolor"black"] + "infoinfo" [label="Contains basic information\nabout the suite used\nby Rosie for searching\nand version control purposes"] + "rose-suite.info" -- "infoinfo" + } + } + } + +Cylc suites can have rose applications. These are stored in an ``app`` +directory and are configured using a :rose:file:`rose-app.conf` file. + +.. TODO - A file tree for an example rose suite + a full file tree showing + all possible files and directories with descriptions, this will + require an extension and some CSS magic to ensure viable output + in HTML and PDF. + + +Suite Commands +-------------- + +.. rubric:: We have learned the following cylc commands: + +``cylc graph`` + Draws the suite's :term:`graph`. +``cylc get-config`` + Processes the ``suite.rc`` file and prints it back out. +``cylc validate`` + Validate the cylc ``suite.rc`` file to check for any obvious errors. +``cylc run`` + Runs a suite. +``cylc stop`` + Stops a suite: + + ``--kill`` + Killing all running / submitted tasks + ``--now --now`` + Leaving all running / submitted tasks running. + +``cylc restart`` + Starts a suite picking up where it left off. + +.. rubric:: We have learned the following Rose commands: + +:ref:`command-rose-app-run` + Runs a Rose application. +:ref:`command-rose-task-run` + Used to run a Rose application from within a cylc suite. +:ref:`command-rose-suite-run` + Runs a rose suite. +:ref:`command-rose-suite-restart` + Runs a rose suite picking up where it left off. + +The cylc commands do not know about the :rose:file:`rose-suite.conf` file +so for rose suite configurations you will have to install the suite before +using commands such as ``cylc graph`` e.g: + +.. code-block:: sub + + rose suite-run -l # install the suite on the local host only - don't run it. + cylc graph # run cylc graph using the installed version of the suite. + + +Rose Utilities +-------------- + +Rose contains some utilities to make life easier: + +:ref:`command-rose-date` + A utility for parsing, manipulating and formatting date-times which is + useful for working with the cylc :term:`cycle point`: + + .. code-block:: console + + $ rose date 2000 --offset '+P1Y1M1D' + 2001-02-02T0000Z + + $ rose date $CYLC_TASK_CYCLE_POINT --format 'The month is %B.' + The month is April. + + See the :ref:`date-time tutorial ` + for more information. + +:ref:`command-rose-host-select` + A utility for select a host from a group with the ability to rank choices + based on server load or free memory. + + Groups are configured using the + :rose:conf:`rose.conf[rose-host-select]group{NAME}` setting. + For example to define a cluster called "mycluster" containing the hosts + "computer1", "computer2" and "computer3". + + .. code-block:: rose + + [rose-host-select] + group{mycluster}=computer1 computer2 computer3 + + Hosts can then be selected from the cluster on the command line: + + .. code-block:: console + + $ rose host-select mycluster + computer2 + + The :ref:`command-rose-host-select` command can by used within cylc suites + to determine which host a task runs on: + + .. code-block:: cylc + + [runtime] + [[foo]] + script = echo "Hello $(hostname)!" + [[[remote]]] + host = rose host-select mycluster + + See the :ref:`command line documentation ` for + more information. + + +Rose Built-In Applications +-------------------------- + +Along with the rose utilities there are also the rose built-in applications. + +:rose:app:`fcm_make` + A template for running the ``fcm make`` command. +:rose:app:`rose_ana` + Runs the rose-ana analysis engine. +:rose:app:`rose_arch` + Provides a generic solution to configure site specific archiving of suite + files. +:rose:app:`rose_bunch` + For the running of multiple command variants in parallel under a single job. +:rose:app:`rose_prune` + A framework for housekeeping a cycling suite. + +For more information on these applications and how to use them see the +:ref:`Rose Built-In Applications` section. + + +Next Steps +---------- + +:ref:`Rose Further Topics` + Tutorials going over some of the more specific aspects of rose not + covered in the main tutorial. +:ref:`Cheat Sheet` + A quick breakdown of the commands for running + and interacting with suites using cylc and rose. +:ref:`Command Reference` + Contains the command line documentation + (also obtainable by calling ``rose --help``). +:ref:`Rose Configuration ` + The possible settings which can be used in the different rose + configuration files. +`cylc suite design guide`_ + Contains recommended best-practice for the style and structure of cylc + suites. From 43225185166d336957a4df2ab5220798f635b5b0 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 10 Apr 2018 11:21:45 +0100 Subject: [PATCH 12/34] style code-block captions. --- sphinx/_static/css/rtd-theme-fix.css | 6 ++++++ sphinx/api/rose-built-in-applications.rst | 2 +- sphinx/tutorial/rose/suites.rst | 10 +++++----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sphinx/_static/css/rtd-theme-fix.css b/sphinx/_static/css/rtd-theme-fix.css index 05a0f74ecc..5960654ddf 100644 --- a/sphinx/_static/css/rtd-theme-fix.css +++ b/sphinx/_static/css/rtd-theme-fix.css @@ -104,3 +104,9 @@ .grid-table div.highlight { margin-bottom: 0; } + +/* Place code-block captions in italics. */ +.code-block-caption { + font-style: italic; + color: #808080; +} diff --git a/sphinx/api/rose-built-in-applications.rst b/sphinx/api/rose-built-in-applications.rst index 95a291c054..1838605dbc 100644 --- a/sphinx/api/rose-built-in-applications.rst +++ b/sphinx/api/rose-built-in-applications.rst @@ -14,7 +14,7 @@ built-in application. For example to use the :rose:app:`rose_prune` built-in application: .. code-block:: rose - :caption: *rose-app.conf* + :caption: rose-app.conf mode=rose_prune # There may also be metadata which can be picked up using the `meta` setting. diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index c731e3f2aa..74db22b773 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -40,7 +40,7 @@ Jinja2 variable ``WORLD`` are both set in the :rose:file:`rose-suite.conf` file. These variables can then be used in the ``suite.rc`` file: .. code-block:: rose - :caption: *rose-suite.conf* + :caption: rose-suite.conf [env] GREETING=Hello @@ -49,7 +49,7 @@ file. These variables can then be used in the ``suite.rc`` file: WORLD=Earth .. code-block:: cylc - :caption: *suite.rc* + :caption: suite.rc [scheduling] [[dependencies]] @@ -385,14 +385,14 @@ In this example the ``hello`` task will run the application located in ``app/hello/``: .. code-block:: cylc - :caption: *suite.rc* + :caption: suite.rc [runtime] [[hello]] script = rose task-run .. code-block:: rose - :caption: *app/hello/rose-app.conf* + :caption: app/hello/rose-app.conf [command] default=echo "Hello World!" @@ -403,7 +403,7 @@ example the ``greetings`` :term:`task` will run the ``hello`` :term:`app ` in the task defined below. .. code-block:: cylc - :caption: *suite.rc* + :caption: suite.rc [runtime] [[greetings]] From 761215a7111d6620afacf50f8abdb728e9f2d266 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 10 Apr 2018 12:35:00 +0100 Subject: [PATCH 13/34] move all tutorials into the rose-tutorial directory. --- .../.validate | 0 .../meta/rose-meta.conf | 0 .../rose-app.conf | 0 .../rose/furthertopics/command-keys.rst | 8 +++-- .../rose/furthertopics/failif-warnif.rst | 8 ++--- .../img/rose-macro-hello-world-app-fail.png | Bin 17721 -> 0 bytes .../img/rose-macro-tutorial-app-fail.png | Bin 0 -> 19130 bytes .../rose/furthertopics/macro-development.rst | 19 ++++++----- .../furthertopics/optional-configurations.rst | 4 +-- .../tutorial/rose/furthertopics/polling.rst | 20 +++++++---- .../tutorial/rose/furthertopics/rose-arch.rst | 7 ++-- .../rose/furthertopics/rose-bunch.rst | 8 +++-- .../tutorial/rose/furthertopics/rose-stem.rst | 13 ++++---- .../tutorial/rose/furthertopics/trigger.rst | 18 ++++++---- .../upgrading-macro-development.rst | 31 +++++++++++------- .../tutorial/rose/furthertopics/upgrading.rst | 19 ++++++----- .../rose/furthertopics/widget-development.rst | 16 +++++---- 17 files changed, 104 insertions(+), 67 deletions(-) rename etc/tutorial/{fail-if-warn-if => failif-warnif}/.validate (100%) rename etc/tutorial/{fail-if-warn-if => failif-warnif}/meta/rose-meta.conf (100%) rename etc/tutorial/{fail-if-warn-if => failif-warnif}/rose-app.conf (100%) delete mode 100644 sphinx/tutorial/rose/furthertopics/img/rose-macro-hello-world-app-fail.png create mode 100644 sphinx/tutorial/rose/furthertopics/img/rose-macro-tutorial-app-fail.png diff --git a/etc/tutorial/fail-if-warn-if/.validate b/etc/tutorial/failif-warnif/.validate similarity index 100% rename from etc/tutorial/fail-if-warn-if/.validate rename to etc/tutorial/failif-warnif/.validate diff --git a/etc/tutorial/fail-if-warn-if/meta/rose-meta.conf b/etc/tutorial/failif-warnif/meta/rose-meta.conf similarity index 100% rename from etc/tutorial/fail-if-warn-if/meta/rose-meta.conf rename to etc/tutorial/failif-warnif/meta/rose-meta.conf diff --git a/etc/tutorial/fail-if-warn-if/rose-app.conf b/etc/tutorial/failif-warnif/rose-app.conf similarity index 100% rename from etc/tutorial/fail-if-warn-if/rose-app.conf rename to etc/tutorial/failif-warnif/rose-app.conf diff --git a/sphinx/tutorial/rose/furthertopics/command-keys.rst b/sphinx/tutorial/rose/furthertopics/command-keys.rst index 871281146b..4a4905cbd4 100644 --- a/sphinx/tutorial/rose/furthertopics/command-keys.rst +++ b/sphinx/tutorial/rose/furthertopics/command-keys.rst @@ -15,8 +15,12 @@ explicitly as an option of :ref:`command-rose-task-run`. Example ------- -Create a new suite (or just a new directory somewhere - e.g. in your homespace) -containing a blank :rose:file:`rose-suite.conf` and a ``suite.rc`` file that +Create a new Rose suite configuration called ``command-keys``:: + + mkdir -p ~/rose-tutorial/command-keys + cd ~/rose-tutorial/command-keys + +Create a blank :rose:file:`rose-suite.conf` and a ``suite.rc`` file that looks like this: .. code-block:: cylc diff --git a/sphinx/tutorial/rose/furthertopics/failif-warnif.rst b/sphinx/tutorial/rose/furthertopics/failif-warnif.rst index cbb8a06122..5b51f8cf74 100644 --- a/sphinx/tutorial/rose/furthertopics/failif-warnif.rst +++ b/sphinx/tutorial/rose/furthertopics/failif-warnif.rst @@ -54,11 +54,11 @@ Example We'll use the example of a rocket launch. -Create a new directory somewhere and run the following command, replacing -``DIRECTORY`` with the path to this new directory:: +Create a new application called ``failif-warnif``:: - rose tutorial fail-if-warn-if DIRECTORY - cd DIRECTORY + mkdir -p ~/rose-tutorial + rose tutorial failif-warnif ~/rose-tutorial/failif-warnif + cd ~/rose-tutorial/failif-warnif You will now have a new rose app with a :rose:file:`rose-app.conf` that looks like this: diff --git a/sphinx/tutorial/rose/furthertopics/img/rose-macro-hello-world-app-fail.png b/sphinx/tutorial/rose/furthertopics/img/rose-macro-hello-world-app-fail.png deleted file mode 100644 index 1302e1ea9a6d7b69be9579768d1dfa8a65ccbddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17721 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 B!UX^T literal 0 HcmV?d00001 diff --git a/sphinx/tutorial/rose/furthertopics/macro-development.rst b/sphinx/tutorial/rose/furthertopics/macro-development.rst index 519524ba85..3c2fc6be95 100644 --- a/sphinx/tutorial/rose/furthertopics/macro-development.rst +++ b/sphinx/tutorial/rose/furthertopics/macro-development.rst @@ -42,10 +42,13 @@ Example ------- For these examples we will create an example app called -``hello_world_app`` that could be part of a typical suite. +``macro_tutorial_app`` that could be part of a typical suite. -Create a directory for your suite app called ``hello_world_app``. -Inside the ``hello_world_app`` directory, create a :rose:file:`rose-app.conf` +Create a directory for your suite app called ``macro_tutorial_app``:: + + mkdir -p ~/rose-tutorial/macro_tutorial_app + +Inside the ``macro_tutorial_app`` directory, create a :rose:file:`rose-app.conf` file and paste in the following contents: .. code-block:: rose @@ -60,7 +63,7 @@ The metadata for the app lives under the ``meta/`` sub directory. Our new macro will live with the metadata. For this example, we want to check the value of the option -``env=WORLD`` in our ``hello_world_app`` application. Specifically, +``env=WORLD`` in our ``macro_tutorial_app`` application. Specifically, for this example, we want our macro to give us an error if the 'world' is too far away from Earth. @@ -264,13 +267,13 @@ in the application directory. Navigate to the ``env`` page, and change the option ``env=WORLD`` to ``Jupiter``. To run the macro, select the menu -:menuselection:`Metadata --> hello_world_app --> +:menuselection:`Metadata --> macro_tutorial_app --> planet.PlanetChecker.validate`. It should either return an "OK" dialog, or give an error dialog like the one below depending on the current Earth-Jupiter distance. -.. image:: img/rose-macro-hello-world-app-fail.png +.. image:: img/rose-macro-tutorial-app-fail.png :width: 350px :align: center :alt: Screenshot of a rose macro failure message. @@ -407,7 +410,7 @@ Your class should now look like this: Your transform macro is now ready to use. You can run it from :ref:`command-rose-config-edit` via the menu -:menuselection:`metadata --> hello_world_app --> planet.PlanetChanger.transform`. +:menuselection:`metadata --> macro_tutorial_app --> planet.PlanetChanger.transform`. It should give a dialog explaining the changes it's made and asking for permission to apply them. If you click OK, the changes will be @@ -563,7 +566,7 @@ metadata option. For example, our validator and transformer macros above are both specific to ``env=WORLD``. Open the file -``hello_world_app/meta/rose-meta.conf`` in a text editor, and +``macro_tutorial_app/meta/rose-meta.conf`` in a text editor, and add the following lines .. code-block:: rose diff --git a/sphinx/tutorial/rose/furthertopics/optional-configurations.rst b/sphinx/tutorial/rose/furthertopics/optional-configurations.rst index 3ff5f48a0e..bf169f10d1 100644 --- a/sphinx/tutorial/rose/furthertopics/optional-configurations.rst +++ b/sphinx/tutorial/rose/furthertopics/optional-configurations.rst @@ -20,8 +20,8 @@ Example Create a new :term:`rose app` called ``rose-opt-conf-tutorial``:: - mkdir rose-opt-conf-tutorial - cd rose-opt-conf-tutorial + mkdir -p ~/rose-tutorial/rose-opt-conf-tutorial + cd ~/rose-tutorial/rose-opt-conf-tutorial Create a :rose:file:`rose-app.conf` file with the following contents: diff --git a/sphinx/tutorial/rose/furthertopics/polling.rst b/sphinx/tutorial/rose/furthertopics/polling.rst index cccd60dd2b..e2a82141b7 100644 --- a/sphinx/tutorial/rose/furthertopics/polling.rst +++ b/sphinx/tutorial/rose/furthertopics/polling.rst @@ -13,8 +13,12 @@ requires said file. Example ------- -Create a new cylc suite (or just a new directory somewhere - e.g. in -your homespace) containing a blank ``rose-suite.conf`` and a ``suite.rc`` +Create a new rose suite configuration:: + + mkdir -p ~/rose-tutorial/polling + cd ~/rose-tutorial/polling + +Create a blank :rose:file:`rose-suite.conf` and a ``suite.rc`` file that looks like this: .. code-block:: cylc @@ -26,7 +30,7 @@ file that looks like this: graph = """compose_letter => send_letter bob => read_letter""" -This sets up a simple suite which consists of the following: +This is simple suite which consists of the following: * A ``compose_letter`` task. * A ``send_letter`` task which is run once the letter is composed. @@ -65,9 +69,10 @@ In the suite directory create an ``app`` directory. In the ``app`` directory create a directory called ``bob``. -In the newly-created ``bob`` directory, create a ``rose-app.conf`` file. +In the newly-created ``bob`` directory, create a :rose:file:`rose-app.conf` +file. -Edit the ``rose-app.conf`` file to look like this: +Edit the :rose:file:`rose-app.conf` file to look like this: .. code-block:: rose @@ -90,7 +95,7 @@ We now have an app that does the following: In practice, it may be preferable to have the ``[command]`` section at the top as that should contain the main command(s) being run by the app. -Save your changes and run the suite using ``rose suite-run``. +Save your changes and run the suite using :ref:`command-rose-suite-run`. The suite should now run. @@ -106,7 +111,8 @@ At present we have specified our own routine for testing for the existence of a particular file using the ``test`` option. However, Rose provides a simpler method for doing this. -Edit the ``rose-app.conf`` in your ``bob`` app to look like the following: +Edit the :rose:file:`rose-app.conf` in your ``bob`` app to look like the +following: .. code-block:: rose diff --git a/sphinx/tutorial/rose/furthertopics/rose-arch.rst b/sphinx/tutorial/rose/furthertopics/rose-arch.rst index a9f5bec99a..2a49f4eb06 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-arch.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-arch.rst @@ -14,8 +14,11 @@ solution to the archiving of suite files. Example ------- -Create a new suite (or just a new directory somewhere - e.g. in your -homespace) containing a blank :rose:file:`rose-suite.conf` and a ``suite.rc`` +Create a new rose suite configuration:: + + mkdir -p ~/rose-tutorial/rose-arch-tutorial + +Create a blank :rose:file:`rose-suite.conf` and a ``suite.rc`` file that looks like this: .. code-block:: cylc diff --git a/sphinx/tutorial/rose/furthertopics/rose-bunch.rst b/sphinx/tutorial/rose/furthertopics/rose-bunch.rst index 08d00d8983..1160da88ba 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-bunch.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-bunch.rst @@ -44,8 +44,12 @@ clear. We can refer to this as the "landing" routine. What differs between landings is the plane type, number of passengers carried and the resulting timings for each stage of the landing process. -Create a new suite (or just a new directory somewhere - e.g. in your -homespace) containing a blank :rose:file:`rose-suite.conf` and a ``suite.rc`` +Create a new rose suite configuration:: + + mkdir -p ~/rose-tutorial/rose-bunch + cd ~/rose-tutorial/rose-bunch + +Create a blank :rose:file:`rose-suite.conf` and a ``suite.rc`` file that looks like this: .. code-block:: cylc diff --git a/sphinx/tutorial/rose/furthertopics/rose-stem.rst b/sphinx/tutorial/rose/furthertopics/rose-stem.rst index 79f0bcec99..cae78c2cf8 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-stem.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-stem.rst @@ -36,8 +36,9 @@ purposes of this tutorial we will create a new one. Type the follow to create a temporary repository (you can safely delete it after finishing this tutorial):: - svnadmin create ~/spaceship_repos - (cd $(mktemp -d); mkdir -p trunk/src; svn import -m "" . file://$HOME/spaceship_repos) + mkdir -p ~/rose-tutorial + svnadmin create ~/rose-tutorial/spaceship_repos + (cd $(mktemp -d); mkdir -p trunk/src; svn import -m "" . file://$HOME/rose-tutorial/spaceship_repos) We then need to link the project name ``SPACESHIP`` with this project. Creating the file and directory if they do not exist @@ -45,18 +46,18 @@ add the following line to the file ``$HOME/.metomi/fcm/keyword.cfg``: .. code-block:: rose - location{primary}[spaceship] = file:///home/user/spaceship_repos + location{primary}[spaceship] = file:///home/user/rose-tutorial/spaceship_repos Make sure the path on the right-hand side matches the location you specified in the ``svnadmin`` command. Now you can checkout a working copy of your repository by typing:: - mkdir ~/spaceship_working_copy - cd ~/spaceship_working_copy + mkdir -p ~/rose-tutorial/spaceship_working_copy + cd ~/rose-tutorial/spaceship_working_copy fcm checkout fcm:spaceship_tr . -Finally populate your working copy by running:: +Finally populate your working copy by running (answering ``y`` to the prompt):: rose tutorial rose-stem . diff --git a/sphinx/tutorial/rose/furthertopics/trigger.rst b/sphinx/tutorial/rose/furthertopics/trigger.rst index 6b76f06212..674c9bc2ff 100644 --- a/sphinx/tutorial/rose/furthertopics/trigger.rst +++ b/sphinx/tutorial/rose/furthertopics/trigger.rst @@ -15,8 +15,12 @@ Example In this example, we'll be ordering pizza. -Create a new directory somewhere - e.g. in your homespace - containing -a ``rose-app.conf`` file that looks like this: +Create a new rose application called ``trigger``:: + + mkdir -p ~/rose-tutorial/trigger + cd ~/rose-tutorial/trigger + +Create a :rose:file:`rose-app.conf` file that looks like this: .. TODO - Perhaps move these large code blocks out of this file using the rose tutorial command. @@ -44,7 +48,7 @@ a ``rose-app.conf`` file that looks like this: soft_drink=.false. We'll add some metadata to make it nice. Create a ``meta/`` -sub-directory with a ``rose-meta.conf`` file that looks like this: +sub-directory with a :rose:file:`rose-meta.conf` file that looks like this: .. code-block:: rose @@ -81,8 +85,8 @@ sub-directory with a ``rose-meta.conf`` file that looks like this: [namelist:side_order=soft_drink] type=logical -Once you've done that, run ``rose edit`` in the application directory -and navigate around the pages. +Once you've done that, run :ref:`command-rose-config-edit` in the application +directory and navigate around the pages. There are quite a lot of settings that are only relevant in certain contexts - for example, ``namelist:pizza_order=extra_chicken`` is @@ -94,8 +98,8 @@ Adding Triggers Let's add some trigger information. -In the ``rose-meta.conf`` file, under ``[namelist:pizza_order=pizza_type]``, -add: +In the :rose:file:`rose-meta.conf` file, under +``[namelist:pizza_order=pizza_type]``, add: .. code-block:: cylc diff --git a/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst b/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst index b75324ff82..eb3343508c 100644 --- a/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst +++ b/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst @@ -19,8 +19,13 @@ Example In this example, we'll be upgrading a boat on a desert island. -Create a new directory called ``make-boat-app`` somewhere - e.g. in your -homespace - containing a ``rose-app.conf`` file with the following content: +Create a rose application called ``make-boat-app``:: + + mkdir -p ~/rose-tutorial/make-boat-app + cd ~/rose-tutorial/make-boat-app + + +Create a ``rose-app.conf`` file with the following content: .. code-block:: rose @@ -30,8 +35,8 @@ homespace - containing a ``rose-app.conf`` file with the following content: hollow_tree_trunks=1 paddling_twigs=1 -This creates an app config that configures our simple boat (a dugout -canoe). It references a meta flag (for which metadata is unlikely to +You now have a rose application configuration that configures our simple boat +(a dugout canoe). It references a meta flag (for which metadata is unlikely to already exist), made up of a category (``make-boat``) at a particular version (``0.1``). The meta flag is used by Rose to locate a configuration metadata directory. @@ -60,7 +65,7 @@ Create a ``rose-meta/make-boat/`` directory in your homespace:: This is the category (also called command) directory for the metadata, which will hold sub-directories for actual configuration metadata -versions (each containing a ``rose-meta.conf`` file, etc). +versions (each containing a :rose:file:`rose-meta.conf` file, etc). N.B. Configuration metadata would normally be managed by whoever manages Rose installation at your site. @@ -70,14 +75,14 @@ We know we need some metadata for the ``0.1`` version, so create a mkdir ~/rose-meta/make-boat/0.1/ -We'll need a ``rose-meta.conf`` file there too, so create an empty one in -the new directory:: +We'll need a :rose:file:`rose-meta.conf` file there too, so create an empty +one in the new directory:: touch ~/rose-meta/make-boat/0.1/rose-meta.conf We can safely say that our two namelist inputs are essential for the construction and testing of the boat, so we can paste the following into -the newly created ``rose-meta.conf`` file: +the newly created :rose:file:`rose-meta.conf` file: .. code-block:: rose @@ -121,7 +126,7 @@ Let's create the new metadata version, to document what we need and don't need. Create a new subdirectory under ``make-boat/`` called ``0.2/`` containing -a ``rose-meta.conf`` file that looks like this: +a :rose:file:`rose-meta.conf` file that looks like this: .. code-block:: rose @@ -215,7 +220,8 @@ Upgrade macros are bits of Python code that essentially look like this: # Some code doing something to config goes here. return config, self.reports -They are sub-classes of a particular class, ``rose.upgrade.MacroUpgrade``, +They are sub-classes of a particular class, +:py:class:`rose.upgrade.MacroUpgrade`, which means that some of the Python functionality is done 'under the hood' to make things easier. @@ -336,7 +342,7 @@ We'll add a rudder option for our ``0.3`` version, with a ``namelist:materials=l_rudder_branch``. Create a ``0.3`` directory in the same way that you created the ``0.1`` -and ``0.2`` metadata directories. Add a ``rose-meta.conf`` file that +and ``0.2`` metadata directories. Add a :rose:file:`rose-meta.conf` file that looks like this: .. code-block:: rose @@ -406,7 +412,8 @@ file that looks like this: Go ahead and upgrade the app configuration to ``0.3``, as you did before. -The ``rose-app.conf`` should now contain the new option, ``l_rudder_branch``. +The :rose:file:`rose-app.conf` should now contain the new option, +``l_rudder_branch``. More Complex Upgrade Macros ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/sphinx/tutorial/rose/furthertopics/upgrading.rst b/sphinx/tutorial/rose/furthertopics/upgrading.rst index f042bafee7..690bba6115 100644 --- a/sphinx/tutorial/rose/furthertopics/upgrading.rst +++ b/sphinx/tutorial/rose/furthertopics/upgrading.rst @@ -22,9 +22,12 @@ This part tutorial walks you through upgrading applications. Example ------- -Create a new directory somewhere in your filesystem called ``garden``. +Create a new rose application called ``garden``:: -Create within it a ``rose-app.conf`` file that looks like this: + mkdir -p ~/rose-tutorial/garden + cd ~/rose-tutorial/garden + +Create within it a :rose:file:`rose-app.conf` file that looks like this: .. code-block:: rose @@ -55,8 +58,8 @@ This gives you a list of versions to upgrade to - see the help for more information (run ``rose help app-upgrade``). There can often be more versions than you can see by just running -``rose app-upgrade``. They will not have formal metadata, and represent -intermediary steps along the way between proper named versions. You +:ref:`command-rose-app-upgrade`. They will not have formal metadata, and +represent intermediary steps along the way between proper named versions. You can see all the possible versions by running: .. code-block:: bash @@ -78,7 +81,7 @@ This will give you a list of changes that the upgrade will apply to your configuration. Accept it, and your application configuration will be upgraded, with a new option (``shrubberies``) and a new ``meta=...`` version of the metadata to point to. Have a look at the changed -``rose-app.conf`` if you like. +:rose:file:`rose-app.conf` if you like. Try repeating this by upgrading to ``garden0.3`` in the same way. This time, you'll get a warning - warnings are used to point out @@ -96,10 +99,10 @@ Try running: If you accept the changes, your app config will be upgraded through all the intermediary versions to the new one. Have a look at the -``rose-app.conf`` file. +:rose:file:`rose-app.conf` file. -If you run rose ``app-upgrade`` with no arguments, you can see that -you're using the latest version. +If you run rose :ref:`command-rose-app-upgrade` with no arguments, you can see +that you're using the latest version. Downgrading diff --git a/sphinx/tutorial/rose/furthertopics/widget-development.rst b/sphinx/tutorial/rose/furthertopics/widget-development.rst index 826687dd3f..524ea9f5f1 100644 --- a/sphinx/tutorial/rose/furthertopics/widget-development.rst +++ b/sphinx/tutorial/rose/furthertopics/widget-development.rst @@ -4,8 +4,9 @@ Widget Development ================== -The ``rose edit`` GUI displays configurations using built-in widgets. For more -complex requirements ``rose edit`` supports custom widgets as plugins. +The :ref:`command-rose-config-edit` GUI displays configurations using built-in +widgets. For more complex requirements :ref:`command-rose-config-edit` supports +custom widgets as plugins. In this tutorial we will write a custom widget which offers typing suggestions when entering usernames. @@ -43,7 +44,8 @@ You will now have a rose app which contains the following files: | `-- username.py `-- rose-app.conf -The ``rose-app.conf`` file defines an environment variable called ``USER``: +The :rose:file:`rose-app.conf` file defines an environment variable called +``USER``: .. code-block:: rose @@ -61,9 +63,9 @@ Initial Code ^^^^^^^^^^^^ We will start with a slimmed-down copy of the class -``rose.config_editor.valuewidget.text.RawValueWidget`` which you will find -in the file ``username.py``. It contains all the API calls you would normally -ever need. +:py:class:`rose.config_editor.valuewidget.text.RawValueWidget` which you will +find in the file ``username.py``. It contains all the API calls you would +normally ever need. We are now going to extend the widget to be more useful. @@ -142,7 +144,7 @@ Results ^^^^^^^ Try opening up the config editor in the application directory (where the -``rose-app.conf`` is) by running:: +:rose:file:`rose-app.conf` is) by running:: rose edit From b89d3ec129d37ab9bd44d9885bbd153ee418853d Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Thu, 12 Apr 2018 16:06:21 +0100 Subject: [PATCH 14/34] erratum - first pass --- sphinx/tutorial/rose/metadata.rst | 26 ++++++++++++++++---------- sphinx/tutorial/rose/rosie.rst | 31 +++++++++++++++++-------------- sphinx/tutorial/rose/suites.rst | 6 ++---- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 0545573c0d..77432997e6 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -24,9 +24,10 @@ outside of the configuration. The :rose:file:`rose-meta.conf` file uses the standard :ref:`Rose configuration format `. -The metadata for a setting is written in a section which is named after the ID -of the setting which is the section and setting name separated by an equals -symbol. +The metadata for a setting is written in a section named ``section=setting`` +where ``setting`` is the name of the setting and ``section`` is the section to +which the setting belongs (leave blank if the setting does not belong to +a section). For example take the following application configuration. @@ -39,7 +40,7 @@ For example take the following application configuration. [env] WORLD=Earth -For example if we were to write metadata for ``WORLD`` environemt variable we +If we were to write metadata for ``WORLD`` environment variable we would create a section called ``[env=WORLD]``. .. code-block:: rose @@ -88,7 +89,7 @@ There are many metadata items, here are some of the commonly used ones: Specify the length of comma separated lists e.g. ``length=:`` for a limitless list. ``range`` - Specify numberical bounds for the value of a setting e.g. ``range=1, 10`` + Specify numerical bounds for the value of a setting e.g. ``range=1, 10`` for a value between 1 and 10. For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. @@ -128,7 +129,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. Hover the mouse over the hash to reveal the comment. Keep the :ref:`command-rose-config-edit` window open as we will use it - throught the rest of this practical. + throughout the rest of this practical. #. **Descriptions.** @@ -166,11 +167,13 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. rose metadata-check -C meta/ Next reload the metadata in the :ref:`command-rose-config-edit` window - using the :menuselection:`Metadata -> Refresh Metadata` menu item. + using the :menuselection:`Metadata --> Refresh Metadata` menu item. The descriptions should now display under each environment variable. - If you don't see the description for a setting it is possible that you - miss-spelt the name of the setting in the section heading. + .. tip:: + + If you don't see the description for a setting it is possible that you + miss-spelt the name of the setting in the section heading. #. **Length.** @@ -199,7 +202,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. rose metadata-check -C meta/ Refresh the metadata in the :ref:`command-rose-config-edit` window be - selecting :menuselection:`Metadata -> Refresh Metadata`. + selecting :menuselection:`Metadata --> Refresh Metadata`. The three settings we have edited should now appear as lists. #. **Types.** @@ -222,6 +225,9 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. Add similar ``type`` entries for the following settings: + .. note that :align: center does not work with the `table` directive + see https://github.com/sphinx-doc/sphinx/issues/3942 + ==================== ========================= ``integer`` settings ``real`` (float) settings ==================== ========================= diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index 66c01d458c..c16ae1b01d 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -20,17 +20,6 @@ Rosie: control see the `FCM User Guide`_. -Version Control ---------------- - -When a rose suite configuration is managed with Rosie the :term:`suite -directory` is added to `version control`_ using `FCM`_. - -FCM is a `subversion `_ (SVN) wrapper which provides a standard working -practice for SVN projects. FCM implements all of the SVN commands as well as -additional functionality. See the `FCM User Guide`_ for more information. - - Rosie Suites ------------ @@ -43,7 +32,18 @@ system. Rosie suites can be created by the command: Create a new suite or copy an existing one. By default Rosie creates the `working copy`_ (local copy) of new suites in the -``~/roses`` directory though Rosie working coppies can be created elsewhere. +``~/roses`` directory though Rosie working copies can be created elsewhere. + + +Version Control +--------------- + +In Rosie suites the :term:`suite directory` is added to `version control`_ +using `FCM`_. + +FCM is a `subversion `_ (SVN) wrapper which provides a standard working +practice for SVN projects. FCM implements all of the SVN commands as well as +additional functionality. See the `FCM User Guide`_ for more information. Suite Naming @@ -56,15 +56,18 @@ hyphen and then an identifier made up of two characters and three numbers e.g: :align: center bgcolor = "none" + ranksep=0 + node [shape="plaintext", fontsize="11"] edge [style="invis"] - graph [ranksep=0] + a1 [label="u", fontsize=20] a2 [label="Prefix", fontcolor="#707070"] b1 [label="-", fontsize=20] b2 [label="", fontcolor="#707070"] c1 [label="aa001", fontsize=20] c2 [label="Unique Identifier", fontcolor="#707070"] + a1 -- a2 b1 -- b2 c1 -- c2 @@ -142,7 +145,7 @@ commands called :ref:`command-rosie-go`. to you. You can specify the repository to use with the ``--prefix`` command line - option. For instance to use the (internal) MetOffice Testing Repository + option. For instance to use the (internal) Met Office Testing Repository supply the command line argument ``--prefix=mot``. .. code-block:: sub diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 74db22b773..523cf0aa81 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -23,9 +23,7 @@ A rose suite configuration is a cylc :term:`suite directory` containing a The :rose:file:`rose-suite.conf` file is written in the same :ref:`format ` as the :rose:file:`rose-app.conf` -file. It is used to configure: - -Its main configuration sections are: +file. Its main configuration sections are: :rose:conf:`rose-suite.conf[env]` Environment variables for use by the whole suite. @@ -78,7 +76,7 @@ directory. As cylc runs suites in the ``cylc-run`` directory the in the same directory in which it is written. With Rose we develop suites in a separate directory to the one in which they -run meaning that the :term:`suite directory` is separate from the +run meaning that the :term:`suite directory` is different from the :term:`run directory`. This helps keep the suite separate from its output and means that you can safely work on a suite and its resources whilst it is running. From 27668cfe91b96b81307a3d77bbe26f75c0e5c2b3 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 10:14:18 +0100 Subject: [PATCH 15/34] pep8. --- .../cylc-forecasting-suite/lib/python/util.py | 1 - sphinx/ext/rose_domain.py | 47 ++++++++++--------- sphinx/ext/script_include.py | 2 +- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/etc/tutorial/cylc-forecasting-suite/lib/python/util.py b/etc/tutorial/cylc-forecasting-suite/lib/python/util.py index 7dcb020211..9e7d7f83c6 100644 --- a/etc/tutorial/cylc-forecasting-suite/lib/python/util.py +++ b/etc/tutorial/cylc-forecasting-suite/lib/python/util.py @@ -6,7 +6,6 @@ # ----------------------------------------------------------------------------- from copy import copy import math -import os import jinja2 diff --git a/sphinx/ext/rose_domain.py b/sphinx/ext/rose_domain.py index 17711611cb..a0a132801a 100644 --- a/sphinx/ext/rose_domain.py +++ b/sphinx/ext/rose_domain.py @@ -124,10 +124,10 @@ LOGGER = logging.getLogger(__name__) ROSE_DOMAIN_REGEX = re.compile( # Regex for a fully qualified rose domain. - r'rose:(\w+):' # Rose domain prefix + object type. - r'([^\|\[ \n]+)' # Configuration file. - r'(\[.*\])?' # Configuration section. - r'(?:\|?(.*))?' # Configuration setting. + r'rose:(\w+):' # Rose domain prefix + object type. + r'([^\|\[ \n]+)' # Configuration file. + r'(\[.*\])?' # Configuration section. + r'(?:\|?(.*))?' # Configuration setting. ) SECTION_REGEX = re.compile( # Regex for splitting sections and settings. r'(\[.*\])(.*)' @@ -165,8 +165,10 @@ def tokenise_namespace(namespace): [('rose:app', 'foo'), ('rose:conf', '[bar]')] >>> tokenise_namespace('rose:conf:foo[bar]baz') [('rose:app', 'foo'), ('rose:conf', '[bar]'), ('rose:conf', 'baz')] - >>> tokenise_namespace('rose:conf:foo.conf[bar:pub]baz') - [('rose:file', 'foo.conf'), ('rose:conf', '[bar:pub]'), ('rose:conf', 'baz')] + >>> tokenise_namespace('rose:conf:foo.conf[bar:pub]baz' + ... ) # doctest: +NORMALIZE_WHITESPACE + [('rose:file', 'foo.conf'), ('rose:conf', '[bar:pub]'), + ('rose:conf', 'baz')] """ match = ROSE_DOMAIN_REGEX.match(namespace) @@ -270,13 +272,14 @@ class RoseDirective(ObjectDescription): - ``ARGUMENT_SEPARATOR`` & ``ARGUMENT_REGEX`` - ``ALT_FORM_SEPARATOR`` - ``ALT_FORM_TEMPLATE`` - - ``doc_field_types`` - List of ``Field`` objects for object parameters. + - ``doc_field_types`` - List of ``Field`` objects for object + parameters. - ``run()`` - For adding special rev_context variables via ``add_rev_context``. - ``handle_signature()`` - For changing the display of objects. - - ``custom_name_template`` - String template accepting one string format - argument for custom formatting the node name (e.g. ``'[%s]'`` for conf - sections). + - ``custom_name_template`` - String template accepting one string + format argument for custom formatting the node name (e.g. ``'[%s]'`` + for conf sections). ref_context Variables: Sphinx domains use ``ref_context`` variables to determine the @@ -391,7 +394,7 @@ def get_ref_context(self, key): def after_content(self): """This method is called after child objects have been processed. - + There is also the ``before_content()`` method which is called during ``run()`` before child objects have been processed but after the current object has been processed. @@ -436,10 +439,10 @@ def process_name(self, name): name = self.custom_name_template % name return name, argument, alt_forms - + def handle_signature(self, sig, signode, display_text=None): """This method determines the appearance of the object. - + Overloaded Args: display_test: Used for overriding the object name. """ @@ -553,8 +556,8 @@ class RoseConfigDirective(RoseDirective): field for optional settings. Additional ref_context: - * ``rose:conf-section`` - Set for parent configurations, is available to - any child nodes. + * ``rose:conf-section`` - Set for parent configurations, is available + to any child nodes. Example: @@ -620,7 +623,7 @@ def run(self): class RoseXRefRole(XRefRole): """Handle references to rose objects. - + This should be minimal.""" def process_link(self, env, refnode, has_explicit_title, title, target): @@ -631,7 +634,7 @@ def process_link(self, env, refnode, has_explicit_title, title, target): class RoseDomain(Domain): """Sphinx extension to add the ability to document rose objects. - + Example: Click :guilabel:`source` to view source code. @@ -691,7 +694,7 @@ class RoseDomain(Domain): def clear_doc(self, docname): """Removes documented items from the rose domain. - + Not sure why, but apparently necessary. """ for fullname, (pkg_docname, _l) in list(self.data['objects'].items()): @@ -706,7 +709,7 @@ def get_objects(self): @staticmethod def get_context_namespace(node): """Extract the namespace from a content node. - + Walks up the node hierarchy from the current node collecting ref_context information as it does. See ``RoseDirective.run`` for information on how this context comes to reside in the node. @@ -724,7 +727,7 @@ def get_context_namespace(node): def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): """Associate a reference with a documented object. - + The important parameters are: typ (str): The object type - see ``RoseDomain.object_types``. target (str): The rest of the reference as written in the rst. @@ -770,8 +773,8 @@ def resolve_xref(self, env, fromdocname, builder, typ, target, node, context_namespace = self.get_context_namespace(node) if not context_namespace: LOGGER.warning( - 'Relative reference requires local context "%s".' % ( - target), location=node) + 'Relative reference requires local context ' + + '"%s".' % (target), location=node) return if relative_to_conf: # Target is relative to the context conf_file. diff --git a/sphinx/ext/script_include.py b/sphinx/ext/script_include.py index 2e9af7db53..0a8e395614 100644 --- a/sphinx/ext/script_include.py +++ b/sphinx/ext/script_include.py @@ -40,7 +40,7 @@ class ScriptInclude(Directive): def run(self): command = sh_split(' '.join(self.arguments[0:])) stdout = Popen(command, stdout=PIPE, stdin=open(os.devnull) - ).communicate()[0] + ).communicate()[0] node = nodes.section() node.document = self.state.document nested_parse_with_titles(self.state, ViewList(stdout.splitlines()), From 78df244825595f453b98daef3e1dc77378076293 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 11:48:29 +0100 Subject: [PATCH 16/34] Capitalise all rose instances. --- sphinx/api/built-in/rose_ana.rst | 2 +- sphinx/api/configuration.rst | 2 +- .../rose-configuration-format.rst | 11 ++-- sphinx/api/configuration/site-and-user.rst | 12 ++++- sphinx/api/configuration/suite.rst | 4 +- sphinx/api/environment-variables.rst | 24 +++++---- sphinx/api/rose-bash-library.rst | 2 +- sphinx/api/rose-macro.rst | 2 +- sphinx/api/rosie-web.rst | 2 +- sphinx/cheat-sheet.rst | 28 +++++----- sphinx/developing/auto-cli-api.rst | 4 +- sphinx/developing/autodoc.rst | 4 +- sphinx/developing/building.rst | 8 ++- sphinx/developing/domains.rst | 2 +- sphinx/ext/auto_cli_doc.py | 4 +- sphinx/ext/rose_domain.py | 54 +++++++++---------- sphinx/ext/rose_lang.py | 10 ++-- sphinx/glossary.rst | 51 +++++++++--------- sphinx/installation.rst | 11 ++-- .../cylc/furthertopics/inheritance.rst | 2 +- sphinx/tutorial/rose/applications.rst | 10 ++-- sphinx/tutorial/rose/configurations.rst | 28 +++++----- .../rose/furthertopics/command-keys.rst | 2 +- .../furthertopics/date-time-manipulation.rst | 11 ++-- .../rose/furthertopics/failif-warnif.rst | 6 +-- sphinx/tutorial/rose/furthertopics/index.rst | 2 +- .../rose/furthertopics/macro-development.rst | 8 +-- .../furthertopics/optional-configurations.rst | 6 +-- .../tutorial/rose/furthertopics/polling.rst | 2 +- .../tutorial/rose/furthertopics/rose-arch.rst | 9 ++-- .../rose/furthertopics/rose-bunch.rst | 20 +++---- .../tutorial/rose/furthertopics/rose-stem.rst | 16 +++--- .../tutorial/rose/furthertopics/trigger.rst | 9 ++-- .../upgrading-macro-development.rst | 16 +++--- .../tutorial/rose/furthertopics/upgrading.rst | 8 +-- .../rose/furthertopics/widget-development.rst | 10 ++-- sphinx/tutorial/rose/index.rst | 4 +- sphinx/tutorial/rose/metadata.rst | 12 ++--- sphinx/tutorial/rose/rosie.rst | 6 +-- sphinx/tutorial/rose/suites.rst | 40 +++++++------- sphinx/tutorial/rose/summary.rst | 16 +++--- 41 files changed, 247 insertions(+), 233 deletions(-) diff --git a/sphinx/api/built-in/rose_ana.rst b/sphinx/api/built-in/rose_ana.rst index ee2aa5196b..16a5dd77ab 100644 --- a/sphinx/api/built-in/rose_ana.rst +++ b/sphinx/api/built-in/rose_ana.rst @@ -67,7 +67,7 @@ Lists Argument substitution If the option contains one or more pairs of braces (``{}``) the option will be returned multiple times with the parentheses substituted once for - each argument passed to ``rose task-run`` + each argument passed to :ref:`command-rose-task-run` The app may also define a configuration section, ``[ana:config]``, whose key-value pairs define app-wide settings that are passed through to the diff --git a/sphinx/api/configuration.rst b/sphinx/api/configuration.rst index 409d04b891..5f6dde7307 100644 --- a/sphinx/api/configuration.rst +++ b/sphinx/api/configuration.rst @@ -50,7 +50,7 @@ For more information see the :ref:`command-rose-config` command line reference. Python API ---------- -Rose provides a Python API for loading, processing, editing and dumping rose +Rose provides a Python API for loading, processing, editing and dumping Rose configurations via the :py:mod:`rose.config` module located within the Rose Python library. diff --git a/sphinx/api/configuration/rose-configuration-format.rst b/sphinx/api/configuration/rose-configuration-format.rst index 6938209aca..26ff7d6356 100644 --- a/sphinx/api/configuration/rose-configuration-format.rst +++ b/sphinx/api/configuration/rose-configuration-format.rst @@ -13,9 +13,9 @@ following: * (optionally) files containing data that cannot easily be represented by the INI format. -We have added the following conventions into the rose configuraiton format: +We have added the following conventions into the Rose configuraiton format: -#. The file name is normally called ``rose*.conf``, e.g. ``rose.conf``, +#. The file name is normally called ``rose*.conf``, e.g. :rose:file:`rose.conf`, :rose:file:`rose-app.conf`, :rose:file:`rose-meta.conf`, etc. #. Only a hash ``#`` in the beginning of a line starts a comment. Empty lines and lines with only white spaces are ignored. There is no support for @@ -59,8 +59,8 @@ We have added the following conventions into the rose configuraiton format: utilities. * A single exclamation denotes a user-ignored setting. * A double exclamation denotes a program-ignored setting. E.g. - ``rose config-edit`` may use a double exclamation to switch off a - setting according to the setting metadata. + :ref:`command-rose-config-edit` may use a double exclamation to switch + off a setting according to the setting metadata. #. The open square bracket (``[``) and close square bracket (``]``) characters cannot be used within a section declaration. E.g. @@ -202,7 +202,8 @@ optional configurations to be selected at run time using: Optional Configurations and Metadata ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Metadata utilities such as ``rose app-upgrade`` and ``rose macro`` treat each +Metadata utilities such as :ref:`command-rose-app-upgrade` and +:ref:`command-rose-macro` treat each main + optional configuration as a separate entity to be transformed, upgraded, or validated. Use cases with more than one optional configuration are not handled. diff --git a/sphinx/api/configuration/site-and-user.rst b/sphinx/api/configuration/site-and-user.rst index edaaaee4e6..702c6c1d8a 100644 --- a/sphinx/api/configuration/site-and-user.rst +++ b/sphinx/api/configuration/site-and-user.rst @@ -14,10 +14,18 @@ site configuration at ``$ROSE_HOME/etc/rose.conf`` where search for the user configuration at ``$HOME/.metomi/rose.conf`` where ``$HOME`` is the home directory of the current user. -You can also override many internal constants of the ``rose config edit`` and +.. note:: + Allowed settings in the site and user configuration files will be + documented in a future version of this document. In the mean time, the + settings are documented as comments in the ``etc/rose.conf.example`` + file of each distribution of Rose. + +You can also override many internal constants of +:ref:`command-rose-config-edit` and ``rosie go``. To change the keyboard shortcut of the ``Find Next`` action in the config editor to ``F3``, put the following lines in your user config file, -and the setting will apply the next time you run ``rose config-edit``: +and the setting will apply the next time you run +:ref:`command-rose-config-edit`: .. code-block:: rose diff --git a/sphinx/api/configuration/suite.rst b/sphinx/api/configuration/suite.rst index 2d27d90150..87807171f7 100644 --- a/sphinx/api/configuration/suite.rst +++ b/sphinx/api/configuration/suite.rst @@ -100,8 +100,8 @@ A suite directory may contain the following: root-dir=hpc*=$WORKDIR =*=$DATADIR - In this example, ``rose suite-run`` of a suite with name ``$NAME`` will - create ``~/cylc-run/$NAME`` as a symbolic link to + In this example, :ref:`command-rose-suite-run` of a suite with name + ``$NAME`` will create ``~/cylc-run/$NAME`` as a symbolic link to ``$DATADIR/cylc-run/$NAME/`` on any machine, except those with their hostnames matching ``hpc*``. In which case, it will create ``~/cylc-run/$NAME`` as a symbolic link to ``$WORKDIR/cylc-run/$NAME/``. diff --git a/sphinx/api/environment-variables.rst b/sphinx/api/environment-variables.rst index e4bbc7941f..6431405820 100644 --- a/sphinx/api/environment-variables.rst +++ b/sphinx/api/environment-variables.rst @@ -31,18 +31,18 @@ Rose Environment Variables .. envvar:: ROSE_BUNCH_LOG_PREFIX Description - Environment variable provided to rose bunch instances at runtime to + Environment variable provided to Rose Bunch instances at runtime to identify the log prefix that will be used for output e.g. for a bunch instance named ``foo`` then ``ROSE_BUNCH_LOG_PREFIX=foo``. Provided At Runtime By - * rose bunch + * Rose Bunch .. envvar:: ROSE_CONF_PATH Description Specify a colon (``:``) separated list of paths for searching and loading site/user configuration. If this environment variable is not defined, the - normal behaviour is to search for and load ``rose.conf`` from + normal behaviour is to search for and load :rose:file:`rose.conf` from ``$ROSE_HOME/etc`` and then ``$HOME/.metomi``. Used By * :ref:`command-rose-test-battery` @@ -111,9 +111,9 @@ Rose Environment Variables .. envvar:: ROSE_HOME Description - Specifies the path to the rose home directory. + Specifies the path to the Rose home directory. Used and Provided By - * rose + * ``rose`` .. envvar:: ROSE_HOME_BIN @@ -121,7 +121,7 @@ Rose Environment Variables Specifies the path to the ``bin/`` or ``sbin/`` directory of the current Rose utility. Used and Provided By - * rose + * ``rose`` .. envvar:: ROSE_LAUNCHER @@ -202,12 +202,13 @@ Rose Environment Variables Defines the rose namespace. Used to identify if a utility belongs to ``rose`` or ``rosie``. Used and Provided By - * rose + * ``rose`` .. envvar:: ROSE_ORIG_HOST Description - The name of the host where the ``rose suite-run`` command was invoked. + The name of the host where the :ref:`command-rose-suite-run` command was + invoked. Provided By * :ref:`command-rose-suite-run` @@ -309,7 +310,8 @@ Rose Environment Variables instead. Description - Additional options and arguments for ``fcm make`` or ``rose app-run``. + Additional options and arguments for ``fcm make`` or + :ref:`command-rose-app-run`. Used By * ``fcm_make`` built-in application * ``fcm_make2`` built-in application @@ -333,12 +335,12 @@ Rose Environment Variables Description Used to identify which ``rose`` or ``rosie`` utility is being run. Used and Provided By - * rose + * ``rose`` .. envvar:: ROSE_VERSION Description The current version of Rose. Used and Provided By - * rose + * ``rose`` * :ref:`command-rose-suite-run` diff --git a/sphinx/api/rose-bash-library.rst b/sphinx/api/rose-bash-library.rst index f48c5672d1..9f806e2550 100644 --- a/sphinx/api/rose-bash-library.rst +++ b/sphinx/api/rose-bash-library.rst @@ -1,7 +1,7 @@ Rose Bash Library ================= -The rose bash library lives in ``lib/bash/``. To import a module, load the file +The Rose bash library lives in ``lib/bash/``. To import a module, load the file into your script. E.g. To load ``rose_usage``, you would do:: . $ROSE_HOME/lib/bash/rose_usage diff --git a/sphinx/api/rose-macro.rst b/sphinx/api/rose-macro.rst index 34d5f2c082..a98d0468cf 100644 --- a/sphinx/api/rose-macro.rst +++ b/sphinx/api/rose-macro.rst @@ -26,7 +26,7 @@ They can be run within :ref:`command-rose-config-edit` or via This section covers validator, transformer and reporter macros. For upgrader macros see :ref:`Upgrade Macro API `. -There are built-in rose macros that handle standard behaviour such as trigger +There are built-in Rose macros that handle standard behaviour such as trigger changing and type checking. Macros use a Python API, and should be written in Python, unless you are diff --git a/sphinx/api/rosie-web.rst b/sphinx/api/rosie-web.rst index c51f544f28..9e2e013982 100644 --- a/sphinx/api/rosie-web.rst +++ b/sphinx/api/rosie-web.rst @@ -16,7 +16,7 @@ Location -------- The URLs to access the web API of a Rosie web service (with a given prefix -name) can be found in your rose site configuration file as the value of +name) can be found in your Rose site configuration file as the value of ``[rosie-id]prefix-ws.PREFIX_NAME``. To access the API for a given repository with prefix ``PREFIX_NAME``, you must select a format (the only currently supported format is JSON) and use a url that looks like: diff --git a/sphinx/cheat-sheet.rst b/sphinx/cheat-sheet.rst index 8e29913185..41a334cb15 100644 --- a/sphinx/cheat-sheet.rst +++ b/sphinx/cheat-sheet.rst @@ -4,8 +4,8 @@ Cheat Sheet =========== This page outlines how to perform suite operations for "pure" :term:`cylc -suites ` (*the cylc way*) and those using :term:`rose suite -configurations ` (*the rose way*). +suites ` (*the cylc way*) and those using :term:`Rose suite +configurations ` (*the Rose way*). .. Use the "sub" lexer as the default for this file. @@ -23,8 +23,8 @@ Starting Suites .. list-table:: :class: grid-table - * - .. rubric:: The cylc way - - .. rubric:: The rose way + * - .. rubric:: The Cylc Way + - .. rubric:: The Rose way * - :: cylc validate @@ -69,8 +69,8 @@ any jobs from the previous run. .. list-table:: :class: grid-table - * - .. rubric:: The cylc way - - .. rubric:: The rose way + * - .. rubric:: The Cylc Way + - .. rubric:: The Rose Way * - :: cylc restart @@ -97,8 +97,8 @@ suite without making any changes to the :term:`run directory`. Cylc will .. list-table:: :class: grid-table - * - .. rubric:: The cylc way - - .. rubric:: The rose way + * - .. rubric:: The Cylc Way + - .. rubric:: The Rose Way * - :: cylc stop --now --now @@ -117,8 +117,8 @@ Change the configuration of a running suite. .. list-table:: :class: grid-table - * - .. rubric:: The cylc way - - .. rubric:: The rose way + * - .. rubric:: The Cylc Way + - .. rubric:: The Rose Way * - :: cylc reload @@ -157,8 +157,8 @@ Visualise A Suite's :term:`Graph` .. list-table:: :class: grid-table - * - .. rubric:: The cylc way - - .. rubric:: The rose way + * - .. rubric:: The Cylc Way + - .. rubric:: The Rose Way * - :: # No special steps required. @@ -177,8 +177,8 @@ View A Suite's ``suite.rc`` Configuration .. list-table:: :class: grid-table - * - .. rubric:: The cylc way - - .. rubric:: The rose way + * - .. rubric:: The Cylc Way + - .. rubric:: The Rose Way * - :: # No special steps required. diff --git a/sphinx/developing/auto-cli-api.rst b/sphinx/developing/auto-cli-api.rst index 1ea9c31708..bfb6dbd373 100644 --- a/sphinx/developing/auto-cli-api.rst +++ b/sphinx/developing/auto-cli-api.rst @@ -2,9 +2,9 @@ Auto CLI API ============ -The rose command line API is auto-documented by the extension ``auto-cli-api``. +The Rose command line API is auto-documented by the extension ``auto-cli-api``. -This translates the rose CLI help into reStructuredText. To keep the CLI docs +This translates the Rose CLI help into reStructuredText. To keep the CLI docs clean they are written in a plain format which has some reStructuredText features built in. diff --git a/sphinx/developing/autodoc.rst b/sphinx/developing/autodoc.rst index f1e8c52f26..074220a822 100644 --- a/sphinx/developing/autodoc.rst +++ b/sphinx/developing/autodoc.rst @@ -20,7 +20,7 @@ Napoleon accepts docstrings in one of two formats: * `Google `_ - `Napoleon Google Example`_ * `Numpy `_ - `Napoleon Numpy Example`_ -For rose docstrings please stick to the **Google** convention. +For Rose docstrings please stick to the **Google** convention. Some quick examples: .. code-block:: python @@ -80,7 +80,7 @@ Writing Doctests Examples [in docstrings] written in `doctest format `_ will appear nicely formatted in the API docs, as an added bonus they are testable (``make -C doc -doctest``, incorporated in the rose test battery). +doctest``, incorporated in the :ref:`command-rose-test-battery`). Use ``>>>`` for statements and ``...`` for continuation lines. Any return values will have to be provided and should sit on the next newline. diff --git a/sphinx/developing/building.rst b/sphinx/developing/building.rst index f71feafe94..1433b6e723 100644 --- a/sphinx/developing/building.rst +++ b/sphinx/developing/building.rst @@ -5,8 +5,8 @@ Building & Testing ``rose make-docs`` ------------------ -The documentation is built by the ``rose make-docs`` command. Its arguments are -provided to the sphinx makefile in order. +The documentation is built by the :ref:`command-rose-make-docs` command. Its +arguments are provided to the sphinx makefile in order. Whenever making changes to the sphinx infrastructure use a clean build e.g: @@ -27,10 +27,8 @@ The following builders are useful for development: ``rose test-battery`` --------------------- -The ``rose test-battery`` runs: +The :ref:`command-rose-test-battery` runs: -* ``rose make-docs clean strict doctest linkcheck``. * pep8 on the python extensions (``sphinx/ext``). * ``python -m doctest `` for python extensions (``sphinx/ext``). * eslint on any static javascript files (``sphinx/static/js``). - diff --git a/sphinx/developing/domains.rst b/sphinx/developing/domains.rst index b158c87d0d..56309bc4c0 100644 --- a/sphinx/developing/domains.rst +++ b/sphinx/developing/domains.rst @@ -17,7 +17,7 @@ Sphinx includes a system for documenting objects in a structured way via This is what the ``sphinx.ext.autodoc`` system does (e.g. ``autofunction``) for you automatically. -For documenting rose components an extension adding a rose domain has been +For documenting Rose components an extension adding a Rose domain has been added. diff --git a/sphinx/ext/auto_cli_doc.py b/sphinx/ext/auto_cli_doc.py index 884abc789f..3611c80a10 100644 --- a/sphinx/ext/auto_cli_doc.py +++ b/sphinx/ext/auto_cli_doc.py @@ -415,10 +415,10 @@ def write_command_reference(write, commands): def get_rose_command_reference(command_name): - """Generate help text for a rose command. + """Generate help text for a Rose command. Args: - command_name (str): The name of the rose command to be documented (i.e. + command_name (str): The name of the Rose command to be documented (i.e. rose / rosie. """ diff --git a/sphinx/ext/rose_domain.py b/sphinx/ext/rose_domain.py index a0a132801a..fcfbfed8a5 100644 --- a/sphinx/ext/rose_domain.py +++ b/sphinx/ext/rose_domain.py @@ -17,14 +17,14 @@ # You should have received a copy of the GNU General Public License # along with Rose. If not, see . # ----------------------------------------------------------------------------- -"""The rose domain is for documenting rose configurations and built-in +"""The Rose domain is for documenting Rose configurations and built-in applications. Rose Objects: - The rose domain supports the following object types: + The Rose domain supports the following object types: * ``rose:app`` - Rose Applications. - * ``rose:file`` - Root rose configurations. + * ``rose:file`` - Root Rose configurations. * ``rose:conf`` - Rose configurations. Nest them to create configuration sections. @@ -44,7 +44,7 @@ * The ``FILE-NAME`` for configuration files (e.g. ``rose.conf``). Referencing From RST Files: - To reference a rose object add the object ``TYPE`` into the domain + To reference a Rose object add the object ``TYPE`` into the domain (e.g. ``conf`` or ``app``). .. code-block:: rst @@ -59,7 +59,7 @@ * :rose:conf:`fcm_make.args` Autodocumentation: - Documentation can be auto-built from RST formatted comments in rose + Documentation can be auto-built from RST formatted comments in Rose configuration files using the ``autoconfig`` directive. Note that due to the implementation of :py:mod:`rose.config` the @@ -86,7 +86,7 @@ .. rose:conf:: ROSE_VERSION - provide the intended rose version to the suite. + provide the intended Rose version to the suite. .. deprecated:: 6.1.0 @@ -94,7 +94,7 @@ .. rose:conf:: CYLC_VERSION - provide the intended rose version to the suite. + provide the intended Rose version to the suite. .. deprecated:: 6.1.0 @@ -123,7 +123,7 @@ LOGGER = logging.getLogger(__name__) -ROSE_DOMAIN_REGEX = re.compile( # Regex for a fully qualified rose domain. +ROSE_DOMAIN_REGEX = re.compile( # Regex for a fully qualified Rose domain. r'rose:(\w+):' # Rose domain prefix + object type. r'([^\|\[ \n]+)' # Configuration file. r'(\[.*\])?' # Configuration section. @@ -191,10 +191,10 @@ def tokenise_namespace(namespace): if typ in ['file', 'app']: ret = [('rose:%s' % typ, conf_file)] elif '.' in conf_file: - # Must be a rose config file. + # Must be a Rose config file. ret = [('rose:file', conf_file)] else: - # Must be a rose application. + # Must be a Rose application. ret = [('rose:app', conf_file)] if conf_section: @@ -262,7 +262,7 @@ def namespace_from_tokens(tokens): class RoseDirective(ObjectDescription): - """Base class for implementing rose objects. + """Base class for implementing Rose objects. Subclasses must provide: - ``NAME`` @@ -283,7 +283,7 @@ class RoseDirective(ObjectDescription): ref_context Variables: Sphinx domains use ``ref_context`` variables to determine the - relationship between objects. E.g. for a rose app the ``rose:app`` + relationship between objects. E.g. for a Rose app the ``rose:app`` variable is set to the name of the app. This variable will be made available to all children which is how they determine that they belong to the app. @@ -299,7 +299,7 @@ class RoseDirective(ObjectDescription): """Override in settings which are permitted to be nested (e.g. 'conf').""" NAME = None - """The rose domain this directive implements, see RoseDomain.directives""" + """The Rose domain this directive implements, see RoseDomain.directives""" LABEL = '' """Label to prepend to objects.""" ARGUMENT_SEPARATOR = None @@ -313,7 +313,7 @@ class RoseDirective(ObjectDescription): argument.""" ROSE_CONTEXT = 'rose:%s' - """Prefix for all rose ref_context variables.""" + """Prefix for all Rose ref_context variables.""" def __init__(self, *args, **kwargs): self.ref_context_to_remove = [] # Cannot do this in run(). @@ -342,7 +342,7 @@ def run(self): def register_subnode(self, subnode): """Register a sub-configuration when creating Rose objects with Python. - Special method for the RoseDirective to facilitate building rose domain + Special method for the RoseDirective to facilitate building Rose domain objects using the Python API rather than RST. See :py:meth:`RoseAutoDirective.run` for usage example. @@ -496,7 +496,7 @@ def add_target_and_index(self, name_cls, _, signode): # Generate a namespace from the tokens. namespace = namespace_from_tokens(context_tokens) if namespace is False: - LOGGER.error('Invalid namespace for rose object "%s"' % namespace, + LOGGER.error('Invalid namespace for Rose object "%s"' % namespace, location=signode) # Register this namespace. @@ -509,7 +509,7 @@ def get_index_text(self, modname, name): class RoseAppDirective(RoseDirective): - """Directive for documenting rose apps. + """Directive for documenting Rose apps. Example: @@ -528,7 +528,7 @@ class RoseAppDirective(RoseDirective): class RoseFileDirective(RoseDirective): - """Directive for documenting rose files. + """Directive for documenting Rose files. Example: @@ -622,7 +622,7 @@ def run(self): class RoseXRefRole(XRefRole): - """Handle references to rose objects. + """Handle references to Rose objects. This should be minimal.""" @@ -633,7 +633,7 @@ def process_link(self, env, refnode, has_explicit_title, title, target): class RoseDomain(Domain): - """Sphinx extension to add the ability to document rose objects. + """Sphinx extension to add the ability to document Rose objects. Example: @@ -659,9 +659,9 @@ class RoseDomain(Domain): """ name = 'rose' - """Prefix for rose domain (used by sphinx).""" + """Prefix for Rose domain (used by sphinx).""" label = 'Rose' - """Display label for the rose domain (used by sphinx).""" + """Display label for the Rose domain (used by sphinx).""" object_types = { 'app': ObjType('app', 'app', 'obj'), @@ -693,7 +693,7 @@ class RoseDomain(Domain): """This sets ``self.data`` on initialisation.""" def clear_doc(self, docname): - """Removes documented items from the rose domain. + """Removes documented items from the Rose domain. Not sure why, but apparently necessary. """ @@ -702,7 +702,7 @@ def clear_doc(self, docname): del self.data['objects'][fullname] def get_objects(self): - """Iterates through documented items in the rose domain.""" + """Iterates through documented items in the Rose domain.""" for refname, (docname, type_) in list(self.data['objects'].items()): yield refname, refname, type_, docname, refname, 1 @@ -801,9 +801,9 @@ def resolve_xref(self, env, fromdocname, builder, typ, target, node, class RoseAutoDirective(Directive): - """Directive for autodocumenting rose configuration files. + """Directive for autodocumenting Rose configuration files. - Uses RST formatted comments in rose configuration files using + Uses RST formatted comments in Rose configuration files using :py:mod:`rose.config`. Note the directive only documents config objects not the file itself. @@ -828,7 +828,7 @@ def run(self): conf = config.load(filename) except config.ConfigSyntaxError: LOGGER.error( - 'Syntax error in rose configuration file "%s".' % filename) + 'Syntax error in Rose configuration file "%s".' % filename) # Append file level comments if present. nodes = [] diff --git a/sphinx/ext/rose_lang.py b/sphinx/ext/rose_lang.py index 09f3c319d9..295c6630a7 100644 --- a/sphinx/ext/rose_lang.py +++ b/sphinx/ext/rose_lang.py @@ -17,21 +17,21 @@ # You should have received a copy of the GNU General Public License # along with Rose. If not, see . # ----------------------------------------------------------------------------- -"""An extension providing a pygments lexer for rose configuration files.""" +"""An extension providing a pygments lexer for Rose configuration files.""" from pygments.lexer import RegexLexer, bygroups, include, words from pygments.token import (Comment, Name, Text, Operator, String) class RoseLexer(RegexLexer): - """Pygments lexer for the rose rose-app.conf language.""" + """Pygments lexer for the Rose rose-app.conf language.""" - # Pattern for a rose setting with capture groups. + # Pattern for a Rose setting with capture groups. ROSE_SETTING_PATTERN = ( r'(\w[^\=\n]+)' # Setting pattern. r'(\s+)?(=)(\s+)?') # Optional spaces around = operator, value. - # Pattern for the value to a rose setting. + # Pattern for the value to a Rose setting. ROSE_VALUE_PATTERN = ( r'.*\n' # Match anything after the = to the end of the line. r'(?:' # Optionally match additional lines. @@ -41,7 +41,7 @@ class RoseLexer(RegexLexer): r')+' # End repeating multiline group. r')?') # End optional group. - # Pygments tokens for rose config elements which have no direct + # Pygments tokens for Rose config elements which have no direct # translation. ROSE_USER_IGNORED_TOKEN = Comment ROSE_TRIGGER_IGNORED_TOKEN = Comment.Preproc diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index abc0a2bb76..db1f3c47d2 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -13,11 +13,12 @@ Glossary suite directory The suite directory contains all of the configuration for a suite (e.g. - the ``suite.rc`` file and for rose suites the ``rose-suite.conf`` file). + the ``suite.rc`` file and for Rose suites the :rose:file:`rose-suite.conf` + file). - This is the directory which is registered using ``cylc reg`` or, for rose - suites, it is the one in which the ``rose suite-run`` command is - executed. + This is the directory which is registered using ``cylc reg`` or, for Rose + suites, it is the one in which the :ref:`command-rose-suite-run` command + is executed. .. note:: @@ -28,10 +29,10 @@ Glossary * :term:`run directory` - rose suite - A rose suite is a :term:`cylc suite` which also contains a - ``rose-suite.conf`` file and optionally :term:`rose apps`, - :term:`metadata` and/or other rose components. + Rose suite + A Rose suite is a :term:`cylc suite` which also contains a + ``rose-suite.conf`` file and optionally :term:`Rose apps`, + :term:`metadata` and/or other Rose components. graph The graph of a :term:`suite` refers to the @@ -413,7 +414,7 @@ Glossary The location of the work directory can be accessed by a :term:`job` via the environment variable ``CYLC_TASK_WORK_DIR``. - Any files installed by :term:`rose apps ` will be placed within + Any files installed by :term:`Rose apps ` will be placed within this directory. See also: @@ -662,14 +663,14 @@ Glossary When a cylc detects that a suite has stalled an email will be sent to the user. Human interaction is required to escape a stalled state. - rose configuration - Rose configurations are directories containing a rose configuration + Rose configuration + Rose configurations are directories containing a Rose configuration file along with other optional files and directories. - The two types of rose configuration relevant to cylc suites are: + The two types of Rose configuration relevant to cylc suites are: - * :term:`rose application configuration` - * :term:`rose suite configuration` + * :term:`Rose application configuration` + * :term:`Rose suite configuration` See also: @@ -678,10 +679,10 @@ Glossary * :ref:`Optional Configuration Tutorial ` - rose app - rose application - rose application configuration - A rose application configuration (or rose app) is a directory containing + Rose app + Rose application + Rose application configuration + A Rose application configuration (or Rose app) is a directory containing a :rose:file:`rose-app.conf` file along with some other optional files and directories. @@ -699,11 +700,11 @@ Glossary application directory The application directory is the folder in which the - :rose:file:`rose-app.conf` file is located in a :term:`rose application + :rose:file:`rose-app.conf` file is located in a :term:`Rose application configuration`. - rose suite configuration - A rose suite configuration is a :rose:file:`rose-suite.conf` file along + Rose suite configuration + A Rose suite configuration is a :rose:file:`rose-suite.conf` file along with other optional files and directories which configure the way in which a :term:`cylc suite` is run. E.g: @@ -720,10 +721,10 @@ Glossary * :ref:`Rose Suites` metadata - rose metadata + Rose metadata Rose metadata provides information about settings in - :term:`rose application configurations ` - and :term:`rose suite configurations `. This + :term:`Rose application configurations ` + and :term:`Rose suite configurations `. This information is stored in a :rose:file:`rose-meta.conf` file in a ``meta/`` directory alongside the configuration it applies to. @@ -748,7 +749,7 @@ Glossary * Validation using the :ref:`command-rose-macro` command. Metadata does not affect the running of an - :term:`application ` or :term:`cylc suite`. + :term:`application ` or :term:`cylc suite`. See also: diff --git a/sphinx/installation.rst b/sphinx/installation.rst index 7472735882..02a67bfd1f 100644 --- a/sphinx/installation.rst +++ b/sphinx/installation.rst @@ -11,7 +11,7 @@ are available in ``zip`` and ``tar.gz`` `archives`_. 1. Un-pack the archive file into an appropriate location on your system. 2. Add the ``rose/bin/`` directory into your ``PATH`` environment variable. -3. Check system compatibility by running ``rose check-software``. +3. Check system compatibility by running :ref:`command-rose-check-software`. System Requirements @@ -20,7 +20,8 @@ System Requirements Rose runs on Unix/Linux systems and is known to run on RHEL6 and a number of systems including those documented under `metomi-vms`_. -System compatibility can be tested using the ``rose check-software`` command. +System compatibility can be tested using the :ref:`command-rose-check-software` +command. .. script-include:: rose check-software --rst @@ -36,7 +37,7 @@ Hosts For Running Cylc Suites ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Each user can just run their suites on the host where they issue the -``rose suite-run`` command. However, the local host may not meet the +:ref:`command-rose-suite-run` command. However, the local host may not meet the necessary requirements for connectivity (to the hosts running the tasks) or for availability (the host needs to remain up for the duration of the suite). Therefore, Rose can be configured to run the suites on @@ -45,8 +46,8 @@ the lowest system load average will be used. Installation requirements: * Rose, cylc, Bash, Python, jinja2. - * Subversion & FCM *(only if you want* ``rose suite-run`` *to install files - from Subversion using FCM keywords).* + * Subversion & FCM *(only if you want* :ref:`command-rose-suite-run` *to + install files from Subversion using FCM keywords).* Connectivity requirements: * Must be able to submit tasks to the hosts which run the suite tasks, either directly or via SSH access to another host. diff --git a/sphinx/tutorial/cylc/furthertopics/inheritance.rst b/sphinx/tutorial/cylc/furthertopics/inheritance.rst index da9d3e6f21..beab8237a6 100644 --- a/sphinx/tutorial/cylc/furthertopics/inheritance.rst +++ b/sphinx/tutorial/cylc/furthertopics/inheritance.rst @@ -70,7 +70,7 @@ a different aircraft, the Airbus A380 jumbo jet and the Robson R44 helicopter: The ``[meta]`` section is a freeform section where we can define metadata to be associated with a task, family or the suite itself. - This metadata should not be mistaken with rose :ref:`conf-meta`. + This metadata should not be mistaken with Rose :ref:`conf-meta`. .. admonition:: Reminder :class: hint diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index fbd382826c..ee757e640c 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -21,7 +21,7 @@ As a task grows in complexity it could require: * Input files. * Scripts and libraries. -A rose application or "rose app" is a runnable :term:`rose configuration` which +A Rose application or "Rose app" is a runnable :term:`Rose configuration` which executes a defined commmand. Rose applications provide a convenient way to encapsulate all of this @@ -83,9 +83,9 @@ An application can be run using the :ref:`command-rose-app-run` command: Hello Earth! The application will run in the current directory so it is a good idea to run -the application elsewhere to keep run files separate. If running the rose +the application elsewhere to keep run files separate. If running the Rose application from outside of the :term:`application directory` the ``-C`` option -can be used to provide the path to the rose application: +can be used to provide the path to the Rose application: .. code-block:: console @@ -99,14 +99,14 @@ can be used to provide the path to the rose application: .. rubric:: In this practical we will convert the ``forecast`` task from the :ref:`weather-forecasting suite ` - into a rose application. + into a Rose application. Create a directory on your filesystem called ``rose-tutorial``:: mkdir ~/rose-tutorial cd ~/rose-tutorial - #. **Create a rose application** + #. **Create a Rose application** Create a new directory called ``forecast``, this is to be our :term:`application directory`:: diff --git a/sphinx/tutorial/rose/configurations.rst b/sphinx/tutorial/rose/configurations.rst index 9a66a413da..254a623acb 100644 --- a/sphinx/tutorial/rose/configurations.rst +++ b/sphinx/tutorial/rose/configurations.rst @@ -6,8 +6,8 @@ Rose Configurations =================== -:term:`Rose configurations ` are directories containing a -rose configuration file along with other optional assets which define behaviour +:term:`Rose configurations ` are directories containing a +Rose configuration file along with other optional assets which define behaviour such as: * Execution. @@ -15,13 +15,13 @@ such as: * Environment variables. Rose configurations may be used standalone or alternatively in combination with -the `cylc`_ workflow engine. There are two types of rose configuration for use +the `cylc`_ workflow engine. There are two types of Rose configuration for use with `cylc`_: -:term:`rose application configuration` - A runnable rose configuration which executes a defined command. -:term:`rose suite configuration` - A rose configuration designed to run :term:`cylc suites `. +:term:`Rose application configuration` + A runnable Rose configuration which executes a defined command. +:term:`Rose suite configuration` + A Rose configuration designed to run :term:`cylc suites `. For instance it may be used to define Jinja2 variables for use in the ``suite.rc`` file. @@ -29,10 +29,10 @@ with `cylc`_: Rose Configuration Format ------------------------- -Rose configurations are directories containing a rose configuration file along +Rose configurations are directories containing a Rose configuration file along with other optional files and directories. -All rose configuration files use the same format which is based on the `INI`_ +All Rose configuration files use the same format which is based on the `INI`_ file format. * Comments start with a ``#`` character. @@ -59,17 +59,17 @@ Unlike the :ref:`cylc file format `: Throughout this tutorial we will refer to settings in the following format: -* ``file`` - would refer to a rose configuration file. -* ``file|setting`` - would refer to a setting in a rose configuration file. -* ``file[section]`` - would refer to a section in a rose configuration file. -* ``file[section]setting`` - would refer to a setting in a section in a rose +* ``file`` - would refer to a Rose configuration file. +* ``file|setting`` - would refer to a setting in a Rose configuration file. +* ``file[section]`` - would refer to a section in a Rose configuration file. +* ``file[section]setting`` - would refer to a setting in a section in a Rose configuration file. Why Use Rose Configurations? ---------------------------- -With rose configurations the inputs and environment required for a particular +With Rose configurations the inputs and environment required for a particular purpose can be encapsulated in a simple human-readable configuration. Configuration settings can have metadata associated with them which may be used diff --git a/sphinx/tutorial/rose/furthertopics/command-keys.rst b/sphinx/tutorial/rose/furthertopics/command-keys.rst index 4a4905cbd4..25137711bd 100644 --- a/sphinx/tutorial/rose/furthertopics/command-keys.rst +++ b/sphinx/tutorial/rose/furthertopics/command-keys.rst @@ -6,7 +6,7 @@ Command Keys This tutorial walks you through using command keys. Command keys allow you to specify and run different commands for a -:term:`rose app`. +:term:`Rose app`. They work just like the default command for an app but have to be specified explicitly as an option of :ref:`command-rose-task-run`. diff --git a/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst b/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst index 2aed80af3c..db3204a003 100644 --- a/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst +++ b/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst @@ -12,9 +12,10 @@ present cycle using:: cylc cyclepoint --offset-hours=-3 -Rose provides the ``rose date`` command which provides functionality beyond -``cylc cyclepoint`` as well as the ``ROSE_DATAC`` environment variable which -provides an easy way to get the path of the ``share/cycle`` directory. +Rose provides the :ref:`command-rose-date` command which provides functionality +beyond ``cylc cyclepoint`` as well as the :envvar:`ROSE_DATAC` environment +variable which provides an easy way to get the path of the ``share/cycle`` +directory. The ``rose date`` Command @@ -60,7 +61,7 @@ cyclepoint using the ``CYLC_TASK_CYCLE_POINT`` environment variable: [[hello_america]] script = rose date $CYLC_TASK_CYCLE_POINT --format='MM-DD-CCYY' -Alternatively, if you are providing the standard rose task environment using +Alternatively, if you are providing the standard Rose task environment using :ref:`command-rose-task-env` then :ref:`command-rose-date` can use the ``-c`` option to pick up the cycle point: @@ -111,7 +112,7 @@ The :ref:`command-rose-task-env` command provides the environment variable ``share/cycle`` directory. To get the path to a previous (or a future) ``share/cycle`` directory we can -provide an offset to ``rose task-env`` e.g:: +provide an offset to :ref:`command-rose-task-env` e.g:: rose task-env --cycle-offset=PT1H diff --git a/sphinx/tutorial/rose/furthertopics/failif-warnif.rst b/sphinx/tutorial/rose/furthertopics/failif-warnif.rst index 5b51f8cf74..16a48746f6 100644 --- a/sphinx/tutorial/rose/furthertopics/failif-warnif.rst +++ b/sphinx/tutorial/rose/furthertopics/failif-warnif.rst @@ -19,8 +19,8 @@ GUI. Simple metadata settings such as ``range`` can be evaluated on-the-fly when a value changes. As ``fail-if`` and ``warn-if`` can take longer to evaluate - they must be done on-demand in the ``rose edit`` GUI or on the command - line. + they must be done on-demand in the :ref:`command-rose-config-edit` GUI or + on the command line. Syntax @@ -60,7 +60,7 @@ Create a new application called ``failif-warnif``:: rose tutorial failif-warnif ~/rose-tutorial/failif-warnif cd ~/rose-tutorial/failif-warnif -You will now have a new rose app with a :rose:file:`rose-app.conf` that +You will now have a new Rose app with a :rose:file:`rose-app.conf` that looks like this: .. code-block:: rose diff --git a/sphinx/tutorial/rose/furthertopics/index.rst b/sphinx/tutorial/rose/furthertopics/index.rst index 36b0b55901..ff8c0ec815 100644 --- a/sphinx/tutorial/rose/furthertopics/index.rst +++ b/sphinx/tutorial/rose/furthertopics/index.rst @@ -3,7 +3,7 @@ Further Topics ============== -This section goes into detail in additional rose topics. +This section goes into detail in additional Rose topics. .. toctree:: :name: rose-further-topics diff --git a/sphinx/tutorial/rose/furthertopics/macro-development.rst b/sphinx/tutorial/rose/furthertopics/macro-development.rst index 3c2fc6be95..f9dbf7a22d 100644 --- a/sphinx/tutorial/rose/furthertopics/macro-development.rst +++ b/sphinx/tutorial/rose/furthertopics/macro-development.rst @@ -276,7 +276,7 @@ like the one below depending on the current Earth-Jupiter distance. .. image:: img/rose-macro-tutorial-app-fail.png :width: 350px :align: center - :alt: Screenshot of a rose macro failure message. + :alt: Screenshot of a Rose macro failure message. If there is an error, the variable should display an error icon on the ``env`` page, which you can hover-over to get the error text as in @@ -286,7 +286,7 @@ re-running your macro. .. image:: img/rose-edit-macro-fail.png :width: 450px :align: center - :alt: Screenshot of setting with an error detected by a rose macro. + :alt: Screenshot of setting with an error detected by a Rose macro. Try changing the value of ``env=WORLD`` to other solar system planets and re-running the macro. @@ -548,8 +548,8 @@ that will be used as the new planet. Save your changes and run the transformer macro either from the command line or :ref:`command-rose-config-edit`. You should be prompted to provide a value for ``planet_name``. At the command line this will take the -form of a prompt while in rose edit you will be presented with a dialog to -enter values in, with defaults already entered for you. +form of a prompt while in :ref:`command-rose-config-edit` you will be presented +with a dialog to enter values in, with defaults already entered for you. Specify a value to use for ``planet_name`` using a quoted string, e.g. ``"Vulcan"`` and accept the proposed changes. The ``WORLD`` diff --git a/sphinx/tutorial/rose/furthertopics/optional-configurations.rst b/sphinx/tutorial/rose/furthertopics/optional-configurations.rst index bf169f10d1..4cbf970611 100644 --- a/sphinx/tutorial/rose/furthertopics/optional-configurations.rst +++ b/sphinx/tutorial/rose/furthertopics/optional-configurations.rst @@ -5,9 +5,9 @@ Optional Configurations Optional configurations are configuration files which can add or overwrite the default configuration. They can be used with :ref:`command-rose-app-run` -for :term:`rose application configurations ` +for :term:`Rose application configurations ` and :ref:`command-rose-suite-run` for -:term:`rose suite configurations `. +:term:`Rose suite configurations `. Example @@ -18,7 +18,7 @@ Example :width: 250px :alt: Ice Cream -Create a new :term:`rose app` called ``rose-opt-conf-tutorial``:: +Create a new :term:`Rose app` called ``rose-opt-conf-tutorial``:: mkdir -p ~/rose-tutorial/rose-opt-conf-tutorial cd ~/rose-tutorial/rose-opt-conf-tutorial diff --git a/sphinx/tutorial/rose/furthertopics/polling.rst b/sphinx/tutorial/rose/furthertopics/polling.rst index e2a82141b7..feef387f72 100644 --- a/sphinx/tutorial/rose/furthertopics/polling.rst +++ b/sphinx/tutorial/rose/furthertopics/polling.rst @@ -13,7 +13,7 @@ requires said file. Example ------- -Create a new rose suite configuration:: +Create a new Rose suite configuration:: mkdir -p ~/rose-tutorial/polling cd ~/rose-tutorial/polling diff --git a/sphinx/tutorial/rose/furthertopics/rose-arch.rst b/sphinx/tutorial/rose/furthertopics/rose-arch.rst index 2a49f4eb06..0b0900bf6c 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-arch.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-arch.rst @@ -1,7 +1,7 @@ rose arch ========= -:rose:app:`rose_arch` is a built-in :term:`rose app` that provides a generic +:rose:app:`rose_arch` is a built-in :term:`Rose app` that provides a generic solution to the archiving of suite files. .. admonition:: Good Practice @@ -14,7 +14,7 @@ solution to the archiving of suite files. Example ------- -Create a new rose suite configuration:: +Create a new Rose suite configuration:: mkdir -p ~/rose-tutorial/rose-arch-tutorial @@ -155,8 +155,9 @@ Save your changes and run the suite:: rose suite-run -View the suite output using ``rose suite-log`` and inspect the output of the -``make_files``, ``archive_files_rsync`` and ``archive_files_scp`` tasks. +View the suite output using :ref:`command-rose-suite-log` and inspect the +output of the ``make_files``, ``archive_files_rsync`` and ``archive_files_scp`` +tasks. Results Of "Archiving" diff --git a/sphinx/tutorial/rose/furthertopics/rose-bunch.rst b/sphinx/tutorial/rose/furthertopics/rose-bunch.rst index 1160da88ba..957e84c456 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-bunch.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-bunch.rst @@ -1,7 +1,7 @@ -rose bunch +Rose Bunch ========== -:rose:app:`rose_bunch` is a built-in :term:`rose app` which allows multiple +:rose:app:`rose_bunch` is a built-in :term:`Rose app` which allows multiple variants of a command to be run under a single job. @@ -25,7 +25,7 @@ alter the code rather than use :rose:app:`rose_bunch` to handle this for you. .. warning:: It is important to note that when running your ``rose_bunch`` - :term:`app ` under load balancing systems such as PBS or Slurm, + :term:`app ` under load balancing systems such as PBS or Slurm, you will need to set resource requests to reflect the resources required by running multiple commands at once. @@ -44,7 +44,7 @@ clear. We can refer to this as the "landing" routine. What differs between landings is the plane type, number of passengers carried and the resulting timings for each stage of the landing process. -Create a new rose suite configuration:: +Create a new Rose suite configuration:: mkdir -p ~/rose-tutorial/rose-bunch cd ~/rose-tutorial/rose-bunch @@ -141,12 +141,12 @@ Navigate to the top directory of your suite (where the ``suite.rc`` and Your suite should run, launch the cylc GUI and successfully run the ``lander`` app. -Once the suite has finished running and has shutdown, open rose bush to view +Once the suite has finished running and has shutdown, open Rose Bush to view its output (note that you can close the cylc GUI at this point):: rose suite-log -.. TODO - Make sure that this is consistent with advice given in the rose +.. TODO - Make sure that this is consistent with advice given in the Rose tutorial when written. .. note:: @@ -154,15 +154,15 @@ its output (note that you can close the cylc GUI at this point):: You can quickly get to the relevant page by running :ref:`command-rose-suite-log` from within the :term:`suite directory`. -In the rose bush jobs page for your suite you should be presented with a +In the Rose Bush jobs page for your suite you should be presented with a page containing a single row for the ``lander`` task, from which you can access its output. In that row you should see something like this: .. image:: img/rose-bunch-bush-page.png :align: center - :alt: rose bush view of output + :alt: Rose Bush view of output -In the rose bush entry you should see that the usual links are present for +In the Rose Bush entry you should see that the usual links are present for the task such as ``job.out``, ``job.status`` etc. with the addition of two drop-down boxes: one for ``bunch.*.err`` and one for ``bunch.*.out``. Rather than mixing the outputs from the multiple command invocations being @@ -188,7 +188,7 @@ following line under the :rose:conf:`rose_bunch[bunch]` section: names=BA123 Emirates345 BA007 PC456 -Re-run your suite and, once it has finished, open up rose bush and examine the +Re-run your suite and, once it has finished, open up Rose Bush and examine the job listing. In the drop-down ``bunch.*.err`` and ``bunch.*.out`` boxes you should now see entries for the names you've configured rather than the ``bunch.0.out ... bunch.3.out`` entries previously present. diff --git a/sphinx/tutorial/rose/furthertopics/rose-stem.rst b/sphinx/tutorial/rose/furthertopics/rose-stem.rst index cae78c2cf8..43e8a037d2 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-stem.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-stem.rst @@ -1,12 +1,12 @@ .. include:: ../../../hyperlinks.rst :start-line: 1 -rose stem +Rose Stem ========= .. warning:: - Before proceeding you should already be familiar with the ``rose stem`` + Before proceeding you should already be familiar with the Rose Stem part of the user guide. .. TODO - link in the rose user guide page when translated. @@ -17,19 +17,19 @@ rose stem :width: 300px This tutorial will walk you through creating a simple example of the -``rose stem`` testing system which will involve piloting a spaceship +Rose Stem testing system which will involve piloting a spaceship through space. Getting Started --------------- -We will start the ``rose stem`` tutorial by setting up an `FCM`_ repository +We will start the Rose Stem tutorial by setting up an `FCM`_ repository called ``SPACESHIP`` to store the code and test suite in. .. _keyword: https://metomi.github.io/fcm/doc/user_guide/code_management.html#svn_basic_keywords -Usually you would add a ``rose stem`` suite to an existing repository with +Usually you would add a Rose Stem suite to an existing repository with the `keyword`_ already set up to test the accompanying source code. For the purposes of this tutorial we will create a new one. @@ -79,7 +79,7 @@ The ``spaceship`` app .. TODO - outline what this app does. -Create a new rose app called ``spaceship``:: +Create a new Rose app called ``spaceship``:: mkdir -p rose-stem/app/spaceship @@ -126,7 +126,7 @@ into the ``fcm-make.cfg`` file within that directory: build.target{task} = link The ``$SOURCE_SPACESHIP`` environment variable will be set using the -Jinja2 variable of the same name which is provided by ``rose stem``. +Jinja2 variable of the same name which is provided by Rose Stem. The ``suite.rc`` file @@ -168,7 +168,7 @@ its own configuration files. The ``rose-suite.conf`` file ---------------------------- -The suites associated with ``rose stem`` require a version number +The suites associated with Rose Stem require a version number indicating the version of the ``rose stem`` command with which they are compatible. This is specified in the :rose:file:`rose-suite.conf` file, together with the default values of ``RUN_NAMES`` and ``SOURCE_SPACESHIP``. diff --git a/sphinx/tutorial/rose/furthertopics/trigger.rst b/sphinx/tutorial/rose/furthertopics/trigger.rst index 674c9bc2ff..d712051a26 100644 --- a/sphinx/tutorial/rose/furthertopics/trigger.rst +++ b/sphinx/tutorial/rose/furthertopics/trigger.rst @@ -2,8 +2,9 @@ Trigger ======= The ``trigger`` metadata item can be used to cut down the amount of irrelevant -settings presented to the user in the ``rose edit`` GUI by hiding any settings -which are not relevant based on the value or state of other settings. +settings presented to the user in the :ref:`command-rose-config-edit` GUI by +hiding any settings which are not relevant based on the value or state of other +settings. Irrelevant (``ignored`` or ``trigger-ignored``) settings do not get included in output files at runtime. In effect, they are commented @@ -15,7 +16,7 @@ Example In this example, we'll be ordering pizza. -Create a new rose application called ``trigger``:: +Create a new Rose application called ``trigger``:: mkdir -p ~/rose-tutorial/trigger cd ~/rose-tutorial/trigger @@ -23,7 +24,7 @@ Create a new rose application called ``trigger``:: Create a :rose:file:`rose-app.conf` file that looks like this: .. TODO - Perhaps move these large code blocks out of this file using - the rose tutorial command. + the Rose tutorial command. .. code-block:: rose diff --git a/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst b/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst index eb3343508c..9b0fac7b41 100644 --- a/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst +++ b/sphinx/tutorial/rose/furthertopics/upgrading-macro-development.rst @@ -1,13 +1,13 @@ Upgrading Macro Development =========================== -Upgrade macros are used to upgrade :term:`rose apps ` to newer +Upgrade macros are used to upgrade :term:`Rose apps ` to newer metadata versions. They are intended to keep application configurations in sync with changes to application inputs e.g. from new code releases. -You should already be familiar with using ``rose app-upgrade`` (see the -:ref:`Upgrading tutorial ` and the concepts in the -reference material). +You should already be familiar with using :ref:`command-rose-app-upgrade` (see +the :ref:`Upgrading tutorial ` and the concepts +in the reference material). Example @@ -19,7 +19,7 @@ Example In this example, we'll be upgrading a boat on a desert island. -Create a rose application called ``make-boat-app``:: +Create a Rose application called ``make-boat-app``:: mkdir -p ~/rose-tutorial/make-boat-app cd ~/rose-tutorial/make-boat-app @@ -35,7 +35,7 @@ Create a ``rose-app.conf`` file with the following content: hollow_tree_trunks=1 paddling_twigs=1 -You now have a rose application configuration that configures our simple boat +You now have a Rose application configuration that configures our simple boat (a dugout canoe). It references a meta flag (for which metadata is unlikely to already exist), made up of a category (``make-boat``) at a particular version (``0.1``). The meta flag is used by Rose to locate a configuration @@ -182,8 +182,8 @@ and an ``AFTER_TAG`` (e.g. ``"0.2"``). The ``BEFORE_TAG`` is the 'start' version (if upgrading) and the ``AFTER_TAG`` is the 'destination' version. When a user requests an upgrade for their configuration (e.g. by running -``rose app-upgrade``), the ``versions.py`` file will be searched for a -macro whose ``BEFORE_TAG`` matches the ``meta=...`` version. +:ref:`command-rose-app-upgrade`), the ``versions.py`` file will be searched +for a macro whose ``BEFORE_TAG`` matches the ``meta=...`` version. For example, for our ``meta=make-boat/0.1`` flag, we'd need a macro whose ``BEFORE_TAG`` was ``"0.1"``. diff --git a/sphinx/tutorial/rose/furthertopics/upgrading.rst b/sphinx/tutorial/rose/furthertopics/upgrading.rst index 690bba6115..93d3d7e33a 100644 --- a/sphinx/tutorial/rose/furthertopics/upgrading.rst +++ b/sphinx/tutorial/rose/furthertopics/upgrading.rst @@ -3,7 +3,7 @@ Upgrading ========= -As :term:`apps ` are developed, newer metadata versions can be +As :term:`apps ` are developed, newer metadata versions can be created each time the application inputs are changed, or just between major releases. @@ -12,7 +12,7 @@ old one is removed. Upgrade macros may be written to automatically apply these changes. -Upgrade macros are used to upgrade :term:`rose apps ` to newer +Upgrade macros are used to upgrade :term:`Rose apps ` to newer metadata versions. They are intended to keep application configurations in sync with changes to application inputs e.g. from new code releases. @@ -22,7 +22,7 @@ This part tutorial walks you through upgrading applications. Example ------- -Create a new rose application called ``garden``:: +Create a new Rose application called ``garden``:: mkdir -p ~/rose-tutorial/garden cd ~/rose-tutorial/garden @@ -101,7 +101,7 @@ If you accept the changes, your app config will be upgraded through all the intermediary versions to the new one. Have a look at the :rose:file:`rose-app.conf` file. -If you run rose :ref:`command-rose-app-upgrade` with no arguments, you can see +If you run Rose :ref:`command-rose-app-upgrade` with no arguments, you can see that you're using the latest version. diff --git a/sphinx/tutorial/rose/furthertopics/widget-development.rst b/sphinx/tutorial/rose/furthertopics/widget-development.rst index 524ea9f5f1..be24aedecc 100644 --- a/sphinx/tutorial/rose/furthertopics/widget-development.rst +++ b/sphinx/tutorial/rose/furthertopics/widget-development.rst @@ -23,7 +23,7 @@ when entering usernames. Example ------- -Create a new rose app by running the following command replacing +Create a new Rose app by running the following command replacing ``DIRECTORY`` with the path in which to create the suite: .. code-block:: sub @@ -31,7 +31,7 @@ Create a new rose app by running the following command replacing rose tutorial widget cd -You will now have a rose app which contains the following files: +You will now have a Rose app which contains the following files: .. code-block:: sub @@ -137,7 +137,7 @@ into it: widget[rose-config-edit]=username.UsernameValueWidget This means that we've set our widget up for the option ``USER`` -under the section ``env``. It will now be used as the widget for this +under the section :guilabel:`env`. It will now be used as the widget for this variable's value. Results @@ -146,9 +146,9 @@ Results Try opening up the config editor in the application directory (where the :rose:file:`rose-app.conf` is) by running:: - rose edit + rose config-edit -Navigate to the ``env`` page. You should see your widget on +Navigate to the :guilabel:`env` page. You should see your widget on the page! As you type, it should provide helpful auto-completion of usernames. Try typing your own username. diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index 6d6f2c0091..3051722b45 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -3,13 +3,13 @@ Rose Tutorial ============= -Rose is a system for creating, editing and running rose configurations. +Rose is a system for creating, editing and running Rose configurations. Rose also contains other optional tools for: * Version control. * Suite discovery and management. -* Validating and tranforming rose configurations. +* Validating and tranforming Rose configurations. * Tools for interfacing with cylc. diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 77432997e6..355d65bfcd 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -3,7 +3,7 @@ Rose Metadata ============= -Metadata can be used to provide information about settings in rose +Metadata can be used to provide information about settings in Rose configurations. It is used for: * Documenting settings. @@ -18,7 +18,7 @@ The Metadata Format ------------------- Metadata is written in a :rose:file:`rose-meta.conf` file. This file can either -be stored inside a rose configuration in a ``meta/`` directory, or elsewhere +be stored inside a Rose configuration in a ``meta/`` directory, or elsewhere outside of the configuration. The :rose:file:`rose-meta.conf` file uses the standard @@ -98,7 +98,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. .. practical:: .. rubric:: In this practical we will write metadata for the forecast app we - wrote in the :ref:`rose application practical + wrote in the :ref:`Rose application practical `. #. **Create the** ``forecast`` **app.** @@ -111,13 +111,13 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. #. **View the application in** :ref:`command-rose-config-edit`. The :ref:`command-rose-config-edit` command opens a GUI which displays - rose configurations. Open the ``forecast`` app:: + Rose configurations. Open the ``forecast`` app:: rose config-edit & .. tip:: - Note :ref:`command-rose-config-edit` searches for rose configuration in + Note :ref:`command-rose-config-edit` searches for Rose configuration in the current directory, use the ``-C`` option to specify a directory. In the panel on the left you will see the different sections of the @@ -178,7 +178,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. #. **Length.** The ``DOMAIN`` and ``WEIGHTING`` settings both accept comma separated - lists of values. We can represent this in rose metadata using the + lists of values. We can represent this in Rose metadata using the :rose:conf:`rose-meta.conf[SETTING]length` setting. To represent the ``DOMAIN`` setting as a list of four elements add the diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index c16ae1b01d..e1c2d7e159 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -4,14 +4,14 @@ Rosie ===== -Rosie is a tool for managing rose suite configurations which is included in +Rosie is a tool for managing Rose suite configurations which is included in Rose. The purpose of Rosie is to facilitate suite development, management and collaboration. Rosie: -* Adds version control to rose suite configurations. -* Updates a database to keep track of rose suite configurations. +* Adds version control to Rose suite configurations. +* Updates a database to keep track of Rose suite configurations. .. warning:: diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 523cf0aa81..12990db8ac 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -4,18 +4,18 @@ Rose Suite Configurations ========================= -:term:`Rose application configurations ` +:term:`Rose application configurations ` can be used to encapsulate the environment and resources required by a cylc :term:`task`. -Similarly :term:`rose suite configurations ` can +Similarly :term:`Rose suite configurations ` can be used to do the same for a :term:`cylc suite`. Configuration Format -------------------- -A rose suite configuration is a cylc :term:`suite directory` containing a +A Rose suite configuration is a cylc :term:`suite directory` containing a :rose:file:`rose-suite.conf` file. .. NOTE - The rose-suite.info is not mentioned here as it is really a rosie @@ -176,7 +176,7 @@ validated but not run (i.e. :ref:`steps 1, 2 and 3 `). Start, Stop, Restart -------------------- -Under rose, suites will run using the name of the suite directory. For instance +Under Rose, suites will run using the name of the suite directory. For instance if you run :ref:`command-rose-suite-run` on a suite in the directory ``~/foo/bar`` then it will run with the name ``bar``. @@ -216,7 +216,7 @@ See the :ref:`Cheat Sheet` for more information. .. practical:: - .. rubric:: In this tutorial we will create a rose Suite Configuration for + .. rubric:: In this tutorial we will create a Rose Suite Configuration for the :ref:`Weather Forecasting Suite`. #. **Create A New Suite.** @@ -236,7 +236,7 @@ See the :ref:`Cheat Sheet` for more information. touch rose-suite.conf - You now have a rose suite configuration. A :rose:file:`rose-suite.conf` + You now have a Rose suite configuration. A :rose:file:`rose-suite.conf` file does not need to have anything in it but it is required to run :ref:`command-rose-suite-run`. @@ -340,8 +340,8 @@ See the :ref:`Cheat Sheet` for more information. #. **Install The Suite.** - Running ``rose suite-run`` will cause the suite to be installed, - validated and run. + Running :ref:`command-rose-suite-run` will cause the suite to be + installed, validated and run. The ``--local-install-only`` command line option will cause the suite to be installed (only on your local machine not on any job hosts) and @@ -362,11 +362,11 @@ See the :ref:`Cheat Sheet` for more information. Rose Applications In Rose Suite Configurations ---------------------------------------------- -In cylc suites, rose applications are placed in an ``app/`` directory which +In cylc suites, Rose applications are placed in an ``app/`` directory which is copied across to run directory with the rest of the suite by :ref:`command-rose-suite-run` when the suite configuration is run. -When we run rose applications in cylc suites we use the +When we run Rose applications in cylc suites we use the :ref:`command-rose-task-run` command rather than the :ref:`command-rose-app-run` command. @@ -397,7 +397,7 @@ In this example the ``hello`` task will run the application located in The name of the application to run can be overridden using the ``--app-key`` command line option or the :envvar:`ROSE_TASK_APP` environment variable. For -example the ``greetings`` :term:`task` will run the ``hello`` :term:`app ` in the task defined below. .. code-block:: cylc @@ -417,12 +417,12 @@ Rose provides a utility for viewing the status and logs for cylc suites called Rose Bush. Rose Bush displays suite information in web-pages. .. figure:: img/rose-bush.png - :alt: rose bush screenshot + :alt: Rose Bush screenshot :width: 100% - Screenshot of a rose bush web page. + Screenshot of a Rose Bush web page. -If a rose bush server is provided at your site you can open the rose bush +If a Bose Bush server is provided at your site you can open the Rose Bush page for a suite by running the :ref:`command-rose-suite-log` command in the suite directory. @@ -432,7 +432,7 @@ Otherwise an add-hoc web-server can be set up using the .. practical:: - .. rubric:: In this practical we will take the ``forecast`` rose application + .. rubric:: In this practical we will take the ``forecast`` Rose application that we developed in the :ref:`Metadata Tutorial ` and integrate it into the :ref:`Weather Forecasting Suite `. @@ -464,7 +464,7 @@ Otherwise an add-hoc web-server can be set up using the mkdir app/forecast/opt touch app/forecast/opt/rose-app-test.conf - This optional configuration is a regular rose configuration file, its + This optional configuration is a regular Rose configuration file, its settings will override those in the :rose:file:`rose-app.conf` file if requested. @@ -507,7 +507,7 @@ Otherwise an add-hoc web-server can be set up using the rose app-run --opt-conf-key=test -C ../ cd ../../../ - You should see the stdout output of the rose application. If there are + You should see the stdout output of the Rose application. If there are any errors they will be marked with the ``[FAIL]`` prefix. #. **Integrate The** ``forecast`` **Application Into The Suite.** @@ -525,7 +525,7 @@ Otherwise an add-hoc web-server can be set up using the TODO - remove triple quotes in cylc tutorial - Remember, in rose configuration files: + Remember, in Rose configuration files: * We don't use spaces around the equals ``=`` operator. * Environment variables shouldn't be quoted. @@ -579,7 +579,7 @@ Otherwise an add-hoc web-server can be set up using the #. **View Output In Rose Bush.** - Open the rose bush page in a browser by running the following command + Open the Rose Bush page in a browser by running the following command from within the suite directory:: rose suite-log @@ -589,5 +589,5 @@ Otherwise an add-hoc web-server can be set up using the task. On the right-hand side of the screen click :guilabel:`job-map.html`. - As this file has a ``.html`` extension rose bush will render it, + As this file has a ``.html`` extension Rose Bush will render it, otherwise the raw text would be displayed. diff --git a/sphinx/tutorial/rose/summary.rst b/sphinx/tutorial/rose/summary.rst index 2c9f20fc40..962f678dd1 100644 --- a/sphinx/tutorial/rose/summary.rst +++ b/sphinx/tutorial/rose/summary.rst @@ -50,10 +50,10 @@ The relationship between them is as follows: } } -Cylc suites can have rose applications. These are stored in an ``app`` +Cylc suites can have Rose applications. These are stored in an ``app`` directory and are configured using a :rose:file:`rose-app.conf` file. -.. TODO - A file tree for an example rose suite + a full file tree showing +.. TODO - A file tree for an example Rose suite + a full file tree showing all possible files and directories with descriptions, this will require an extension and some CSS magic to ensure viable output in HTML and PDF. @@ -90,12 +90,12 @@ Suite Commands :ref:`command-rose-task-run` Used to run a Rose application from within a cylc suite. :ref:`command-rose-suite-run` - Runs a rose suite. + Runs a Rose suite. :ref:`command-rose-suite-restart` - Runs a rose suite picking up where it left off. + Runs a Rose suite picking up where it left off. The cylc commands do not know about the :rose:file:`rose-suite.conf` file -so for rose suite configurations you will have to install the suite before +so for Rose suite configurations you will have to install the suite before using commands such as ``cylc graph`` e.g: .. code-block:: sub @@ -163,7 +163,7 @@ Rose contains some utilities to make life easier: Rose Built-In Applications -------------------------- -Along with the rose utilities there are also the rose built-in applications. +Along with the Rose utilities there are also the Rose built-in applications. :rose:app:`fcm_make` A template for running the ``fcm make`` command. @@ -185,7 +185,7 @@ Next Steps ---------- :ref:`Rose Further Topics` - Tutorials going over some of the more specific aspects of rose not + Tutorials going over some of the more specific aspects of Rose not covered in the main tutorial. :ref:`Cheat Sheet` A quick breakdown of the commands for running @@ -194,7 +194,7 @@ Next Steps Contains the command line documentation (also obtainable by calling ``rose --help``). :ref:`Rose Configuration ` - The possible settings which can be used in the different rose + The possible settings which can be used in the different Rose configuration files. `cylc suite design guide`_ Contains recommended best-practice for the style and structure of cylc From 61feafea31de0177fd3603aa72bb6984830ddb78 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 12:12:49 +0100 Subject: [PATCH 17/34] Capitalise all cylc instances. --- sphinx/_static/js/minicylc.js | 2 +- sphinx/api/built-in/rose_prune.rst | 8 +-- sphinx/api/configuration/suite.rst | 8 +-- sphinx/cheat-sheet.rst | 4 +- sphinx/ext/cylc_lang.py | 8 +-- sphinx/ext/minicylc.py | 6 +- sphinx/glossary.rst | 68 +++++++++---------- sphinx/hyperlinks.rst | 8 +-- sphinx/index.rst | 6 +- sphinx/installation.rst | 22 +++--- .../tutorial/cylc/furthertopics/broadcast.rst | 2 +- .../furthertopics/clock-triggered-tasks.rst | 2 +- .../cylc/furthertopics/family-triggers.rst | 2 +- .../cylc/furthertopics/inheritance.rst | 4 +- sphinx/tutorial/cylc/furthertopics/queues.rst | 2 +- .../tutorial/cylc/furthertopics/retries.rst | 12 ++-- .../cylc/furthertopics/suicide-triggers.rst | 10 +-- sphinx/tutorial/cylc/index.rst | 2 +- sphinx/tutorial/cylc/introduction.rst | 4 +- .../runtime/configuration-consolidation.rst | 14 ++-- sphinx/tutorial/cylc/runtime/index.rst | 2 +- sphinx/tutorial/cylc/runtime/introduction.rst | 40 +++++------ .../cylc/runtime/runtime-configuration.rst | 24 +++---- .../cylc/scheduling/datetime-cycling.rst | 6 +- .../cylc/scheduling/further-scheduling.rst | 12 ++-- sphinx/tutorial/cylc/scheduling/graphing.rst | 26 +++---- .../cylc/scheduling/integer-cycling.rst | 18 ++--- sphinx/tutorial/rose/applications.rst | 4 +- sphinx/tutorial/rose/configurations.rst | 8 +-- .../furthertopics/date-time-manipulation.rst | 2 +- .../rose/furthertopics/rose-bunch.rst | 6 +- .../tutorial/rose/furthertopics/rose-stem.rst | 4 +- sphinx/tutorial/rose/suites.rst | 36 +++++----- sphinx/tutorial/rose/summary.rst | 18 ++--- 34 files changed, 199 insertions(+), 201 deletions(-) diff --git a/sphinx/_static/js/minicylc.js b/sphinx/_static/js/minicylc.js index 77ffaf755e..014f048d95 100644 --- a/sphinx/_static/js/minicylc.js +++ b/sphinx/_static/js/minicylc.js @@ -1,4 +1,4 @@ -// Default cylc colour theme. +// Default Cylc colour theme. var minicylc_default_theme = { 'waiting_fill': 'none', 'waiting_stroke': '#88c6ff', diff --git a/sphinx/api/built-in/rose_prune.rst b/sphinx/api/built-in/rose_prune.rst index c122c0f21d..ce79af5b40 100644 --- a/sphinx/api/built-in/rose_prune.rst +++ b/sphinx/api/built-in/rose_prune.rst @@ -62,7 +62,7 @@ Configuration Specify a key to a format string for use in conjunction with a :rose:conf`prune{item-root}=cycle:globs` setting. For example, we may have something like ``cycle-format{cycle_year}=CCYY`` and - ``prune{share}=-P1Y:xmas-present-%(cycle_year)s/``. In cylc, if the + ``prune{share}=-P1Y:xmas-present-%(cycle_year)s/``. In Cylc, if the current cycle point is ``20151201T0000Z``, it will clear out the directory ``share/xmas-present-2014/``. @@ -89,19 +89,19 @@ Configuration Remove the sub-directories under ``item-root`` (e.g. :term:`work/ ` of the specified cycles. - E.g. In cylc, if current cycle is ``20141225T1200Z``, + E.g. In Cylc, if current cycle is ``20141225T1200Z``, ``prune{work}=-PT12H`` will clear out ``work/20141225T0000Z/``. If globs are specified for a cycle, it will attempt to prune only items matching ``CYCLE/GLOBS`` under ``item-root``. - E.g. In cylc, if current cycle is ``20141225T1200Z``, then + E.g. In Cylc, if current cycle is ``20141225T1200Z``, then ``prune{share/cycle}=-PT12H:wild*`` will clear out all items matching ``share/cycle/20141225T0000Z/wild*``. A glob can also be specified as a formatting string containing a single substitution ``%(cycle)s``\ . In this mode, the cycle string will not be added as a sub-directory of the ``item-root``. - E.g. In cylc, if current cycle is ``20141225T1200Z``, then + E.g. In Cylc, if current cycle is ``20141225T1200Z``, then ``prune{share}=-PT12H:hello-*-at-%(cycle)s.txt`` will clear out all items matching ``share/hello-*-at-20141225T0000Z.txt``. diff --git a/sphinx/api/configuration/suite.rst b/sphinx/api/configuration/suite.rst index 87807171f7..8722f5b52e 100644 --- a/sphinx/api/configuration/suite.rst +++ b/sphinx/api/configuration/suite.rst @@ -7,8 +7,8 @@ Suite Configuration ------------------- The configuration and functionality of a suite will usually be covered by -the use of `cylc`_. In which case, most of the suite configuration will live -in the cylc ``suite.rc`` file. Otherwise, a suite is just a directory of +the use of `Cylc`_. In which case, most of the suite configuration will live +in the Cylc ``suite.rc`` file. Otherwise, a suite is just a directory of files. A suite directory may contain the following: @@ -29,7 +29,7 @@ A suite directory may contain the following: * A ``meta/`` directory containing the suite's configuration metadata. * ``opt/`` directory. For detail, see :ref:`Optional Configuration`. * Other items, as long as they do not clash with the scheduler's working - directories. E.g. for a cylc suite, ``log*/``, ``share/``, ``state/`` and + directories. E.g. for a Cylc suite, ``log*/``, ``share/``, ``state/`` and ``work/`` should be avoided. .. rose:file:: rose-suite.conf @@ -60,7 +60,7 @@ A suite directory may contain the following: .. rose:conf:: CYLC_VERSION=CYLC_VERSION_NUMBER - If specified for a cylc suite, the Rose suite runner + If specified for a Cylc suite, the Rose suite runner will attempt to use this version of cylc. .. rose:conf:: jinja2:suite.rc diff --git a/sphinx/cheat-sheet.rst b/sphinx/cheat-sheet.rst index 41a334cb15..8897316080 100644 --- a/sphinx/cheat-sheet.rst +++ b/sphinx/cheat-sheet.rst @@ -4,7 +4,7 @@ Cheat Sheet =========== This page outlines how to perform suite operations for "pure" :term:`cylc -suites ` (*the cylc way*) and those using :term:`Rose suite +suites ` (*the Cylc way*) and those using :term:`Rose suite configurations ` (*the Rose way*). .. Use the "sub" lexer as the default for this file. @@ -54,7 +54,7 @@ Stopping Suites cylc stop --kill # Shutdown the suite now leaving any running / submitted tasks behind. - # If the suite is restarted cylc will "re-connect" with these jobs + # If the suite is restarted Cylc will "re-connect" with these jobs # continuing where it left off: cylc stop --now --now diff --git a/sphinx/ext/cylc_lang.py b/sphinx/ext/cylc_lang.py index c0fd6c3dca..af0620409d 100644 --- a/sphinx/ext/cylc_lang.py +++ b/sphinx/ext/cylc_lang.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with Rose. If not, see . # ----------------------------------------------------------------------------- -"""An extension providing pygments lexers for suite.rc files and cylc graph +"""An extension providing pygments lexers for suite.rc files and Cylc graph strings.""" from pygments.lexer import RegexLexer, bygroups, include, words @@ -26,9 +26,9 @@ class CylcLexer(RegexLexer): - """Pygments lexer for the cylc suite.rc language.""" + """Pygments lexer for the Cylc suite.rc language.""" - # Pygments tokens for cylc suite.rc elements which have no direct + # Pygments tokens for Cylc suite.rc elements which have no direct # translation. HEADING_TOKEN = Name.Tag SETTING_TOKEN = Name.Variable @@ -248,7 +248,7 @@ class CylcLexer(RegexLexer): class CylcGraphLexer(CylcLexer): - """Pygments lexer for cylc graph strings.""" + """Pygments lexer for Cylc graph strings.""" tokens = dict(CylcLexer.tokens) tokens['root'] = list(tokens['graph']) diff --git a/sphinx/ext/minicylc.py b/sphinx/ext/minicylc.py index 9d0f2fc159..c0aa18a38c 100644 --- a/sphinx/ext/minicylc.py +++ b/sphinx/ext/minicylc.py @@ -34,7 +34,7 @@ class MiniCylc(graphviz): - """Node to represent an animated cylc graph. + """Node to represent an animated Cylc graph. Works by extending the built-in ``sphinx.ext.graphviz`` code. @@ -103,7 +103,7 @@ def visit_html(builder, node): class MiniCylcDirective(GraphvizSimple): - """Implement the ``mini-cylc`` directive for animating cylc graphs. + """Implement the ``mini-cylc`` directive for animating Cylc graphs. Works by extending the built-in ``sphinx.ext.graphviz`` code. @@ -203,7 +203,7 @@ def run(self): # Provide a dummy argument to match the spec of GraphvizSimple. self.arguments = ['Mini_Cylc'] - # Generate cylc code snippet if requested. + # Generate Cylc code snippet if requested. if 'snippet' in self.options: ret.extend(CodeBlock(self.name, ['cylc-graph'], diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index db1f3c47d2..b49823a88f 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -7,8 +7,8 @@ Glossary .. glossary:: :sorted: - cylc suite - A cylc suite is a directory containing a ``suite.rc`` file which contains + Cylc suite + A Cylc suite is a directory containing a ``suite.rc`` file which contains :term:`graphing` representing a workflow. suite directory @@ -30,12 +30,12 @@ Glossary * :term:`run directory` Rose suite - A Rose suite is a :term:`cylc suite` which also contains a + A Rose suite is a :term:`Cylc suite` which also contains a ``rose-suite.conf`` file and optionally :term:`Rose apps`, :term:`metadata` and/or other Rose components. graph - The graph of a :term:`suite` refers to the + The graph of a :term:`suite` refers to the :term:`graph strings` contained within the ``[scheduling][dependencies]`` section. For example the following is, collectively, a graph: @@ -163,7 +163,7 @@ Glossary "bar.1" -> "bar.2" -> "bar.3" cycling - A cycling :term:`suite` is one in which the workflow repeats. + A cycling :term:`suite` is one in which the workflow repeats. See also: @@ -172,9 +172,9 @@ Glossary cycle point A cycle point is the unique label given to a particular :term:`cycle`. - If the :term:`suite` is using :term:`integer cycling` then + If the :term:`suite` is using :term:`integer cycling` then the cycle points will be numbers e.g. ``1``, ``2``, ``3``, etc. If the - :term:`suite` is using :term:`datetime cycling` then the + :term:`suite` is using :term:`datetime cycling` then the labels will be :term:`ISO8601` datetimes e.g. ``2000-01-01T00:00Z``. See also: @@ -215,7 +215,7 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` datetime cycling A datetime cycling is the default for a :term:`cycling suite`. @@ -226,10 +226,10 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` wall-clock time - In a cylc suite the wall-clock time refers to the actual time (in the + In a Cylc suite the wall-clock time refers to the actual time (in the real world). See also: @@ -239,7 +239,7 @@ Glossary ISO8601 ISO8601 is an international standard for writing dates and times which is - used in cylc with :term:`datetime cycling`. + used in Cylc with :term:`datetime cycling`. See also: @@ -259,7 +259,7 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` * :term:`ISO8601` ISO8601 duration @@ -269,14 +269,14 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` * :term:`ISO8601` recurrence A recurrence is a repeating sequence which may be used to define a :term:`cycling suite`. Recurrences determine how often something repeats and take one of two forms depending on whether the - :term:`suite` is configured to use :term:`integer cycling` + :term:`suite` is configured to use :term:`integer cycling` or :term:`datetime cycling`. See also: @@ -344,7 +344,7 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` * :term:`task state` task @@ -373,13 +373,13 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` * :term:`task` * :term:`job` * :term:`qualifier` run directory - When a :term:`suite ` is run a directory is created for all + When a :term:`suite ` is run a directory is created for all of the files generated whilst the suite is running. This is called the run directory and typically resides in the ``cylc-run`` directory: @@ -402,8 +402,8 @@ Glossary * :term:`job log directory` work directory - When cylc executes a :term:`job` it does so inside the - :term:`job's ` working directory. This directory is created by cylc + When Cylc executes a :term:`job` it does so inside the + :term:`job's ` working directory. This directory is created by Cylc and lies within the directory tree inside the relevant suite's :term:`run directory`. @@ -443,7 +443,7 @@ Glossary suite log suite log directory - A cylc suite logs events and other information to the suite log files + A Cylc suite logs events and other information to the suite log files when it runs. There are three log files: * ``out`` - the stdout of the suite. @@ -460,7 +460,7 @@ Glossary job log job log directory - When cylc executes a :term:`job`, stdout and stderr are redirected to the + When Cylc executes a :term:`job`, stdout and stderr are redirected to the ``job.out`` and ``job.err`` files which are stored in the job log directory. @@ -475,7 +475,7 @@ Glossary * `job`: the :term:`job script`. * `job-activity.log`: a log file containing details of the :term:`job's ` progress. - * `job.status`: a file holding cylc's most up-to-date + * `job.status`: a file holding Cylc's most up-to-date understanding of the :term:`job's ` present status. job @@ -512,7 +512,7 @@ Glossary job submission number Cylc may run multiple :term:`jobs ` per :term:`task` (e.g. if the - task failed and was re-tried). Each time cylc runs a :term:`job` it is + task failed and was re-tried). Each time Cylc runs a :term:`job` it is assigned a submission number. The submission number starts at 1, incrementing with each submission. @@ -544,7 +544,7 @@ Glossary * :term:`batch system` parameterisation - Parameterisation is a way to consolidate configuration in the cylc + Parameterisation is a way to consolidate configuration in the Cylc ``suite.rc`` file by implicitly looping over a set of pre-defined variables e.g: @@ -566,10 +566,10 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` family - In cylc a family is a collection of :term:`tasks ` which share a + In Cylc a family is a collection of :term:`tasks ` which share a common configuration and which can be referred to collectively in the :term:`graph`. @@ -578,7 +578,7 @@ Glossary See also: - * :ref:`cylc tutorial ` + * :ref:`Cylc tutorial ` * :term:`family inheritance` * :term:`family trigger` @@ -607,7 +607,7 @@ Glossary See also: - * `cylc user guide`_ + * `Cylc User Guide`_ * :term:`family` * :term:`family trigger` @@ -632,7 +632,7 @@ Glossary See also: - * `cylc user guide`_ + * `Cylc User Guide`_ * :term:`family` * :term:`task trigger` * :term:`dependency` @@ -640,7 +640,7 @@ Glossary stalled suite stalled state - If cylc is unable to proceed running a workflow due to unmet dependencies + If Cylc is unable to proceed running a workflow due to unmet dependencies the suite is said to be *stalled*. This usually happens because of a task failure as in the following @@ -660,14 +660,14 @@ Glossary In this example the task ``bar`` has failed meaning that ``baz`` is unable to run as its dependency (``bar:succeed``) has not been met. - When a cylc detects that a suite has stalled an email will be sent to the + When a Cylc detects that a suite has stalled an email will be sent to the user. Human interaction is required to escape a stalled state. Rose configuration Rose configurations are directories containing a Rose configuration file along with other optional files and directories. - The two types of Rose configuration relevant to cylc suites are: + The two types of Rose configuration relevant to Cylc suites are: * :term:`Rose application configuration` * :term:`Rose suite configuration` @@ -706,7 +706,7 @@ Glossary Rose suite configuration A Rose suite configuration is a :rose:file:`rose-suite.conf` file along with other optional files and directories which configure the way in - which a :term:`cylc suite` is run. E.g: + which a :term:`Cylc suite` is run. E.g: * Jinja2 variables to be passed into the ``suite.rc`` file ( :rose:conf:`rose-suite.conf[jinja2:suite.rc]`). @@ -749,7 +749,7 @@ Glossary * Validation using the :ref:`command-rose-macro` command. Metadata does not affect the running of an - :term:`application ` or :term:`cylc suite`. + :term:`application ` or :term:`Cylc suite`. See also: diff --git a/sphinx/hyperlinks.rst b/sphinx/hyperlinks.rst index d063d2cff2..928acd8ed8 100644 --- a/sphinx/hyperlinks.rst +++ b/sphinx/hyperlinks.rst @@ -9,11 +9,9 @@ .. include:: path/to/thisfile.rst :start-line: 1 -.. _GitHub: https://github.com/metomi/rose -.. _metomi-vms: https://github.com/metomi/metomi-vms -.. _cylc: http://cylc.github.io/cylc/ -.. _cylc user guide: http://cylc.github.io/cylc/documentation.html#the-cylc-user-guide -.. _cylc suite design guide: http://cylc.github.io/cylc/doc/suite-design-guide.pdf +.. _Cylc: http://cylc.github.io/cylc/ +.. _Cylc User Guide: http://cylc.github.io/cylc/documentation.html#the-cylc-user-guide +.. _Cylc Suite Design Guide: http://cylc.github.io/cylc/doc/suite-design-guide.pdf .. _FCM: https://metomi.github.io/fcm/doc/ .. _FCM User Guide: http://metomi.github.io/fcm/doc/user_guide/ .. _Github: https://github.com/metomi/rose diff --git a/sphinx/index.rst b/sphinx/index.rst index cdba1cdaab..c73f3cd05f 100644 --- a/sphinx/index.rst +++ b/sphinx/index.rst @@ -16,13 +16,13 @@ Rose is a system for writing, editing and running application configurations. :width: 250px :align: center -Rose uses the `cylc`_ workflow engine for running suites of inter-dependent -applications. :ref:`What Is Cylc? ` +Rose uses the `Cylc`_ workflow engine for running suites of inter-dependent +applications. :ref:`What Is Cylc? ` .. image:: img/cylc-logo.png :width: 250px :align: center - :target: `cylc`_ + :target: `Cylc`_ .. toctree:: diff --git a/sphinx/installation.rst b/sphinx/installation.rst index 02a67bfd1f..3ff08fef30 100644 --- a/sphinx/installation.rst +++ b/sphinx/installation.rst @@ -29,7 +29,7 @@ command. Host Requirements ----------------- -Whilst you can install and use Rose & cylc on a single host (i.e. machine), +Whilst you can install and use Rose & Cylc on a single host (i.e. machine), most installations are likely to be more complex. There are five types of installation: @@ -45,7 +45,7 @@ remote hosts. If multiple hosts are available, by default the host with the lowest system load average will be used. Installation requirements: - * Rose, cylc, Bash, Python, jinja2. + * Rose, Cylc, Bash, Python, jinja2. * Subversion & FCM *(only if you want* :ref:`command-rose-suite-run` *to install files from Subversion using FCM keywords).* Connectivity requirements: @@ -56,28 +56,28 @@ Hosts For Running Tasks In Suites ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Installation requirements: - * Rose, cylc, Bash, Python. + * Rose, Cylc, Bash, Python. * Subversion & FCM *only if you want to use the Rose install utility to install files from Subversion using FCM keywords*. Connectivity requirements: - * Must be able to communicate back to the hosts running the cylc suites + * Must be able to communicate back to the hosts running the Cylc suites via HTTPS (preferred), HTTP or SSH. Hosts For Running User Interactive Tools ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Installation requirements: - * Rose, cylc, Bash, Python, requests, Subversion, FCM, + * Rose, Cylc, Bash, Python, requests, Subversion, FCM, Pygraphviz (+ graphviz), PyGTK (+ GTK). Connectivity requirements: * Must have HTTP access to the hosts running the Rosie web service. * Must have access to the Rosie Subversion repositories via the appropriate protocol. - * Must have HTTP and SSH access to the hosts running the cylc suites. + * Must have HTTP and SSH access to the hosts running the Cylc suites. * Must share user accounts and ``$HOME`` directories with the hosts running - the cylc suites. + the Cylc suites. Hosts For Running Rose Bush ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -86,7 +86,7 @@ Installation requirements: * Rose, Bash, Python, cherrypy, jinja2. Connectivity requirements: - * Must be able to access the home directories of users' cylc run directories. + * Must be able to access the home directories of users' Cylc run directories. Hosts For Rosie Subversion Repositories And The Rosie Web Services ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -99,13 +99,13 @@ Installation requirements: .. note:: - This section has assumed that you wish to use Rose & cylc (including + This section has assumed that you wish to use Rose & Cylc (including their respective GUIs) and use Rosie to store your suites. However, there are many ways of using Rose. For instance: * You can use Rose without using cylc. - * You can use Rose & cylc but not use Rosie. - * You can use Rose & cylc from the command line without using their GUIs. + * You can use Rose & Cylc but not use Rosie. + * You can use Rose & Cylc from the command line without using their GUIs. Configuring Rose diff --git a/sphinx/tutorial/cylc/furthertopics/broadcast.rst b/sphinx/tutorial/cylc/furthertopics/broadcast.rst index c311cc0497..bf6aa3d06d 100644 --- a/sphinx/tutorial/cylc/furthertopics/broadcast.rst +++ b/sphinx/tutorial/cylc/furthertopics/broadcast.rst @@ -63,7 +63,7 @@ whilst the suite is running. For instance we could change the value of the cylc broadcast tutorial-broadcast -n announce -s "[environment]WORD=it" * ``tutorial-broadcast`` is the name of the suite. -* ``-n announce`` tells cylc we want to change the runtime configuration of the +* ``-n announce`` tells Cylc we want to change the runtime configuration of the ``announce`` task. * ``-s "[environment]WORD=it"`` changes the value of the ``WORD`` environment variable to ``it``. diff --git a/sphinx/tutorial/cylc/furthertopics/clock-triggered-tasks.rst b/sphinx/tutorial/cylc/furthertopics/clock-triggered-tasks.rst index 857e2a01ab..43181eebf1 100644 --- a/sphinx/tutorial/cylc/furthertopics/clock-triggered-tasks.rst +++ b/sphinx/tutorial/cylc/furthertopics/clock-triggered-tasks.rst @@ -172,4 +172,4 @@ Summary * A clock trigger applies only to a single task. * Clock triggers can only be used in datetime cycling suites. -For more information see the `cylc User Guide`_. +For more information see the `Cylc User Guide`_. diff --git a/sphinx/tutorial/cylc/furthertopics/family-triggers.rst b/sphinx/tutorial/cylc/furthertopics/family-triggers.rst index 03d646ec29..29cd03bc6d 100644 --- a/sphinx/tutorial/cylc/furthertopics/family-triggers.rst +++ b/sphinx/tutorial/cylc/furthertopics/family-triggers.rst @@ -39,7 +39,7 @@ in that family reaching the desired :term:`state ` e.g: Such :term:`triggers ` are referred to as :term:`family triggers ` -Foo :command:`cylc gui` bar +Foo ``cylc gui`` bar Example diff --git a/sphinx/tutorial/cylc/furthertopics/inheritance.rst b/sphinx/tutorial/cylc/furthertopics/inheritance.rst index beab8237a6..c7506048c2 100644 --- a/sphinx/tutorial/cylc/furthertopics/inheritance.rst +++ b/sphinx/tutorial/cylc/furthertopics/inheritance.rst @@ -169,7 +169,7 @@ land vertically. :align: center As the V-22 can be thought of as both a plane and a helicopter we want it to -inherit from both the ``AIRPLANE`` and ``HELICOPTER`` families. In cylc we can +inherit from both the ``AIRPLANE`` and ``HELICOPTER`` families. In Cylc we can inherit from multiple families by separating their names with commas: Add the following task to your ``suite.rc`` file. @@ -181,7 +181,7 @@ Add the following task to your ``suite.rc`` file. [[[meta]]] title = V-22 Osprey Military Aircraft. -Refresh your ``cylc graph`` window or re-run the cylc graph command. +Refresh your ``cylc graph`` window or re-run the ``cylc graph`` command. The inheritance hierarchy should now look like this: diff --git a/sphinx/tutorial/cylc/furthertopics/queues.rst b/sphinx/tutorial/cylc/furthertopics/queues.rst index 7a9a527740..fc6df9ba37 100644 --- a/sphinx/tutorial/cylc/furthertopics/queues.rst +++ b/sphinx/tutorial/cylc/furthertopics/queues.rst @@ -102,4 +102,4 @@ The customers will obviously have to wait! Further Reading --------------- -For more information, see the `cylc User Guide`_. +For more information, see the `Cylc User Guide`_. diff --git a/sphinx/tutorial/cylc/furthertopics/retries.rst b/sphinx/tutorial/cylc/furthertopics/retries.rst index 5f6a32ef92..8f6b00b654 100644 --- a/sphinx/tutorial/cylc/furthertopics/retries.rst +++ b/sphinx/tutorial/cylc/furthertopics/retries.rst @@ -15,7 +15,7 @@ Retries can be useful for tasks that may occasionally fail due to external events, and are routinely fixable when they do - an example would be a task that is dependent on a system that experiences temporary outages. -If a task fails, the cylc retry mechanism can resubmit it after a +If a task fails, the Cylc retry mechanism can resubmit it after a pre-determined delay. An environment variable, ``$CYLC_TASK_TRY_NUMBER`` is incremented and passed into the task - this means you can write your task script so that it changes behaviour accordingly. @@ -85,7 +85,7 @@ Stop the suite:: Configuring Retries ------------------- -We need to tell cylc to retry it a few times - replace the line +We need to tell Cylc to retry it a few times - replace the line ``[[roll_doubles]]`` in the ``suite.rc`` file with: .. code-block:: cylc @@ -94,12 +94,12 @@ We need to tell cylc to retry it a few times - replace the line [[[job]]] execution retry delays = 5*PT6S -This means that if the ``roll_doubles`` task fails, cylc expects to +This means that if the ``roll_doubles`` task fails, Cylc expects to retry running it 5 times before finally failing. Each retry will have a delay of 6 seconds. We can apply multiple retry periods with the ``execution retry delays`` setting -by separating them with commas, for example the following line would tell cylc +by separating them with commas, for example the following line would tell Cylc to retry a task four times, once after 15 seconds, then once after 10 minutes, then once after one hour then once after three hours. @@ -119,7 +119,7 @@ Re-run the suite:: cylc run retries-tutorial -What you should see is cylc retrying the ``roll_doubles`` task. Hopefully, +What you should see is Cylc retrying the ``roll_doubles`` task. Hopefully, it will succeed (there is only about a about a 1 in 3 chance of every task failing) and the suite will continue. @@ -154,4 +154,4 @@ This time, the task should definitely succeed before the third retry. Further Reading --------------- -For more information see the `cylc User Guide`_. +For more information see the `Cylc User Guide`_. diff --git a/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst b/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst index c8351fe34e..0649e38c01 100644 --- a/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst +++ b/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst @@ -40,7 +40,7 @@ it will get burnt. In the case that we burn the cake the workflow gets stuck. In this event the ``sell_cake`` task will be unable to run as it depends on ``bake_cake``. We would say that this suite has :term:`stalled `. -When cylc detects that a suite has stalled it sends you an email to let you +When Cylc detects that a suite has stalled it sends you an email to let you know that the suite has got stuck and requires human intervention to proceed. @@ -96,7 +96,7 @@ We can add this logic to our workflow using the ``fail`` :term:`qualifier`. .. admonition:: Reminder :class: hint - If you don't specify a qualifier cylc assumes you mean ``:succeed`` so the + If you don't specify a qualifier Cylc assumes you mean ``:succeed`` so the following two lines are equivalent: .. code-block:: cylc-graph @@ -220,14 +220,14 @@ you see might differ slightly. You may receive a "suite stalled" email. "make_cake_mixture.3" -> "bake_cake.3" -> "sell_cake.3" "bake_cake.3" -> "eat_cake.3" -The reason the suite stalls is that, by default, cylc will run a maximum of +The reason the suite stalls is that, by default, Cylc will run a maximum of three cycles concurrently. As each cycle has at least one task which hasn't -either succeeded or failed cylc cannot move onto the next cycle. +either succeeded or failed Cylc cannot move onto the next cycle. .. tip:: For more information search ``max active cycle points`` in the - `cylc user guide`_. + `Cylc User Guide`_. You will also notice that some of the tasks (e.g. ``eat_cake`` in cycle ``2`` in the above example) are drawn in a faded gray. This is because these tasks diff --git a/sphinx/tutorial/cylc/index.rst b/sphinx/tutorial/cylc/index.rst index a20c4ffdef..ece8cfe6af 100644 --- a/sphinx/tutorial/cylc/index.rst +++ b/sphinx/tutorial/cylc/index.rst @@ -3,7 +3,7 @@ Cylc Tutorial ============= -This section will cover the cylc framework and writing basic cylc suites. +This section will cover the Cylc framework and writing basic Cylc suites. .. toctree:: :name: cylc-tutorial diff --git a/sphinx/tutorial/cylc/introduction.rst b/sphinx/tutorial/cylc/introduction.rst index 3873fbe187..18af61b3c5 100644 --- a/sphinx/tutorial/cylc/introduction.rst +++ b/sphinx/tutorial/cylc/introduction.rst @@ -35,7 +35,7 @@ What Is Cylc? Cylc (pronounced silk) is a workflow engine, a system that automatically executes tasks according to their schedules and dependencies. -In a cylc workflow each step is a +In a Cylc workflow each step is a computational task, a script to execute. Cylc runs each task as soon as it is appropriate to do so. @@ -57,7 +57,7 @@ Cylc was originally developed at NIWA (The National Institute of Water and Atmospheric Research - New Zealand) for running their weather forecasting workflows. Cylc is now developed by an international partnership including members from NIWA and the Met Office (UK). Though initially developed for -meteorological purposes cylc is a general purpose tool as applicable in +meteorological purposes Cylc is a general purpose tool as applicable in business as in scientific research. Cylc provides a variety of command line and GUI tools for visualising and diff --git a/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst b/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst index b67675f5c6..3beafad436 100644 --- a/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst +++ b/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst @@ -75,7 +75,7 @@ default values. cylc get-config --sparse To view the configuration of a particular section or setting refer to it by -name using the ``-i`` option (see :ref:`cylc file format` for details), e.g: +name using the ``-i`` option (see :ref:`Cylc file format` for details), e.g: .. code-block:: sub @@ -217,7 +217,7 @@ non-optional. The most commonly used ones are: Run as soon as all of the family members have completed (i.e. have each either succeeded or failed). -For more information on family triggers see the `cylc user guide`_. +For more information on family triggers see the `Cylc User Guide`_. The ``root`` Family ^^^^^^^^^^^^^^^^^^^ @@ -580,7 +580,7 @@ brackets, e.g: [[task]] script = echo 'Hello World!' -When the ``suite.rc`` file is read by cylc, the parameters will be expanded. +When the ``suite.rc`` file is read by Cylc, the parameters will be expanded. For example the code above is equivalent to: .. code-block:: cylc @@ -635,7 +635,7 @@ Parameters can be either words or integers: .. warning:: - Remember that cylc automatically inserts an underscore between the task and + Remember that Cylc automatically inserts an underscore between the task and the parameter, e.g. the following lines are equivalent: .. code-block:: cylc-graph @@ -645,7 +645,7 @@ Parameters can be either words or integers: .. note:: - When using integer parameters, to prevent confusion, cylc prefixes the + When using integer parameters, to prevent confusion, Cylc prefixes the parameter value with the parameter name. For example, the above code is equivalent to: @@ -699,7 +699,7 @@ so: [[[environment]]] SITE_ID = 3005 -For more information see the `cylc user guide`_. +For more information see the `Cylc User Guide`_. .. practical:: @@ -727,7 +727,7 @@ For more information see the `cylc user guide`_. [[[environment]]] API_KEY = {{ API_KEY }} - Using ``cylc get-config`` you should see that cylc replaces the + Using ``cylc get-config`` you should see that Cylc replaces the ```` with each of the stations in turn, creating a new task for each: diff --git a/sphinx/tutorial/cylc/runtime/index.rst b/sphinx/tutorial/cylc/runtime/index.rst index b6f7a56a48..2777c70127 100644 --- a/sphinx/tutorial/cylc/runtime/index.rst +++ b/sphinx/tutorial/cylc/runtime/index.rst @@ -7,7 +7,7 @@ This section covers: * Associating tasks with scripts and executables. * Providing executables with runtime configurations. -* Running cylc suites. +* Running Cylc suites. .. toctree:: :name: rug-runtime-toc diff --git a/sphinx/tutorial/cylc/runtime/introduction.rst b/sphinx/tutorial/cylc/runtime/introduction.rst index d927535a60..cdabcff9a4 100644 --- a/sphinx/tutorial/cylc/runtime/introduction.rst +++ b/sphinx/tutorial/cylc/runtime/introduction.rst @@ -31,7 +31,7 @@ settings inside the following section: The ``script`` Setting ---------------------- -We tell cylc *what* to execute when a task is run using the ``script`` setting. +We tell Cylc *what* to execute when a task is run using the ``script`` setting. This setting is interpreted as a bash script. The following example defines a task called ``hello_world`` which writes ``Hello World!`` to stdout upon @@ -55,7 +55,7 @@ We can also call other scripts or executables in this way, e.g: [[hello_world]] script = ~/foo/bar/baz/hello_world -It is often a good idea to keep our scripts within the cylc suite directory +It is often a good idea to keep our scripts within the Cylc suite directory tree rather than leaving them somewhere else on the system. If you create a ``bin`` sub-directory within the :term:`suite directory` this directory will be added to the path when tasks run, e.g: @@ -104,7 +104,7 @@ be ``foo`` in the above example). In this tutorial we are writing our suites in the ``cylc-run`` directory. It is possible to write them elsewhere on the system. If we do so we - must register the suite with cylc before use. + must register the suite with Cylc before use. We do this using the ``cylc reg`` command which we supply with a name which will be used to refer to the suite in place of the path i.e: @@ -152,14 +152,14 @@ These descriptions, and a few more (e.g. failed), are called the :term:`task sta -The cylc GUI +The Cylc GUI ------------ -To help you to keep track of a running suite cylc has a graphical user -interface (the cylc GUI) which can be used for monitoring and +To help you to keep track of a running suite Cylc has a graphical user +interface (the Cylc GUI) which can be used for monitoring and interaction. -The cylc GUI looks quite like ``cylc graph`` but the tasks are colour-coded to +The Cylc GUI looks quite like ``cylc graph`` but the tasks are colour-coded to represent their state, as in the following diagram. .. digraph:: example @@ -178,26 +178,26 @@ represent their state, as in the following diagram. b => d => f e => f -This is the "graph view". The cylc GUI has two other views called "tree" and +This is the "graph view". The Cylc GUI has two other views called "tree" and "dot". .. figure:: ../img/cylc-gui-graph.png :figwidth: 50% :align: center - Screenshot of the cylc GUI in "Graph View" mode. + Screenshot of the Cylc GUI in "Graph View" mode. .. figure:: ../img/cylc-gui-tree.png :figwidth: 50% :align: center - Screenshot of the cylc GUI in "Tree View" mode. + Screenshot of the Cylc GUI in "Tree View" mode. .. figure:: ../img/cylc-gui-dot.png :figwidth: 50% :align: center - Screenshot of the cylc GUI in "Dot View" mode. + Screenshot of the Cylc GUI in "Dot View" mode. Where Do All The Files Go? @@ -206,7 +206,7 @@ Where Do All The Files Go? The Work Directory ^^^^^^^^^^^^^^^^^^ -When a :term:`task` is run cylc creates a directory for the :term:`job` to run +When a :term:`task` is run Cylc creates a directory for the :term:`job` to run in. This is called the :term:`work directory`. By default the work directory is located in a directory structure @@ -219,7 +219,7 @@ under the relevant :term:`cycle point` and :term:`task` name: The Job Log Directory ^^^^^^^^^^^^^^^^^^^^^ -When a task is run cylc generates a :term:`job script` which is stored in the +When a task is run Cylc generates a :term:`job script` which is stored in the :term:`job log directory` as the file ``job``. When the :term:`job script` is executed the stdout and stderr are redirected @@ -238,7 +238,7 @@ a task is re-run. .. tip:: - If a task has run and is still visible in the cylc GUI you can view its + If a task has run and is still visible in the Cylc GUI you can view its :term:`job log files ` by right-clicking on the task and selecting "View". @@ -249,7 +249,7 @@ a task is re-run. Suite Files ^^^^^^^^^^^ -Along with the :term:`work directory` and :term:`job log directory`, cylc +Along with the :term:`work directory` and :term:`job log directory`, Cylc generates other files and directories when it runs a suite, namely: @@ -257,12 +257,12 @@ generates other files and directories when it runs a suite, namely: Directory containing log files, including: ``log/db`` - The database which cylc uses to record the state of the suite; + The database which Cylc uses to record the state of the suite; ``log/job`` The directory where the :term:`job log files ` live; ``log/suite`` The directory where the :term:`suite log files ` live. - These files are written by cylc as the suite is run and are useful for + These files are written by Cylc as the suite is run and are useful for debugging purposes in the event of error. ``suite.rc.processed`` @@ -306,7 +306,7 @@ generates other files and directories when it runs a suite, namely: cylc validate . - Open the cylc GUI (in the background) by running the following command: + Open the Cylc GUI (in the background) by running the following command: .. code-block:: bash @@ -326,7 +326,7 @@ generates other files and directories when it runs a suite, namely: .. tip:: - You can also run a suite from the cylc GUI by pressing the "play" + You can also run a suite from the Cylc GUI by pressing the "play" button. .. image:: ../img/gcylc-play.png @@ -361,7 +361,7 @@ generates other files and directories when it runs a suite, namely: 1970-01-01T00:00:00Z NORMAL - started 2038-01-19T03:14:08Z NORMAL - succeeded - * The first three lines are information which cylc has written to the file + * The first three lines are information which Cylc has written to the file to provide information about the job. * The last two lines were also written by cylc. They provide timestamps marking the stages in the job's life. diff --git a/sphinx/tutorial/cylc/runtime/runtime-configuration.rst b/sphinx/tutorial/cylc/runtime/runtime-configuration.rst index fc3a7fef96..0912c93400 100644 --- a/sphinx/tutorial/cylc/runtime/runtime-configuration.rst +++ b/sphinx/tutorial/cylc/runtime/runtime-configuration.rst @@ -40,15 +40,15 @@ Each job is also provided with some standard environment variables e.g: The :term:`cycle point` for the associated task *(e.g. 20171009T0950)*. -There are many more environment variables - see the `cylc user guide`_ for more +There are many more environment variables - see the `Cylc User Guide`_ for more information. Job Submission -------------- -By default cylc runs :term:`jobs ` on the machine where the suite is -running. We can tell cylc to run jobs on other machines by setting the +By default Cylc runs :term:`jobs ` on the machine where the suite is +running. We can tell Cylc to run jobs on other machines by setting the ``[remote]host`` setting to the name of the host, e.g. to run a task on the host ``computehost`` you might write: @@ -138,7 +138,7 @@ Sometimes jobs fail. This can be caused by two factors: * The :term:`job host` becoming unavailable or overloaded; * An issue with the directives. -In the event of failure cylc can automatically re-submit (retry) jobs. We +In the event of failure Cylc can automatically re-submit (retry) jobs. We configure retries using the ``[job]execution retry delays`` and ``[job]submission retry delays`` settings. These settings are both set to an :term:`ISO8601 duration`, e.g. setting ``execution retry delays`` to ``PT10M`` @@ -165,17 +165,17 @@ duration, e.g: Start, Stop, Restart -------------------- -We have seen how to start and stop cylc suites with ``cylc run`` and -``cylc stop`` respectively. The ``cylc stop`` command causes cylc to wait +We have seen how to start and stop Cylc suites with ``cylc run`` and +``cylc stop`` respectively. The ``cylc stop`` command causes Cylc to wait for all running jobs to finish before it stops the suite. There are two options which change this behaviour: ``cylc stop --kill`` - When the ``--kill`` option is used cylc will kill all running jobs + When the ``--kill`` option is used Cylc will kill all running jobs before stopping. *Cylc can kill jobs on remote hosts and uses the appropriate command when a* :term:`batch system` *is used.* ``cylc stop --now --now`` - When the ``--now`` option is used twice cylc stops straight away, leaving + When the ``--now`` option is used twice Cylc stops straight away, leaving any jobs running. Once a suite has stopped it is possible to restart it using the @@ -319,13 +319,13 @@ off and carries on as normal. Next we will test the ``get_observations`` tasks. - Open the cylc GUI by running the following command: + Open the Cylc GUI by running the following command: .. code-block:: bash cylc gui runtime-tutorial & - Run the suite either by pressing the play button in the cylc GUI or by + Run the suite either by pressing the play button in the Cylc GUI or by running the command: .. code-block:: bash @@ -385,7 +385,7 @@ off and carries on as normal. #. **Run The Suite.** - Open the cylc GUI (if not already open) and run the suite. + Open the Cylc GUI (if not already open) and run the suite. .. spoiler:: Hint hint @@ -395,7 +395,7 @@ off and carries on as normal. Run the suite either by: - * Pressing the play button in the cylc GUI. Then, ensuring that + * Pressing the play button in the Cylc GUI. Then, ensuring that "Cold Start" is selected within the dialogue window, pressing the "Start" button. * Running the command ``cylc run runtime-tutorial``. diff --git a/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst b/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst index d19224d24b..ded7c4a97a 100644 --- a/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst +++ b/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst @@ -10,7 +10,7 @@ In the last section we looked at writing an :term:`integer cycling` workflow, one where the :term:`cycle points ` are numbered. Typically workflows are repeated at a regular time interval, say every day -or every few hours. To make this easier cylc has a date-time cycling mode +or every few hours. To make this easier Cylc has a date-time cycling mode where the :term:`cycle points ` use date and time specifications rather than numbers. @@ -26,7 +26,7 @@ rather than numbers. ISO8601 ------- -In cylc, dates, times and durations are written using the :term:`ISO8601` format +In Cylc, dates, times and durations are written using the :term:`ISO8601` format - an international standard for representing dates and times. .. _tutorial-iso8601-datetimes: @@ -206,7 +206,7 @@ UTC Mode Due to all of the difficulties caused by time zones, particularly with respect to daylight savings, we typically use UTC (that's the ``+00`` time -zone) in cylc suites. +zone) in Cylc suites. When a suite uses UTC all of the cycle points will be written in the ``+00`` time zone. diff --git a/sphinx/tutorial/cylc/scheduling/further-scheduling.rst b/sphinx/tutorial/cylc/scheduling/further-scheduling.rst index 6888c1585d..40c7aa38f1 100644 --- a/sphinx/tutorial/cylc/scheduling/further-scheduling.rst +++ b/sphinx/tutorial/cylc/scheduling/further-scheduling.rst @@ -2,7 +2,7 @@ Further Scheduling ================== In this section we will quickly run through some of the more advanced features -of cylc's scheduling logic. +of Cylc's scheduling logic. .. include:: ../../../hyperlinks.rst @@ -33,13 +33,13 @@ There are qualifiers for different :term:`task states ` e.g: It is also possible to create your own custom :term:`qualifiers ` to handle events within your code (custom outputs). -*For more information see the* `cylc user guide`_. +*For more information see the* `Cylc User Guide`_. Clock Triggers -------------- -In cylc, :term:`cycle points ` are just labels. Tasks are triggered +In Cylc, :term:`cycle points ` are just labels. Tasks are triggered when their dependencies are met irrespective of the cycle they are in, but we can force cycles to wait for a particular time before running using clock triggers. This is necessary for certain operational and monitoring systems. @@ -66,12 +66,12 @@ until 11:00 on the 1st of January 2000 before running: Alternative Calendars --------------------- -By default cylc uses the Gregorian calendar for :term:`datetime cycling`, but -cylc also supports the 360-day calendar (12 months of 30 days each in a year). +By default Cylc uses the Gregorian calendar for :term:`datetime cycling`, but +Cylc also supports the 360-day calendar (12 months of 30 days each in a year). .. code-block:: cylc [scheduling] cycling mode = 360day -*For more information see the* `cylc user guide`_. +*For more information see the* `Cylc User Guide`_. diff --git a/sphinx/tutorial/cylc/scheduling/graphing.rst b/sphinx/tutorial/cylc/scheduling/graphing.rst index ae83280eb7..330109a2d6 100644 --- a/sphinx/tutorial/cylc/scheduling/graphing.rst +++ b/sphinx/tutorial/cylc/scheduling/graphing.rst @@ -7,12 +7,12 @@ Graphing In this section we will cover writing basic workflows in cylc. -.. _cylc file format: +.. _Cylc file format: The suite.rc File Format ------------------------ -We refer to a cylc workflow as a :term:`cylc suite`. A cylc suite is a directory +We refer to a Cylc workflow as a :term:`Cylc suite`. A Cylc suite is a directory containing a ``suite.rc`` file. This configuration file is where we define our workflow. The ``suite.rc`` file uses a nested `INI`_-based format: @@ -101,7 +101,7 @@ Throughout this tutorial we will refer to settings in the following format: Graph Strings ------------- -In cylc we consider workflows in terms of :term:`tasks ` and +In Cylc we consider workflows in terms of :term:`tasks ` and :term:`dependencies `. Task are represented as words and dependencies as arrows (``=>``), so the following text defines two tasks where ``make_dough`` is dependent on ``purchase_ingredients``: @@ -113,7 +113,7 @@ defines two tasks where ``make_dough`` is dependent on ``purchase_ingredients``: purchase_ingredients => make_dough -In a cylc workflow this would mean that ``make_dough`` would only run when +In a Cylc workflow this would mean that ``make_dough`` would only run when ``purchase_ingredients`` has succeeded. These :term:`dependencies ` can be chained together: @@ -166,7 +166,7 @@ Collectively these :term:`graph strings` are referred to as a Cylc Graphs ----------- -In a :term:`cylc suite` the :term:`graph` is stored under the +In a :term:`Cylc suite` the :term:`graph` is stored under the ``[scheduling][dependencies]graph`` setting, i.e: .. code-block:: cylc @@ -178,9 +178,9 @@ In a :term:`cylc suite` the :term:`graph` is stored under the pre_heat_oven & make_dough => bake_bread => sell_bread & clean_oven """ -This is a minimal :term:`cylc suite`, in which we have defined a :term:`graph` -representing a workflow for cylc to run. -We have not yet provided cylc with the scripts or binaries to run for +This is a minimal :term:`Cylc suite`, in which we have defined a :term:`graph` +representing a workflow for Cylc to run. +We have not yet provided Cylc with the scripts or binaries to run for each task. This will be covered later in the :ref:`runtime tutorial `. @@ -197,12 +197,12 @@ seen so far. The number ``1`` which appears below each task is the .. practical:: - .. rubric:: In this practical we will create a new cylc suite and write a + .. rubric:: In this practical we will create a new Cylc suite and write a graph for it to use. - #. **Create a cylc suite.** + #. **Create a Cylc suite.** - A cylc suite is just a directory containing a ``suite.rc`` file. + A Cylc suite is just a directory containing a ``suite.rc`` file. If you don't have one already, create a ``cylc-run`` directory in your user space i.e:: @@ -230,7 +230,7 @@ seen so far. The number ``1`` which appears below each task is the #. **Write a graph.** - We now have a blank cylc suite, next we need to define a workflow. + We now have a blank Cylc suite, next we need to define a workflow. Edit your ``suite.rc`` file to add graph strings representing the following graph: @@ -243,7 +243,7 @@ seen so far. The number ``1`` which appears below each task is the foo -> bar -> baz -> qux pub -> bar -> wop - #. **Use** ``cylc graph`` **to visualise the workflow.** + #. **Use** ``Cylc graph`` **to visualise the workflow.** Once you have written some graph strings try using ``cylc graph`` to display the workflow. Run the following command: diff --git a/sphinx/tutorial/cylc/scheduling/integer-cycling.rst b/sphinx/tutorial/cylc/scheduling/integer-cycling.rst index 391897dc90..467b2b8fe3 100644 --- a/sphinx/tutorial/cylc/scheduling/integer-cycling.rst +++ b/sphinx/tutorial/cylc/scheduling/integer-cycling.rst @@ -11,7 +11,7 @@ workflows. Repeating Workflows ------------------- -Often, we will want to repeat the same workflow multiple times. In cylc this +Often, we will want to repeat the same workflow multiple times. In Cylc this "repetition" is called :term:`cycling` and each repetition of the workflow is referred to as a :term:`cycle`. @@ -19,12 +19,12 @@ Each :term:`cycle` is given a unique label. This is called a :term:`cycle point`. For now these :term:`cycle points` will be integers *(they can also be dates as we will see in the next section)*. -To make a workflow repeat we must tell cylc three things: +To make a workflow repeat we must tell Cylc three things: 1) How often we want the workflow to repeat - the :term:`recurrence`. 2) At what cycle point we want to start the workflow - the :term:`initial cycle point`. -3) *Optionally* we can also tell cylc what cycle point we want to stop the +3) *Optionally* we can also tell Cylc what cycle point we want to stop the workflow - the :term:`final cycle point`. Let's take the bakery example from the previous section. Bread is @@ -44,9 +44,9 @@ three lines: pre_heat_oven & make_dough => bake_bread => sell_bread & clean_oven """ -* The ``cycling mode = integer`` setting tells cylc that we want our +* The ``cycling mode = integer`` setting tells Cylc that we want our :term:`cycle points` to be numbered. -* The ``initial cycle point = 1`` setting tells cylc to start counting from 1. +* The ``initial cycle point = 1`` setting tells Cylc to start counting from 1. * ``P1`` is the :term:`recurrence`. The :term:`graph` within the ``[[[P1]]]`` section will be repeated at each :term:`cycle point`. @@ -194,7 +194,7 @@ Adding this dependency "strings together" the cycles, forcing them to run in order. We refer to dependencies between cycles as :term:`inter-cycle dependencies`. -In the dependency the ``[-P1]`` suffix tells cylc that we are referring to a +In the dependency the ``[-P1]`` suffix tells Cylc that we are referring to a task in the previous cycle. Equally ``[-P2]`` would refer to a task two cycles ago. @@ -360,7 +360,7 @@ starting 5 cycles *after* the initial cycle point. .. practical:: - .. rubric:: In this practical we will take the :term:`suite ` + .. rubric:: In this practical we will take the :term:`suite ` we wrote in the previous section and turn it into a :term:`cycling suite `. @@ -406,7 +406,7 @@ starting 5 cycles *after* the initial cycle point. #. **Visualise the suite.** - Try visualising the suite using ``cylc graph``. + Try visualising the suite using ``Cylc graph``. .. code-block:: none @@ -414,7 +414,7 @@ starting 5 cycles *after* the initial cycle point. .. tip:: - You can get cylc graph to draw dotted boxes around the cycles by + You can get Cylc graph to draw dotted boxes around the cycles by clicking the "Organise by cycle point" button on the toolbar: .. image:: ../img/cylc-graph-cluster.png diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index ee757e640c..6c03220772 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -4,7 +4,7 @@ Rose Applications ================= -The cylc ``suite.rc`` file allows us to define environment variables for use by +The Cylc ``suite.rc`` file allows us to define environment variables for use by :term:`tasks ` e.g: .. code-block:: cylc @@ -203,7 +203,7 @@ can be used to provide the path to the Rose application: provide the ``DOMAIN`` and ``RESOLUTION`` environment variables defined in the ``[runtime][root][environment]`` section of the ``suite.rc`` file as well as the ``CYLC_TASK_CYCLE_POINT`` environment variable - provided by cylc when it runs a task. + provided by Cylc when it runs a task. Add the following lines to the :rose:file:`rose-app.conf`: diff --git a/sphinx/tutorial/rose/configurations.rst b/sphinx/tutorial/rose/configurations.rst index 254a623acb..106300b4ee 100644 --- a/sphinx/tutorial/rose/configurations.rst +++ b/sphinx/tutorial/rose/configurations.rst @@ -15,13 +15,13 @@ such as: * Environment variables. Rose configurations may be used standalone or alternatively in combination with -the `cylc`_ workflow engine. There are two types of Rose configuration for use -with `cylc`_: +the `Cylc`_ workflow engine. There are two types of Rose configuration for use +with `Cylc`_: :term:`Rose application configuration` A runnable Rose configuration which executes a defined command. :term:`Rose suite configuration` - A Rose configuration designed to run :term:`cylc suites `. + A Rose configuration designed to run :term:`Cylc suites `. For instance it may be used to define Jinja2 variables for use in the ``suite.rc`` file. @@ -39,7 +39,7 @@ file format. * Settings are written as ``key=value`` pairs. * Sections are written inside square brackets i.e. ``[section-name]`` -Unlike the :ref:`cylc file format `: +Unlike the :ref:`Cylc file format`: * Sections cannot be nested. * Settings should not be indented. diff --git a/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst b/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst index db3204a003..073765c2bb 100644 --- a/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst +++ b/sphinx/tutorial/rose/furthertopics/date-time-manipulation.rst @@ -6,7 +6,7 @@ Date and Time Manipulation :term:`Datetime cycling ` suites inevitably involve performing some form of datetime arithmetic. In the :ref:`weather forecasting suite ` we wrote -in the cylc tutorial this arithmetic was done using the ``cylc cyclepoint`` +in the Cylc tutorial this arithmetic was done using the ``cylc cyclepoint`` command. For example we calculated the cycle point three hours before the present cycle using:: diff --git a/sphinx/tutorial/rose/furthertopics/rose-bunch.rst b/sphinx/tutorial/rose/furthertopics/rose-bunch.rst index 957e84c456..7b920a9d8c 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-bunch.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-bunch.rst @@ -138,11 +138,11 @@ Navigate to the top directory of your suite (where the ``suite.rc`` and :rose:file:`rose-suite.conf` files can be found) and run :ref:`command-rose-suite-run`. -Your suite should run, launch the cylc GUI and successfully run the ``lander`` +Your suite should run, launch the Cylc GUI and successfully run the ``lander`` app. Once the suite has finished running and has shutdown, open Rose Bush to view -its output (note that you can close the cylc GUI at this point):: +its output (note that you can close the Cylc GUI at this point):: rose suite-log @@ -221,7 +221,7 @@ following line to the :rose:conf:`rose_bunch[bunch]` section: Run your suite again. Notice that this time round it takes longer for the task to run as it has been limited in the number of command variants it can run simultaneously. You can see the individual commands being started by viewing -the task stdout in the cylc GUI by right-clicking on the task and selecting +the task stdout in the Cylc GUI by right-clicking on the task and selecting :guilabel:`View` then :guilabel:`job stdout`. As an example, when the ``BA007`` invocation starts running you should see the line: diff --git a/sphinx/tutorial/rose/furthertopics/rose-stem.rst b/sphinx/tutorial/rose/furthertopics/rose-stem.rst index 43e8a037d2..a377d6e12d 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-stem.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-stem.rst @@ -252,8 +252,8 @@ so it should automatically pick up your working copy as the source). .. note:: - If your site uses a cylc server, and your home directory is not shared - with the cylc server, you will need to add the option:: + If your site uses a Cylc server, and your home directory is not shared + with the Cylc server, you will need to add the option:: --host=localhost diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 12990db8ac..27f9a8e76d 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -5,17 +5,17 @@ Rose Suite Configurations ========================= :term:`Rose application configurations ` -can be used to encapsulate the environment and resources required by a cylc +can be used to encapsulate the environment and resources required by a Cylc :term:`task`. Similarly :term:`Rose suite configurations ` can -be used to do the same for a :term:`cylc suite`. +be used to do the same for a :term:`Cylc suite`. Configuration Format -------------------- -A Rose suite configuration is a cylc :term:`suite directory` containing a +A Rose suite configuration is a Cylc :term:`suite directory` containing a :rose:file:`rose-suite.conf` file. .. NOTE - The rose-suite.info is not mentioned here as it is really a rosie @@ -71,7 +71,7 @@ Suite Directory Vs Run Directory directories live here. Throughout the :ref:`Cylc Tutorial` we wrote suites in the ``cylc-run`` -directory. As cylc runs suites in the ``cylc-run`` directory the +directory. As Cylc runs suites in the ``cylc-run`` directory the :term:`suite directory` is also the :term:`run directory` i.e. the suite runs in the same directory in which it is written. @@ -83,7 +83,7 @@ running. .. note:: - Using cylc it is possible to separate the :term:`suite directory` and + Using Cylc it is possible to separate the :term:`suite directory` and :term:`run directory` using the ``cylc register`` command. Note though that suite resources e.g. scripts in the ``bin/`` directory will remain in the :term:`suite directory` so cannot safely be edited whilst the suite is @@ -106,9 +106,9 @@ When a suite configuration is run: #. Any files defined in the :rose:file:`rose-suite.conf` file are installed. #. Jinja2 variables defined in the :rose:file:`rose-suite.conf` file are added to the top of the ``suite.rc`` file. -#. The cylc suite is validated. -#. The cylc suite is run. -#. The cylc gui is launched. +#. The Cylc suite is validated. +#. The Cylc suite is run. +#. The Cylc gui is launched. .. digraph:: Example :align: center @@ -191,7 +191,7 @@ The name can be overridden using the ``--name`` option i.e: in turn calls the ``cylc run`` command. :ref:`Stopping Suites` Suites can be stopped using the ``cylc stop `` as for regular - cylc suites. + Cylc suites. :ref:`Restarting Suites` There are two options for restarting: @@ -362,21 +362,21 @@ See the :ref:`Cheat Sheet` for more information. Rose Applications In Rose Suite Configurations ---------------------------------------------- -In cylc suites, Rose applications are placed in an ``app/`` directory which +In Cylc suites, Rose applications are placed in an ``app/`` directory which is copied across to run directory with the rest of the suite by :ref:`command-rose-suite-run` when the suite configuration is run. -When we run Rose applications in cylc suites we use the +When we run Rose applications in Cylc suites we use the :ref:`command-rose-task-run` command rather than the :ref:`command-rose-app-run` command. When run, :ref:`command-rose-task-run` searches for an application with the same -name as the cylc task in the ``app/`` directory. +name as the Cylc task in the ``app/`` directory. -The :ref:`command-rose-task-run` command also interfaces with cylc to provide +The :ref:`command-rose-task-run` command also interfaces with Cylc to provide a few useful environment variables (see the :ref:`command line reference ` for details). The -application will run in the :term:`work directory` the same as a regular cylc +application will run in the :term:`work directory` the same as a regular Cylc task. In this example the ``hello`` task will run the application located in @@ -411,9 +411,9 @@ app>` in the task defined below. Rose Bush --------- -.. TODO - move this into the cylc tutorial with the upcomming cylc "nameless". +.. TODO - move this into the Cylc tutorial with the upcomming Cylc "nameless". -Rose provides a utility for viewing the status and logs for cylc suites called +Rose provides a utility for viewing the status and logs for Cylc suites called Rose Bush. Rose Bush displays suite information in web-pages. .. figure:: img/rose-bush.png @@ -448,7 +448,7 @@ Otherwise an add-hoc web-server can be set up using the We have configured the ``forecast`` application to use test data. We will now adjust this configuration to make it work with real data generated by - the cylc suite. It is useful to keep the ability to run the application + the Cylc suite. It is useful to keep the ability to run the application using test data so we won't delete this configuration but, instead we will move it into an :ref:`Optional Configuration`. This way we can run the application in "test mode" or "live mode". @@ -523,7 +523,7 @@ Otherwise an add-hoc web-server can be set up using the task of the ``suite.rc`` file into the :rose:file:`rose-app.conf` file of the ``forecast`` application. - TODO - remove triple quotes in cylc tutorial + TODO - remove triple quotes in Cylc tutorial Remember, in Rose configuration files: diff --git a/sphinx/tutorial/rose/summary.rst b/sphinx/tutorial/rose/summary.rst index 962f678dd1..2bff86807a 100644 --- a/sphinx/tutorial/rose/summary.rst +++ b/sphinx/tutorial/rose/summary.rst @@ -62,14 +62,14 @@ directory and are configured using a :rose:file:`rose-app.conf` file. Suite Commands -------------- -.. rubric:: We have learned the following cylc commands: +.. rubric:: We have learned the following Cylc commands: ``cylc graph`` Draws the suite's :term:`graph`. ``cylc get-config`` Processes the ``suite.rc`` file and prints it back out. ``cylc validate`` - Validate the cylc ``suite.rc`` file to check for any obvious errors. + Validate the Cylc ``suite.rc`` file to check for any obvious errors. ``cylc run`` Runs a suite. ``cylc stop`` @@ -88,13 +88,13 @@ Suite Commands :ref:`command-rose-app-run` Runs a Rose application. :ref:`command-rose-task-run` - Used to run a Rose application from within a cylc suite. + Used to run a Rose application from within a Cylc suite. :ref:`command-rose-suite-run` Runs a Rose suite. :ref:`command-rose-suite-restart` Runs a Rose suite picking up where it left off. -The cylc commands do not know about the :rose:file:`rose-suite.conf` file +The Cylc commands do not know about the :rose:file:`rose-suite.conf` file so for Rose suite configurations you will have to install the suite before using commands such as ``cylc graph`` e.g: @@ -111,7 +111,7 @@ Rose contains some utilities to make life easier: :ref:`command-rose-date` A utility for parsing, manipulating and formatting date-times which is - useful for working with the cylc :term:`cycle point`: + useful for working with the Cylc :term:`cycle point`: .. code-block:: console @@ -145,7 +145,7 @@ Rose contains some utilities to make life easier: $ rose host-select mycluster computer2 - The :ref:`command-rose-host-select` command can by used within cylc suites + The :ref:`command-rose-host-select` command can by used within Cylc suites to determine which host a task runs on: .. code-block:: cylc @@ -189,13 +189,13 @@ Next Steps covered in the main tutorial. :ref:`Cheat Sheet` A quick breakdown of the commands for running - and interacting with suites using cylc and rose. + and interacting with suites using Cylc and Rose. :ref:`Command Reference` Contains the command line documentation (also obtainable by calling ``rose --help``). :ref:`Rose Configuration ` The possible settings which can be used in the different Rose configuration files. -`cylc suite design guide`_ - Contains recommended best-practice for the style and structure of cylc +`Cylc Suite Design Guide`_ + Contains recommended best-practice for the style and structure of Cylc suites. From 1ca206d2cb2cdec83901388b1969572801fe4b26 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 12:37:46 +0100 Subject: [PATCH 18/34] Add tutorial file tests. --- etc/tutorial/forecast-script/.validate | 0 etc/tutorial/map-template/.validate | 0 etc/tutorial/metadata-tutorial/.validate | 1 + etc/tutorial/rose-suite-tutorial/.validate | 3 +++ etc/tutorial/test-data/.validate | 0 5 files changed, 4 insertions(+) create mode 100644 etc/tutorial/forecast-script/.validate create mode 100644 etc/tutorial/map-template/.validate create mode 100644 etc/tutorial/metadata-tutorial/.validate create mode 100644 etc/tutorial/rose-suite-tutorial/.validate create mode 100644 etc/tutorial/test-data/.validate diff --git a/etc/tutorial/forecast-script/.validate b/etc/tutorial/forecast-script/.validate new file mode 100644 index 0000000000..e69de29bb2 diff --git a/etc/tutorial/map-template/.validate b/etc/tutorial/map-template/.validate new file mode 100644 index 0000000000..e69de29bb2 diff --git a/etc/tutorial/metadata-tutorial/.validate b/etc/tutorial/metadata-tutorial/.validate new file mode 100644 index 0000000000..e65c84f202 --- /dev/null +++ b/etc/tutorial/metadata-tutorial/.validate @@ -0,0 +1 @@ +rose config --file $TUT_DIR/rose-app.conf diff --git a/etc/tutorial/rose-suite-tutorial/.validate b/etc/tutorial/rose-suite-tutorial/.validate new file mode 100644 index 0000000000..db30af0c41 --- /dev/null +++ b/etc/tutorial/rose-suite-tutorial/.validate @@ -0,0 +1,3 @@ +cylc validate "$TUT_DIR" --icp=2000 -v -v +rose metadata-check -C "$TUT_DIR/app/forecast/meta" +rose macro -C "$TUT_DIR/app/forecast" -V diff --git a/etc/tutorial/test-data/.validate b/etc/tutorial/test-data/.validate new file mode 100644 index 0000000000..e69de29bb2 From 83790e8eadc349bc03a66f05ad3f4a4b00c70614 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 12:57:09 +0100 Subject: [PATCH 19/34] Correct tutorial directory names. --- sphinx/tutorial/rose/applications.rst | 11 ++++++----- sphinx/tutorial/rose/metadata.rst | 12 ++++++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index 6c03220772..6c7bee5845 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -108,22 +108,23 @@ can be used to provide the path to the Rose application: #. **Create a Rose application** - Create a new directory called ``forecast``, this is to be our + Create a new directory called ``application-tutorial``, this is to be our :term:`application directory`:: mkdir application-tutorial cd application-tutorial - #. **Move the required resources into the** ``forecast`` **application.** + #. **Move the required resources into the** ``application-tutorial`` + **application.** - The ``forecast`` application requires three resources. + The application requires three resources. * The ``bin/forecast`` script. * The ``lib/python/util.py`` python library. * The ``lib/template/map.html`` html template. Rather than leaving these resources scattered throughout the - :term:`suite directory` we can encapsulate them into the ``forecast`` + :term:`suite directory` we can encapsulate them into the application directory. Copy the ``forecast`` script and ``util.py`` library into the ``bin/`` @@ -173,7 +174,7 @@ can be used to provide the path to the Rose application: * ``MAP_TEMPLATE`` We will now move these into the application. This way all of the - configuration speciffic to the forecast application lives within it. + configuration speciffic to the application live within it. Add the following lines to the :rose:conf:`rose-app.conf[env]` section: diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 355d65bfcd..4ad17f0657 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -97,13 +97,13 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. .. practical:: - .. rubric:: In this practical we will write metadata for the forecast app we - wrote in the :ref:`Rose application practical - `. + .. rubric:: In this practical we will write metadata for the + ``application-tutorial`` app we wrote in the + :ref:`Rose application practical `. - #. **Create the** ``forecast`` **app.** + #. **Create a Rose application called** ``metadata-tutorial``. - Create a new copy of the ``forecast`` app by running:: + Create a new copy of the ``application-tutorial`` application by running:: rose tutorial metadata-tutorial ~/rose-tutorial/metadata-tutorial cd ~/rose-tutorial/metadata-tutorial @@ -111,7 +111,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. #. **View the application in** :ref:`command-rose-config-edit`. The :ref:`command-rose-config-edit` command opens a GUI which displays - Rose configurations. Open the ``forecast`` app:: + Rose configurations. Open the ``metadata-tutorial`` app:: rose config-edit & From 93581cbd1cf1c308d528abbf317d8801f9540b4e Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 15:04:31 +0100 Subject: [PATCH 20/34] Set graphviz defaults. --- sphinx/conf.py | 4 ++++ sphinx/ext/minicylc.py | 3 ++- sphinx/glossary.rst | 5 ----- .../tutorial/cylc/furthertopics/inheritance.rst | 9 --------- .../cylc/furthertopics/suicide-triggers.rst | 17 ----------------- sphinx/tutorial/cylc/introduction.rst | 1 - sphinx/tutorial/cylc/runtime/introduction.rst | 2 -- .../cylc/scheduling/datetime-cycling.rst | 5 ----- sphinx/tutorial/cylc/scheduling/graphing.rst | 2 -- .../cylc/scheduling/integer-cycling.rst | 6 ------ .../tutorial/rose/furthertopics/rose-stem.rst | 2 -- sphinx/tutorial/rose/rosie.rst | 1 - sphinx/tutorial/rose/suites.rst | 5 ++--- sphinx/tutorial/rose/summary.rst | 4 +--- 14 files changed, 9 insertions(+), 57 deletions(-) diff --git a/sphinx/conf.py b/sphinx/conf.py index 1c9a972124..211cec132c 100644 --- a/sphinx/conf.py +++ b/sphinx/conf.py @@ -52,6 +52,10 @@ # Use SVG for all graphviz (and by extension minicylc) blocks (alt png). graphviz_output_format = 'svg' +# Global configuration for graphviz diagrams. +graphviz_dot_args = ['-Gfontname=sans', '-Gbgcolor=none', + '-Nfontname=sans'] + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/sphinx/ext/minicylc.py b/sphinx/ext/minicylc.py index c0aa18a38c..a7c9699d05 100644 --- a/sphinx/ext/minicylc.py +++ b/sphinx/ext/minicylc.py @@ -220,7 +220,8 @@ def run(self): clean_graphing = self.content # Generate dotcode for graphviz. - dotcode = ['bgcolor=none'] + # dotcode = ['bgcolor=none'] now set in conf.py:graphviz_dot_args + dotcode = [] if 'size' in self.options: dotcode.append('size="%s"' % self.options['size']) for left, right, conditional in self.get_triggers(self.content): diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index b49823a88f..e0c98bacf1 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -50,7 +50,6 @@ Glossary .. digraph:: example :align: center - bgcolor=none size = "7,15" subgraph cluster_1 { @@ -130,7 +129,6 @@ Glossary .. digraph:: example :align: center - bgcolor=none size = "3,5" subgraph cluster_1 { @@ -306,7 +304,6 @@ Glossary .. digraph:: example :align: center - bgcolor=none size = "3,5" subgraph cluster_1 { @@ -649,8 +646,6 @@ Glossary .. digraph:: Example :align: center - bgcolor = none - foo [style="filled" color="#ada5a5"] bar [style="filled" color="#ff0000" fontcolor="white"] baz [color="#88c6ff"] diff --git a/sphinx/tutorial/cylc/furthertopics/inheritance.rst b/sphinx/tutorial/cylc/furthertopics/inheritance.rst index c7506048c2..c1bf03af3c 100644 --- a/sphinx/tutorial/cylc/furthertopics/inheritance.rst +++ b/sphinx/tutorial/cylc/furthertopics/inheritance.rst @@ -88,8 +88,6 @@ Running this command will generate the following output: .. digraph:: Example :align: center - bgcolor=none - AIRPLANE [color=royalblue, fillcolor=powderblue, shape=box, @@ -188,8 +186,6 @@ The inheritance hierarchy should now look like this: .. digraph:: Example :align: center - bgcolor=none - AIRPLANE [color=royalblue, fillcolor=powderblue, shape=box, @@ -295,7 +291,6 @@ Next we will define four families to represent three different types of engine. :align: center size = "5,5" - bgcolor=none ENGINE [color=royalblue, fillcolor=powderblue, shape=box, style=filled, margin="0.3,0.055"] @@ -381,8 +376,6 @@ following manner: .. digraph:: Example :align: center - bgcolor=none - VEHICLE [color=royalblue, fillcolor=powderblue, shape=box, style=filled] LAND_VEHICLE [color=royalblue, fillcolor=powderblue, shape=box, style=filled] @@ -461,7 +454,6 @@ of as flying vehicles. :align: center size = "7,5" - bgcolor=none VEHICLE [color=royalblue, fillcolor=powderblue, shape=box, style=filled] AIR_VEHICLE [color=royalblue, fillcolor=powderblue, shape=box, style=filled] @@ -514,7 +506,6 @@ this: .. digraph:: Example size = "7, 5" - bgcolor = none root [color=royalblue, fillcolor=powderblue, diff --git a/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst b/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst index 0649e38c01..3acc273fbd 100644 --- a/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst +++ b/sphinx/tutorial/cylc/furthertopics/suicide-triggers.rst @@ -30,8 +30,6 @@ it will get burnt. In the case that we burn the cake the workflow gets stuck. .. digraph:: Example :align: center - bgcolor = none - make_cake_mixture [style="filled" color="#ada5a5"] bake_cake [style="filled" color="#ff0000" fontcolor="white"] sell_cake [color="#88c6ff"] @@ -59,8 +57,6 @@ otherwise. .. digraph:: Example :align: center - bgcolor = none - make_cake_mixture bake_cake @@ -145,7 +141,6 @@ you see might differ slightly. You may receive a "suite stalled" email. .. digraph:: Example :align: center - bgcolor = none size = "7,5" subgraph cluster_1 { @@ -294,8 +289,6 @@ something like this: .. digraph:: Example :align: center - bgcolor = none - make_cake_mixture -> bake_cake bake_cake -> sell_cake [style="dashed" arrowhead="dot"] bake_cake -> eat_cake [style="dashed" arrowhead="dot"] @@ -326,8 +319,6 @@ of the ``sell_cake`` or ``eat_cake`` tasks is run. .. digraph:: Example :align: center - bgcolor = none - subgraph cluster_1 { style="dashed" label="1" @@ -405,8 +396,6 @@ A common use case where a ``recover`` task is used to handle a task failure. .. digraph:: Example :align: center - bgcolor = "none" - subgraph cluster_1 { label = ":fail" color = "red" @@ -455,8 +444,6 @@ cases. .. digraph:: Example :align: center - bgcolor = "none" - foo -> bar bar -> tar -> par bar -> jar -> par @@ -535,8 +522,6 @@ the task ``showdown`` produces one of three possible custom outputs, ``good``, .. digraph:: Example :align: center - bgcolor = "none" - subgraph cluster_1 { label = ":good" color = "green" @@ -612,8 +597,6 @@ task to suicide trigger. .. digraph:: Example :align: center - bgcolor = "none" - subgraph cluster_1 { label = "Faulty\nTask" color = "orange" diff --git a/sphinx/tutorial/cylc/introduction.rst b/sphinx/tutorial/cylc/introduction.rst index 18af61b3c5..fe1cd0c502 100644 --- a/sphinx/tutorial/cylc/introduction.rst +++ b/sphinx/tutorial/cylc/introduction.rst @@ -24,7 +24,6 @@ arrows. .. digraph:: bakery :align: center - bgcolor=none "purchase ingredients" -> "make dough" -> "bake bread" -> "sell bread" "bake bread" -> "clean oven" "pre-heat oven" -> "bake bread" diff --git a/sphinx/tutorial/cylc/runtime/introduction.rst b/sphinx/tutorial/cylc/runtime/introduction.rst index cdabcff9a4..fbcae13a8b 100644 --- a/sphinx/tutorial/cylc/runtime/introduction.rst +++ b/sphinx/tutorial/cylc/runtime/introduction.rst @@ -165,8 +165,6 @@ represent their state, as in the following diagram. .. digraph:: example :align: center - bgcolor=none - Waiting [color="#88c6ff"] Running [style="filled" color="#00c410"] Succeeded [style="filled" color="#ada5a5"] diff --git a/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst b/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst index ded7c4a97a..43cf3b717e 100644 --- a/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst +++ b/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst @@ -265,7 +265,6 @@ The ``consolidate_observations`` task must run after the :align: center size = "5,4" - bgcolor=none get_observations_belmullet -> consolidate_observations get_observations_camborne -> consolidate_observations @@ -294,7 +293,6 @@ The ``forecast`` task will be dependent on: :align: center size = "5,4" - bgcolor=none subgraph cluster_T00 { label="+PT0H" @@ -335,7 +333,6 @@ after the initial cycle point** and will be dependent on the ``forecast`` task. :align: center size = "1.5,1" - bgcolor=none "forecast" -> "post_process_exeter" @@ -460,7 +457,6 @@ after the initial cycle point** and will be dependent on the ``forecast`` task. :align: center size = "4,1.5" - bgcolor=none rankdir=LR subgraph cluster_T06 { @@ -494,7 +490,6 @@ after the initial cycle point** and will be dependent on the ``forecast`` task. :align: center size = "4,1" - bgcolor=none rankdir=LR "forecast.t00" [label="forecast\n20000101T0000Z" diff --git a/sphinx/tutorial/cylc/scheduling/graphing.rst b/sphinx/tutorial/cylc/scheduling/graphing.rst index 330109a2d6..e4b254c4d5 100644 --- a/sphinx/tutorial/cylc/scheduling/graphing.rst +++ b/sphinx/tutorial/cylc/scheduling/graphing.rst @@ -238,8 +238,6 @@ seen so far. The number ``1`` which appears below each task is the .. digraph:: graph_tutorial :align: center - bgcolor=none - foo -> bar -> baz -> qux pub -> bar -> wop diff --git a/sphinx/tutorial/cylc/scheduling/integer-cycling.rst b/sphinx/tutorial/cylc/scheduling/integer-cycling.rst index 467b2b8fe3..3353e57296 100644 --- a/sphinx/tutorial/cylc/scheduling/integer-cycling.rst +++ b/sphinx/tutorial/cylc/scheduling/integer-cycling.rst @@ -56,7 +56,6 @@ workflow repeated at each cycle point: .. digraph:: example :align: center - bgcolor=none size = "7,15" subgraph cluster_1 { @@ -145,7 +144,6 @@ The resulting suite would look like this: .. digraph:: example :align: center - bgcolor=none size = "7,15" subgraph cluster_1 { @@ -237,7 +235,6 @@ This dependency means that the ``purchase_ingredients`` task will run after the .. digraph:: example :align: center - bgcolor=none size = "4.5,15" subgraph cluster_1 { @@ -324,8 +321,6 @@ recurrences: .. digraph:: example :align: center - bgcolor=none - subgraph cluster_1 { label = 1 style = dashed @@ -476,7 +471,6 @@ starting 5 cycles *after* the initial cycle point. .. digraph:: example :align: center - bgcolor=none size = "4.5,7" subgraph cluster_1 { diff --git a/sphinx/tutorial/rose/furthertopics/rose-stem.rst b/sphinx/tutorial/rose/furthertopics/rose-stem.rst index a377d6e12d..9d06861053 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-stem.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-stem.rst @@ -143,8 +143,6 @@ case, the group ``command_spaceship`` gives you the graph: .. digraph:: Example :align: center - bgcolor = "none" - fcm_make_spaceship -> spaceship -> rose_ana_position This variable ``name_graphs`` is used later to generate the graph when diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index e1c2d7e159..9210f5fef0 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -55,7 +55,6 @@ hyphen and then an identifier made up of two characters and three numbers e.g: .. graph:: Example :align: center - bgcolor = "none" ranksep=0 node [shape="plaintext", fontsize="11"] diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 27f9a8e76d..55f60975cb 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -113,11 +113,10 @@ When a suite configuration is run: .. digraph:: Example :align: center - graph [rankdir="LR", fontname="sanz"] - node [fontname="sanz", shape="none"] + graph [rankdir="LR"] + node [shape="none"] edge [color="blue"] - bgcolor="none" size="7,5" ranksep=0.75 diff --git a/sphinx/tutorial/rose/summary.rst b/sphinx/tutorial/rose/summary.rst index 2bff86807a..dda093ba4d 100644 --- a/sphinx/tutorial/rose/summary.rst +++ b/sphinx/tutorial/rose/summary.rst @@ -19,17 +19,15 @@ The relationship between them is as follows: :align: center ranksep = 0 - bgcolor = none size = "7, 5" - node [shape="plaintext", fontcolor="#606060", fontname="sans"] + node [shape="plaintext", fontcolor="#606060"] edge [style="invis"] subgraph cluster_1 { label = "Cylc Suite" fontsize="20" fontcolor="#5050aa" - fontname="sans" labelloc="r" "suite.rc" [fontsize="18", fontname="mono", fontcolor"black"] "rcinfo" [label="Defines the workflow\nin terms of tasks\nand dependencies"] From 7b7255f8a93bb51b14cf181174c3a180e73f23ea Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 15:40:00 +0100 Subject: [PATCH 21/34] Default to rose highlighting in rose auto directive. --- sphinx/ext/rose_domain.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sphinx/ext/rose_domain.py b/sphinx/ext/rose_domain.py index fcfbfed8a5..e3ea5c5aba 100644 --- a/sphinx/ext/rose_domain.py +++ b/sphinx/ext/rose_domain.py @@ -830,8 +830,10 @@ def run(self): LOGGER.error( 'Syntax error in Rose configuration file "%s".' % filename) - # Append file level comments if present. nodes = [] + nodes.append(addnodes.highlightlang(lang='rose', linenothreshold=20)) + + # Append file level comments if present. if conf.comments: contentnode = addnodes.desc_content() contentnode.document = self.state.document @@ -878,6 +880,9 @@ def run(self): if section: node.append(section.run()[1]) nodes.append(node) + + nodes.append(addnodes.highlightlang(lang='bash', linenothreshold=20)) + return nodes From 6200429da8f1f7cc5a838d933c60454d733d7fc1 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 13 Apr 2018 16:45:26 +0100 Subject: [PATCH 22/34] Add final rose forecasting suite, address TODOs. --- .../rose-weather-forecasting-suite/.validate | 4 + .../app/forecast/bin | 1 + .../app/forecast/file | 1 + .../app/forecast/meta | 1 + .../app/forecast/opt/rose-app-test.conf | 0 .../app/forecast/rose-app.conf | 14 ++++ .../rose-weather-forecasting-suite/bin | 1 + .../rose-weather-forecasting-suite/lib/python | 1 + .../meta/rose-meta.conf | 9 +++ .../rose-suite.conf | 6 ++ .../rose-weather-forecasting-suite/suite.rc | 78 +++++++++++++++++++ sphinx/tutorial/rose/rosie.rst | 3 +- sphinx/tutorial/rose/suites.rst | 5 +- 13 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 etc/tutorial/rose-weather-forecasting-suite/.validate create mode 120000 etc/tutorial/rose-weather-forecasting-suite/app/forecast/bin create mode 120000 etc/tutorial/rose-weather-forecasting-suite/app/forecast/file create mode 120000 etc/tutorial/rose-weather-forecasting-suite/app/forecast/meta create mode 100644 etc/tutorial/rose-weather-forecasting-suite/app/forecast/opt/rose-app-test.conf create mode 100644 etc/tutorial/rose-weather-forecasting-suite/app/forecast/rose-app.conf create mode 120000 etc/tutorial/rose-weather-forecasting-suite/bin create mode 120000 etc/tutorial/rose-weather-forecasting-suite/lib/python create mode 100644 etc/tutorial/rose-weather-forecasting-suite/meta/rose-meta.conf create mode 100644 etc/tutorial/rose-weather-forecasting-suite/rose-suite.conf create mode 100644 etc/tutorial/rose-weather-forecasting-suite/suite.rc diff --git a/etc/tutorial/rose-weather-forecasting-suite/.validate b/etc/tutorial/rose-weather-forecasting-suite/.validate new file mode 100644 index 0000000000..2d64935c71 --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/.validate @@ -0,0 +1,4 @@ +rose metadata-check -C "$TUT_DIR/meta" +rose metadata-check -C "$TUT_DIR/app/forecast/meta" +rose macro -C "$TUT_DIR" -V +# TODO install and validate in temp directory? diff --git a/etc/tutorial/rose-weather-forecasting-suite/app/forecast/bin b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/bin new file mode 120000 index 0000000000..a1101a0b48 --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/bin @@ -0,0 +1 @@ +../../../rose-suite-tutorial/app/forecast/bin \ No newline at end of file diff --git a/etc/tutorial/rose-weather-forecasting-suite/app/forecast/file b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/file new file mode 120000 index 0000000000..3b01397506 --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/file @@ -0,0 +1 @@ +../../../rose-suite-tutorial/app/forecast/file \ No newline at end of file diff --git a/etc/tutorial/rose-weather-forecasting-suite/app/forecast/meta b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/meta new file mode 120000 index 0000000000..99e3447ca0 --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/meta @@ -0,0 +1 @@ +../../../rose-suite-tutorial/app/forecast/meta \ No newline at end of file diff --git a/etc/tutorial/rose-weather-forecasting-suite/app/forecast/opt/rose-app-test.conf b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/opt/rose-app-test.conf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/etc/tutorial/rose-weather-forecasting-suite/app/forecast/rose-app.conf b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/rose-app.conf new file mode 100644 index 0000000000..0c18cd098e --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/app/forecast/rose-app.conf @@ -0,0 +1,14 @@ +[command] +default=forecast $INTERVAL $N_FORECASTS + +[env] +INTERVAL=60 +N_FORECASTS=5 +MAP_TEMPLATE=map-template.html +SPLINE_LEVEL=0 +WIND_FILE_TEMPLATE=$CYLC_SUITE_WORK_DIR/{cycle}/consolidate_observations/wind_{xy}.csv +WIND_CYCLES=0, -3, -6 +RAINFALL_FILE=$CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv +# Create the html map file in the task's log directory. +MAP_FILE=${CYLC_TASK_LOG_ROOT}-map.html +WEIGHTING=0.7, 0.2, 0.1 diff --git a/etc/tutorial/rose-weather-forecasting-suite/bin b/etc/tutorial/rose-weather-forecasting-suite/bin new file mode 120000 index 0000000000..8bf39e22de --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/bin @@ -0,0 +1 @@ +../cylc-forecasting-suite/bin/ \ No newline at end of file diff --git a/etc/tutorial/rose-weather-forecasting-suite/lib/python b/etc/tutorial/rose-weather-forecasting-suite/lib/python new file mode 120000 index 0000000000..6b9d2c638d --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/lib/python @@ -0,0 +1 @@ +../../cylc-forecasting-suite/lib/python/ \ No newline at end of file diff --git a/etc/tutorial/rose-weather-forecasting-suite/meta/rose-meta.conf b/etc/tutorial/rose-weather-forecasting-suite/meta/rose-meta.conf new file mode 100644 index 0000000000..fd4af324ce --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/meta/rose-meta.conf @@ -0,0 +1,9 @@ +[jinja2:suite.rc=station] +length=: + +[env=RESOLUTION] +type=real + +[env=DOMAIN] +length=4 +type=integer diff --git a/etc/tutorial/rose-weather-forecasting-suite/rose-suite.conf b/etc/tutorial/rose-weather-forecasting-suite/rose-suite.conf new file mode 100644 index 0000000000..08cfe9d3d5 --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/rose-suite.conf @@ -0,0 +1,6 @@ +[jinja2:suite.rc] +station="camborne", "heathrow", "shetland", "belmullet" + +[env] +RESOLUTION=0.2 +DOMAIN=-12,48,5,61 diff --git a/etc/tutorial/rose-weather-forecasting-suite/suite.rc b/etc/tutorial/rose-weather-forecasting-suite/suite.rc new file mode 100644 index 0000000000..ebe413210e --- /dev/null +++ b/etc/tutorial/rose-weather-forecasting-suite/suite.rc @@ -0,0 +1,78 @@ +[cylc] + UTC mode = True + [[parameters]] + # A list of the weather stations we will be fetching observations from. + station = {{ station | join(", ") }} + # A list of the sites we will be generating forecasts for. + site = exeter + +[scheduling] + # TODO - set the initial cycle point. + # TODO - set the final cycle point. + [[dependencies]] + [[[PT3H]]] + # Repeat every three hours starting at the initial cycle point. + graph = """ + get_observations => consolidate_observations + """ + + [[[+PT6H/PT6H]]] + # Repeat every six hours starting six hours after the initial + # cycle point. + graph = """ + consolidate_observations => forecast + consolidate_observations[-PT3H] => forecast + consolidate_observations[-PT6H] => forecast + get_rainfall => forecast => post_process + """ + + [[[+PT12H/PT6H]]] + # Repeat every six hours starting twelve hours after the initial + # cycle point. + graph = """ + forecast[-PT6H] => forecast + """ + +[runtime] + [[root]] + # These environment variables will be available to all tasks. + [[[environment]]] + # Add the `python` directory to the PYTHONPATH. + PYTHONPATH="$CYLC_SUITE_RUN_DIR/lib/python:$PYTHONPATH" + + [[get_observations]] + script = get-observations + [[[environment]]] + # The key required to get weather data from the DataPoint service. + # To use archived data comment this line out. + API_KEY = 3b627bb4-f8aa-4ed5-b486-09c606a475ef + + [[get_observations]] + [[[environment]]] + SITE_ID = 3976 + [[get_observations]] + [[[environment]]] + SITE_ID = 3808 + [[get_observations]] + [[[environment]]] + SITE_ID = 3772 + [[get_observations]] + [[[environment]]] + SITE_ID = 3005 + + [[consolidate_observations]] + script = consolidate-observations + + [[get_rainfall]] + script = get-rainfall + [[[environment]]] + # The key required to get weather data from the DataPoint service. + # To use archived data comment this line out. + API_KEY = 3b627bb4-f8aa-4ed5-b486-09c606a475ef + + [[forecast]] + script = rose task-run + + [[post_process]] + # Generate a forecast for the location 60 minutes in the future. + script = post-process $CYLC_TASK_PARAM_site 60 diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index 9210f5fef0..17b5f04ad5 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -173,7 +173,8 @@ commands called :ref:`command-rosie-go`. Add the files from the Weather Forecasting Suite by running:: - TODO + rose tutorial rose-weather-forecasting-suite ~/rose-tutorial/rosie + cd ~/rose-tutorial/rosie We now need to add these files to version control. First check the SVN status by running:: diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 55f60975cb..0cc2d9d4d2 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -522,7 +522,7 @@ Otherwise an add-hoc web-server can be set up using the task of the ``suite.rc`` file into the :rose:file:`rose-app.conf` file of the ``forecast`` application. - TODO - remove triple quotes in Cylc tutorial + .. TODO - remove triple quotes in Cylc tutorial Remember, in Rose configuration files: @@ -531,7 +531,8 @@ Otherwise an add-hoc web-server can be set up using the .. TODO -- what what, point this out earlier! - Your :rose:file:`rose-app.conf` file should now look like this: + The ``[env]`` section of your :rose:file:`rose-app.conf` file should now + look like this: .. code-block:: rose From a01e3b66aecb2fe1718696befb02a9cdc562f965 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Sat, 21 Apr 2018 20:39:50 +0100 Subject: [PATCH 23/34] Address feedback --- sphinx/tutorial/rose/applications.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index 6c7bee5845..36e65c2c21 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -181,9 +181,9 @@ can be used to provide the path to the Rose application: .. code-block:: rose # The weighting to give to the wind file from each WIND_CYCLE - # (should add up to 1). + # (comma separated list, values should add up to 1). WEIGHTING=1 - # List of cycle points to get wind data from. + # Comma separated list of cycle points to get wind data from. WIND_CYCLES=0 # Path to the wind files. {cycle}, {xy} will get filled in by the # forecast script From feb3ec8344faca12fe3310af18c8a635694d43eb Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Mon, 23 Apr 2018 12:48:12 +0100 Subject: [PATCH 24/34] feedback --- sphinx/hyperlinks.rst | 2 +- sphinx/installation.rst | 4 ++-- sphinx/tutorial/rose/furthertopics/polling.rst | 2 +- sphinx/tutorial/rose/rosie.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sphinx/hyperlinks.rst b/sphinx/hyperlinks.rst index 928acd8ed8..b783bd82f1 100644 --- a/sphinx/hyperlinks.rst +++ b/sphinx/hyperlinks.rst @@ -14,11 +14,11 @@ .. _Cylc Suite Design Guide: http://cylc.github.io/cylc/doc/suite-design-guide.pdf .. _FCM: https://metomi.github.io/fcm/doc/ .. _FCM User Guide: http://metomi.github.io/fcm/doc/user_guide/ -.. _Github: https://github.com/metomi/rose .. _INI: https://en.wikipedia.org/wiki/INI_file .. _Jinja2: http://jinja.pocoo.org/ .. _metomi-vms: https://github.com/metomi/metomi-vms .. _PyGTK: http://www.pygtk.org/ .. _Python: https://www.python.org/ .. _Python Regular Expressions: https://docs.python.org/2/library/re.html#regular-expression-syntax +.. _Rose GitHub: https://github.com/metomi/rose .. _SRS: https://code.metoffice.gov.uk/ diff --git a/sphinx/installation.rst b/sphinx/installation.rst index 3ff08fef30..9ae5816d7a 100644 --- a/sphinx/installation.rst +++ b/sphinx/installation.rst @@ -6,8 +6,8 @@ Installation .. _archives: https://github.com/metomi/rose/tags -The source code for Rose is available via `GitHub`_, code releases -are available in ``zip`` and ``tar.gz`` `archives`_. +The source code for Rose is available via `GitHub `_, code +releases are available in ``zip`` and ``tar.gz`` `archives`_. 1. Un-pack the archive file into an appropriate location on your system. 2. Add the ``rose/bin/`` directory into your ``PATH`` environment variable. diff --git a/sphinx/tutorial/rose/furthertopics/polling.rst b/sphinx/tutorial/rose/furthertopics/polling.rst index feef387f72..2c52274ee4 100644 --- a/sphinx/tutorial/rose/furthertopics/polling.rst +++ b/sphinx/tutorial/rose/furthertopics/polling.rst @@ -30,7 +30,7 @@ file that looks like this: graph = """compose_letter => send_letter bob => read_letter""" -This is simple suite which consists of the following: +This is a simple suite which consists of the following: * A ``compose_letter`` task. * A ``send_letter`` task which is run once the letter is composed. diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index 17b5f04ad5..e50e5eec4f 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -298,7 +298,7 @@ commands called :ref:`command-rosie-go`. Switch back to the trunk then merge your change branch into the trunk:: fcm sw trunk - fcm merge change trunk + fcm merge change Check the status (you should see the ``M`` symbol next to the :rose:file:`rose-suite.conf` file) then commit the merge:: From 2b223ca1705db3c983c3d16ef530159a602613bb Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Mon, 23 Apr 2018 12:55:31 +0100 Subject: [PATCH 25/34] remove rogue control character --- sphinx/tutorial/cylc/runtime/configuration-consolidation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst b/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst index 3beafad436..02ce25cf09 100644 --- a/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst +++ b/sphinx/tutorial/cylc/runtime/configuration-consolidation.rst @@ -612,7 +612,7 @@ the parameter (in the present case ``param``): [runtime] [[task]] - # This is equivalent to `echo 'bar'` + # This is equivalent to `echo 'bar'` script = echo $CYLC_TASK_PARAM_param Parameters can be either words or integers: From 18ac5f5f2598d696eed977a76228d3613650cc8e Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 24 Apr 2018 09:48:57 +0100 Subject: [PATCH 26/34] erratum --- sphinx/tutorial/rose/metadata.rst | 10 ++++++---- sphinx/tutorial/rose/rosie.rst | 7 +++---- sphinx/tutorial/rose/suites.rst | 2 +- sphinx/tutorial/rose/summary.rst | 9 ++++++--- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 4ad17f0657..55c01b56b0 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -11,7 +11,7 @@ configurations. It is used for: * Formatting the :ref:`command-rose-config-edit` GUI. Metadata can be used to ensure that configurations are valid before they are -run and to assist those who are edit the configurations. +run and to assist those who edit the configurations. The Metadata Format @@ -24,7 +24,7 @@ outside of the configuration. The :rose:file:`rose-meta.conf` file uses the standard :ref:`Rose configuration format `. -The metadata for a setting is written in a section named ``section=setting`` +The metadata for a setting is written in a section named ``[section=setting]`` where ``setting`` is the name of the setting and ``section`` is the section to which the setting belongs (leave blank if the setting does not belong to a section). @@ -47,7 +47,7 @@ would create a section called ``[env=WORLD]``. :caption: meta/rose-meta.conf [env=WORLD] - title=The name of the world to say hello to. + description=The name of the world to say hello to. values=Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune This example gives the ``WORLD`` variable a title and a list of allowed values. @@ -165,6 +165,8 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. :ref:`command-rose-metadata-check`:: rose metadata-check -C meta/ + + There should not be any errors so this check will silently pass. Next reload the metadata in the :ref:`command-rose-config-edit` window using the :menuselection:`Metadata --> Refresh Metadata` menu item. @@ -191,7 +193,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. The ``WEIGHTING`` and ``WIND_CYCLES`` settings are different as we don't know how many items they will contain. For flexible lists we use a colon, add the following line to the ``[env=WEIGHTING]`` and - ``[env=WIND_CYCLES`` sections: + ``[env=WIND_CYCLES]`` sections: .. code-block:: rose diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index e50e5eec4f..a5f3662bf4 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -173,8 +173,7 @@ commands called :ref:`command-rosie-go`. Add the files from the Weather Forecasting Suite by running:: - rose tutorial rose-weather-forecasting-suite ~/rose-tutorial/rosie - cd ~/rose-tutorial/rosie + rose tutorial rose-weather-forecasting-suite . We now need to add these files to version control. First check the SVN status by running:: @@ -265,7 +264,7 @@ commands called :ref:`command-rosie-go`. the "trunk" (referred to as "master" in git terminology) we will work in a new "branch". - Create a new branch by running:: + Create a new branch called "configuration-change" by running:: fcm bc configuration-change @@ -298,7 +297,7 @@ commands called :ref:`command-rosie-go`. Switch back to the trunk then merge your change branch into the trunk:: fcm sw trunk - fcm merge change + fcm merge configuration-change Check the status (you should see the ``M`` symbol next to the :rose:file:`rose-suite.conf` file) then commit the merge:: diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 0cc2d9d4d2..c9658c7509 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -169,7 +169,7 @@ from other locations using the ``-C`` argument:: The ``--local-install-only`` command line option will cause the suite to be installed (only on your local machine not on any job hosts) and -validated but not run (i.e. :ref:`steps 1, 2 and 3 `). +validated but not run (i.e. :ref:`steps 1-4 `). Start, Stop, Restart diff --git a/sphinx/tutorial/rose/summary.rst b/sphinx/tutorial/rose/summary.rst index dda093ba4d..d40602ab4a 100644 --- a/sphinx/tutorial/rose/summary.rst +++ b/sphinx/tutorial/rose/summary.rst @@ -36,7 +36,7 @@ The relationship between them is as follows: subgraph cluster_2 { label = "Rose Suite Configuration" "rose-suite.conf" [fontsize="18", fontname="mono", fontcolor"black"] - "confinfo" [label="Defines Jinja2 variables for\nthesuite.rc and environment\nvariable for use throughout\nthe suite"] + "confinfo" [label="Defines Jinja2 variables for\nthe suite.rc and environment\nvariable for use throughout\nthe suite"] "rose-suite.conf" -- "confinfo" subgraph cluster_3 { @@ -98,8 +98,11 @@ using commands such as ``cylc graph`` e.g: .. code-block:: sub - rose suite-run -l # install the suite on the local host only - don't run it. - cylc graph # run cylc graph using the installed version of the suite. + # install the suite on the local host only - don't run it. + rose suite-run --local-install-only + + # run cylc graph using the installed version of the suite. + cylc graph Rose Utilities From 400ee9c4274637b0f9f44b153899fda6e6ced646 Mon Sep 17 00:00:00 2001 From: Sadie Bartholomew Date: Fri, 20 Apr 2018 19:58:36 +0100 Subject: [PATCH 27/34] Review feedback minor changes: fix typos, improve clarity etc --- sphinx/cheat-sheet.rst | 28 +-- .../cylc/scheduling/datetime-cycling.rst | 3 +- sphinx/tutorial/cylc/scheduling/graphing.rst | 4 +- sphinx/tutorial/rose/applications.rst | 61 +++--- sphinx/tutorial/rose/configurations.rst | 19 +- .../tutorial/rose/furthertopics/rose-arch.rst | 2 +- sphinx/tutorial/rose/index.rst | 2 +- sphinx/tutorial/rose/metadata.rst | 75 ++++---- sphinx/tutorial/rose/rosie.rst | 94 +++++----- sphinx/tutorial/rose/suites.rst | 176 ++++++++++-------- sphinx/tutorial/rose/summary.rst | 47 +++-- 11 files changed, 269 insertions(+), 242 deletions(-) diff --git a/sphinx/cheat-sheet.rst b/sphinx/cheat-sheet.rst index 8897316080..67e3608e3f 100644 --- a/sphinx/cheat-sheet.rst +++ b/sphinx/cheat-sheet.rst @@ -3,7 +3,7 @@ Cheat Sheet =========== -This page outlines how to perform suite operations for "pure" :term:`cylc +This page outlines how to perform suite operations for "pure" :term:`Cylc suites ` (*the Cylc way*) and those using :term:`Rose suite configurations ` (*the Rose way*). @@ -14,7 +14,7 @@ configurations ` (*the Rose way*). .. _Starting Suites: -Running/Interracting With Suites +Running/Interacting With Suites -------------------------------- Starting Suites @@ -31,15 +31,15 @@ Starting Suites cylc run - :: - # run the suite in the current directory + # run the suite in the current directory: rose suite-run - # run using a custom name - rose suite-run --name - - # run a suite in another directory + # run a suite in another directory: rose suite-run --path + # run using a custom name: + rose suite-run --name + .. _Stopping Suites: Stopping Suites @@ -47,20 +47,20 @@ Stopping Suites :: - # Wait for running / submitted tasks to finish then shutdown the suite: + # Wait for running/submitted tasks to finish then shut down the suite: cylc stop - # Kill all running / submitted tasks then shutdown the suite: + # Kill all running/submitted tasks then shut down the suite: cylc stop --kill - # Shutdown the suite now leaving any running / submitted tasks behind. - # If the suite is restarted Cylc will "re-connect" with these jobs + # Shut down the suite now leaving any running/submitted tasks behind. + # If the suite is restarted Cylc will "re-connect" with these jobs, # continuing where it left off: cylc stop --now --now .. _Restarting Suites: -Restarting Suites (from stopped) +Restarting Suites (From Stopped) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pick up a suite where it left off after a shutdown. Cylc will "re-connect" with @@ -84,11 +84,11 @@ any jobs from the previous run. # directory then restart: rose suite-run --restart -Restarting Suites (from running) +Restarting Suites (From Running) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *This might be needed, for instance, to upgrade a running suite to a -newer version of cylc.* +newer version of Cylc.* Stop a suite leaving all running/submitted jobs unchanged, then restart the suite without making any changes to the :term:`run directory`. Cylc will diff --git a/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst b/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst index 43cf3b717e..d495ea0547 100644 --- a/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst +++ b/sphinx/tutorial/cylc/scheduling/datetime-cycling.rst @@ -132,7 +132,8 @@ to be annual. E.G: * ``01T00``: every month on the first of the month. * ``T00``: every day at midnight. * ``T-00``: every hour at zero minutes past (every hour on the hour). - *Note that the ``-`` character takes the place of the hour digits as we may not omit components after the ``T`` character.* + *Note that the* ``-`` *character takes the place of the hour digits* + *as we may not omit components after the* ``T`` *character.* Recurrence Formats ^^^^^^^^^^^^^^^^^^ diff --git a/sphinx/tutorial/cylc/scheduling/graphing.rst b/sphinx/tutorial/cylc/scheduling/graphing.rst index e4b254c4d5..85ca7152c6 100644 --- a/sphinx/tutorial/cylc/scheduling/graphing.rst +++ b/sphinx/tutorial/cylc/scheduling/graphing.rst @@ -9,8 +9,8 @@ In this section we will cover writing basic workflows in cylc. .. _Cylc file format: -The suite.rc File Format ------------------------- +The ``suite.rc`` File Format +---------------------------- We refer to a Cylc workflow as a :term:`Cylc suite`. A Cylc suite is a directory containing a ``suite.rc`` file. This configuration file is where diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index 6c7bee5845..1c4553202a 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -54,9 +54,9 @@ section e.g: [env] WORLD=Earth -Scripts and executables can be placed in a ``bin/`` directory, they will be +Scripts and executables can be placed in a ``bin/`` directory. They will be automatically added to the ``PATH`` environment variable when the application -is run e.g.: +is run, e.g.: .. code-block:: bash :caption: bin/hello @@ -82,10 +82,10 @@ An application can be run using the :ref:`command-rose-app-run` command: $ rose app-run -q # -q for quiet output Hello Earth! -The application will run in the current directory so it is a good idea to run -the application elsewhere to keep run files separate. If running the Rose -application from outside of the :term:`application directory` the ``-C`` option -can be used to provide the path to the Rose application: +The Rose application will by default run in the current directory so it is a +good idea to run it outside of the :term:`application directory` to keep run +files separate, using the ``-C`` option to provide the path to the +application: .. code-block:: console @@ -117,11 +117,11 @@ can be used to provide the path to the Rose application: #. **Move the required resources into the** ``application-tutorial`` **application.** - The application requires three resources. + The application requires three resources: * The ``bin/forecast`` script. - * The ``lib/python/util.py`` python library. - * The ``lib/template/map.html`` html template. + * The ``lib/python/util.py`` Python library. + * The ``lib/template/map.html`` HTML template. Rather than leaving these resources scattered throughout the :term:`suite directory` we can encapsulate them into the @@ -132,17 +132,18 @@ can be used to provide the path to the Rose application: rose tutorial forecast-script bin - These file will be automatically added to the ``PATH`` when the + These files will be automatically added to the ``PATH`` when the application is run. - Copy the html template into the ``file/`` directory by running:: + Copy the HTML template into the ``file/`` directory by running:: rose tutorial map-template file #. **Create the** :rose:file:`rose-app.conf` **file.** The :rose:file:`rose-app.conf` file needs to define the command to run. - Create a :rose:file:`rose-app.conf` file containing the following: + Create a :rose:file:`rose-app.conf` file directly inside the + :term:`application directory` containing the following: .. code-block:: rose @@ -150,7 +151,8 @@ can be used to provide the path to the Rose application: default=forecast $INTERVAL $N_FORECASTS The ``INTERVAL`` and ``N_FORECASTS`` environment variables need to be - defined, to do this add an :rose:conf:`rose-app.conf[env]` section: + defined. To do this add a :rose:conf:`rose-app.conf[env]` section + to the file: .. code-block:: rose @@ -173,8 +175,8 @@ can be used to provide the path to the Rose application: * ``MAP_FILE`` * ``MAP_TEMPLATE`` - We will now move these into the application. This way all of the - configuration speciffic to the application live within it. + We will now move these into the application. This way, all of the + configuration specific to the application live within it. Add the following lines to the :rose:conf:`rose-app.conf[env]` section: @@ -186,18 +188,18 @@ can be used to provide the path to the Rose application: # List of cycle points to get wind data from. WIND_CYCLES=0 # Path to the wind files. {cycle}, {xy} will get filled in by the - # forecast script + # forecast script. WIND_FILE_TEMPLATE=test-data/wind_{cycle}_{xy}.csv # Path to the rainfall file. RAINFALL_FILE=test-data/rainfall.csv - # The path to create the html map in. + # The path to create the HTML map in. MAP_FILE=map.html - # The path to the html map template file. + # The path to the HTML map template file. MAP_TEMPLATE=map-template.html To start with we will run this application with test data outside of a suite so the ``WIND_FILE_TEMPLATE`` and ``RAINFALL_FILE`` environment - variables have been set to point at files in the ``test-data`` directroy + variables have been set to point at files in the ``test-data`` directory which we will create in the next step. To make this application work outside of a suite we will also need to @@ -210,11 +212,11 @@ can be used to provide the path to the Rose application: .. code-block:: rose - # The cycle point for the test data + # The cycle point for the test data. CYLC_TASK_CYCLE_POINT=20171101T0000Z # The dimensions of each grid cell in degrees. RESOLUTION=0.2 - # The area to generate forecasts for (lng1, lat1, lng2, lat2) + # The area to generate forecasts for (lng1, lat1, lng2, lat2). DOMAIN=-12,48,5,61 #. **Copy the test data.** @@ -226,20 +228,17 @@ can be used to provide the path to the Rose application: #. **Run the application.** All of the scripts, libraries, files and environment variables required - to make a forecast are now all provided inside this application directory. + to make a forecast are now provided inside this application directory. - We should now be able to run the application. :ref:`command-rose-app-run` - will run an application in the current directory so it is a good idea to - move somewhere else before calling the command. + We should now be able to run the application. - Create a directory and run the application in it:: + :ref:`command-rose-app-run` will run an application in the current + directory so it is a good idea to move somewhere else before calling + the command. Create a directory and run the application in it:: mkdir run cd run rose app-run -C ../ - The ``-C`` argument to :ref:`command-rose-app-run` provides the path to - the application directory. - - The application should run successuly leaving behind some files. Try - opening the ``map.html`` file. + The application should run successfully, leaving behind some files. Try + opening the ``map.html`` file in a web browser. diff --git a/sphinx/tutorial/rose/configurations.rst b/sphinx/tutorial/rose/configurations.rst index 106300b4ee..847723b2fb 100644 --- a/sphinx/tutorial/rose/configurations.rst +++ b/sphinx/tutorial/rose/configurations.rst @@ -7,8 +7,8 @@ Rose Configurations =================== :term:`Rose configurations ` are directories containing a -Rose configuration file along with other optional assets which define behaviour -such as: +Rose configuration file along with other optional assets which define +behaviours such as: * Execution. * File installation. @@ -33,19 +33,22 @@ Rose configurations are directories containing a Rose configuration file along with other optional files and directories. All Rose configuration files use the same format which is based on the `INI`_ -file format. +file format. *Like* the file format for :ref:`Cylc suites `: * Comments start with a ``#`` character. * Settings are written as ``key=value`` pairs. * Sections are written inside square brackets i.e. ``[section-name]`` -Unlike the :ref:`Cylc file format`: +However, there are also key differences, and *unlike* the file format for +:ref:`Cylc suites `: * Sections cannot be nested. * Settings should not be indented. * Comments must start on a new line (i.e. you cannot have inline comments). * There should not be spaces around the ``=`` operator in a ``key=value`` pair. +For example: + .. code-block:: rose # Comment. @@ -59,10 +62,10 @@ Unlike the :ref:`Cylc file format`: Throughout this tutorial we will refer to settings in the following format: -* ``file`` - would refer to a Rose configuration file. -* ``file|setting`` - would refer to a setting in a Rose configuration file. -* ``file[section]`` - would refer to a section in a Rose configuration file. -* ``file[section]setting`` - would refer to a setting in a section in a Rose +* ``file`` - will refer to a Rose configuration *file*. +* ``file|setting`` - will refer to a *setting* in a Rose configuration file. +* ``file[section]`` - will refer to a *section* in a Rose configuration file. +* ``file[section]setting`` - will refer to a *setting in a section* in a Rose configuration file. diff --git a/sphinx/tutorial/rose/furthertopics/rose-arch.rst b/sphinx/tutorial/rose/furthertopics/rose-arch.rst index 0b0900bf6c..dffaa843a4 100644 --- a/sphinx/tutorial/rose/furthertopics/rose-arch.rst +++ b/sphinx/tutorial/rose/furthertopics/rose-arch.rst @@ -1,4 +1,4 @@ -rose arch +Rose Arch ========= :rose:app:`rose_arch` is a built-in :term:`Rose app` that provides a generic diff --git a/sphinx/tutorial/rose/index.rst b/sphinx/tutorial/rose/index.rst index 3051722b45..3bf9efde42 100644 --- a/sphinx/tutorial/rose/index.rst +++ b/sphinx/tutorial/rose/index.rst @@ -10,7 +10,7 @@ Rose also contains other optional tools for: * Version control. * Suite discovery and management. * Validating and tranforming Rose configurations. -* Tools for interfacing with cylc. +* Interfacing with Cylc. .. toctree:: diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 4ad17f0657..6e386b1ce3 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -11,7 +11,7 @@ configurations. It is used for: * Formatting the :ref:`command-rose-config-edit` GUI. Metadata can be used to ensure that configurations are valid before they are -run and to assist those who are edit the configurations. +run and to assist those who edit the configurations. The Metadata Format @@ -26,10 +26,10 @@ The :rose:file:`rose-meta.conf` file uses the standard The metadata for a setting is written in a section named ``section=setting`` where ``setting`` is the name of the setting and ``section`` is the section to -which the setting belongs (leave blank if the setting does not belong to +which the setting belongs (left blank if the setting does not belong to a section). -For example take the following application configuration. +For example, take the following application configuration: .. code-block:: rose :caption: rose-app.conf @@ -40,7 +40,7 @@ For example take the following application configuration. [env] WORLD=Earth -If we were to write metadata for ``WORLD`` environment variable we +If we were to write metadata for the ``WORLD`` environment variable we would create a section called ``[env=WORLD]``. .. code-block:: rose @@ -66,7 +66,7 @@ The configuration can be tested against the metadata using the rose macro -V -For example if we were to change the value of ``WORLD`` to ``Pluto`` then +For example, if we were to change the value of ``WORLD`` to ``Pluto`` ``rose macro -V`` would return the following error message: .. code-block:: none @@ -77,22 +77,22 @@ For example if we were to change the value of ``WORLD`` to ``Pluto`` then Metadata Items -------------- -There are many metadata items, here are some of the commonly used ones: +There are many metadata items, some of the most commonly-used ones being: ``title`` - Assign a title to the setting. + Assign a title to a setting. ``description`` Attach a short description to a setting. ``type`` Specify the data type a setting expects, e.g. ``type=integer``. ``length`` - Specify the length of comma separated lists e.g. ``length=:`` for a + Specify the length of comma-separated lists, e.g. ``length=:`` for a limitless list. ``range`` - Specify numerical bounds for the value of a setting e.g. ``range=1, 10`` + Specify numerical bounds for the value of a setting, e.g. ``range=1, 10`` for a value between 1 and 10. -For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. +For a full list of metadata items, see :rose:conf:`rose-meta.conf[SETTING]`. .. practical:: @@ -117,21 +117,22 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. .. tip:: - Note :ref:`command-rose-config-edit` searches for Rose configuration in - the current directory, use the ``-C`` option to specify a directory. + Note :ref:`command-rose-config-edit` searches for any Rose + configuration in the current directory. Use the ``-C`` option + to specify another directory. In the panel on the left you will see the different sections of the :rose:file:`rose-app.conf` file. - Click on :guilabel:`env`, here you will find all of the environment - variables. Each setting will have a hash symbol ``#`` next to its name, - these are the comments defined in the :rose:file:`rose-app.conf` file. + Click on :guilabel:`env`, where you will find all of the environment + variables. Each setting will have a hash symbol (``#``) next to its name. + These are the comments defined in the :rose:file:`rose-app.conf` file. Hover the mouse over the hash to reveal the comment. Keep the :ref:`command-rose-config-edit` window open as we will use it throughout the rest of this practical. - #. **Descriptions.** + #. **Add descriptions.** Now we will start writing some metadata. @@ -143,9 +144,8 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. In the :rose:file:`rose-app.conf` file there are comments associated with each setting. Take these comments out of the :rose:file:`rose-app.conf` - file and add them as descriptions in the metadata. - - E.g. for the ``INTERVAL`` environment variable we could create a metadata + file and add them as descriptions in the metadata. As an example, + for the ``INTERVAL`` environment variable you would create a metadata entry that looks like this: .. code-block:: rose @@ -173,15 +173,15 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. .. tip:: If you don't see the description for a setting it is possible that you - miss-spelt the name of the setting in the section heading. + misspelt the name of the setting in the section heading. - #. **Length.** + #. **Indicate list settings and their length.** - The ``DOMAIN`` and ``WEIGHTING`` settings both accept comma separated + The ``DOMAIN`` and ``WEIGHTING`` settings both accept comma-separated lists of values. We can represent this in Rose metadata using the :rose:conf:`rose-meta.conf[SETTING]length` setting. - To represent the ``DOMAIN`` setting as a list of four elements add the + To represent the ``DOMAIN`` setting as a list of four elements, add the following to the ``[env=DOMAIN]`` section: .. code-block:: rose @@ -190,7 +190,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. The ``WEIGHTING`` and ``WIND_CYCLES`` settings are different as we don't know how many items they will contain. For flexible lists we use a colon, - add the following line to the ``[env=WEIGHTING]`` and + so add the following line to the ``[env=WEIGHTING]`` and ``[env=WIND_CYCLES`` sections: .. code-block:: rose @@ -201,11 +201,11 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. rose metadata-check -C meta/ - Refresh the metadata in the :ref:`command-rose-config-edit` window be + Refresh the metadata in the :ref:`command-rose-config-edit` window by selecting :menuselection:`Metadata --> Refresh Metadata`. The three settings we have edited should now appear as lists. - #. **Types.** + #. **Impose types.** Next we will add type information to the metadata. @@ -220,8 +220,8 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. window. The ``INTERVAL`` setting should now appear as an integer rather than a text field. - In the :ref:`command-rose-config-edit` window try changing the value of - ``INTERVAL`` to a string, it shouldn't let you. + In the :ref:`command-rose-config-edit` window, try changing the value of + ``INTERVAL`` to a string. It shouldn't let you do so. Add similar ``type`` entries for the following settings: @@ -238,13 +238,13 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. Validate the metadata to check for errors. In the :ref:`command-rose-config-edit` window try changing the value of - ``RESOLUTION`` to a string, it should be marked as an error. + ``RESOLUTION`` to a string. It should be marked as an error. - #. **Values.** + #. **Define sets of allowed values.** We will now add a new input to our application called ``SPLINE_LEVEL``. This is a science setting used to determine the interpolation method - used on the rainfall data. It accepts the following values + used on the rainfall data. It accepts the following values: * ``0`` - for nearest member interpolation. * ``1`` - for linear interpolation. @@ -269,13 +269,14 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. As we have made a change to the configuration (by editing the :rose:file:`rose-app.conf` file) we will need to close and reload the :ref:`command-rose-config-edit` GUI. - The setting should appear as a radio-button with the options ``0`` and + The setting should appear as a button with only the options ``0`` and ``1``. - Unfortunately ``0`` and ``1`` are not particularly descriptive, it might - not be obvious that they mean "nearest" and "linear" respectively. The - :rose:conf:`rose-meta.conf[SETTING]value-titles` metadata item can be - used to add titles to such settings to make the values clearer. + Unfortunately ``0`` and ``1`` are not particularly descriptive, so + it might not be obvious that they mean "nearest" and "linear" + respectively. The :rose:conf:`rose-meta.conf[SETTING]value-titles` + metadata item can be used to add titles to such settings to make the + values clearer. Add the following lines to the ``[env=SPLINE_LEVEL]`` section in the :rose:file:`rose-meta.conf` file: @@ -294,7 +295,7 @@ For a full list of metadata items see :rose:conf:`rose-meta.conf[SETTING]`. The :rose:conf:`rose-meta.conf[SETTING]value-hints` metadata option can be used to provide a longer description of each option. - #. **rose macro.** + #. **Validate with** ``rose macro``. On the command line :ref:`command-rose-macro` can be used to check that the configuration is compliant with the metadata. diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index 17b5f04ad5..225a457370 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -49,8 +49,9 @@ additional functionality. See the `FCM User Guide`_ for more information. Suite Naming ------------ -Each Rosie suite is assigned a unique name made up of a prefix followed by a -hyphen and then an identifier made up of two characters and three numbers e.g: +Each Rosie suite is assigned a unique name made up of a *prefix* followed by a +hyphen and then an *identifier* made up of two characters and three +numbers, e.g: .. graph:: Example :align: center @@ -75,8 +76,8 @@ The prefix denotes the repository in which the suite is located. Prefixes are site specific and are configured by the :rose:conf:`rose.conf[rosie-id]prefix-location.PREFIX` setting. -Within the Rose user community the "u" prefix is typically configured to point -at the `SRS`_ repository. +Within the Rose user community the ``u`` prefix is typically configured to +point at the `SRS`_ repository. The :rose:file:`rose-suite.info` File @@ -84,14 +85,16 @@ The :rose:file:`rose-suite.info` File All Rosie suites require a :rose:file:`rose-suite.info` file. This file provides information about the suite for use in the suite management and version control systems. The :rose:file:`rose-suite.info` file uses the -`Rose Configuration Format `_, the main settings -are: +:ref:`Rose Configuration Format `. +The main settings are: ``title`` A short title for the suite. ``owner`` - The user who has control over the suite (i.e. your username). + The user who has control over the suite (i.e. their username). ``project`` + .. TODO - add in description. + ??? ``access-list`` An optional list of users who have permission to commit to the trunk of the @@ -101,18 +104,18 @@ are: Managing Suites --------------- -Rosie provides commands for managing suites including: +Rosie provides commands for managing suites, including: :ref:`command-rosie-checkout` Creates a local copy of a suite. :ref:`command-rosie-ls` Lists all locally checked-out suites. :ref:`command-rosie-lookup` - Search the suite database (using information from suite's + Searches the suite database (using information from suite's :rose:file:`rose-suite.info` files). -Rosie also provides a GUI which incorporates the functionality of the above -commands called :ref:`command-rosie-go`. +Rosie also provides a GUI called :ref:`command-rosie-go` which incorporates +the functionality of the above commands. .. figure:: img/rosie-go-annotated.png :align: center @@ -126,9 +129,10 @@ commands called :ref:`command-rosie-go`. .. practical:: - .. rubric:: In this practical we will add the Weather Forecasting Suite from - the previous practical to a rosie repository make some changes and commit - them to the repository. + .. rubric:: In this practical we will add the + :ref:`weather-forecasting suite ` + from the :ref:`previous practical ` to a rosie + repository, make some changes, and commit them to the repository. .. note:: :class: tip @@ -143,7 +147,7 @@ commands called :ref:`command-rosie-go`. You will probably want to use a "testing" repository if one is available to you. - You can specify the repository to use with the ``--prefix`` command line + You can specify the repository to use with the ``--prefix`` command-line option. For instance to use the (internal) Met Office Testing Repository supply the command line argument ``--prefix=mot``. @@ -161,8 +165,8 @@ commands called :ref:`command-rosie-go`. If the text editor does not appear you may have to press enter on the keyboard. - Rosie will create the new suite in the ``~/roses`` directory, the exact - location will appear in the command output. Move into the suite + Rosie will create the new suite in the ``~/roses`` directory and the + exact location will appear in the command output. Move into the suite directory: .. code-block:: sub @@ -181,68 +185,70 @@ commands called :ref:`command-rosie-go`. fcm st - You should see a list of files with the ``?`` symbols next to them - meaning that they are un-tracked (not version controlled). Add all - un-tracked files to version control by running:: + You should see a list of files with the ``?`` symbol next to them, + as well as ``rose-suite.conf`` with an ``M`` symbol beside it. ``?`` + means the files marked are untracked (not version controlled), whereas + ``M`` indicates files which have been modified. Add all untracked files + to version control by running:: fcm add --check . - Answer yes where prompted. Now check the status again:: + Answer yes ("y") where prompted. Now check the status again:: fcm st - You should see a list of files with the ``A`` character next to them - meaning "added". Finally commit the changes by running:: + You should see a list of files with the ``A`` character, meaning "added", + next to them. Finally commit the changes by running:: fcm ci - A text editor will open, add a message for your commit, save the file and - close the editor. You will the be prompted whether you want to make the - commit, answer yes. + A text editor will open. Add a message for your commit, save the file and + close the editor. You will then be prompted as to whether you want to + make the commit. Answer yes. You have now added the Weather Forecasting Suite to version control. Open the Trac browser to see your suite:: fcm browse - A web browser window will open showing the Trac page for your Rosie + A web browser window will open, showing the Trac page for your Rosie suite. .. TODO - Note remove ?rev=xxxx to see latest revision? #. **Find The Suite In Rosie Go.** - Open The :ref:`command-rosie-go` GUI:: + Open the :ref:`command-rosie-go` GUI:: rosie go & - Open the advanced search options by clicking the add :guilabel:`+` + Open the advanced search options by clicking the add (:guilabel:`+`) button in the top right-hand corner of the window. Search for suites which you have authored by selecting :guilabel:`author` - and filling in your username into the right-hand box: + and filling in your username in the right-hand box: .. image:: img/rosie-go-author-search.png :align: center :alt: rosie go advanced search for author screenshot Press :guilabel:`Search`. You should see your suite appear with a home - icon next to it meaning that you have a local copy checked out. + icon next to it, meaning that you have a local copy checked out. - Right-click on the suite and click :guilabel:`Info`, you should see the - information defined in the :rose:file:`rose-suite.info` file. + Right-click on the suite and then click :guilabel:`Info`. You should + see the information defined in the :rose:file:`rose-suite.info` file. .. admonition:: Help :class: tip - If your suite does not show up select the menu item + If your suite does not show up, select the menu item :menuselection:`Edit --> Data Source` and ensure the repository you committed to is checked. #. **Checkout The Suite.** Now that the suite is in the Rosie repository a working copy can be - checked out on any machine with access to the repository by doing: + checked out on any machine with access to the repository by executing: .. code-block:: sub @@ -256,19 +262,23 @@ commands called :ref:`command-rosie-go`. rm -rf rosie checkout +.. TODO - introduce practical extension / mention what useful for (or similar). .. practical-extension:: #. **Make Changes In A Branch.** - Next we will make a change to the suite. Rather than making the change in - the "trunk" (referred to as "master" in git terminology) we will work in a - new "branch". + Next we will make a change to the suite. Rather than making this change + in the "trunk" (referred to as "master" in git terminology) we will + work in a new "branch". Create a new branch by running:: fcm bc configuration-change + Provide a brief commit message of your choosing when prompted and enter + yes ("y"). + You can list all branches by running:: fcm bls @@ -277,16 +287,16 @@ commands called :ref:`command-rosie-go`. fcm sw configuration-change - Next, either by using the :ref:`command-rose-config-edit` GUI or a text - editor change the ``RESOLUTION`` setting in the + Next, either using the :ref:`command-rose-config-edit` GUI or a text + editor, change the ``RESOLUTION`` setting in the :rose:file:`rose-suite.conf` file to ``0.1``. Check the status of the project:: fcm st - You should see the :rose:file:`rose-suite.conf` file with a ``M`` next to - it meaning modified. Commit the change by running:: + You should see the :rose:file:`rose-suite.conf` file with a ``M``, + meaning modified, next to it. Commit the change by running:: fcm ci diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 0cc2d9d4d2..26f4070149 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -50,12 +50,12 @@ file. These variables can then be used in the ``suite.rc`` file: :caption: suite.rc [scheduling] - [[dependencies]] - graph = hello_{{WORLD}} + [[dependencies]] + graph = hello_{{WORLD}} [runtime] - [[hello_{{WORLD}}]] - script = echo "$GREETING {{WORLD}}" + [[hello_{{WORLD}}]] + script = echo "$GREETING {{WORLD}}" .. _Suite Directory Vs Run Directory: @@ -64,10 +64,10 @@ Suite Directory Vs Run Directory -------------------------------- :term:`suite directory` - The directory in which the suite is written, the ``suite.rc`` and + The directory in which the suite is written. The ``suite.rc`` and :rose:file:`rose-suite.conf` files live here. :term:`run directory` - The directory in which the suite runs, the ``work``, ``share`` and ``log`` + The directory in which the suite runs. The ``work``, ``share`` and ``log`` directories live here. Throughout the :ref:`Cylc Tutorial` we wrote suites in the ``cylc-run`` @@ -85,9 +85,9 @@ running. Using Cylc it is possible to separate the :term:`suite directory` and :term:`run directory` using the ``cylc register`` command. Note though - that suite resources e.g. scripts in the ``bin/`` directory will remain in - the :term:`suite directory` so cannot safely be edited whilst the suite is - running. + that suite resources, e.g. scripts in the ``bin/`` directory, will remain + in the :term:`suite directory` so cannot safely be edited whilst the suite + is running. Running Rose Suite Configurations @@ -101,14 +101,14 @@ Rose :ref:`Application Configurations ` are run using When a suite configuration is run: -#. The :term:`suite directory` is coppied into the ``cylc-run`` directory where +#. The :term:`suite directory` is copied into the ``cylc-run`` directory where it becomes the :term:`run directory`. #. Any files defined in the :rose:file:`rose-suite.conf` file are installed. #. Jinja2 variables defined in the :rose:file:`rose-suite.conf` file are added to the top of the ``suite.rc`` file. #. The Cylc suite is validated. #. The Cylc suite is run. -#. The Cylc gui is launched. +#. The Cylc GUI is launched. .. digraph:: Example :align: center @@ -168,7 +168,7 @@ from other locations using the ``-C`` argument:: rose suite-run -C /path/to/suite/configuration/ The ``--local-install-only`` command line option will cause the suite -to be installed (only on your local machine not on any job hosts) and +to be installed (though only on your local machine, not on any job hosts) and validated but not run (i.e. :ref:`steps 1, 2 and 3 `). @@ -189,16 +189,16 @@ The name can be overridden using the ``--name`` option i.e: Suites must be run using the :ref:`command-rose-suite-run` command which in turn calls the ``cylc run`` command. :ref:`Stopping Suites` - Suites can be stopped using the ``cylc stop `` as for regular - Cylc suites. + Suites can be stopped using the ``cylc stop `` command, + as for regular Cylc suites. :ref:`Restarting Suites` There are two options for restarting: * To pick up where the suite left off use :ref:`command-rose-suite-restart`. No changes will be made to the run directory. *This is usually the recommended option.* - * To restart picking up changes made in the suite directory use the - ``--restart`` option with :ref:`command-rose-suite-run`. + * To restart in a way that picks up changes made in the suite directory, + use the ``--restart`` option to the :ref:`command-rose-suite-run` command. See the :ref:`Cheat Sheet` for more information. @@ -207,26 +207,28 @@ See the :ref:`Cheat Sheet` for more information. :ref:`command-rose-suite-run` installs suites to the run directory incrementally so if you change a file and restart the suite using ``rose suite-run --restart`` only the changed file will be re-installed. - This process is strictly constructive, any files deleted in the suite + This process is strictly constructive i.e. any files deleted in the suite directory will *not* be removed from the run directory. To force :ref:`command-rose-suite-run` to perform a complete rebuild, use the ``--new`` option. +.. _suites-practical: .. practical:: .. rubric:: In this tutorial we will create a Rose Suite Configuration for - the :ref:`Weather Forecasting Suite`. + the + :ref:`weather-forecasting suite`. #. **Create A New Suite.** - Create a copy of the :ref:`weather forecasting suite + Create a copy of the :ref:`weather-forecasting suite ` by running:: rose tutorial rose-suite-tutorial ~/rose-tutorial/rose-suite-tutorial cd ~/rose-tutorial/rose-suite-tutorial - Set the initial and final cycle points as :ref:`in previous tutorials + Set the initial and final cycle points as in :ref:`previous tutorials `. #. **Create A Rose Suite Configuration.** @@ -268,7 +270,7 @@ See the :ref:`Cheat Sheet` for more information. Create a ``meta/rose-meta.conf`` file and write some metadata for the settings defined in the :rose:file:`rose-suite.conf` file. - * ``station`` is a list of un-limited length. + * ``station`` is a list of unlimited length. * ``RESOLUTION`` is a "real" number. * ``DOMAIN`` is a list of four integers. @@ -308,7 +310,7 @@ See the :ref:`Cheat Sheet` for more information. We can delete the ``RESOLUTION`` and ``DOMAIN`` settings in the ``[runtime][root][environment]`` section which would otherwise override the variables we have just defined in the :rose:file:`rose-suite.conf` - file. + file, like so: .. code-block:: diff @@ -323,7 +325,7 @@ See the :ref:`Cheat Sheet` for more information. - # The area to generate forecasts for (lng1, lat1, lng2, lat2). - DOMAIN = -12,48,5,61 # Do not change! - We can write out the list of stations using the `Jinja2`_ ``join`` + We can write out the list of stations, using the `Jinja2`_ ``join`` filter to write the commas between the list items: .. code-block:: diff @@ -342,27 +344,32 @@ See the :ref:`Cheat Sheet` for more information. Running :ref:`command-rose-suite-run` will cause the suite to be installed, validated and run. - The ``--local-install-only`` command line option will cause the suite - to be installed (only on your local machine not on any job hosts) and - validated but not run. - - Install the suite:: + Use the ``--local-install-only`` command-line option to install the + suite on your local machine and validate it:: rose suite-run --local-install-only - Inspect the installed suite, you will find it in:: + Inspect the installed suite, which you will find in:: ~/cylc-run/rose-suite-tutorial - You shuld find all files contained in the :term:`suite directory` as well - as the :term:`run directory` folders ``log``, ``work`` and ``share``. + .. tip:: + + Remember this is the :term:`run directory`, which is different to + the directory we were working in previously, the + :term:`suite directory` ``~/rose-tutorial/rose-suite-tutorial``, + despite having the same sub-directory name. + + You should find all the files contained in the :term:`suite directory` + as well as the :term:`run directory` folders ``log``, ``work`` and + ``share``. Rose Applications In Rose Suite Configurations ---------------------------------------------- In Cylc suites, Rose applications are placed in an ``app/`` directory which -is copied across to run directory with the rest of the suite by +is copied across to the :term:`run directory` with the rest of the suite by :ref:`command-rose-suite-run` when the suite configuration is run. When we run Rose applications in Cylc suites we use the @@ -374,9 +381,9 @@ name as the Cylc task in the ``app/`` directory. The :ref:`command-rose-task-run` command also interfaces with Cylc to provide a few useful environment variables (see the -:ref:`command line reference ` for details). The -application will run in the :term:`work directory` the same as a regular Cylc -task. +:ref:`command-line reference ` for details). The +application will run in the :term:`work directory`, just like for a +regular Cylc task. In this example the ``hello`` task will run the application located in ``app/hello/``: @@ -385,8 +392,8 @@ In this example the ``hello`` task will run the application located in :caption: suite.rc [runtime] - [[hello]] - script = rose task-run + [[hello]] + script = rose task-run .. code-block:: rose :caption: app/hello/rose-app.conf @@ -395,7 +402,7 @@ In this example the ``hello`` task will run the application located in default=echo "Hello World!" The name of the application to run can be overridden using the ``--app-key`` -command line option or the :envvar:`ROSE_TASK_APP` environment variable. For +command-line option or the :envvar:`ROSE_TASK_APP` environment variable. For example the ``greetings`` :term:`task` will run the ``hello`` :term:`app ` in the task defined below. @@ -403,8 +410,8 @@ app>` in the task defined below. :caption: suite.rc [runtime] - [[greetings]] - script = rose task-run --app-key hello + [[greetings]] + script = rose task-run --app-key hello Rose Bush @@ -412,8 +419,8 @@ Rose Bush .. TODO - move this into the Cylc tutorial with the upcomming Cylc "nameless". -Rose provides a utility for viewing the status and logs for Cylc suites called -Rose Bush. Rose Bush displays suite information in web-pages. +Rose provides a utility for viewing the status and logs of Cylc suites called +Rose Bush. Rose Bush displays suite information in web pages. .. figure:: img/rose-bush.png :alt: Rose Bush screenshot @@ -421,41 +428,43 @@ Rose Bush. Rose Bush displays suite information in web-pages. Screenshot of a Rose Bush web page. -If a Bose Bush server is provided at your site you can open the Rose Bush +If a Rose Bush server is provided at your site, you can open the Rose Bush page for a suite by running the :ref:`command-rose-suite-log` command in the suite directory. -Otherwise an add-hoc web-server can be set up using the -:ref:`command-rose-bush` ``start`` command. +Otherwise an add-hoc web server can be set up using the +:ref:`command-rose-bush` ``start`` command argument. .. practical:: .. rubric:: In this practical we will take the ``forecast`` Rose application that we developed in the :ref:`Metadata Tutorial ` - and integrate it into the :ref:`Weather Forecasting Suite + and integrate it into the :ref:`weather-forecasting suite `. - Move into the suite directory from the previous practical:: + #. **Set-up The Forecast Application.** - cd ~/rose-tutorial/rose-suite-tutorial + Move into the suite directory from the previous practical:: - You will find a copy of the ``forecast`` application located in - ``app/forecast``. + cd ~/rose-tutorial/rose-suite-tutorial + + You will find a copy of the ``forecast`` application located in + ``app/forecast``. - #. **Create A "test" Configuration For The** ``forecast`` **Application.** + #. **Create A Test Configuration For The** ``forecast`` **Application.** We have configured the ``forecast`` application to use test data. We will now adjust this configuration to make it work with real data generated by the Cylc suite. It is useful to keep the ability to run the application - using test data so we won't delete this configuration but, instead we - will move it into an :ref:`Optional Configuration`. This way we can run + using test data, so we won't delete this configuration. Instead we + will move it into an :ref:`Optional Configuration` so that we can run the application in "test mode" or "live mode". Optional configurations are covered in more detail in the :ref:`Optional Configurations - Tutorial `, for now all we need to - know is that they enable use to store alternative configurations. + Tutorial `. For now all we need to + know is that they enable us to store alternative configurations. Create an optional configuration called ``test`` inside the ``forecast`` application:: @@ -463,10 +472,15 @@ Otherwise an add-hoc web-server can be set up using the mkdir app/forecast/opt touch app/forecast/opt/rose-app-test.conf - This optional configuration is a regular Rose configuration file, its + This optional configuration is a regular Rose configuration file. Its settings will override those in the :rose:file:`rose-app.conf` file if requested. + .. tip:: + + Take care not to confuse the ``rose-app.conf`` and + ``rose-app-test.conf`` files used within this practical. + Move the following environment variables from the ``app/forecast/rose-app.conf`` file into an ``[env]`` section in the ``app/forecast/opt/rose-app-test.conf`` file: @@ -476,9 +490,6 @@ Otherwise an add-hoc web-server can be set up using the * ``WIND_FILE_TEMPLATE`` * ``RAINFALL_FILE`` * ``MAP_FILE`` - * ``CYLC_TASK_CYCLE_POINT`` - * ``RESOLUTION`` - * ``DOMAIN`` .. spoiler:: Solution warning @@ -494,11 +505,8 @@ Otherwise an add-hoc web-server can be set up using the WIND_FILE_TEMPLATE=test-data/wind_{cycle}_{xy}.csv RAINFALL_FILE=test-data/rainfall.csv MAP_FILE=map.html - CYLC_TASK_CYCLE_POINT=20171101T0000Z - RESOLUTION=0.2 - DOMAIN=-12,48,5,61 - Run the application in "test" mode by providing the option + Run the application in "test mode" by providing the option ``--opt-conf-key=test`` to the :ref:`command-rose-app-run` command:: mkdir app/forecast/run @@ -519,15 +527,17 @@ Otherwise an add-hoc web-server can be set up using the ``suite.rc`` file. Copy the remaining environment variables defined in the ``forecast`` - task of the ``suite.rc`` file into the :rose:file:`rose-app.conf` file - of the ``forecast`` application. + task within the ``suite.rc`` file into the :rose:file:`rose-app.conf` + file of the ``forecast`` application, replacing any values already + specified if necessary. Remove the lines from the ``suite.rc`` file + when you are done. .. TODO - remove triple quotes in Cylc tutorial Remember, in Rose configuration files: - * We don't use spaces around the equals ``=`` operator. - * Environment variables shouldn't be quoted. + * Spaces are not used around the equals (``=``) operator. + * Environment variables should not be quoted. .. TODO -- what what, point this out earlier! @@ -539,22 +549,22 @@ Otherwise an add-hoc web-server can be set up using the [env] INTERVAL=60 N_FORECASTS=5 + WEIGHTING=1 MAP_TEMPLATE=map-template.html SPLINE_LEVEL=0 WIND_FILE_TEMPLATE=$CYLC_SUITE_WORK_DIR/{cycle}/consolidate_observations/wind_{xy}.csv WIND_CYCLES=0, -3, -6 RAINFALL_FILE=$CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv - # Create the html map file in the task's log directory. MAP_FILE=${CYLC_TASK_LOG_ROOT}-map.html - Finally we need to change the ``forecast`` task to run - :ref:`command-rose-task-run`. Change the ``script`` setting, the runtime - section for the ``forecast`` task should now look like this: + Finally we need to change the ``forecast`` task to instead simply run + :ref:`command-rose-task-run`. Change the ``script`` setting in this way. + The runtime section for the ``forecast`` task should now look like this: .. code-block:: cylc [[forecast]] - script = rose task-run + script = rose task-run #. **Make Changes To The Configuration.** @@ -565,17 +575,25 @@ Otherwise an add-hoc web-server can be set up using the Navigate to the :guilabel:`forecast > env` panel. - Add a new variable called ``WEIGHTING`` and set it to the values:: + Edit the ``WEIGHTING`` variable so that it is equal to the following + list of values:: 0.7, 0.2, 0.1 + .. tip:: + + Click the "Add array element" button (:guilabel:`+`) to extend the + number of elements assigned to ``WEIGHTING``. + + Finally, save these settings via :guilabel:`File > Save` in the menu. + #. **Run The Suite.** Install, validate and run the suite:: rose suite-run - The ``cylc gui`` should open, the suite should run and complete. + The ``cylc gui`` should open and the suite should run and complete. #. **View Output In Rose Bush.** @@ -584,10 +602,10 @@ Otherwise an add-hoc web-server can be set up using the rose suite-log - On this page you will see the tasks run by the suite ordered from most to - least recent. Near the top you should see an entry for the ``forecast`` - task. On the right-hand side of the screen click + On this page you will see the tasks run by the suite, ordered from most + to least recent. Near the top you should see an entry for the + ``forecast`` task. On the right-hand side of the screen click :guilabel:`job-map.html`. - As this file has a ``.html`` extension Rose Bush will render it, - otherwise the raw text would be displayed. + As this file has a ``.html`` extension Rose Bush will render it. + The raw text would be displayed otherwise. diff --git a/sphinx/tutorial/rose/summary.rst b/sphinx/tutorial/rose/summary.rst index dda093ba4d..11cac1ff52 100644 --- a/sphinx/tutorial/rose/summary.rst +++ b/sphinx/tutorial/rose/summary.rst @@ -36,7 +36,7 @@ The relationship between them is as follows: subgraph cluster_2 { label = "Rose Suite Configuration" "rose-suite.conf" [fontsize="18", fontname="mono", fontcolor"black"] - "confinfo" [label="Defines Jinja2 variables for\nthesuite.rc and environment\nvariable for use throughout\nthe suite"] + "confinfo" [label="Defines Jinja2 variables for\nthe suite.rc and environment\nvariables for use throughout\nthe suite"] "rose-suite.conf" -- "confinfo" subgraph cluster_3 { @@ -67,34 +67,34 @@ Suite Commands ``cylc get-config`` Processes the ``suite.rc`` file and prints it back out. ``cylc validate`` - Validate the Cylc ``suite.rc`` file to check for any obvious errors. + Validates the Cylc ``suite.rc`` file to check for any obvious errors. ``cylc run`` Runs a suite. ``cylc stop`` - Stops a suite: + Stops a suite, in a way that: ``--kill`` - Killing all running / submitted tasks + Kills all running/submitted tasks. ``--now --now`` - Leaving all running / submitted tasks running. + Leaves all running/submitted tasks running. ``cylc restart`` - Starts a suite picking up where it left off. + Starts a suite, picking up where it left off from the previous run. .. rubric:: We have learned the following Rose commands: :ref:`command-rose-app-run` Runs a Rose application. :ref:`command-rose-task-run` - Used to run a Rose application from within a Cylc suite. + Runs a Rose application from within a Cylc suite. :ref:`command-rose-suite-run` Runs a Rose suite. :ref:`command-rose-suite-restart` - Runs a Rose suite picking up where it left off. + Runs a Rose suite, picking up where it left off from the previous run. The Cylc commands do not know about the :rose:file:`rose-suite.conf` file so for Rose suite configurations you will have to install the suite before -using commands such as ``cylc graph`` e.g: +using commands such as ``cylc graph``, e.g: .. code-block:: sub @@ -123,13 +123,13 @@ Rose contains some utilities to make life easier: for more information. :ref:`command-rose-host-select` - A utility for select a host from a group with the ability to rank choices - based on server load or free memory. + A utility for selecting a host from a group with the ability to rank + choices based on server load or free memory. Groups are configured using the :rose:conf:`rose.conf[rose-host-select]group{NAME}` setting. For example to define a cluster called "mycluster" containing the hosts - "computer1", "computer2" and "computer3". + "computer1", "computer2" and "computer3", you would write: .. code-block:: rose @@ -149,35 +149,30 @@ Rose contains some utilities to make life easier: .. code-block:: cylc [runtime] - [[foo]] - script = echo "Hello $(hostname)!" - [[[remote]]] - host = rose host-select mycluster - - See the :ref:`command line documentation ` for - more information. + [[foo]] + script = echo "Hello $(hostname)!" + [[[remote]]] + host = rose host-select mycluster Rose Built-In Applications -------------------------- -Along with the Rose utilities there are also the Rose built-in applications. +Along with Rose utilities there are also :ref:`Rose built-in applications +`. :rose:app:`fcm_make` A template for running the ``fcm make`` command. :rose:app:`rose_ana` Runs the rose-ana analysis engine. :rose:app:`rose_arch` - Provides a generic solution to configure site specific archiving of suite + Provides a generic solution to configure site-specific archiving of suite files. :rose:app:`rose_bunch` For the running of multiple command variants in parallel under a single job. :rose:app:`rose_prune` A framework for housekeeping a cycling suite. -For more information on these applications and how to use them see the -:ref:`Rose Built-In Applications` section. - Next Steps ---------- @@ -189,11 +184,11 @@ Next Steps A quick breakdown of the commands for running and interacting with suites using Cylc and Rose. :ref:`Command Reference` - Contains the command line documentation + Contains the command-line documentation (also obtainable by calling ``rose --help``). :ref:`Rose Configuration ` The possible settings which can be used in the different Rose configuration files. `Cylc Suite Design Guide`_ - Contains recommended best-practice for the style and structure of Cylc + Contains recommended best practice for the style and structure of Cylc suites. From 307639ceb6953900e486f07b96127dd0cb82ce85 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 24 Apr 2018 12:32:12 +0100 Subject: [PATCH 28/34] feedback 2 --- sphinx/cheat-sheet.rst | 2 + sphinx/glossary.rst | 142 +++++++++++++++++++++++++++++-- sphinx/hyperlinks.rst | 1 + sphinx/tutorial/rose/rosie.rst | 2 + sphinx/tutorial/rose/suites.rst | 2 + sphinx/tutorial/rose/summary.rst | 2 + 6 files changed, 146 insertions(+), 5 deletions(-) diff --git a/sphinx/cheat-sheet.rst b/sphinx/cheat-sheet.rst index 8897316080..872147485f 100644 --- a/sphinx/cheat-sheet.rst +++ b/sphinx/cheat-sheet.rst @@ -109,6 +109,8 @@ suite without making any changes to the :term:`run directory`. Cylc will rose suite-restart +.. _Reloading Suites: + Reloading Suites ^^^^^^^^^^^^^^^^ diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index e0c98bacf1..b781c604ea 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -7,10 +7,17 @@ Glossary .. glossary:: :sorted: + suite Cylc suite A Cylc suite is a directory containing a ``suite.rc`` file which contains :term:`graphing` representing a workflow. + See also: + + * :ref:`Relationship between Cylc suites, Rose suite configurations and + Rosie suites ` + + suite directory The suite directory contains all of the configuration for a suite (e.g. the ``suite.rc`` file and for Rose suites the :rose:file:`rose-suite.conf` @@ -28,11 +35,8 @@ Glossary See also: * :term:`run directory` - - Rose suite - A Rose suite is a :term:`Cylc suite` which also contains a - ``rose-suite.conf`` file and optionally :term:`Rose apps`, - :term:`metadata` and/or other Rose components. + * :ref:`Rose suite installation diagram + ` graph The graph of a :term:`suite` refers to the @@ -418,6 +422,8 @@ Glossary * :term:`run directory` * :term:`share directory` + * :ref:`Rose suite installation diagram + ` share directory The share directory resides within a suite's :term:`run directory`. It @@ -540,6 +546,111 @@ Glossary * :term:`batch system` + + + suite server program + When we say that a :term:`suite` is "running" we mean that the cylc + suite server program is running. + + The suite server program is responsible for running the suite, it submits + :term:`jobs `, monitors their status and maintains the suite state. + + .. _daemon: https://en.wikipedia.org/wiki/Daemon_(computing) + + By default a suite server program is a `daemon`_ meaning that is runs in + the background (potentially on another host). + + start + startup + When a :term:`suite` starts the cylc :term:`suite server program` is + run. This program controls the suite and is what we refer to as + "running". + + * A :term:`Cylc suite` is started using ``cylc run``. + * A :term:`Rose suite configuration` (or :term:`Rosie Suite`) is started + using :ref:`command-rose-suite-run`. + + A suite start can be either :term:`cold ` or :term:`warm ` (cold by default). + + See also: + + * :ref:`Starting Suites` + * :term:`suite server program` + * :term:`warm start` + * :term:`cold start` + * :term:`shutdown` + * :term:`restart` + * :term:`reload` + + cold start + A cold start is one in which the :term:`suite` :term:`starts ` + from the :term:`initial cycle point`. This is the default behaviour of + ``cylc run``. + + See also: + + * :term:`warm start` + + warm start + In a :term:`datetime cycling` suite + a warm start is one in which the :term:`suite` :term:`starts ` + from a :term:`cycle point` after the :term`initial cycle point`. + Tasks in cycles before this point as assumed to have succeeded. + + See also: + + * :term:`cold start` + + stop + shutdown + When a :term:`suite` is shutdown the :term:`suite server program` is + stopped. This means that no further :term:`jobs ` will be submitted. + + By default cylc waits for any submitted or running :term:`jobs ` to + complete (either succeed or fail) before shutting down. + + See also: + + * :ref:`Stopping Suites` + * :term:`start` + * :term:`restart` + * :term:`reload` + + restart + When a :term:`stopped ` :term:`suite` is "restarted" Cylc will pick + up where it left off. Cylc will detect any :term:`jobs ` which + have changed state (e.g. succeed) during the period in which the + :term:`suite` was :term:`shutdown`. + + See also: + + * :ref:`Restarting Suites` + * :term:`start` + * :term:`Stop` + * :term:`Reload` + + reload + Any changes made to the ``suite.rc`` file whilst the suite is running + will not have any effect untill the suite is: + + * :term:`Shutdown` and :term:`rerun ` + * :term:`Shutdown` and :term:`restarted ` + * "Reloaded" + + Reloading does not require the suite to be :term:`shutdown`. When a suite + is reloaded any currently "active" :term:`tasks ` will continue with + their "pre-reload" configuration, new tasks will use the new + configuration. + + Reloading changes to the ``[runtime]`` section is safe, reloading changes + to the ``[scheduling]`` section has caveats, see the `Cylc User Guide`_. + + See also: + + * :ref:`Reloading Suites` + * `Cylc User Guide`_ + parameterisation Parameterisation is a way to consolidate configuration in the Cylc ``suite.rc`` file by implicitly looping over a set of pre-defined @@ -698,6 +809,14 @@ Glossary :rose:file:`rose-app.conf` file is located in a :term:`Rose application configuration`. + Rose built-in application + A Rose built-in application is a generic :term:`Rose application` + providing common functionality which is provided in the Rose installation. + + See also: + + * :ref:`Rose Built-In Applications` + Rose suite configuration A Rose suite configuration is a :rose:file:`rose-suite.conf` file along with other optional files and directories which configure the way in @@ -749,3 +868,16 @@ Glossary See also: * :ref:`Metadata` + + Rosie Suite + A Rosie suite is a :term:`Rose suite configuration` which is managed + using the Rosie system. + + When a suite is managed using Rosie: + + * The :term:`suite directory` is added to version control. + * The suite is registered in a database. + + See also: + + * :ref:`Rosie Tutorial ` diff --git a/sphinx/hyperlinks.rst b/sphinx/hyperlinks.rst index b783bd82f1..a65e93947c 100644 --- a/sphinx/hyperlinks.rst +++ b/sphinx/hyperlinks.rst @@ -22,3 +22,4 @@ .. _Python Regular Expressions: https://docs.python.org/2/library/re.html#regular-expression-syntax .. _Rose GitHub: https://github.com/metomi/rose .. _SRS: https://code.metoffice.gov.uk/ +.. _SVN: https://subversion.apache.org/ diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index a5f3662bf4..2b36f40912 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -1,6 +1,8 @@ .. include:: ../../hyperlinks.rst :start-line: 1 +.. _tutorial-rosie: + Rosie ===== diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index c9658c7509..3d04247f2a 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -110,6 +110,8 @@ When a suite configuration is run: #. The Cylc suite is run. #. The Cylc gui is launched. +.. _rose-suite-installation-diagram: + .. digraph:: Example :align: center diff --git a/sphinx/tutorial/rose/summary.rst b/sphinx/tutorial/rose/summary.rst index d40602ab4a..ad9f1f4c9a 100644 --- a/sphinx/tutorial/rose/summary.rst +++ b/sphinx/tutorial/rose/summary.rst @@ -13,6 +13,8 @@ So far we have covered: * Rose suite configurations. * Rosie suites. +.. _cylc-rose-rosie-suite-relationship-diagram: + The relationship between them is as follows: .. graph:: Example From f458a4f801ede4ee5e84f371597842f09b5986d0 Mon Sep 17 00:00:00 2001 From: Sadie Bartholomew Date: Tue, 24 Apr 2018 15:48:29 +0100 Subject: [PATCH 29/34] Respond to feedback --- sphinx/tutorial/rose/metadata.rst | 2 +- sphinx/tutorial/rose/rosie.rst | 2 +- sphinx/tutorial/rose/suites.rst | 32 +++++++++++++++---------------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index 4725739aaf..d54decc339 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -207,7 +207,7 @@ For a full list of metadata items, see :rose:conf:`rose-meta.conf[SETTING]`. selecting :menuselection:`Metadata --> Refresh Metadata`. The three settings we have edited should now appear as lists. - #. **Impose types.** + #. **Specify data types.** Next we will add type information to the metadata. diff --git a/sphinx/tutorial/rose/rosie.rst b/sphinx/tutorial/rose/rosie.rst index 87e9136434..5faf5c4ea8 100644 --- a/sphinx/tutorial/rose/rosie.rst +++ b/sphinx/tutorial/rose/rosie.rst @@ -187,7 +187,7 @@ the functionality of the above commands. fcm st You should see a list of files with the ``?`` symbol next to them, - as well as ``rose-suite.conf`` with an ``M`` symbol beside it. ``?`` + as well as :file:`rose-suite.conf` with an ``M`` symbol beside it. ``?`` means the files marked are untracked (not version controlled), whereas ``M`` indicates files which have been modified. Add all untracked files to version control by running:: diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index a6a3923a62..54791a858c 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -351,17 +351,11 @@ See the :ref:`Cheat Sheet` for more information. rose suite-run --local-install-only - Inspect the installed suite, which you will find in:: + Inspect the installed suite, which you will find in + the :term:`run directory`, i.e:: ~/cylc-run/rose-suite-tutorial - .. tip:: - - Remember this is the :term:`run directory`, which is different to - the directory we were working in previously, the - :term:`suite directory` ``~/rose-tutorial/rose-suite-tutorial``, - despite having the same sub-directory name. - You should find all the files contained in the :term:`suite directory` as well as the :term:`run directory` folders ``log``, ``work`` and ``share``. @@ -445,14 +439,12 @@ Otherwise an add-hoc web server can be set up using the and integrate it into the :ref:`weather-forecasting suite `. - #. **Set-up The Forecast Application.** + Move into the suite directory from the previous practical:: - Move into the suite directory from the previous practical:: - - cd ~/rose-tutorial/rose-suite-tutorial + cd ~/rose-tutorial/rose-suite-tutorial - You will find a copy of the ``forecast`` application located in - ``app/forecast``. + You will find a copy of the ``forecast`` application located in + ``app/forecast``. #. **Create A Test Configuration For The** ``forecast`` **Application.** @@ -492,6 +484,9 @@ Otherwise an add-hoc web server can be set up using the * ``WIND_FILE_TEMPLATE`` * ``RAINFALL_FILE`` * ``MAP_FILE`` + * ``CYLC_TASK_CYCLE_POINT`` + * ``RESOLUTION`` + * ``DOMAIN`` .. spoiler:: Solution warning @@ -507,6 +502,9 @@ Otherwise an add-hoc web server can be set up using the WIND_FILE_TEMPLATE=test-data/wind_{cycle}_{xy}.csv RAINFALL_FILE=test-data/rainfall.csv MAP_FILE=map.html + CYLC_TASK_CYCLE_POINT=20171101T0000Z + RESOLUTION=0.2 + DOMAIN=-12,48,5,61 Run the application in "test mode" by providing the option ``--opt-conf-key=test`` to the :ref:`command-rose-app-run` command:: @@ -559,9 +557,9 @@ Otherwise an add-hoc web server can be set up using the RAINFALL_FILE=$CYLC_SUITE_WORK_DIR/$CYLC_TASK_CYCLE_POINT/get_rainfall/rainfall.csv MAP_FILE=${CYLC_TASK_LOG_ROOT}-map.html - Finally we need to change the ``forecast`` task to instead simply run - :ref:`command-rose-task-run`. Change the ``script`` setting in this way. - The runtime section for the ``forecast`` task should now look like this: + Finally we need to change the ``forecast`` task to run + :ref:`command-rose-task-run`. The runtime section for the ``forecast`` + task should now look like this: .. code-block:: cylc From cf3439a6403c6e86a36ca4bce6880556cbaff692 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 24 Apr 2018 15:59:53 +0100 Subject: [PATCH 30/34] feedback 3 --- sphinx/cheat-sheet.rst | 2 +- sphinx/tutorial/rose/metadata.rst | 2 ++ sphinx/tutorial/rose/suites.rst | 8 ++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sphinx/cheat-sheet.rst b/sphinx/cheat-sheet.rst index a522488a4b..3a64b1c0aa 100644 --- a/sphinx/cheat-sheet.rst +++ b/sphinx/cheat-sheet.rst @@ -35,7 +35,7 @@ Starting Suites rose suite-run # run a suite in another directory: - rose suite-run --path + rose suite-run -C # run using a custom name: rose suite-run --name diff --git a/sphinx/tutorial/rose/metadata.rst b/sphinx/tutorial/rose/metadata.rst index d54decc339..269c5f3045 100644 --- a/sphinx/tutorial/rose/metadata.rst +++ b/sphinx/tutorial/rose/metadata.rst @@ -161,6 +161,8 @@ For a full list of metadata items, see :rose:conf:`rose-meta.conf[SETTING]`. description=The interval =between forecasts. + .. TODO - this is a bit tedious, do something to speed this up. + Once you have finished save your work and validate the metadata using :ref:`command-rose-metadata-check`:: diff --git a/sphinx/tutorial/rose/suites.rst b/sphinx/tutorial/rose/suites.rst index 54791a858c..65179962d7 100644 --- a/sphinx/tutorial/rose/suites.rst +++ b/sphinx/tutorial/rose/suites.rst @@ -368,7 +368,7 @@ In Cylc suites, Rose applications are placed in an ``app/`` directory which is copied across to the :term:`run directory` with the rest of the suite by :ref:`command-rose-suite-run` when the suite configuration is run. -When we run Rose applications in Cylc suites we use the +When we run Rose applications from within Cylc suites we use the :ref:`command-rose-task-run` command rather than the :ref:`command-rose-app-run` command. @@ -523,7 +523,7 @@ Otherwise an add-hoc web server can be set up using the We have moved the map template file (``map-template.html``) into the ``forecast`` application so we can delete the ``MAP_TEMPLATE`` - environment variable from the ``forecast`` section of the + environment variable from the ``[runtime]forecast`` section of the ``suite.rc`` file. Copy the remaining environment variables defined in the ``forecast`` @@ -558,8 +558,8 @@ Otherwise an add-hoc web server can be set up using the MAP_FILE=${CYLC_TASK_LOG_ROOT}-map.html Finally we need to change the ``forecast`` task to run - :ref:`command-rose-task-run`. The runtime section for the ``forecast`` - task should now look like this: + :ref:`command-rose-task-run`. The ``[runtime]forecast`` section of the + ``suite.rc`` file should now look like this: .. code-block:: cylc From a42675ac47cd405466118b36d007e48df82a7e2a Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 24 Apr 2018 16:25:12 +0100 Subject: [PATCH 31/34] explain the forecast app test data --- sphinx/tutorial/rose/applications.rst | 28 +++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/sphinx/tutorial/rose/applications.rst b/sphinx/tutorial/rose/applications.rst index d603019c09..55dc5f102f 100644 --- a/sphinx/tutorial/rose/applications.rst +++ b/sphinx/tutorial/rose/applications.rst @@ -162,6 +162,17 @@ application: # The number of forecasts to run. N_FORECASTS=5 + #. **Copy the test data.** + + For now we will run the ``forecast`` application using some sample data + so that we can run it outside of the weather forecasting suite. + + The test data was gathered in November 2017. + + Copy the test data files into the ``file/`` directory by running:: + + rose tutorial test-data file/test-data + #. **Move environment variables defined in the** ``suite.rc`` **file.** In the ``[runtime][forecast][environment]`` section of the ``suite.rc`` @@ -197,12 +208,11 @@ application: # The path to the HTML map template file. MAP_TEMPLATE=map-template.html - To start with we will run this application with test data outside of a - suite so the ``WIND_FILE_TEMPLATE`` and ``RAINFALL_FILE`` environment - variables have been set to point at files in the ``test-data`` directory - which we will create in the next step. + Note that the ``WIND_FILE_TEMPLATE`` and ``RAINFALL_FILE`` environment + variables are pointing at files in the ``test-data`` directory. - To make this application work outside of a suite we will also need to + To make this application work outside of the weather forecasting suite + we will also need to provide the ``DOMAIN`` and ``RESOLUTION`` environment variables defined in the ``[runtime][root][environment]`` section of the ``suite.rc`` file as well as the ``CYLC_TASK_CYCLE_POINT`` environment variable @@ -212,19 +222,13 @@ application: .. code-block:: rose - # The cycle point for the test data. + # The date when the test data was gathered. CYLC_TASK_CYCLE_POINT=20171101T0000Z # The dimensions of each grid cell in degrees. RESOLUTION=0.2 # The area to generate forecasts for (lng1, lat1, lng2, lat2). DOMAIN=-12,48,5,61 - #. **Copy the test data.** - - Copy the test data files into the ``file/`` directory by running:: - - rose tutorial test-data file/test-data - #. **Run the application.** All of the scripts, libraries, files and environment variables required From 5fc9e36ced1ef0d2d6b933318d3f46a5a998f724 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 24 Apr 2018 16:31:17 +0100 Subject: [PATCH 32/34] feedback 4 --- sphinx/glossary.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index b781c604ea..fde1b7cef0 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -593,7 +593,7 @@ Glossary * :term:`warm start` warm start - In a :term:`datetime cycling` suite + In a :term:`cycling suite ` a warm start is one in which the :term:`suite` :term:`starts ` from a :term:`cycle point` after the :term`initial cycle point`. Tasks in cycles before this point as assumed to have succeeded. @@ -643,8 +643,9 @@ Glossary their "pre-reload" configuration, new tasks will use the new configuration. - Reloading changes to the ``[runtime]`` section is safe, reloading changes - to the ``[scheduling]`` section has caveats, see the `Cylc User Guide`_. + Reloading changes is safe providing they don't affect the + :term:`suite's ` :term:`graph`. Changes to the graph have certain + caveats attached, see the `Cylc User Guide`_. See also: From d4e9baa74b27199e50055a8d3a70605878268d0a Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Wed, 25 Apr 2018 15:12:23 +0100 Subject: [PATCH 33/34] feedback 5 --- etc/tutorial/metadata-tutorial/rose-app.conf | 4 ++-- .../app/forecast/meta/rose-meta.conf | 4 ++-- sphinx/glossary.rst | 18 +++++++++--------- sphinx/hyperlinks.rst | 1 - sphinx/installation.rst | 1 + 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/etc/tutorial/metadata-tutorial/rose-app.conf b/etc/tutorial/metadata-tutorial/rose-app.conf index d73c092e12..ddeae230d2 100644 --- a/etc/tutorial/metadata-tutorial/rose-app.conf +++ b/etc/tutorial/metadata-tutorial/rose-app.conf @@ -7,9 +7,9 @@ INTERVAL=60 # The number of forecasts to run. N_FORECASTS=5 # The weighting to give to the wind file from each WIND_CYCLE -# (should add up to 1). +# (comma separared list, values should add up to 1). WEIGHTING=1 -# List of cycle points to get wind data from. +# Comma separated list of cycle points to get wind data from. WIND_CYCLES=0 # Path to the wind files. {cycle}, {xy} will get filled in by the # forecast script diff --git a/etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf b/etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf index 2cb66413f5..bb34a67bad 100644 --- a/etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf +++ b/etc/tutorial/rose-suite-tutorial/app/forecast/meta/rose-meta.conf @@ -9,11 +9,11 @@ description=The number of forecasts to run. [env=WEIGHTING] type=real description=The weighting to give to the wind file from each WIND_CYCLE - =(should add up to 1). + =(comma separared list, values should add up to 1). length=: [env=WIND_CYCLES] -description=List of cycle points to get wind data from. +description=Comma separated list of cycle points to get wind data from. length=: [env=WIND_FILE_TEMPLATE] diff --git a/sphinx/glossary.rst b/sphinx/glossary.rst index fde1b7cef0..71ee9cfa5a 100644 --- a/sphinx/glossary.rst +++ b/sphinx/glossary.rst @@ -552,17 +552,17 @@ Glossary When we say that a :term:`suite` is "running" we mean that the cylc suite server program is running. - The suite server program is responsible for running the suite, it submits + The suite server program is responsible for running the suite. It submits :term:`jobs `, monitors their status and maintains the suite state. .. _daemon: https://en.wikipedia.org/wiki/Daemon_(computing) - By default a suite server program is a `daemon`_ meaning that is runs in + By default a suite server program is a `daemon`_ meaning that it runs in the background (potentially on another host). start startup - When a :term:`suite` starts the cylc :term:`suite server program` is + When a :term:`suite` starts the Cylc :term:`suite server program` is run. This program controls the suite and is what we refer to as "running". @@ -595,7 +595,7 @@ Glossary warm start In a :term:`cycling suite ` a warm start is one in which the :term:`suite` :term:`starts ` - from a :term:`cycle point` after the :term`initial cycle point`. + from a :term:`cycle point` after the :term:`initial cycle point`. Tasks in cycles before this point as assumed to have succeeded. See also: @@ -607,7 +607,7 @@ Glossary When a :term:`suite` is shutdown the :term:`suite server program` is stopped. This means that no further :term:`jobs ` will be submitted. - By default cylc waits for any submitted or running :term:`jobs ` to + By default Cylc waits for any submitted or running :term:`jobs ` to complete (either succeed or fail) before shutting down. See also: @@ -620,7 +620,7 @@ Glossary restart When a :term:`stopped ` :term:`suite` is "restarted" Cylc will pick up where it left off. Cylc will detect any :term:`jobs ` which - have changed state (e.g. succeed) during the period in which the + have changed state (e.g. succeeded) during the period in which the :term:`suite` was :term:`shutdown`. See also: @@ -632,7 +632,7 @@ Glossary reload Any changes made to the ``suite.rc`` file whilst the suite is running - will not have any effect untill the suite is: + will not have any effect until the suite is either: * :term:`Shutdown` and :term:`rerun ` * :term:`Shutdown` and :term:`restarted ` @@ -640,12 +640,12 @@ Glossary Reloading does not require the suite to be :term:`shutdown`. When a suite is reloaded any currently "active" :term:`tasks ` will continue with - their "pre-reload" configuration, new tasks will use the new + their "pre-reload" configuration, whilst new tasks will use the new configuration. Reloading changes is safe providing they don't affect the :term:`suite's ` :term:`graph`. Changes to the graph have certain - caveats attached, see the `Cylc User Guide`_. + caveats attached, see the `Cylc User Guide`_ for details. See also: diff --git a/sphinx/hyperlinks.rst b/sphinx/hyperlinks.rst index a65e93947c..20aec67603 100644 --- a/sphinx/hyperlinks.rst +++ b/sphinx/hyperlinks.rst @@ -20,6 +20,5 @@ .. _PyGTK: http://www.pygtk.org/ .. _Python: https://www.python.org/ .. _Python Regular Expressions: https://docs.python.org/2/library/re.html#regular-expression-syntax -.. _Rose GitHub: https://github.com/metomi/rose .. _SRS: https://code.metoffice.gov.uk/ .. _SVN: https://subversion.apache.org/ diff --git a/sphinx/installation.rst b/sphinx/installation.rst index 9ae5816d7a..74a0096320 100644 --- a/sphinx/installation.rst +++ b/sphinx/installation.rst @@ -4,6 +4,7 @@ Installation ============ +.. _GitHub: https://github.com/metomi/rose .. _archives: https://github.com/metomi/rose/tags The source code for Rose is available via `GitHub `_, code From 332c9761410db49654163c33b64b7fe88f94e231 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Wed, 25 Apr 2018 15:59:27 +0100 Subject: [PATCH 34/34] feedback 6 --- sphinx/api/configuration/rose-configuration-format.rst | 2 +- sphinx/api/configuration/site-and-user.rst | 6 ------ sphinx/tutorial/cylc/scheduling/graphing.rst | 2 +- sphinx/tutorial/cylc/scheduling/integer-cycling.rst | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/sphinx/api/configuration/rose-configuration-format.rst b/sphinx/api/configuration/rose-configuration-format.rst index 26ff7d6356..488ad9c629 100644 --- a/sphinx/api/configuration/rose-configuration-format.rst +++ b/sphinx/api/configuration/rose-configuration-format.rst @@ -13,7 +13,7 @@ following: * (optionally) files containing data that cannot easily be represented by the INI format. -We have added the following conventions into the Rose configuraiton format: +We have added the following conventions into the Rose configuration format: #. The file name is normally called ``rose*.conf``, e.g. :rose:file:`rose.conf`, :rose:file:`rose-app.conf`, :rose:file:`rose-meta.conf`, etc. diff --git a/sphinx/api/configuration/site-and-user.rst b/sphinx/api/configuration/site-and-user.rst index 702c6c1d8a..22451d075a 100644 --- a/sphinx/api/configuration/site-and-user.rst +++ b/sphinx/api/configuration/site-and-user.rst @@ -14,12 +14,6 @@ site configuration at ``$ROSE_HOME/etc/rose.conf`` where search for the user configuration at ``$HOME/.metomi/rose.conf`` where ``$HOME`` is the home directory of the current user. -.. note:: - Allowed settings in the site and user configuration files will be - documented in a future version of this document. In the mean time, the - settings are documented as comments in the ``etc/rose.conf.example`` - file of each distribution of Rose. - You can also override many internal constants of :ref:`command-rose-config-edit` and ``rosie go``. To change the keyboard shortcut of the ``Find Next`` action in diff --git a/sphinx/tutorial/cylc/scheduling/graphing.rst b/sphinx/tutorial/cylc/scheduling/graphing.rst index 85ca7152c6..696a817862 100644 --- a/sphinx/tutorial/cylc/scheduling/graphing.rst +++ b/sphinx/tutorial/cylc/scheduling/graphing.rst @@ -241,7 +241,7 @@ seen so far. The number ``1`` which appears below each task is the foo -> bar -> baz -> qux pub -> bar -> wop - #. **Use** ``Cylc graph`` **to visualise the workflow.** + #. **Use** ``cylc graph`` **to visualise the workflow.** Once you have written some graph strings try using ``cylc graph`` to display the workflow. Run the following command: diff --git a/sphinx/tutorial/cylc/scheduling/integer-cycling.rst b/sphinx/tutorial/cylc/scheduling/integer-cycling.rst index 3353e57296..0ff4e2c177 100644 --- a/sphinx/tutorial/cylc/scheduling/integer-cycling.rst +++ b/sphinx/tutorial/cylc/scheduling/integer-cycling.rst @@ -401,7 +401,7 @@ starting 5 cycles *after* the initial cycle point. #. **Visualise the suite.** - Try visualising the suite using ``Cylc graph``. + Try visualising the suite using ``cylc graph``. .. code-block:: none