From 55666bac24cecb605d20d4951cd179a45f62d041 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 19 Oct 2023 14:50:06 +0100 Subject: [PATCH 01/45] Added permission check before editing files/copying --- bgcval2/download_from_mass.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/bgcval2/download_from_mass.py b/bgcval2/download_from_mass.py index 461e24c8..463c39b5 100755 --- a/bgcval2/download_from_mass.py +++ b/bgcval2/download_from_mass.py @@ -37,6 +37,7 @@ from socket import gethostname import shutil import os +from pwd import getpwuid import stat from glob import glob from re import findall @@ -409,7 +410,16 @@ def download_from_mass( outputFold = folder([paths.ModelFolder_pref, jobID,] ) # make this folder group writeable. st = os.stat(outputFold) - os.chmod(outputFold, st.st_mode | stat.S_IWGRP) + + # Case one: + # I just created this folder and I own it: + i_can_write_this = os.access(outputFold, os.W_OK) + if i_can_write_this: + os.chmod(outputFold, st.st_mode | stat.S_IWGRP) + else: + uname = getpwuid(os.stat(outputFold).st_uid).pw_name + print('WARNING: someone else (', uname, ') owns this directory, so you may not be able to download files.') + print('WARNING: Ask them politely to run "chmod g+w ',outputFold,'"') deleteBadLinksAndZeroSize(outputFold, jobID) @@ -483,8 +493,19 @@ def download_from_mass( if auto_download: shared_file_path = os.path.join(paths.shared_mass_scripts, os.path.basename(download_script_path)) print('writing file in shared path', shared_file_path) - shutil.copy(download_script_path, shared_file_path) + # Case one: + # I just created this folder and I own it: + i_can_write_this = os.access(shared_file_path, os.W_OK) + if i_can_write_this: + os.chmod(download_script_path, st.st_mode | stat.S_IWGRP) + shutil.copy(download_script_path, shared_file_path) + os.chmod(shared_file_path, st.st_mode | stat.S_IWGRP) + else: + uname = getpwuid(os.stat(shared_file_path).st_uid).pw_name + print('WARNING: someone else (', shared_file_path, ') owns this directory, so you may not be able to download files.') + print('WARNING: Ask them politely to run "chmod g+w ', shared_file_path,'"') + fixFilePaths(outputFold, jobID, debug=False,) deleteBadLinksAndZeroSize(outputFold, jobID, debug=False,) @@ -598,12 +619,17 @@ def deleteBadLinksAndZeroSize(outputFold, jobID, debug=True): bashCommand1 = "find " + outputFold + "/. -size 0 -print -delete" bashCommand2 = "find -L " + outputFold + "/. -type l -delete -print" - if debug: print("deleteBadLinksAndZeroSize:\t", bashCommand1) + bashCommand1 = bashCommand1.replace('//', '/') + bashCommand2 = bashCommand2.replace('//', '/') + + #f debug: + print("deleteBadLinksAndZeroSize:\t", bashCommand1) process1 = subprocess.Popen(bashCommand1.split(), stdout=subprocess.PIPE) output1 = process1.communicate()[0] - if debug: print("deleteBadLinksAndZeroSize:\t", bashCommand2) + #f debug: + print("deleteBadLinksAndZeroSize:\t", bashCommand2) process2 = subprocess.Popen(bashCommand2.split(), stdout=subprocess.PIPE) output2 = process2.communicate()[0] From bb1b36efd3ce2fe4034a301cc28f6a8860bb4222 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 19 Oct 2023 14:52:33 +0100 Subject: [PATCH 02/45] minor comment edit --- bgcval2/download_from_mass.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bgcval2/download_from_mass.py b/bgcval2/download_from_mass.py index 463c39b5..351fc657 100755 --- a/bgcval2/download_from_mass.py +++ b/bgcval2/download_from_mass.py @@ -412,7 +412,7 @@ def download_from_mass( st = os.stat(outputFold) # Case one: - # I just created this folder and I own it: + # I created this folder and I own it: i_can_write_this = os.access(outputFold, os.W_OK) if i_can_write_this: os.chmod(outputFold, st.st_mode | stat.S_IWGRP) @@ -494,8 +494,7 @@ def download_from_mass( shared_file_path = os.path.join(paths.shared_mass_scripts, os.path.basename(download_script_path)) print('writing file in shared path', shared_file_path) - # Case one: - # I just created this folder and I own it: + # I created this file and I own it: i_can_write_this = os.access(shared_file_path, os.W_OK) if i_can_write_this: os.chmod(download_script_path, st.st_mode | stat.S_IWGRP) From ba7738ca1c5ecbd8a2ec0cecb90aac671d4c5e78 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 19 Oct 2023 15:17:27 +0100 Subject: [PATCH 03/45] improved comments --- bgcval2/download_from_mass.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/bgcval2/download_from_mass.py b/bgcval2/download_from_mass.py index 351fc657..756ccf55 100755 --- a/bgcval2/download_from_mass.py +++ b/bgcval2/download_from_mass.py @@ -408,16 +408,18 @@ def download_from_mass( paths = get_paths(config_user) outputFold = folder([paths.ModelFolder_pref, jobID,] ) - # make this folder group writeable. st = os.stat(outputFold) - - # Case one: - # I created this folder and I own it: + + # Check permissions on the output folder i_can_write_this = os.access(outputFold, os.W_OK) if i_can_write_this: + # I created this folder and I own it. + # make this folder group writeable. os.chmod(outputFold, st.st_mode | stat.S_IWGRP) else: - uname = getpwuid(os.stat(outputFold).st_uid).pw_name + # Someone else created it and they own it, + # so I can't change permissions. + uname = getpwuid(st.st_uid).pw_name print('WARNING: someone else (', uname, ') owns this directory, so you may not be able to download files.') print('WARNING: Ask them politely to run "chmod g+w ',outputFold,'"') @@ -494,13 +496,20 @@ def download_from_mass( shared_file_path = os.path.join(paths.shared_mass_scripts, os.path.basename(download_script_path)) print('writing file in shared path', shared_file_path) - # I created this file and I own it: + # check destination permissions: i_can_write_this = os.access(shared_file_path, os.W_OK) if i_can_write_this: + # I created this file and I own it: + # make local copy group writable: os.chmod(download_script_path, st.st_mode | stat.S_IWGRP) + + # copy local to shared folder: shutil.copy(download_script_path, shared_file_path) + + # make shared copy group writable: (possibly overkill) os.chmod(shared_file_path, st.st_mode | stat.S_IWGRP) else: + # I don't have permission to edit this file. Someone else does: uname = getpwuid(os.stat(shared_file_path).st_uid).pw_name print('WARNING: someone else (', shared_file_path, ') owns this directory, so you may not be able to download files.') print('WARNING: Ask them politely to run "chmod g+w ', shared_file_path,'"') @@ -621,15 +630,11 @@ def deleteBadLinksAndZeroSize(outputFold, jobID, debug=True): bashCommand1 = bashCommand1.replace('//', '/') bashCommand2 = bashCommand2.replace('//', '/') - #f debug: print("deleteBadLinksAndZeroSize:\t", bashCommand1) - process1 = subprocess.Popen(bashCommand1.split(), stdout=subprocess.PIPE) output1 = process1.communicate()[0] - #f debug: print("deleteBadLinksAndZeroSize:\t", bashCommand2) - process2 = subprocess.Popen(bashCommand2.split(), stdout=subprocess.PIPE) output2 = process2.communicate()[0] From 17c01ddf87b95ea06cc18a91e323daec86b08ff2 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 23 Oct 2023 15:12:52 +0100 Subject: [PATCH 04/45] add unit test dir --- .../test_download_from_mass_permissions.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/unit/test_download_from_mass_permissions.py diff --git a/tests/unit/test_download_from_mass_permissions.py b/tests/unit/test_download_from_mass_permissions.py new file mode 100644 index 00000000..cdefa6a8 --- /dev/null +++ b/tests/unit/test_download_from_mass_permissions.py @@ -0,0 +1,32 @@ +import os +import shutil +import stat + +from bgcval2.download_from_mass import download_from_mass as dfm + + +def test_allowed_user(): + dfm(jobID="u-xxx", + doMoo=False, + auto_download=False, + config_user="defaults" + ) + user_home = os.path.expanduser('~') + output_folder = "bgcval2/local_test/BGC_data/u-xxx/" + run_dir = os.path.join(user_home, output_folder) + assert os.stat(run_dir).st_mode == 16893 + + +def test_disallowed_user(): + user_home = os.path.expanduser('~') + output_folder = "bgcval2/local_test/BGC_data/u-xxx/" + run_dir = os.path.join(user_home, output_folder) + st = os.stat(run_dir) + os.chmod(run_dir, False) + dfm(jobID="u-xxx", + doMoo=False, + auto_download=False, + config_user="defaults" + ) + assert os.stat(run_dir).st_mode == 16384 + shutil.rmtree(run_dir, ignore_errors=True) From 06f4336202e381d6d698e2a4c654a07285814020 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 23 Oct 2023 15:13:17 +0100 Subject: [PATCH 05/45] remove whitespace --- bgcval2/download_from_mass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bgcval2/download_from_mass.py b/bgcval2/download_from_mass.py index 756ccf55..a42c03da 100755 --- a/bgcval2/download_from_mass.py +++ b/bgcval2/download_from_mass.py @@ -409,7 +409,7 @@ def download_from_mass( paths = get_paths(config_user) outputFold = folder([paths.ModelFolder_pref, jobID,] ) st = os.stat(outputFold) - + # Check permissions on the output folder i_can_write_this = os.access(outputFold, os.W_OK) if i_can_write_this: From 9d032464a2de217fce5662d8a17d4c2c913036d6 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 23 Oct 2023 15:20:34 +0100 Subject: [PATCH 06/45] tweak test --- tests/unit/test_download_from_mass_permissions.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_download_from_mass_permissions.py b/tests/unit/test_download_from_mass_permissions.py index cdefa6a8..1471121e 100644 --- a/tests/unit/test_download_from_mass_permissions.py +++ b/tests/unit/test_download_from_mass_permissions.py @@ -19,11 +19,13 @@ def test_allowed_user(): def test_disallowed_user(): user_home = os.path.expanduser('~') - output_folder = "bgcval2/local_test/BGC_data/u-xxx/" + output_folder = "bgcval2/local_test/BGC_data/u-yyy/" run_dir = os.path.join(user_home, output_folder) + if not os.path.exists(run_dir): + os.makedirs(run_dir) st = os.stat(run_dir) os.chmod(run_dir, False) - dfm(jobID="u-xxx", + dfm(jobID="u-yyy", doMoo=False, auto_download=False, config_user="defaults" From 098ad28c3dd47f25494e0b69b3064b819a6ceef0 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 23 Oct 2023 16:09:08 +0100 Subject: [PATCH 07/45] fix test --- tests/unit/test_download_from_mass_permissions.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_download_from_mass_permissions.py b/tests/unit/test_download_from_mass_permissions.py index 1471121e..719a78fc 100644 --- a/tests/unit/test_download_from_mass_permissions.py +++ b/tests/unit/test_download_from_mass_permissions.py @@ -6,14 +6,16 @@ def test_allowed_user(): + user_home = os.path.expanduser('~') + output_folder = "bgcval2/local_test/BGC_data/u-xxx/" + run_dir = os.path.join(user_home, output_folder) + if not os.path.exists(run_dir): + os.makedirs(run_dir) dfm(jobID="u-xxx", doMoo=False, auto_download=False, config_user="defaults" ) - user_home = os.path.expanduser('~') - output_folder = "bgcval2/local_test/BGC_data/u-xxx/" - run_dir = os.path.join(user_home, output_folder) assert os.stat(run_dir).st_mode == 16893 From 4300bbd54a40a8f4a7e52884bc04987a97b1fc01 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 23 Oct 2023 16:27:51 +0100 Subject: [PATCH 08/45] allow for 16877 --- tests/unit/test_download_from_mass_permissions.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_download_from_mass_permissions.py b/tests/unit/test_download_from_mass_permissions.py index 719a78fc..6c56c373 100644 --- a/tests/unit/test_download_from_mass_permissions.py +++ b/tests/unit/test_download_from_mass_permissions.py @@ -16,7 +16,11 @@ def test_allowed_user(): auto_download=False, config_user="defaults" ) - assert os.stat(run_dir).st_mode == 16893 + try: + assert os.stat(run_dir).st_mode == 16893 + # when stat mode is 16877 (equivalent to chmod 877) + except AssertionError: + assert os.stat(run_dir).st_mode == 16877 def test_disallowed_user(): From 23c826a4fb1416f8e3cb61022b240243a4377844 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 2 Nov 2023 10:40:21 +0000 Subject: [PATCH 09/45] added fixes into the correct branch this time. --- bgcval2/download_from_mass.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/bgcval2/download_from_mass.py b/bgcval2/download_from_mass.py index a42c03da..e2a3cd68 100755 --- a/bgcval2/download_from_mass.py +++ b/bgcval2/download_from_mass.py @@ -412,15 +412,22 @@ def download_from_mass( # Check permissions on the output folder i_can_write_this = os.access(outputFold, os.W_OK) - if i_can_write_this: + owner = getpwuid(st.st_uid).pw_name + my_username = os.environ.get('USERNAME') + + i_own_this = my_username == owner + #group_can_write_this = os.access(outputFold, os.W_OK) + if i_can_write_this and i_own_this: # I created this folder and I own it. - # make this folder group writeable. + # make this folder group writeable.: os.chmod(outputFold, st.st_mode | stat.S_IWGRP) + elif i_can_write_this and not i_own_this: + pass else: # Someone else created it and they own it, # so I can't change permissions. - uname = getpwuid(st.st_uid).pw_name - print('WARNING: someone else (', uname, ') owns this directory, so you may not be able to download files.') + owner = getpwuid(st.st_uid).pw_name + print('WARNING: someone else (', owner, ') owns this directory, so you may not be able to download files.') print('WARNING: Ask them politely to run "chmod g+w ',outputFold,'"') deleteBadLinksAndZeroSize(outputFold, jobID) @@ -503,11 +510,12 @@ def download_from_mass( # make local copy group writable: os.chmod(download_script_path, st.st_mode | stat.S_IWGRP) - # copy local to shared folder: - shutil.copy(download_script_path, shared_file_path) + # copy local to shared folder: + if not os.path.exists(shared_file_path): + shutil.copy(download_script_path, shared_file_path) - # make shared copy group writable: (possibly overkill) - os.chmod(shared_file_path, st.st_mode | stat.S_IWGRP) + # make shared copy group writable: (possibly overkill) + os.chmod(shared_file_path, st.st_mode | stat.S_IWGRP) else: # I don't have permission to edit this file. Someone else does: uname = getpwuid(os.stat(shared_file_path).st_uid).pw_name From 34b44ba32ff3b85a8c9c155e76fd326e4c655172 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 2 Nov 2023 14:24:17 +0000 Subject: [PATCH 10/45] fixed missing file case --- bgcval2/download_from_mass.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bgcval2/download_from_mass.py b/bgcval2/download_from_mass.py index e2a3cd68..1270c1de 100755 --- a/bgcval2/download_from_mass.py +++ b/bgcval2/download_from_mass.py @@ -503,8 +503,14 @@ def download_from_mass( shared_file_path = os.path.join(paths.shared_mass_scripts, os.path.basename(download_script_path)) print('writing file in shared path', shared_file_path) - # check destination permissions: - i_can_write_this = os.access(shared_file_path, os.W_OK) + # check destination existance and permissions + if os.path.exists(shared_file_path): + # check destination permissions + i_can_write_this = os.access(shared_file_path, os.W_OK) + else: + # File doesn't exist! + i_can_write_this = True + if i_can_write_this: # I created this file and I own it: # make local copy group writable: From 841f07369c0cf34a875d9cfa8f73f3598ad3d89c Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 2 Nov 2023 15:23:09 +0000 Subject: [PATCH 11/45] added capability to choose moving average and labels in the yml files --- bgcval2/analysis_compare.py | 19 ++++++++-- bgcval2/analysis_timeseries.py | 5 +++ bgcval2/timeseries/timeseriesPlots.py | 53 ++++++++++++++------------- key_files/amoc_26n.yml | 1 + 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/bgcval2/analysis_compare.py b/bgcval2/analysis_compare.py index e1c3be68..f1d6b833 100755 --- a/bgcval2/analysis_compare.py +++ b/bgcval2/analysis_compare.py @@ -189,6 +189,7 @@ def timeseries_compare(jobs, jobDescriptions={}, lineThicknesses=defaultdict(lambda: 1), linestyles=defaultdict(lambda: '-'), + labels = {}, ensembles={}, config_user=None, ): @@ -382,6 +383,7 @@ def timeseries_compare(jobs, regions = av[name]['regions'] layers = av[name]['layers'] metrics = av[name]['metrics'] + smoothings = av[name]['smoothings'] for region, layer, metric in itertools.product(regions, layers, metrics): timesD = {} arrD = {} @@ -405,20 +407,22 @@ def timeseries_compare(jobs, units = av[name]['modeldetails']['units'] ts = 'Together' - for ls in ['DataOnly', ]: + for smoothing in smoothings: + #or ls in ['DataOnly', ]: tsp.multitimeseries( timesD, # model times (in floats) arrD, # model time series data=-999, # in situ data distribution title=title, filename=bvt.folder(imageFolder) + - '_'.join([name, region, layer, ts, ls + '.png']), + '_'.join([name, region, layer, ts, smoothing + '.png']), units=units, plotStyle=ts, - lineStyle=ls, + smoothing=smoothing, colours=colours, thicknesses=lineThicknesses, linestyles=linestyles, + labels=labels, ) # Generate a list of comparison images: @@ -515,7 +519,8 @@ def load_comparison_yml(master_compare_yml_fn): descriptions = {} shifttimes = {} # number of years to shift time axis. timeranges = {} - + labels = {} + for jobID, job_dict in details['jobs'].items(): if job_dict.get('colour', False): colours[jobID] = job_dict['colour'] @@ -530,6 +535,8 @@ def load_comparison_yml(master_compare_yml_fn): timeranges[jobID] = job_dict.get('timerange', None) suites[jobID] = job_dict.get('suite', default_suite) auto_download_dict[jobID] = job_dict.get('auto_download', auto_download_dict[jobID]) + labels[jobID] = job_dict.get('label', jobID) + details['colours'] = colours details['descriptions'] = descriptions @@ -537,6 +544,7 @@ def load_comparison_yml(master_compare_yml_fn): details['linestyles'] = linestyles details['shifttimes'] = shifttimes details['timeranges'] = timeranges + details['labels'] = labels details['suites'] = suites details['auto_download'] = auto_download_dict return details @@ -567,6 +575,7 @@ def load_yml_and_run(compare_yml, config_user, skip_timeseries): descriptions = details['descriptions'] shifttimes = details['shifttimes'] timeranges = details['timeranges'] + labels = details['labels'] suites = details['suites'] auto_download = details['auto_download'] strictFileCheck = details.get('strictFileCheck', True) @@ -578,6 +587,7 @@ def load_yml_and_run(compare_yml, config_user, skip_timeseries): print(jobID, 'colour:',colours[jobID]) print(jobID, 'line thickness & style:',thicknesses[jobID], linestyles[jobID]) print(jobID, 'Shift time by', shifttimes[jobID]) + print(jobID, 'Label: ', labels[jobID]) print(jobID, 'Time range (None means all):', timeranges.get(jobID, None)) print(jobID, 'suite:', suites[jobID]) print(jobID, 'auto_download', auto_download[jobID]) @@ -620,6 +630,7 @@ def load_yml_and_run(compare_yml, config_user, skip_timeseries): analysisname=analysis_name, lineThicknesses=thicknesses, linestyles=linestyles, + labels=labels, config_user=config_user, ) diff --git a/bgcval2/analysis_timeseries.py b/bgcval2/analysis_timeseries.py index d063dfa8..e6aa75d0 100755 --- a/bgcval2/analysis_timeseries.py +++ b/bgcval2/analysis_timeseries.py @@ -297,6 +297,11 @@ def load_key_file(key, paths, jobID, strictFileCheck=True): output_dict['metrics'] = key_dict.get('metrics', metricList) output_dict['metrics'] = parse_list_from_string(output_dict['metrics']) + # Smoothings: + default_smoothings = ['DataOnly', ] + output_dict['smoothings'] = key_dict.get('smoothings', default_smoothings) + output_dict['smoothings'] = parse_list_from_string(output_dict['smoothings']) + # Load Grid: gridFile = key_dict.get('gridFile', paths.orcaGridfn) output_dict['gridFile'] = list_input_files(gridFile, key_dict, paths)[0] diff --git a/bgcval2/timeseries/timeseriesPlots.py b/bgcval2/timeseries/timeseriesPlots.py index 543849f4..aecaaca3 100644 --- a/bgcval2/timeseries/timeseriesPlots.py +++ b/bgcval2/timeseries/timeseriesPlots.py @@ -702,9 +702,10 @@ def multitimeseries( 'lime', ], plotStyle='Together', - lineStyle='', + smoothing='', thicknesses=defaultdict(lambda: 1), linestyles=defaultdict(lambda: '-'), + labels={}, ): if 0 in [len(timesD), len(list(timesD.keys()))]: return @@ -783,7 +784,8 @@ def multitimeseries( if np.min(arr) < ylims[0]: ylims[0] = np.min(arr) if np.max(arr) > ylims[1]: ylims[1] = np.max(arr) - if lineStyle.lower() in ['spline', 'all']: + label = labels.get(jobID, jobID) + if smoothing.lower() in ['spline', 'all']: tnew = np.linspace(times[0], times[-1], 60) arr_smooth = interpolate.spline(times, arr, tnew) pyplot.plot( @@ -792,10 +794,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID + ' spline', + label=label + ' spline', ) - if lineStyle.lower() in ['movingaverage', 'both', 'all']: + if smoothing.lower() in ['movingaverage', 'both', 'all']: if len(times) > 100.: window = 30 elif len(times) > 30.: window = 15 elif len(times) > 10.: window = 4 @@ -810,10 +812,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingaverage5', ]: window = 5 @@ -827,11 +829,11 @@ def multitimeseries( arr_new, c=colours[jobID], ls=linestyles[jobID], - label=jobID, + label=label, lw=thicknesses[jobID], ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingav1year', ]: arr_new = movingaverage_DT(arr, @@ -844,10 +846,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ - 'movingav5years', + if smoothing.lower() in [ + 'movingav5years', 'both5' ]: arr_new = movingaverage_DT(arr, times, @@ -859,11 +861,11 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ - 'movingav30years', + if smoothing.lower() in [ + 'movingav30years', 'both30' ]: pyplot.plot(times, arr, @@ -881,11 +883,11 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ - 'movingav100years', + if smoothing.lower() in [ + 'movingav100years', 'both100', ]: pyplot.plot(times, arr, @@ -903,10 +905,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingaverage12', ]: window = 12 @@ -921,10 +923,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=2., - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingaverage60', ]: window = 60 @@ -939,13 +941,14 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=2., - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ '', 'both', 'all', + 'both5', 'both30', 'both100', ]: pyplot.plot(times, arr, @@ -953,14 +956,14 @@ def multitimeseries( ls=linestyles[jobID], lw=0.25) - if lineStyle.lower() in ['dataonly']: + if smoothing.lower() in ['dataonly']: pyplot.plot( times, arr, c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) if type(data) == type(10.): diff --git a/key_files/amoc_26n.yml b/key_files/amoc_26n.yml index 5b77b064..2d99d7a3 100644 --- a/key_files/amoc_26n.yml +++ b/key_files/amoc_26n.yml @@ -13,3 +13,4 @@ model_convert: altmaskfile: $PATHS_BGCVAL2/bgcval2/data/basinlandmask_eORCA1.nc layers: layerless regions: regionless +smoothings: DataOnly both5 both30 movingav30years From f54cb6c8411b4bbf7879dd20306b16e1751287da Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 2 Nov 2023 15:38:26 +0000 Subject: [PATCH 12/45] added more smoothing options --- bgcval2/timeseries/timeseriesPlots.py | 54 +++++++++++++++++++++++++++ key_files/amoc_26n.yml | 2 +- key_files/drakepassagetransport.yml | 2 + 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/bgcval2/timeseries/timeseriesPlots.py b/bgcval2/timeseries/timeseriesPlots.py index aecaaca3..217b8d21 100644 --- a/bgcval2/timeseries/timeseriesPlots.py +++ b/bgcval2/timeseries/timeseriesPlots.py @@ -833,6 +833,60 @@ def multitimeseries( lw=thicknesses[jobID], ) + if smoothing.lower() == '5and30': + arr_new5 = movingaverage_DT(arr, + times, + window_len=5., + window_units='years') + + arr_new30 = movingaverage_DT(arr, + times, + window_len=30., + window_units='years') + + pyplot.plot( + times, + arr_new5, + c=colours[jobID], + ls=linestyles[jobID], + lw=thicknesses[jobID]/2., + ) + pyplot.plot( + times, + arr_new30, + c=colours[jobID], + ls=linestyles[jobID], + lw=thicknesses[jobID], + label=label, + ) + if smoothing.lower() == '30and100': + arr_new5 = movingaverage_DT(arr, + times, + window_len=30., + window_units='years') + + arr_new30 = movingaverage_DT(arr, + times, + window_len=100., + window_units='years') + + pyplot.plot( + times, + arr_new5, + c=colours[jobID], + ls=linestyles[jobID], + lw=thicknesses[jobID]/2., + ) + pyplot.plot( + times, + arr_new30, + c=colours[jobID], + ls=linestyles[jobID], + lw=thicknesses[jobID], + label=label, + ) + + if smoothing.lower() in [ 'movingav1year', ]: diff --git a/key_files/amoc_26n.yml b/key_files/amoc_26n.yml index 2d99d7a3..9577ac97 100644 --- a/key_files/amoc_26n.yml +++ b/key_files/amoc_26n.yml @@ -13,4 +13,4 @@ model_convert: altmaskfile: $PATHS_BGCVAL2/bgcval2/data/basinlandmask_eORCA1.nc layers: layerless regions: regionless -smoothings: DataOnly both5 both30 movingav30years +smoothings: DataOnly both5 both30 movingav30years 5and30 30and100 diff --git a/key_files/drakepassagetransport.yml b/key_files/drakepassagetransport.yml index 776b572e..124f8b33 100644 --- a/key_files/drakepassagetransport.yml +++ b/key_files/drakepassagetransport.yml @@ -11,3 +11,5 @@ model_convert: areafile: $PATHS_GRIDFILE layers: layerless regions: regionless +smoothings: DataOnly 5and30 30and100 + From c28346d0e5809be9697941f197a97bf1fcbe6dbe Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 6 Nov 2023 08:11:55 +0000 Subject: [PATCH 13/45] Update bgcval2/timeseries/timeseriesPlots.py Co-authored-by: Valeriu Predoi --- bgcval2/timeseries/timeseriesPlots.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bgcval2/timeseries/timeseriesPlots.py b/bgcval2/timeseries/timeseriesPlots.py index 217b8d21..c34115a2 100644 --- a/bgcval2/timeseries/timeseriesPlots.py +++ b/bgcval2/timeseries/timeseriesPlots.py @@ -702,7 +702,7 @@ def multitimeseries( 'lime', ], plotStyle='Together', - smoothing='', + smoothing='', thicknesses=defaultdict(lambda: 1), linestyles=defaultdict(lambda: '-'), labels={}, From e9dd4df4fc925d2067239ca8bd235ff2826d2878 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 6 Nov 2023 11:16:41 +0000 Subject: [PATCH 14/45] Added documentation --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 1a05ee71..5d8c6c7b 100644 --- a/README.md +++ b/README.md @@ -229,6 +229,7 @@ strictFileCheck: jobs: : description: + label: 'Job info' colour: red thickness: 0.7 linestyle: '-' @@ -271,6 +272,10 @@ These values are: - The options are: - `description`: - A description of job, which helps people differentiate the jobs in the final report. + - `label`: + - A short description of the job which will appear in the plot legend. + - If you make it too long, it won't fit on the plot. + - Optional: Default behaviour is the jobID. - `colour`: - The colour of this jobs line in the report plots. - Default colour is a randomly generated hex colour. @@ -447,6 +452,8 @@ units: Units dimensions: 1,2 or 3 # The number of dimensions after the calculations are performed layers : Surface regions : Global ignoreInlandSeas SouthernOcean ArcticOcean Equator10 Remainder NorthernSubpolarAtlantic NorthernSubpolarPacific +smoothings : DataOnly both5 both30 movingav30years 5and30 30and100 + #paths: modelFiles : $BASEDIR_MODEL/$JOBID/nemo_$JOBIDo_1y_*_grid-T.nc @@ -500,6 +507,26 @@ basic functions such as multiply by or add to, or `noChange`, which can all be called without providing the `path`, and which may have their own key word arguments. +Some of the other options for each analysis include: + - `layers`: + - The z axis layers that you want to use. + - Typically include things like `Surface`, `500m`, `1000m` etc. + - Note that this is a pre-curated list, so you can't use it to select a specific depth (like `327m` or something) + - `regions`: + - A list of regions to investigate. + - This is a pre-curated list, and they are defined in so you can't. + - These regions are defined in the file `bgcval2/bgcvaltools/makeMask.py`. + - `smoothings`: + - This is the smoothing function (if any) to apply to the data before plotting it. + - The smoothing it added before plotting, but after saving the shelve file, so it doesn't impact the data. + - No smoothing is `DataOnly`, which is also the default behaviour. + - If several smoothing options are added here, bgcval2 will generate a comparison plot for each one. + - Other modes exist: + - `movingav30years`: A 30 year moving average + - `both5`: Both no smoothing and a 5 year moving average + - `both30`: Both no smoothing and a 30 year moving average + - `5and30`: a 5 year moving average and a 30 year moving average. + Clearing the Cache ------------------ From 39661765298f976e04dc549e872e97567d6db9c4 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 6 Nov 2023 11:25:12 +0000 Subject: [PATCH 15/45] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5d8c6c7b..3c9e8aee 100644 --- a/README.md +++ b/README.md @@ -521,6 +521,7 @@ Some of the other options for each analysis include: - The smoothing it added before plotting, but after saving the shelve file, so it doesn't impact the data. - No smoothing is `DataOnly`, which is also the default behaviour. - If several smoothing options are added here, bgcval2 will generate a comparison plot for each one. + - The smoothings are defined and performed in `bgcval2/timeseries/timeseriesPlots.py` - Other modes exist: - `movingav30years`: A 30 year moving average - `both5`: Both no smoothing and a 5 year moving average From 4e86a7fd0479ea795734a2b0a1952fb1857b1248 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Wed, 22 Nov 2023 15:07:50 +0000 Subject: [PATCH 16/45] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6284a3c6..de6e55f9 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ _sidebar.rst.inc local_test/BGC_data/valeriu mass_scripts CompareReports2 +.idea/workspace.xml From 017445f83c7ff6c55ff92a9926af88625bd8b94f Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Wed, 22 Nov 2023 15:38:08 +0000 Subject: [PATCH 17/45] Added new regions and keys to focus in on cornwall and several UKOT MPAs --- bgcval2/bgcvaltools/makeMask.py | 22 +++++++++++++-------- bgcval2/bgcvaltools/pftnames.py | 12 +++++++---- key_files/mpa_airseafluxco2.yml | 13 ++++++++++++ key_files/mpa_alkalinity.yml | 23 ++++++++++++++++++++++ key_files/mpa_chlorophyll.yml | 20 +++++++++++++++++++ key_files/mpa_dic.yml | 19 ++++++++++++++++++ key_files/mpa_iron.yml | 32 ++++++++++++++++++++++++++++++ key_files/mpa_mld.yml | 35 +++++++++++++++++++++++++++++++++ key_files/mpa_nitrate.yml | 27 +++++++++++++++++++++++++ key_files/mpa_oxygen.yml | 25 +++++++++++++++++++++++ key_files/mpa_ph.yml | 17 ++++++++++++++++ key_files/mpa_salinity.yml | 23 ++++++++++++++++++++++ key_files/mpa_silicate.yml | 25 +++++++++++++++++++++++ key_files/mpa_temperature.yml | 28 ++++++++++++++++++++++++++ key_lists/ukmpas.yml | 35 +++++++++++++++++++++++++++++++++ 15 files changed, 344 insertions(+), 12 deletions(-) create mode 100644 key_files/mpa_airseafluxco2.yml create mode 100644 key_files/mpa_alkalinity.yml create mode 100644 key_files/mpa_chlorophyll.yml create mode 100644 key_files/mpa_dic.yml create mode 100644 key_files/mpa_iron.yml create mode 100644 key_files/mpa_mld.yml create mode 100644 key_files/mpa_nitrate.yml create mode 100644 key_files/mpa_oxygen.yml create mode 100644 key_files/mpa_ph.yml create mode 100644 key_files/mpa_salinity.yml create mode 100644 key_files/mpa_silicate.yml create mode 100644 key_files/mpa_temperature.yml create mode 100644 key_lists/ukmpas.yml diff --git a/bgcval2/bgcvaltools/makeMask.py b/bgcval2/bgcvaltools/makeMask.py index 6604b627..afdf354d 100644 --- a/bgcval2/bgcvaltools/makeMask.py +++ b/bgcval2/bgcvaltools/makeMask.py @@ -45,13 +45,13 @@ def makeMask(name, newSlice, xt, xz, xy, xx, xd, debug=False): :param xy: A one-dimensional array of the dataset latitudes. :param xx: A one-dimensional array of the dataset longitudes. :param xd: A one-dimensional array of the data. - + This function produces a mask to hides all points that are not in the requested region. - - Note that xt,xz,xy,xx,xd should all be the same shape and size. - + + Note that xt,xz,xy,xx,xd should all be the same shape and size. + This functional can call itself, if two regional masks are needed. - + Please add your own regions, at the bottom of the list, if needed. """ if debug: @@ -270,6 +270,12 @@ def makeMask(name, newSlice, xt, xz, xy, xx, xd, debug=False): mx += np.ma.masked_outside(xy, 49., 52.).mask return mx + if newSlice == 'Ascension': + mx = np.ma.masked_outside(xx, -17.246, -11.487).mask # longitude + mx += np.ma.masked_outside(xy, -10.813, -5.053).mask # Lattitue + return mx + + if newSlice == 'WeddelSea': mx = np.ma.masked_outside(xx, -60., -20.).mask mx += np.ma.masked_outside(xy, -80., -64.).mask @@ -487,13 +493,13 @@ def makeMask(name, newSlice, xt, xz, xy, xx, xd, debug=False): print("Corner case:", la, lo, bathy[la, lo]) nmask[i] = 1 if newSlice == "maskBelowBathy": - if (bathy[la, lo] - 10.) > abs(z): + if (bathy[la, lo] - 10.) > abs(z): nmask[i] = 1 elif newSlice in ["OnShelf", 'AMM_Shelf']: - if bathy[la, lo] >= shelfDepth: + if bathy[la, lo] >= shelfDepth: nmask[i] = 1 elif newSlice in ["OffShelf", 'AMM_OffShelf']: - if bathy[la, lo] < shelfDepth: + if bathy[la, lo] < shelfDepth: nmask[i] = 1 if i > 0: try: diff --git a/bgcval2/bgcvaltools/pftnames.py b/bgcval2/bgcvaltools/pftnames.py index 994d1297..c98d93e1 100644 --- a/bgcval2/bgcvaltools/pftnames.py +++ b/bgcval2/bgcvaltools/pftnames.py @@ -209,7 +209,7 @@ def makeLongNameDict(): lnd['Chlorophylla'] = 'Chlorophyll' lnd['Chlorophyll_cci'] = "Chlorophyll (CCI)" lnd['Chlorophyll_pig'] = "Chlorophyll (Pigments)" - lnd['TotalChlorophyll'] = 'Total Chlorophyll' + lnd['TotalChlorophyll'] = 'Total Chlorophyll' lnd['CHD'] = "Diatom Chlorophyll" lnd['CHN'] = "Non-Diatom Chlorophyll" lnd['DiatomChlorophyll'] = "Diatom Chlorophyll" @@ -247,7 +247,7 @@ def makeLongNameDict(): lnd['VolumeMeanTemperature'] = "Volume-weighted Mean Temperature" lnd['GlobalMeanSalinity'] = "Global Volume-weighted Mean Salinity" - + lnd['TotalHeatFlux'] = "Global Total Heat Flux" lnd['HeatFlux'] = "Heat Flux" @@ -326,7 +326,7 @@ def makeLongNameDict(): lnd['SSS'] = 'Sea Surface Salinty' lnd['MA_DraKE'] = 'Drake Passage Current' - lnd['MA_AMOC_26N'] = 'AMOC at 26.5N' + lnd['MA_AMOC_26N'] = 'AMOC at 26.5N' lnd['MA_ZOS'] = 'Sea Surface Height' lnd['MA_MLD'] = 'Mixed Layer Depth' lnd['MA_MLD_Sigma'] = 'Mixed Layer Depth (Sigma)' @@ -400,6 +400,10 @@ def makeLongNameDict(): lnd['LabradorSea'] = "Labrador Sea" lnd['NorwegianSea'] = "Norwegian Sea" lnd['Cornwall'] = "Cornwall" + lnd['Ascension'] = "Ascension Island" + lnd['TristandaCunha'] = "Tristan da Cunha" + lnd['Pitcairn'] = "Pitcairn" + lnd['100m'] = "100m deep" lnd['200m'] = "200m deep" @@ -732,7 +736,7 @@ def getLongName(text, debug=False): def fancyUnits(units, debug=False): - """ + """ Converts ascii units string into latex style formatting. """ units = units.replace('[', '').replace(']', '') diff --git a/key_files/mpa_airseafluxco2.yml b/key_files/mpa_airseafluxco2.yml new file mode 100644 index 00000000..556b2701 --- /dev/null +++ b/key_files/mpa_airseafluxco2.yml @@ -0,0 +1,13 @@ +--- +name : AirSeaFluxCO2 +units : mmolC/m2/d +model : MEDUSA +modelgrid : eORCA1 +dimensions : 2 +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*$JOBIDo_1y_*_diad-T.nc +model_vars : CO2FLUX +model_convert : NoChange +layers : layerless +regions : Global Ascension TristandaCunha Pitcairn Cornwall + + diff --git a/key_files/mpa_alkalinity.yml b/key_files/mpa_alkalinity.yml new file mode 100644 index 00000000..285044b0 --- /dev/null +++ b/key_files/mpa_alkalinity.yml @@ -0,0 +1,23 @@ +--- +name : Alkalinity +units : meq/m^3 +model : MEDUSA +modelgrid : eORCA1 +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*$JOBID*_1y_*_ptrc-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/medusa*$JOBID*_1y_*$YEAR????_ptrc-T.nc +#dataFile : $BASEDIR_OBS/Alk.nc + +# # Model coordinates/dimension names +model_vars : ALK +model_convert : NoChange + +#data_vars : Alk +#data_convert: +# function: convertmeqm3TOumolkg + +layers : Surface #50m #;100m 200m 500m 1000m 2000m +regions : Global Ascension TristandaCunha Pitcairn Cornwall + diff --git a/key_files/mpa_chlorophyll.yml b/key_files/mpa_chlorophyll.yml new file mode 100644 index 00000000..f52c10fb --- /dev/null +++ b/key_files/mpa_chlorophyll.yml @@ -0,0 +1,20 @@ +--- +name : Chlorophyll +units : mg C/m^3 +model : MEDUSA +modelgrid : eORCA1 +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*_1y_*_ptrc-T.nc +gridFile : $BASEDIR_MODEL/mesh_mask_eORCA1_wrk.nc + +# Model coordinates/dimension names +model_vars : CHD CHN +model_convert : sum + +layers : Surface +regions : Global Ascension TristandaCunha Pitcairn Cornwall + + + diff --git a/key_files/mpa_dic.yml b/key_files/mpa_dic.yml new file mode 100644 index 00000000..5c9732d0 --- /dev/null +++ b/key_files/mpa_dic.yml @@ -0,0 +1,19 @@ +--- +name : DIC +units : mmol C/m^3 +model : MEDUSA +modelgrid : eORCA1 +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*$JOBIDo_1y_*_ptrc-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/medusa*$JOBIDo_1y_*$YEAR????_ptrc-T.nc + +# # Model coordinates/dimension names +model_vars : DIC +model_convert : NoChange + + +layers : Surface #50m #;100m 200m 500m 1000m 2000m +regions : Global Ascension TristandaCunha Pitcairn Cornwall + diff --git a/key_files/mpa_iron.yml b/key_files/mpa_iron.yml new file mode 100644 index 00000000..96a2793c --- /dev/null +++ b/key_files/mpa_iron.yml @@ -0,0 +1,32 @@ +--- +name : Iron +units : mmol Fe/m^3 +datasource : Initial Conditions +model : MEDUSA +modelgrid : eORCA1 +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*$JOBIDo_1y_*_ptrc-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/medusa*$JOBDo_1y_*$YEAR????_ptrc-T.nc +#dataFile : /data/euryale7/backup/ledm/UKESM/InitialConditions/UKESM_fields_1860_eORCA1_small.nc +gridFile : $BASEDIR_MODEL/mesh_mask_eORCA1_wrk.nc + +# Model coordinates/dimension names +model_vars : FER +model_convert : + function: multiplyBy + factor : 1000 + +# Data coordinates names +#data_vars : FER +#data_tdict : ZeroToZero +#data_convert : multiplyBy +#data_convert_factor : 1000 + +layers : Surface #Transect ;CanRusTransect PTransect SOTransect Equator ArcTransect AntTransect ArcTransect AntTransect +regions : Global Ascension TristandaCunha Pitcairn Cornwall + + + + diff --git a/key_files/mpa_mld.yml b/key_files/mpa_mld.yml new file mode 100644 index 00000000..3d37268e --- /dev/null +++ b/key_files/mpa_mld.yml @@ -0,0 +1,35 @@ +--- +name : MLD +units : m +dimensions : 2 +model : NEMO +datasource : IFERMER + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/nemo*_$JOBIDo_1y_*_grid-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/nemo*_$JOBIDo_1y_*$YEAR????_grid-T.nc +dataFile : $BASEDIR_OBS/IFREMER-MLD/mld_DT02_c1m_reg2.0-annual.nc + +# Model coordinates/dimension names +model_vars : mlotst +model_convert : NoChange +layers : layerless + +#model_vars : somxl010 somxzint1 +#model_convert: +# path: bgcval2/functions/applyLandMask.py +# function: applyLandMask +# areafile: $PATHS_GRIDFILE +# maskname : tmask + +data_vars : mld +data_tdict : ZeroToZero +data_convert: + path: bgcval2/functions/applyLandMask.py + function: applyLandMask + maskname : mask + areafile: $BASEDIR_OBS/IFREMER-MLD/mld_DT02_c1m_reg2.0-annual.nc +#layers : Surface +#regions : Global ignoreInlandSeas SouthernOcean ArcticOcean Equator10 NorthPacificOcean SouthPacificOcean NorthAtlanticOcean SouthAtlanticOcean +regions : Global Ascension TristandaCunha Pitcairn Cornwall + diff --git a/key_files/mpa_nitrate.yml b/key_files/mpa_nitrate.yml new file mode 100644 index 00000000..de9e2ec7 --- /dev/null +++ b/key_files/mpa_nitrate.yml @@ -0,0 +1,27 @@ +--- +name : Nitrate +units : mmol N/m^3 +datasource : WOA +model : MEDUSA +modelgrid : eORCA1 +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*$JOBID*_1y_*_ptrc-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/medusa*$JOBID*_1y_*$YEAR????_ptrc-T.nc +dataFile : $BASEDIR_OBS/WOA/annual/woa13_all_n00_01.nc + +# Model coordinates/dimension names +model_vars : DIN +model_convert : NoChange + +# Data coordinates names +data_vars : n_an +data_convert : NoChange +data_tdict : ZeroToZero + +layers : Surface 50m #;100m 200m 500m 1000m 2000m +regions : Global Ascension TristandaCunha Pitcairn Cornwall + + + diff --git a/key_files/mpa_oxygen.yml b/key_files/mpa_oxygen.yml new file mode 100644 index 00000000..c264fc7b --- /dev/null +++ b/key_files/mpa_oxygen.yml @@ -0,0 +1,25 @@ +--- +name : Oxygen +units : mmol O2/m^3 +datasource : WOA +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*_1y_*_ptrc-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/medusa*_1y_*$YEAR????_ptrc-T.nc +dataFile : $BASEDIR_OBS/WOA/annual/woa13_all_o00_01.nc + +# Model coordinates/dimension names +model_vars : OXY +model_convert : NoChange + +# Data coordinates names +data_vars : o_an +data_tdict : ZeroToZero +data_convert: + function: multiplyBy + factor : 44.661 + +layers : Surface 100m 500m +regions : Global Ascension TristandaCunha Pitcairn Cornwall + diff --git a/key_files/mpa_ph.yml b/key_files/mpa_ph.yml new file mode 100644 index 00000000..68915a93 --- /dev/null +++ b/key_files/mpa_ph.yml @@ -0,0 +1,17 @@ +--- +name : pH +units : '' +model : MEDUSA +modelgrid : eORCA1 +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*$JOBID*_1y_*_diad-T.nc +#modelFile_p2p : $BASEDIR_MODEL/$JOBID/medusa*$JOBID*_1y_*$YEAR????_ptrc-T.nc +# dataFile : $BASEDIR_OBS/WOA/annual/woa13_all_n00_01.nc +# # Model coordinates/dimension names +model_vars : PH3 +model_convert : NoChange + +layers : Surface #50m #;100m 200m 500m 1000m 2000m +regions : Global Ascension TristandaCunha Pitcairn Cornwall diff --git a/key_files/mpa_salinity.yml b/key_files/mpa_salinity.yml new file mode 100644 index 00000000..716f62e5 --- /dev/null +++ b/key_files/mpa_salinity.yml @@ -0,0 +1,23 @@ +--- +name : Salinity +units : PSU +dimensions : 3 +model : NEMO +datasource : WOA +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/nemo_$JOBIDo_1y_*_grid-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/nemo*$JOBIDo_1y_*$YEAR????_grid-T.nc +dataFile : $BASEDIR_OBS/WOA/annual/woa13_decav_s00_01v2.nc +gridFile : $PATHS_GRIDFILE + +# Model coordinates/dimension names +model_vars : so_abs so +model_convert : choose_best_var + +# Data coordinates names +data_vars : s_an +data_convert : NoChange +data_tdict : ZeroToZero + +layers : Surface +regions : Global Ascension TristandaCunha Pitcairn Cornwall diff --git a/key_files/mpa_silicate.yml b/key_files/mpa_silicate.yml new file mode 100644 index 00000000..46d74dee --- /dev/null +++ b/key_files/mpa_silicate.yml @@ -0,0 +1,25 @@ +--- +name : Silicate +units : mmol Si/m^3 +datasource : WOA +dimensions : 3 + +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/medusa*_1y_*_ptrc-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/medusa*_1y_*$YEAR????_ptrc-T.nc +dataFile : $BASEDIR_OBS/WOA/annual/woa13_all_i00_01.nc + +# Model coordinates/dimension names +model_vars : SIL +model_convert : NoChange + +# Data coordinates names +data_vars : i_an +data_convert : NoChange +data_tdict : ZeroToZero + +layers : Surface +regions : Global Ascension TristandaCunha Pitcairn Cornwall + + + diff --git a/key_files/mpa_temperature.yml b/key_files/mpa_temperature.yml new file mode 100644 index 00000000..d7ce291e --- /dev/null +++ b/key_files/mpa_temperature.yml @@ -0,0 +1,28 @@ +--- +name : Temperature +units : degrees C +dimensions : 3 +model : NEMO +datasource : WOA +# The filenames +modelFiles : $BASEDIR_MODEL/$JOBID/nemo_$JOBIDo_1y_*_grid-T.nc +modelFile_p2p : $BASEDIR_MODEL/$JOBID/nemo*$JOBIDo_1y_*$YEAR????_grid-T.nc +dataFile : $BASEDIR_OBS/WOA/annual/woa13_decav_t00_01v2.nc +gridFile : $PATHS_GRIDFILE + +# Model coordinates/dimension names +model_vars : thetao_con thetao +model_convert : choose_best_var + + +# Data coordinates names +data_vars : t_an +data_convert : NoChange +data_tdict : ZeroToZero + +layers : Surface +regions : Global Ascension TristandaCunha Pitcairn Cornwall + + + + diff --git a/key_lists/ukmpas.yml b/key_lists/ukmpas.yml new file mode 100644 index 00000000..bd277f3b --- /dev/null +++ b/key_lists/ukmpas.yml @@ -0,0 +1,35 @@ +--- +# UK MPAS +# A short list of key metrics to study MPAs. +keys: + # Useful metrics for everything + GlobalMeanTemperature: True + DrakePassageTransport: True + AMOC_26N: True + TotalAirSeaFluxCO2: True + TotalIceExtent: True + + # Nutrients + MPA_Nitrate: True # WOA Nitrate + MPA_Silicate: True # WOA Siliate + MPA_Iron: True # Iron + + # Chlorophyll, Production, Export and DMS + MPA_Chlorophyll: True # Total Chlorophyll + MPA_IntPP: True # Global Total Integrated Primary Production + + # Carbonate system: + MPA_Alkalinity: True # Glodap Alkalinity + MPA_pH: True + MPA_DIC: True # Globap dissolved inorganic carbon + MPA_AirSeaFluxCO2: True # Air Sea Flux of CO2 + # Oxygen: + MPA_Oxygen: True # WOA Oxygen + + MPA_Temperature: True # WOA Temperature + MPA_Salinity: True # WOA Salinity + MPA_MLD: True # iFERMER Mixed Layer Depth + + + + From 54780e7009af78517a0d43e5fa65b79fe80d05b9 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Wed, 22 Nov 2023 16:02:20 +0000 Subject: [PATCH 18/45] added new mpa regions --- bgcval2/bgcvaltools/makeMask.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/bgcval2/bgcvaltools/makeMask.py b/bgcval2/bgcvaltools/makeMask.py index afdf354d..405dc225 100644 --- a/bgcval2/bgcvaltools/makeMask.py +++ b/bgcval2/bgcvaltools/makeMask.py @@ -275,6 +275,20 @@ def makeMask(name, newSlice, xt, xz, xy, xx, xd, debug=False): mx += np.ma.masked_outside(xy, -10.813, -5.053).mask # Lattitue return mx + if newSlice == 'TristandaCunha': # MPA covers two islands. This is very approximate + # Edinburgh of 7 seas: -37.10646514207477 South,, -12.297874143783694 West + # Gough island: -40.322968275628654 South, -9.935193569988446 West + mx = np.ma.masked_outside(xx, -12.3 - 3., -9.9 + 3.).mask # longitude # West + mx += np.ma.masked_outside(xy, -40.3 -3, -37.1 + 3.).mask # Lattitue # South + return mx + + if newSlice == 'Pitcairn': # MPA covers several islands. This is very approximate + # Ducie Island: 24.66 S 124.75 W (Eastern most) + # Oeno island: 23.9 S 130.74 W (western most) (Western boundary is not the full EEZ) + mx = np.ma.masked_outside(xx, -130.74 - 1.5., 124.75 + 3.).mask # longitude # West + mx += np.ma.masked_outside(xy, -24.66 -3, -23.9 + 3.).mask # Lattitue # South + return mx + if newSlice == 'WeddelSea': mx = np.ma.masked_outside(xx, -60., -20.).mask From 974d8060953db8b39955e97b8bac931c2d4de1e3 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 10:03:14 +0000 Subject: [PATCH 19/45] adde fixes --- bgcval2/bgcvaltools/makeMask.py | 2 +- key_lists/debug.yml | 4 ++-- key_lists/{ukmpas.yml => mpas.yml} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename key_lists/{ukmpas.yml => mpas.yml} (92%) diff --git a/bgcval2/bgcvaltools/makeMask.py b/bgcval2/bgcvaltools/makeMask.py index 405dc225..e7463a2a 100644 --- a/bgcval2/bgcvaltools/makeMask.py +++ b/bgcval2/bgcvaltools/makeMask.py @@ -285,7 +285,7 @@ def makeMask(name, newSlice, xt, xz, xy, xx, xd, debug=False): if newSlice == 'Pitcairn': # MPA covers several islands. This is very approximate # Ducie Island: 24.66 S 124.75 W (Eastern most) # Oeno island: 23.9 S 130.74 W (western most) (Western boundary is not the full EEZ) - mx = np.ma.masked_outside(xx, -130.74 - 1.5., 124.75 + 3.).mask # longitude # West + mx = np.ma.masked_outside(xx, -130.74 - 1.5, 124.75 + 3.).mask # longitude # West mx += np.ma.masked_outside(xy, -24.66 -3, -23.9 + 3.).mask # Lattitue # South return mx diff --git a/key_lists/debug.yml b/key_lists/debug.yml index dbecdaca..9f666ca1 100644 --- a/key_lists/debug.yml +++ b/key_lists/debug.yml @@ -8,9 +8,9 @@ keys: # SouthernTotalIceExtent: True # DrakePassageTransport: True # AMOC_26N: True -# GlobalMeanTemperature: True + GlobalMeanTemperature: True # Temperature: True - Iron: True +# Iron: True # GlobalMeanSalinity: True # Salinity: True # MLD: True diff --git a/key_lists/ukmpas.yml b/key_lists/mpas.yml similarity index 92% rename from key_lists/ukmpas.yml rename to key_lists/mpas.yml index bd277f3b..52689a35 100644 --- a/key_lists/ukmpas.yml +++ b/key_lists/mpas.yml @@ -16,7 +16,7 @@ keys: # Chlorophyll, Production, Export and DMS MPA_Chlorophyll: True # Total Chlorophyll - MPA_IntPP: True # Global Total Integrated Primary Production + #MPA_IntPP: True # Global Total Integrated Primary Production # Carbonate system: MPA_Alkalinity: True # Glodap Alkalinity From a2f78772de2158ddc9e33bde4cef6afdb56f89eb Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 10:03:30 +0000 Subject: [PATCH 20/45] added mpa yml --- input_yml/TerraFIRMA_overshoot_mpas.yml | 120 ++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 input_yml/TerraFIRMA_overshoot_mpas.yml diff --git a/input_yml/TerraFIRMA_overshoot_mpas.yml b/input_yml/TerraFIRMA_overshoot_mpas.yml new file mode 100644 index 00000000..1b380f7e --- /dev/null +++ b/input_yml/TerraFIRMA_overshoot_mpas.yml @@ -0,0 +1,120 @@ +--- +# GC5 N96 ORCA1 spinup analysis +name: TerraFIRMA_overshoot_MPAs + +# Run the single job analysis +do_analysis_timeseries: True + +# Download from mass: +do_mass_download: False + +# master analysis suite +master_suites: kmf mpas # physics bgc #alkalinity physics kmf1 + +# Run without strick check (if True, breaks if job has no years.) +strict_file_check: False + +clean: True + +jobs: + u-cs495: + description: 'PI-Control' + label: 'Pi-Control' + colour: 'blue' + thickness: 1.2 + linestyle: '-' + shifttime: -100. + timerange: [1850, 2200] + suite: kmf mpas #physics bgc #alkalinity physics + + + u-cx209: + description: 'E-mode free ice RAMP UP 8GtC/yr #1' + label: 'Ramp-up' + colour: 'black' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas #physics bgc #alkalinity physics + + # 1.5k Stabilisation + u-cy837: + description: '1.5K Stabilisation from u-cx209 (#1)' + label: '1.5K Stable' + colour: 'lawngreen' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas # physics bgc #alkalinity physics + + + # 2k Stabilisation + u-cy838: + description: '2.0K Stabilisation from u-cx209 (#1)' + label: '2K Stable' + colour: 'goldenrod' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas # physics bgc #alkalinity physics + + + # other Stabilisations + u-cz375: + description: '3.0K Stabilisation from u-cx209 (#1)' + label: '3K Stable' + colour: 'red' # + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas # physics bgc #alkalinity physics + u-cz376: + description: '4.0K Stabilisation from u-cx209 (#1)' + label: '4K Stable' + colour: 'sienna' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas # physics bgc #alkalinity physics + u-cz377: + description: '5.0K Stabilisation from u-cx209 (#1)' + label: '5K Stable' + colour: 'maroon' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas # physics bgc #alkalinity physics + + # Ramp downs + u-da697: + description: '1.5K Rampdown from u-cx209 (#1)' + label: '1.5K Rampdown' + colour: 'lawngreen' + thickness: 1.2 + linestyle: ':' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas # physics bgc #alkalinity physics + + u-cz944: + description: 'Ramp down from cy838 (- 2.0K Stabilisation from u-cx209) (#1)' + label: '2K Rampdown' + colour: 'goldenrod' + thickness: 1.2 + linestyle: 'dashed' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf mpas #physics bgc #alkalinity physics + + + + + + + From c530c9f75f48b505dca14c0e7874643de378e8a8 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 10:49:22 +0000 Subject: [PATCH 21/45] working lotus script for single time series --- lotus_timeseries.sh | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 lotus_timeseries.sh diff --git a/lotus_timeseries.sh b/lotus_timeseries.sh new file mode 100644 index 00000000..99fbc3aa --- /dev/null +++ b/lotus_timeseries.sh @@ -0,0 +1,72 @@ +#!/bin/bash +#SBATCH --job-name=bgcval2 +#SBATCH --partition=short-serial +#SBATCH --time 6:00:00 +#SBATCH -o logs/log_bgcval2_ts_%J.out +#SBATCH -e logs/log_bgcval3_ts_%J.err + + +###################### +# First make a copy of this file: +# rysnc -av lotus_bgcval2.sh lotus_bgcval2_$USER.sh +# +# Then edit your new copy (lotus_bgcval2_$USER.sh): +# +# 1. Check the name of your conda environment: CONDA_ENV +# "bgcval2" is the default, but may have a different one. +# +# 2. Check the path to your bgcval2 directory: BGCVAL2_PATH +# +# 3. Change the analyses to run: BGCVAL2_SUITE +# You can add several suites here if needed. +# +# 4. Submit this script with with: +# sbatch lotus_bgcval2_$USER.sh +# +# 5. Monitor progress with: +# squeue | grep $USER +# +######################### + + + +######################### +# Edit these bits: + +# Change this to your bgcval2 conda environment name +CONDA_ENV=bgcval2 + +# Change this to your bgcval2 directory - or wheever you wish to run. +#BGCVAL2_PATH=$PWD + +# Add one or more input_yml files here +#BGCVAL2_SUITE2=input_yml/my_bgcval2_suite2.yml + +########################## +# Source global definitions +if [ -f ~/.bashrc ]; then + echo 'source ~/.bashrc' + source ~/.bashrc +fi + +########################## +# load your conda env: +#conda activate bgcval2 +echo conda activate $CONDA_ENV +conda activate ${CONDA_ENV} + +########################## +# Change directory to your bgcval2 directory: +#echo cd $BGCVAL2_PATH +#cd $BGCVAL2_PATH +#pwd + +jobID=$1 +keys=$2 + +echo "analysis timeseries -j $jobID -k $2" +analysis_timeseries -j $jobID -k $2 +######################### +# Add one or more input_yml files here +#cho analysis_timeseries -y $BGCVAL2_SUITE +#nalysis_timeseries -y $BGCVAL2_SUITE From 5fb37d9f7063966dd57135dd3c04c1e3886aa25c Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 12:07:29 +0000 Subject: [PATCH 22/45] created parrellel_timeseries analysis --- bgcval2/parrellel_timeseries.py | 1 + setup.py | 1 + 2 files changed, 2 insertions(+) create mode 100644 bgcval2/parrellel_timeseries.py diff --git a/bgcval2/parrellel_timeseries.py b/bgcval2/parrellel_timeseries.py new file mode 100644 index 00000000..07f86497 --- /dev/null +++ b/bgcval2/parrellel_timeseries.py @@ -0,0 +1 @@ +starting here. diff --git a/setup.py b/setup.py index 015512b2..9006a4e8 100755 --- a/setup.py +++ b/setup.py @@ -201,6 +201,7 @@ def read_authors(filename): 'analysis_level3_sameYear = bgcval2.analysis_level3_sameYear:main', 'analysis_p2p = bgcval2.analysis_p2p:run', 'analysis_timeseries = bgcval2.analysis_timeseries:main', + 'parrallel_timeseries = bgcval2.parrellel_timeseries:main', 'download_from_mass = bgcval2.download_from_mass:main', 'bgcval2_make_report = bgcval2.bgcval2_make_report:main', ], From 93a4a1a934b954b05a0b4cd7b59efa85a7e4b802 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 12:51:18 +0000 Subject: [PATCH 23/45] working here. --- bgcval2/parrellel_timeseries.py | 117 +++++++++++++++++++++++++++++++- lotus_timeseries.sh | 4 +- 2 files changed, 118 insertions(+), 3 deletions(-) diff --git a/bgcval2/parrellel_timeseries.py b/bgcval2/parrellel_timeseries.py index 07f86497..fc98c324 100644 --- a/bgcval2/parrellel_timeseries.py +++ b/bgcval2/parrellel_timeseries.py @@ -1 +1,116 @@ -starting here. +#!/usr/bin/env python +# +# Copyright 2015, Plymouth Marine Laboratory +# +# This file is part of the bgc-val library. +# +# bgc-val is free software: you can redistribute it and/or modify it +# under the terms of the Revised Berkeley Software Distribution (BSD) 3-clause license. + +# bgc-val is distributed in the hope that it will be useful, but +# without any warranty; without even the implied warranty of merchantability +# or fitness for a particular purpose. See the revised BSD license for more details. +# You should have received a copy of the revised BSD license along with bgc-val. +# If not, see . +# +# Address: +# Plymouth Marine Laboratory +# Prospect Place, The Hoe +# Plymouth, PL1 3DH, UK +# +# Email: +# ledm@pml.ac.uk +# +""" +.. module:: analysis_timeseries + :platform: Unix + :synopsis: A script to produce analysis for time series. + +.. moduleauthor:: Lee de Mora + +""" +import argparse +import subprocess + +from bgcval2.analysis_compare import load_comparison_yml + + +def get_args(): + """Parse command line arguments.""" + parser = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + + parser.add_argument('-y', + '--compare_yml', + nargs='+', + type=str, + help='One or more Comparison Analysis configuration file, for examples see bgcval2 input_yml directory.', + required=True, + ) + + parser.add_argument('-c', + '--config-file', + default=os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'default-bgcval2-config.yml'), + help='User configuration file (for paths).', + required=False) + + parser.add_argument('--dry_run', + '-d', + default=False, + help='When True: Do not submit the jobs to lotus.', + action=argparse.BooleanOptionalAction, + required=False) + + args = parser.parse_args() + + return args + +def submits_lotus(compare_yml, config_user, dry_run=False): + """ + Loads the yaml file and submits individual time series to sbatch. + """ + # Below here is analysis + details = load_comparison_yml(compare_yml) + jobs = details['jobs'] + + user='ldemora' + out = str(subprocess.check_output(["squeue", "--user="+user])) + + for job in jobs: + suites = details['suites'][job] + if out.find(job) > -1: + print("That job exists already: skipping", job) + if dry_run: + print(' '.join(['sbatch', 'lotus_timeseries.sh', job, suites]) ) + else: + command1 = subprocess.Popen(['sbatch', 'lotus_timeseries.sh', job, suites]) + + +def main(): + + """Run the main routine.""" + args = get_args() + + # This has a sensible default value. + config_user=args.config_file + + # This shouldn't fail as it's a required argument. + compare_ymls = args.compare_yml + + for compare_yml in compare_ymls: + print(f"analysis_timeseries: Comparison config file {compare_yml}") + + if not os.path.isfile(compare_yml): + print(f"analysis_timeseries: Could not find comparison config file {compare_yml}") + sys.exit(1) + dry_run = compare_yml.dry_run + submits_lotus(compare_yml, config_user, dry_run) + + +if __name__ == "__main__": + from ._version import __version__ + print(f'BGCVal2: {__version__}') + main() + diff --git a/lotus_timeseries.sh b/lotus_timeseries.sh index 99fbc3aa..c2e21e32 100644 --- a/lotus_timeseries.sh +++ b/lotus_timeseries.sh @@ -1,5 +1,5 @@ #!/bin/bash -#SBATCH --job-name=bgcval2 +#SBATCH --job-name=$1 #SBATCH --partition=short-serial #SBATCH --time 6:00:00 #SBATCH -o logs/log_bgcval2_ts_%J.out @@ -65,7 +65,7 @@ jobID=$1 keys=$2 echo "analysis timeseries -j $jobID -k $2" -analysis_timeseries -j $jobID -k $2 +#analysis_timeseries -j $jobID -k $2 ######################### # Add one or more input_yml files here #cho analysis_timeseries -y $BGCVAL2_SUITE From 9a25b7ef71e2fc7226436e4214e02aace26f87c4 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 12:51:52 +0000 Subject: [PATCH 24/45] Update .gitignore working here --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index de6e55f9..1478f966 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,7 @@ local_test/BGC_data/valeriu mass_scripts CompareReports2 .idea/workspace.xml +*.iml +.idea/inspectionProfiles/profiles_settings.xml +.idea/misc.xml +.idea/vcs.xml From da0f257deb8bc73f52241c3a6b8cb03c15c57f73 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 14:13:11 +0000 Subject: [PATCH 25/45] testing sbatch --- bgcval2/parrellel_timeseries.py | 13 +++++++++--- lotus_timeseries.sh | 35 +++++++++++---------------------- 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/bgcval2/parrellel_timeseries.py b/bgcval2/parrellel_timeseries.py index fc98c324..e914eb84 100644 --- a/bgcval2/parrellel_timeseries.py +++ b/bgcval2/parrellel_timeseries.py @@ -31,6 +31,7 @@ """ import argparse import subprocess +from getpass import getuser from bgcval2.analysis_compare import load_comparison_yml @@ -75,17 +76,23 @@ def submits_lotus(compare_yml, config_user, dry_run=False): details = load_comparison_yml(compare_yml) jobs = details['jobs'] - user='ldemora' + user = getuser() out = str(subprocess.check_output(["squeue", "--user="+user])) for job in jobs: suites = details['suites'][job] + if out.find(job) > -1: print("That job exists already: skipping", job) + + command_txt = ['sbatch', '-J', job, 'lotus_timeseries.sh', job] + for suite in suites: + command_txt.append(suite) if dry_run: - print(' '.join(['sbatch', 'lotus_timeseries.sh', job, suites]) ) + print(' '.join(command_txt)) else: - command1 = subprocess.Popen(['sbatch', 'lotus_timeseries.sh', job, suites]) + # Submit job: + command1 = subprocess.Popen(command_txt) def main(): diff --git a/lotus_timeseries.sh b/lotus_timeseries.sh index c2e21e32..92488145 100644 --- a/lotus_timeseries.sh +++ b/lotus_timeseries.sh @@ -7,25 +7,10 @@ ###################### -# First make a copy of this file: -# rysnc -av lotus_bgcval2.sh lotus_bgcval2_$USER.sh -# -# Then edit your new copy (lotus_bgcval2_$USER.sh): -# -# 1. Check the name of your conda environment: CONDA_ENV -# "bgcval2" is the default, but may have a different one. -# -# 2. Check the path to your bgcval2 directory: BGCVAL2_PATH -# -# 3. Change the analyses to run: BGCVAL2_SUITE -# You can add several suites here if needed. -# -# 4. Submit this script with with: -# sbatch lotus_bgcval2_$USER.sh -# -# 5. Monitor progress with: -# squeue | grep $USER +# This script runs a single time series job. # +# Runs: +# lotus_timeseries.sh jobID suite1 suite2 etc... ######################### @@ -61,11 +46,15 @@ conda activate ${CONDA_ENV} #cd $BGCVAL2_PATH #pwd -jobID=$1 -keys=$2 - -echo "analysis timeseries -j $jobID -k $2" -#analysis_timeseries -j $jobID -k $2 +########################## +# Load command line arguments: +args=$@ +jobID="${a%% *}" +suites="${@:2}" +echo $suites + +echo "analysis timeseries -j $jobID -k $suites" +#analysis_timeseries -j $jobID -k $suites ######################### # Add one or more input_yml files here #cho analysis_timeseries -y $BGCVAL2_SUITE From 19465fc0c1535ef6af099f354dd5d11098c10ace Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 14:13:59 +0000 Subject: [PATCH 26/45] working and debuggin. --- lotus_timeseries.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lotus_timeseries.sh b/lotus_timeseries.sh index c2e21e32..8fd2b73c 100644 --- a/lotus_timeseries.sh +++ b/lotus_timeseries.sh @@ -1,5 +1,5 @@ #!/bin/bash -#SBATCH --job-name=$1 +#SBATCH --job-name=bgcval2 #SBATCH --partition=short-serial #SBATCH --time 6:00:00 #SBATCH -o logs/log_bgcval2_ts_%J.out From b8da78cec2db88270dced02abed388a43b8ee7da Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 14:34:03 +0000 Subject: [PATCH 27/45] debugs and tests and prints. --- bgcval2/parrellel_timeseries.py | 12 ++++++++++-- lotus_timeseries.sh | 8 +++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/bgcval2/parrellel_timeseries.py b/bgcval2/parrellel_timeseries.py index e914eb84..b721443e 100644 --- a/bgcval2/parrellel_timeseries.py +++ b/bgcval2/parrellel_timeseries.py @@ -31,6 +31,8 @@ """ import argparse import subprocess +import os + from getpass import getuser from bgcval2.analysis_compare import load_comparison_yml @@ -81,17 +83,23 @@ def submits_lotus(compare_yml, config_user, dry_run=False): for job in jobs: suites = details['suites'][job] + print(suites) + if isinstance(suites, str): + suites = suites.split(' ') if out.find(job) > -1: print("That job exists already: skipping", job) + continue command_txt = ['sbatch', '-J', job, 'lotus_timeseries.sh', job] for suite in suites: command_txt.append(suite) + print(' '.join(command_txt)) if dry_run: - print(' '.join(command_txt)) + print('Not submitting (dry-run):', ' '.join(command_txt)) else: # Submit job: + print('Submitting:', ' '.join(command_txt)) command1 = subprocess.Popen(command_txt) @@ -112,7 +120,7 @@ def main(): if not os.path.isfile(compare_yml): print(f"analysis_timeseries: Could not find comparison config file {compare_yml}") sys.exit(1) - dry_run = compare_yml.dry_run + dry_run = args.dry_run submits_lotus(compare_yml, config_user, dry_run) diff --git a/lotus_timeseries.sh b/lotus_timeseries.sh index 23bae130..b6b81c36 100644 --- a/lotus_timeseries.sh +++ b/lotus_timeseries.sh @@ -1,23 +1,21 @@ #!/bin/bash -#SBATCH --job-name=bgcval2 #SBATCH --partition=short-serial #SBATCH --time 6:00:00 #SBATCH -o logs/log_bgcval2_ts_%J.out #SBATCH -e logs/log_bgcval3_ts_%J.err +# slurm job name should be set in the command line with -J option to the jobID ###################### # This script runs a single time series job. # # Runs: -# lotus_timeseries.sh jobID suite1 suite2 etc... +# sbatch -J jobID lotus_timeseries.sh jobID suite1 suite2 etc... +# ######################### - ######################### -# Edit these bits: - # Change this to your bgcval2 conda environment name CONDA_ENV=bgcval2 From 860a6b345ad67d3da889a8b4445b1d6745130e5c Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 15:28:51 +0000 Subject: [PATCH 28/45] working fixes --- bgcval2/parrellel_timeseries.py | 32 ++++++++++++++++-------- bgcval2/timeseries/timeseriesAnalysis.py | 2 +- lotus_timeseries.sh | 6 ++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/bgcval2/parrellel_timeseries.py b/bgcval2/parrellel_timeseries.py index b721443e..30e07bed 100644 --- a/bgcval2/parrellel_timeseries.py +++ b/bgcval2/parrellel_timeseries.py @@ -22,9 +22,9 @@ # ledm@pml.ac.uk # """ -.. module:: analysis_timeseries +.. module:: parrallel_timeseries :platform: Unix - :synopsis: A script to produce analysis for time series. + :synopsis: A script to submit slurm scripts time series. .. moduleauthor:: Lee de Mora @@ -32,6 +32,7 @@ import argparse import subprocess import os +import sys from getpass import getuser @@ -67,34 +68,45 @@ def get_args(): required=False) args = parser.parse_args() - return args + def submits_lotus(compare_yml, config_user, dry_run=False): """ Loads the yaml file and submits individual time series to sbatch. """ - # Below here is analysis + # Load details from yml file details = load_comparison_yml(compare_yml) + + # list of job IDS jobs = details['jobs'] + # username user = getuser() + + # Load current on-going list of this users slurm jobs: out = str(subprocess.check_output(["squeue", "--user="+user])) + # loop over jobs: for job in jobs: - suites = details['suites'][job] - print(suites) - if isinstance(suites, str): - suites = suites.split(' ') - + # Check whether there's already a job running for this jobID if out.find(job) > -1: print("That job exists already: skipping", job) continue + # Get list of suites for each job + suites = details['suites'][job] + + # Make it a list: + if isinstance(suites, str): + suites = suites.split(' ') + + # prepare the command command_txt = ['sbatch', '-J', job, 'lotus_timeseries.sh', job] for suite in suites: command_txt.append(suite) - print(' '.join(command_txt)) + + # Send it! if dry_run: print('Not submitting (dry-run):', ' '.join(command_txt)) else: diff --git a/bgcval2/timeseries/timeseriesAnalysis.py b/bgcval2/timeseries/timeseriesAnalysis.py index 99bd7899..83096752 100644 --- a/bgcval2/timeseries/timeseriesAnalysis.py +++ b/bgcval2/timeseries/timeseriesAnalysis.py @@ -137,7 +137,7 @@ def loadModel(self): if self.debug: print("timeseriesAnalysis:\tloadModel.") #### # load and calculate the model info - if glob.glob(self.shelvefn): + if glob.glob(self.shelvefn+'*'): # shelve files have .bak .dat .dir files now sh = shOpen(self.shelvefn) print('seems fine:', self.shelvefn) sh = shOpen(self.shelvefn) diff --git a/lotus_timeseries.sh b/lotus_timeseries.sh index b6b81c36..7654936d 100644 --- a/lotus_timeseries.sh +++ b/lotus_timeseries.sh @@ -47,12 +47,12 @@ conda activate ${CONDA_ENV} ########################## # Load command line arguments: args=$@ -jobID="${a%% *}" +jobID=$1 suites="${@:2}" echo $suites -echo "analysis timeseries -j $jobID -k $suites" -#analysis_timeseries -j $jobID -k $suites +echo "analysis_timeseries -j $jobID -k $suites" +analysis_timeseries -j ${jobID} -k ${suites} ######################### # Add one or more input_yml files here #cho analysis_timeseries -y $BGCVAL2_SUITE From b18cb8e5780404fd950bb46411beec54c107e20f Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 15:30:06 +0000 Subject: [PATCH 29/45] on-going TF runs --- input_yml/TerraFIRMA_overshoot_runs.yml | 194 ++++++++++++++++++ .../TerraFIRMA_overshoot_runs_minimal.yml | 120 +++++++++++ 2 files changed, 314 insertions(+) create mode 100644 input_yml/TerraFIRMA_overshoot_runs.yml create mode 100644 input_yml/TerraFIRMA_overshoot_runs_minimal.yml diff --git a/input_yml/TerraFIRMA_overshoot_runs.yml b/input_yml/TerraFIRMA_overshoot_runs.yml new file mode 100644 index 00000000..ca5154d5 --- /dev/null +++ b/input_yml/TerraFIRMA_overshoot_runs.yml @@ -0,0 +1,194 @@ +--- +# GC5 N96 ORCA1 spinup analysis +name: TerraFIRMA_overshoot_runs + +# Run the single job analysis +do_analysis_timeseries: True + +# Download from mass: +do_mass_download: False + +# master analysis suite +master_suites: physics bgc kmf #alkalinity physics kmf1 + +# Run without strick check (if True, breaks if job has no years.) +strict_file_check: False + +clean: True + +jobs: + u-cs495: + description: 'PI-Control' + label: 'PIcontrol' + colour: 'blue' + thickness: 1.2 + linestyle: '-' + shifttime: -100. + timerange: [1850, 2300] + suite: kmf physics bgc #alkalinity physics + + + u-cx209: + description: 'E-mode free ice RAMP UP 8GtC/yr #1' + label: 'Ramp-up #1' + colour: 'black' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + u-cw988: + description: 'E-mode free ice RAMP UP 8GtC/yr #2' + label: 'Ramp-up #2' + colour: 'black' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + u-cw989: + description: 'E-mode free ice RAMP UP 8GtC/yr #3' + label: 'Ramp-up #3' + colour: 'black' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + u-cw990: + description: 'E-mode free ice RAMP UP 8GtC/yr #4' + label: 'Ramp-up #4' + colour: 'black' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + # 1.5k Stabilisation + u-cy837: + description: '1.5K Stabilisation from u-cx209 (#1)' + label: '1.5K Stable #1' + colour: 'lawngreen' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + u-cz834: + description: '1.5K Stabilisation from u-cw988 (#2)' + label: '1.5K Stable #2' + colour: 'lawngreen' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + u-da087: + description: '1.5K Stabilisation from u-cw989 (#3)' + label: '1.5K Stable #3' + colour: 'lawngreen' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + # 2k Stabilisation + u-cy838: + description: '2.0K Stabilisation from u-cx209 (#1)' + label: '2K Stable #1' + colour: 'goldenrod' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + u-cz855: + description: '2.0K Stabilisation from cw988 (#2)' + label: '2K Stable #2' + colour: 'goldenrod' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + + # 2.5k Stabilisation + u-cz374: + description: '2.5K Stabilisation from u-cx209 (#1)' + label: '2.5K Stable #1' + colour: 'orange' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + u-cz859: + description: '2.5K Stabilisation from cw988 (#2)' + label: '2.5K Stable #2' + colour: 'orange' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + + # other Stabilisations + u-cz375: + description: '3.0K Stabilisation from u-cx209 (#1)' + label: '3K Stable #1' + colour: 'red' # + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + u-cz376: + description: '4.0K Stabilisation from u-cx209 (#1)' + label: '4K Stable #1' + colour: 'sienna' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + u-cz377: + description: '5.0K Stabilisation from u-cx209 (#1)' + label: '5K Stable #1' + colour: 'maroon' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + # Ramp downs + u-cz944: + description: 'Ramp down from cy838 (- 2.0K Stabilisation from u-cx209) (#1)' + label: '2K Rampdown #1' + colour: 'goldenrod' + thickness: 1.2 + linestyle: ':' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + u-da697: + description: '1.5K Rampdown from u-cx209 (#1)' + label: '1.5K Rampdown #1' + colour: 'lawngreen' + thickness: 1.2 + linestyle: ':' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + + diff --git a/input_yml/TerraFIRMA_overshoot_runs_minimal.yml b/input_yml/TerraFIRMA_overshoot_runs_minimal.yml new file mode 100644 index 00000000..cfa54aac --- /dev/null +++ b/input_yml/TerraFIRMA_overshoot_runs_minimal.yml @@ -0,0 +1,120 @@ +--- +# GC5 N96 ORCA1 spinup analysis +name: TerraFIRMA_overshoot_runs_minimal + +# Run the single job analysis +do_analysis_timeseries: True + +# Download from mass: +do_mass_download: False + +# master analysis suite +master_suites: kmf # physics bgc #alkalinity physics kmf1 + +# Run without strick check (if True, breaks if job has no years.) +strict_file_check: False + +clean: True + +jobs: + u-cs495: + description: 'PI-Control' + label: 'Pi-Control' + colour: 'blue' + thickness: 1.2 + linestyle: '-' + shifttime: -100. + timerange: [1850, 2200] + suite: kmf #physics bgc #alkalinity physics + + + u-cx209: + description: 'E-mode free ice RAMP UP 8GtC/yr #1' + label: 'Ramp-up' + colour: 'black' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf #physics bgc #alkalinity physics + + # 1.5k Stabilisation + u-cy837: + description: '1.5K Stabilisation from u-cx209 (#1)' + label: '1.5K Stable' + colour: 'lawngreen' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf # physics bgc #alkalinity physics + + + # 2k Stabilisation + u-cy838: + description: '2.0K Stabilisation from u-cx209 (#1)' + label: '2K Stable' + colour: 'goldenrod' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf # physics bgc #alkalinity physics + + + # other Stabilisations + u-cz375: + description: '3.0K Stabilisation from u-cx209 (#1)' + label: '3K Stable' + colour: 'red' # + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf # physics bgc #alkalinity physics + u-cz376: + description: '4.0K Stabilisation from u-cx209 (#1)' + label: '4K Stable' + colour: 'sienna' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf # physics bgc #alkalinity physics + u-cz377: + description: '5.0K Stabilisation from u-cx209 (#1)' + label: '5K Stable' + colour: 'maroon' + thickness: 1.2 + linestyle: '-' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf # physics bgc #alkalinity physics + + # Ramp downs + u-da697: + description: '1.5K Rampdown from u-cx209 (#1)' + label: '1.5K Rampdown' + colour: 'lawngreen' + thickness: 1.2 + linestyle: ':' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf # physics bgc #alkalinity physics + + u-cz944: + description: 'Ramp down from cy838 (- 2.0K Stabilisation from u-cx209) (#1)' + label: '2K Rampdown' + colour: 'goldenrod' + thickness: 1.2 + linestyle: 'dashed' + shifttime: 0. + #timerange: [1800, 2050] + suite: kmf physics bgc #alkalinity physics + + + + + + + From 7e92e4aab5b242a826a137e2ea83be534ce1f041 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Fri, 24 Nov 2023 15:37:15 +0000 Subject: [PATCH 30/45] Added end of command print" --- bgcval2/analysis_timeseries.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bgcval2/analysis_timeseries.py b/bgcval2/analysis_timeseries.py index e6aa75d0..76e0811b 100755 --- a/bgcval2/analysis_timeseries.py +++ b/bgcval2/analysis_timeseries.py @@ -733,7 +733,8 @@ def applyLandMask1e3(nc, keys): gridFile=av[name]['gridFile'], clean=False, ) - + print("analysis_timeseries:\tINFO:\tEnd of the timeseries analysis", jobID, suites) + def get_args(): """Parse command line arguments. """ From da2392305e2ab2e876a69d2c54c0b04e78ffac2f Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 11:07:11 +0000 Subject: [PATCH 31/45] renamed parrallel to batch as per decreed by @valeriupredoi --- bgcval2/{parrellel_timeseries.py => batch_timeseries.py} | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename bgcval2/{parrellel_timeseries.py => batch_timeseries.py} (99%) diff --git a/bgcval2/parrellel_timeseries.py b/bgcval2/batch_timeseries.py similarity index 99% rename from bgcval2/parrellel_timeseries.py rename to bgcval2/batch_timeseries.py index 30e07bed..c6303a94 100644 --- a/bgcval2/parrellel_timeseries.py +++ b/bgcval2/batch_timeseries.py @@ -22,7 +22,7 @@ # ledm@pml.ac.uk # """ -.. module:: parrallel_timeseries +.. module:: batch_timeseries :platform: Unix :synopsis: A script to submit slurm scripts time series. diff --git a/setup.py b/setup.py index 9006a4e8..3baa25f6 100755 --- a/setup.py +++ b/setup.py @@ -201,7 +201,7 @@ def read_authors(filename): 'analysis_level3_sameYear = bgcval2.analysis_level3_sameYear:main', 'analysis_p2p = bgcval2.analysis_p2p:run', 'analysis_timeseries = bgcval2.analysis_timeseries:main', - 'parrallel_timeseries = bgcval2.parrellel_timeseries:main', + 'batch_timeseries = bgcval2.batch_timeseries:main', 'download_from_mass = bgcval2.download_from_mass:main', 'bgcval2_make_report = bgcval2.bgcval2_make_report:main', ], From 431b54da6d18b014556427225043ef451fc4e0ac Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 15:26:54 +0000 Subject: [PATCH 32/45] Update bgcval2/batch_timeseries.py Co-authored-by: Valeriu Predoi --- bgcval2/batch_timeseries.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bgcval2/batch_timeseries.py b/bgcval2/batch_timeseries.py index c6303a94..7c275c4f 100644 --- a/bgcval2/batch_timeseries.py +++ b/bgcval2/batch_timeseries.py @@ -112,7 +112,11 @@ def submits_lotus(compare_yml, config_user, dry_run=False): else: # Submit job: print('Submitting:', ' '.join(command_txt)) - command1 = subprocess.Popen(command_txt) + command1 = subprocess.Popen( + command_txt, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) def main(): From 1825a3b7a94808017b7446b172c9485fbac66e23 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 15:27:15 +0000 Subject: [PATCH 33/45] local changes. --- bgcval2/batch_timeseries.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bgcval2/batch_timeseries.py b/bgcval2/batch_timeseries.py index c6303a94..069e603c 100644 --- a/bgcval2/batch_timeseries.py +++ b/bgcval2/batch_timeseries.py @@ -113,6 +113,7 @@ def submits_lotus(compare_yml, config_user, dry_run=False): # Submit job: print('Submitting:', ' '.join(command_txt)) command1 = subprocess.Popen(command_txt) + def main(): From 1c567e9623adbb0021511c474c8daee09476835c Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 15:55:33 +0000 Subject: [PATCH 34/45] added documentation. --- README.md | 102 +++++++++++++++++------------------------------------- 1 file changed, 32 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 3c9e8aee..cd013e0c 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,4 @@ -[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/Naereen/StrapDown.js/graphs/commit-activity) -[![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/) -[![Github Actions Test](https://github.com/valeriupredoi/bgcval2/actions/workflows/run-tests.yml/badge.svg)](https://github.com/valeriupredoi/bgcval2/actions/workflows/run-tests.yml) - -![bgcval2logo](https://github.com/valeriupredoi/bgcval2/blob/main/doc/figures/BGCVal2-logo-2.png) - -bgcval2 -======= - - -bgcval2 is the updated and modernised version of BGC-val. -There are several updates over the previously published version of [BGCVal](https://gmd.copernicus.org/articles/11/4215/2018/). -The primary improvements are to the user interface, the ease of use, ease of installation, -and a general modernisation of the core approach, including the move to python3, -and using a conda enviroment. - -This work was funded through WP1 of the Terrafirma project. - - -Current version notes: - -- Suported versions of Python: 3.9, 3.10 and 3.11 - -Environment and installation -============================ - -**Supported Operating Systems so far**: Linux/UNIX - -To install locally: - -- get the `git` file of this repository: - -``` -git clone https://github.com/valeriupredoi/bgcval2.git -``` - -- then grab [miniconda3](https://docs.conda.io/projects/conda/en/latest/user-guide/install/linux.html). -- This can be installed using (bearing in mind that your file name may differ), and follow the on screen instructions: -``` - bash Miniconda3-py39_4.12.0-Linux-x86_64.sh -``` - -- Once you have a local version of miniconda3 installed, install `mamba` in the `base` environment: - -``` -conda install -c conda-forge mamba -``` - -- mamba is a replacement for conda that is faster, but works exactly the same way. Ie the command “conda env” -> becomes “mamba env”. However, this step is somewhat optional. If you can’t install mamba, but have conda working, just replace “mamba” with “conda” below. - - -- then create the `bgcval2` environment and activate it: - -``` -cd bgcval2 -mamba env create -n bgcval2 -f environment.yml -conda activate bgcval2 -``` - -- then install the development dependencies and the tool itself - (note that all our dependencies are from `conda-forge` so there - is no risk of mixing Conda and PyPI packages): - -``` -pip install -e .[develop] -``` - -Test that the tool has been installed correctly with: -``` -analysis_compare -h +compare -h ``` which should print the module information and instructions on how to run the tool. @@ -115,6 +46,7 @@ Executable name | What it does | Command `bgcval` | runs time series and point to point. | bgcval jobID `bgcval2_make_report` | makes the single model HTML report. | bgcval2_make_report jobID `analysis_compare` | runs comparison of multiple single jobs | analysis_compare +`batch_timeseries` | Submits single job time series analysis to slurm | batch_timeseries ### Checking out development branches @@ -319,6 +251,36 @@ then the report will appear on the [JASMIN public facing page](https://gws-acces which is public facing but password protected. +Batch times series Analysis +=========================== + +The `batch_timeseries` tool can take an `analysis_compare` input yaml file, +and instead of running the time series analysis for each job on +the interactive shell terminal in series, it uses slurm to submit +each job as an independent job. + +On jasmin, users can run up to five jobs simulataneously, +so this can singnificantly boost the speed of the analysis. + +The command to run it is: +``` +batch_timeseries - y comparison_recipe.yml +``` + +There is also an optional flag `-d` or `--dry_run` to test the batch_timeseries, +which outputs the submission command to screen but does not submit the jobs. + +Note that this task does not run the `analysis_compare` suite so it will +not generate the html report. However, the html report can be generated more quickly +with the `-s` skip the `analysis_timeseries` section +described above. + +In addition, note that this will not run the `download_from_mass` +script, so jobs added here will not be included in the automated download. +However, these jobs are added for automated download when `analysis_compare` +is used. + + Downloading data using MASS =========================== From 778067450ddbe982156cbcb73f4b0cca453dabef Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 15:56:54 +0000 Subject: [PATCH 35/45] reverted text deletion. --- README.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/README.md b/README.md index cd013e0c..cdd72a42 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,73 @@ +[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/Naereen/StrapDown.js/graphs/commit-activity) +[![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/) +[![Github Actions Test](https://github.com/valeriupredoi/bgcval2/actions/workflows/run-tests.yml/badge.svg)](https://github.com/valeriupredoi/bgcval2/actions/workflows/run-tests.yml) + +![bgcval2logo](https://github.com/valeriupredoi/bgcval2/blob/main/doc/figures/BGCVal2-logo-2.png) + +bgcval2 +======= + + +bgcval2 is the updated and modernised version of BGC-val. +There are several updates over the previously published version of [BGCVal](https://gmd.copernicus.org/articles/11/4215/2018/). +The primary improvements are to the user interface, the ease of use, ease of installation, +and a general modernisation of the core approach, including the move to python3, +and using a conda enviroment. + +This work was funded through WP1 of the Terrafirma project. + + +Current version notes: + +- Suported versions of Python: 3.9, 3.10 and 3.11 + +Environment and installation +============================ + +**Supported Operating Systems so far**: Linux/UNIX + +To install locally: + +- get the `git` file of this repository: + +``` +git clone https://github.com/valeriupredoi/bgcval2.git +``` + +- then grab [miniconda3](https://docs.conda.io/projects/conda/en/latest/user-guide/install/linux.html). +- This can be installed using (bearing in mind that your file name may differ), and follow the on screen instructions: +``` + bash Miniconda3-py39_4.12.0-Linux-x86_64.sh +``` + +- Once you have a local version of miniconda3 installed, install `mamba` in the `base` environment: + +``` +conda install -c conda-forge mamba +``` + +- mamba is a replacement for conda that is faster, but works exactly the same way. Ie the command “conda env” -> becomes “mamba env”. However, this step is somewhat optional. If you can’t install mamba, but have conda working, just replace “mamba” with “conda” below. + + +- then create the `bgcval2` environment and activate it: + +``` +cd bgcval2 +mamba env create -n bgcval2 -f environment.yml +conda activate bgcval2 +``` + +- then install the development dependencies and the tool itself + (note that all our dependencies are from `conda-forge` so there + is no risk of mixing Conda and PyPI packages): + +``` +pip install -e .[develop] +``` + +Test that the tool has been installed correctly with: +``` +analysis_compare -h compare -h ``` which should print the module information and instructions on how to run the tool. From 923154b3bd5d9c4a6e6dd9289ce9918db8076080 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 15:57:40 +0000 Subject: [PATCH 36/45] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index cdd72a42..a1b67328 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,6 @@ pip install -e .[develop] Test that the tool has been installed correctly with: ``` analysis_compare -h -compare -h ``` which should print the module information and instructions on how to run the tool. From b759b33ad81af1812121d0a7154bad1973ee2387 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 27 Nov 2023 16:07:32 +0000 Subject: [PATCH 37/45] add test to new cmd line func --- tests/integration/test_command_line.py | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_command_line.py b/tests/integration/test_command_line.py index d4114a10..a2315e69 100644 --- a/tests/integration/test_command_line.py +++ b/tests/integration/test_command_line.py @@ -15,7 +15,8 @@ analysis_timeseries, download_from_mass, bgcval2_make_report, - analysis_compare + analysis_compare, + batch_timeseries ) from bgcval2.analysis_timeseries import main as analysis_timeseries_main from bgcval2.download_from_mass import main as download_from_mass_main @@ -23,6 +24,7 @@ # from bgcval2.bgcval import run as bgcval_main from bgcval2.bgcval2_make_report import main as bgcval2_make_report_main from bgcval2.analysis_compare import main as analysis_compare_main +from bgcval2.batch_timeseries import main as bgcval2_batch_timeseries def wrapper(f): @@ -142,3 +144,27 @@ def test_bgcval2_make_report_command(): as (stdout, stderr): bgcval2_make_report_main() assert err in str(stderr.getvalue()) + + +@patch('bgcval2.batch_timeseries.main', new=wrapper(bgcval2_batch_timeseries)) +def test_bgcval2_make_report_command(): + """Test run command.""" + with arguments('batch_timeseries', '--help'): + with pytest.raises(SystemExit) as pytest_wrapped_e: + bgcval2_batch_timeseries() + assert pytest_wrapped_e.type == SystemExit + assert pytest_wrapped_e.value.code == 0 + + err = "the following arguments are required: -y/--compare_yml" + with arguments('bgcval2_batch_timeseries'): + with pytest.raises(SystemExit) as cm, capture_sys_output() \ + as (stdout, stderr): + bgcval2_batch_timeseries() + assert err in str(stderr.getvalue()) + + err = "argument -y/--compare_yml: expected at least one argument" + with arguments('bgcval2_batch_timeseries', '--compare_yml'): + with pytest.raises(SystemExit) as cm, capture_sys_output() \ + as (stdout, stderr): + bgcval2_batch_timeseries() + assert err in str(stderr.getvalue()) From 841eeb5564d8314e3a508ca76675c0942f7137d7 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 27 Nov 2023 16:07:49 +0000 Subject: [PATCH 38/45] add GA call to cmd line func --- .github/workflows/run-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 466a8d4b..894a041b 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -41,6 +41,7 @@ jobs: analysis_level3_sameYear --help analysis_p2p --help analysis_timeseries --help + batch_timeseries --help bgcval2_make_report --help download_from_mass --help - shell: bash -l {0} From 07ecc30ce0e13ff0a3111261724692e736585547 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 16:26:00 +0000 Subject: [PATCH 39/45] additional doc --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a1b67328..a6ce9665 100644 --- a/README.md +++ b/README.md @@ -336,7 +336,15 @@ The command to run it is: batch_timeseries - y comparison_recipe.yml ``` -There is also an optional flag `-d` or `--dry_run` to test the batch_timeseries, +This will submit a time-series analysis for each job, using a command which looks like this: +``` +sbatch -J u-aa111 --error=logs/u-aa111.err --output=logs/u-aa111.out lotus_timeseries.sh u-aa111 kmf physics bgc +``` +The output and error messages will be in the `logs` directory which the jobID as the file prefix. +The job name on slurm will also be the jobID, so it's easy to tell which jobs are running. +The analysis suites will be apended as a list to the end of the command. + +There is also an optional flag `-d` or `--dry_run` to test `batch_timeseries`, which outputs the submission command to screen but does not submit the jobs. Note that this task does not run the `analysis_compare` suite so it will From 7d92af489c7cf350a20452a66413f87ce6c1eaeb Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Mon, 27 Nov 2023 16:40:20 +0000 Subject: [PATCH 40/45] Changed logo --- README.md | 2 +- doc/figures/bgcval2_logo_v_small.png | Bin 0 -> 190740 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/figures/bgcval2_logo_v_small.png diff --git a/README.md b/README.md index a6ce9665..37e2b1a6 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/) [![Github Actions Test](https://github.com/valeriupredoi/bgcval2/actions/workflows/run-tests.yml/badge.svg)](https://github.com/valeriupredoi/bgcval2/actions/workflows/run-tests.yml) -![bgcval2logo](https://github.com/valeriupredoi/bgcval2/blob/main/doc/figures/BGCVal2-logo-2.png) +![bgcval2logo](https://github.com/valeriupredoi/bgcval2/blob/main/doc/figures/bgcval2_logo_v_small.png) bgcval2 ======= diff --git a/doc/figures/bgcval2_logo_v_small.png b/doc/figures/bgcval2_logo_v_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa513adb5f25e8953fca14e27b989a36fe83fac GIT binary patch literal 190740 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 Date: Tue, 28 Nov 2023 10:35:11 +0000 Subject: [PATCH 41/45] changed comments --- lotus_timeseries.sh | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/lotus_timeseries.sh b/lotus_timeseries.sh index 7654936d..bfcd161c 100644 --- a/lotus_timeseries.sh +++ b/lotus_timeseries.sh @@ -4,14 +4,19 @@ #SBATCH -o logs/log_bgcval2_ts_%J.out #SBATCH -e logs/log_bgcval3_ts_%J.err +# Note that the # slurm job name should be set in the command line with -J option to the jobID +# and the output and error filers are also set at the command line. +# ###################### # This script runs a single time series job. # # Runs: # sbatch -J jobID lotus_timeseries.sh jobID suite1 suite2 etc... -# +# Note that that batch_timeseries command also +# adds specific out and job scripts, +# and outputs them to ./logs directory.. ######################### @@ -19,11 +24,6 @@ # Change this to your bgcval2 conda environment name CONDA_ENV=bgcval2 -# Change this to your bgcval2 directory - or wheever you wish to run. -#BGCVAL2_PATH=$PWD - -# Add one or more input_yml files here -#BGCVAL2_SUITE2=input_yml/my_bgcval2_suite2.yml ########################## # Source global definitions @@ -38,12 +38,6 @@ fi echo conda activate $CONDA_ENV conda activate ${CONDA_ENV} -########################## -# Change directory to your bgcval2 directory: -#echo cd $BGCVAL2_PATH -#cd $BGCVAL2_PATH -#pwd - ########################## # Load command line arguments: args=$@ @@ -51,9 +45,9 @@ jobID=$1 suites="${@:2}" echo $suites +########################## +# Run single jog timeseries analysis. echo "analysis_timeseries -j $jobID -k $suites" analysis_timeseries -j ${jobID} -k ${suites} -######################### -# Add one or more input_yml files here -#cho analysis_timeseries -y $BGCVAL2_SUITE -#nalysis_timeseries -y $BGCVAL2_SUITE + + From 31cc3c40ad78e9e6fbd9836583d7e7b2426c5eff Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Tue, 28 Nov 2023 10:43:43 +0000 Subject: [PATCH 42/45] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 37e2b1a6..28ff6d0c 100644 --- a/README.md +++ b/README.md @@ -338,7 +338,7 @@ batch_timeseries - y comparison_recipe.yml This will submit a time-series analysis for each job, using a command which looks like this: ``` -sbatch -J u-aa111 --error=logs/u-aa111.err --output=logs/u-aa111.out lotus_timeseries.sh u-aa111 kmf physics bgc +sbatch -J jobID --error=logs/jobID .err --output=logs/jobID .out lotus_timeseries.sh jobID kmf physics bgc ``` The output and error messages will be in the `logs` directory which the jobID as the file prefix. The job name on slurm will also be the jobID, so it's easy to tell which jobs are running. From 25b7f9cbbdfe7ee9e41f2eadef6881e727131ead Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Tue, 28 Nov 2023 10:44:07 +0000 Subject: [PATCH 43/45] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 28ff6d0c..d3d38c94 100644 --- a/README.md +++ b/README.md @@ -340,7 +340,7 @@ This will submit a time-series analysis for each job, using a command which look ``` sbatch -J jobID --error=logs/jobID .err --output=logs/jobID .out lotus_timeseries.sh jobID kmf physics bgc ``` -The output and error messages will be in the `logs` directory which the jobID as the file prefix. +The output and error messages will be in the `logs` directory with the jobID as the file prefix. The job name on slurm will also be the jobID, so it's easy to tell which jobs are running. The analysis suites will be apended as a list to the end of the command. From c0aee37fadc3a0a1bb5e06a68dddff37024f1cdb Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Tue, 28 Nov 2023 10:48:04 +0000 Subject: [PATCH 44/45] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d3d38c94..d3370d89 100644 --- a/README.md +++ b/README.md @@ -342,7 +342,13 @@ sbatch -J jobID --error=logs/jobID .err --output=logs/jobID .out lotus_timeserie ``` The output and error messages will be in the `logs` directory with the jobID as the file prefix. The job name on slurm will also be the jobID, so it's easy to tell which jobs are running. -The analysis suites will be apended as a list to the end of the command. +The analysis suites will be appended as a list to the end of the command. +In order to reduce the chance of analysing the same jobID twice, `batch_timeseries` +checks whether a job exists, either currently running or in the queue before submitting. +If a jobID exists, it is not re-submitted. However, this means that +if two versions of the same jobID are submitted one after the other +with different suite lists (`kmf`, `physics`, `bgc`), then only the first +set of suites will be run. There is also an optional flag `-d` or `--dry_run` to test `batch_timeseries`, which outputs the submission command to screen but does not submit the jobs. From 355c8c40fbb3dc229b9b8f1808d488fa3363cd3c Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Tue, 28 Nov 2023 10:54:29 +0000 Subject: [PATCH 45/45] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3370d89..d67affd4 100644 --- a/README.md +++ b/README.md @@ -355,7 +355,7 @@ which outputs the submission command to screen but does not submit the jobs. Note that this task does not run the `analysis_compare` suite so it will not generate the html report. However, the html report can be generated more quickly -with the `-s` skip the `analysis_timeseries` section +with the `-s` argument to skip the `analysis_timeseries` section described above. In addition, note that this will not run the `download_from_mass`