diff --git a/scripts/acme/acme_util.py b/scripts/acme/acme_util.py new file mode 100644 index 000000000000..17ec7a6ecc65 --- /dev/null +++ b/scripts/acme/acme_util.py @@ -0,0 +1,72 @@ +""" +Common functions used by acme python scripts +""" + +import sys + +_VERBOSE = False + +############################################################################### +def expect(condition, error_msg): +############################################################################### + """ + Similar to assert except doesn't generate an ugly stacktrace. Useful for + checking user error, not programming error. + """ + if (not condition): + raise SystemExit(error_msg) + +############################################################################### +def warning(msg): +############################################################################### + print >> sys.stderr, "WARNING:", msg + +############################################################################### +def verbose_print(msg, override=None): +############################################################################### + if ( (_VERBOSE and not override is False) or override): + print msg + +############################################################################### +def set_verbosity(verbose): +############################################################################### + global _VERBOSE + _VERBOSE = verbose + +############################################################################### +def run_cmd(cmd, ok_to_fail=False, input_str=None, from_dir=None, verbose=None): +############################################################################### + import subprocess # Not safe to do globally, module not available in older pythons + + verbose_print("RUN: %s" % cmd, verbose) + + if (input_str is not None): + stdin = subprocess.PIPE + else: + stdin = None + + proc = subprocess.Popen(cmd, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + stdin=stdin, + cwd=from_dir) + output, errput = proc.communicate() + stat = proc.wait() + + verbose_print(" stat: %d\n" % stat, verbose) + verbose_print(" output: %s\n" % output, verbose) + verbose_print(" errput: %s\n" % errput, verbose) + + if (ok_to_fail): + return stat, output, errput + else: + expect(stat == 0, "Command: '%s' failed with error '%s'" % (cmd, errput)) + return output + +############################################################################### +def check_minimum_python_version(major, minor): +############################################################################### + expect(sys.version_info.major == major and sys.version_info.minor >= minor, + "Python %d.%d+ is required, you have %d.%d" % + (major, minor, sys.version_info.major, sys.version_info.minor)) diff --git a/scripts/acme/update_acme_developer b/scripts/acme/update_acme_developer deleted file mode 100755 index 31cbb02adfeb..000000000000 --- a/scripts/acme/update_acme_developer +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python - -"""This script recreates the acme_developer suite within the CESM testlist.xml -file, which should be given as the only argument. It deletes any existing -"acme_developer" category from the XML file, draws from information within -this file to create new test entries, and then inserts these entries into -the XML file.""" - -# First off, we need a non-ancient Python. -import sys -if (sys.version_info.major != 2) or (sys.version_info.minor < 7): - print('update_acme_developer: Python 2.7+ is required.') - print('(Note: Python 3.x is not yet supported.)') - exit(-1) - -# Here are the tests belonging to the acme_developer suite. Format is -# .. -acme_developer_tests = [ - 'ERS.f19_g16_rx1.A', - 'ERS.f45_g37.B1850C5', - 'ERS.f45_g37_rx1.DTEST', - 'ERS.ne30_g16_rx1.A', - 'ERS_D.f45_g37.B1850C5', - 'ERS_IOP.f19_g16_rx1.A', - 'ERS_IOP.f45_g37_rx1.DTEST', - 'ERS_IOP.ne30_g16_rx1.A', - 'ERS_IOP4c.f19_g16_rx1.A', - 'ERS_IOP4c.ne30_g16_rx1.A', - 'ERS_IOP4p.f19_g16_rx1.A', - 'ERS_IOP4p.ne30_g16_rx1.A', - 'ERS_Ly21.f09_g16.TG', - 'NCK.f19_g16_rx1.A', - 'PEA_P1_M.f45_g37_rx1.A', - 'SMS.ne30_f19_g16_rx1.A'] - -############################################################################### -def find_all_machines(xml_file): -############################################################################### - f = open(xml_file, 'r') - lines = f.readlines() - f.close() - machine_set = set() - for line in lines: - if '') + 1 - j2 = line.index('<', j1) - machine = line[j1:j2] - machine_set.add((machine, compiler)) - return [m for m in machine_set] - -############################################################################### -def replace_testlist_xml(output, xml_file): -############################################################################### - # manage_xml_entries creates a temporary file intended for people to manually check the - # changes. This made sense before revision control, but not anymore. - import shutil - if 'now writing the new test list to' in output: - i1 = output.index('now writing') + len('now writing the new test list to ') - i2 = output.index('xml') + 3 - new_xml_file = output[i1:i2] - shutil.move(new_xml_file, xml_file) - -############################################################################### -def generate_acme_developer_entries(tests, machines): -############################################################################### - import tempfile - test_file = tempfile.NamedTemporaryFile(mode='w', delete = False) - for test in tests: - for machine, compiler in machines: - test_file.write('%s.%s_%s\n'%(test, machine, compiler)) - name = test_file.name - test_file.close() - return name - -############################################################################### -def _main_func(): -############################################################################### - import os.path - if len(sys.argv) == 1: - print('update_acme_developer: usage: update_acme_developer testlist.xml') - exit(-1) - - # Get the absolute path to the XML file. - xml_file = sys.argv[1] - xml_file_dir = os.path.abspath(os.path.dirname(xml_file)) - xml_file = os.path.join(xml_file_dir, os.path.basename(xml_file)) - if not os.path.exists(xml_file): - print('Invalid XML file: %s'%xml_file) - exit(-1) - - # Fish all of the existing machine/compiler combos out of the XML file. - machines = find_all_machines(xml_file) - - # Try to find the manage_xml_entries script. Too fancy? - manage_xml_entries = None - for root, _, files in os.walk('.'): - for name in files: - if name == 'manage_xml_entries': - manage_xml_entries = os.path.abspath(os.path.join(root, name)) - if manage_xml_entries is None: - print('Couldn\'t find manage_xml_entries. You might be too deep in the source tree.') - exit(-1) - - # Remove any existing acme_developer category from the file. - import subprocess - output = subprocess.check_output([manage_xml_entries, '-removetests', '-category', 'acme_developer']) - replace_testlist_xml(output, xml_file) - - # Generate a list of test entries corresponding to our suite at the top - # of the file. - import os - new_test_file = generate_acme_developer_entries(acme_developer_tests, machines) - output = subprocess.check_output([manage_xml_entries, '-addlist', - '-file', new_test_file, - '-category', 'acme_developer']) - os.unlink(new_test_file) - replace_testlist_xml(output, xml_file) - -if __name__ == "__main__": - _main_func() diff --git a/scripts/acme/update_acme_tests b/scripts/acme/update_acme_tests new file mode 100755 index 000000000000..28ec0211f179 --- /dev/null +++ b/scripts/acme/update_acme_tests @@ -0,0 +1,156 @@ +#!/usr/bin/env python + +"""This script recreates and acme suite within the CESM testlist.xml +file, which should be given as the only argument. It deletes any +existing category from the XML file, draws from information within +this file to create new test entries, and then inserts these entries +into the XML file.""" + +import acme_util +acme_util.check_minimum_python_version(2, 7) + +import sys, argparse, os, shutil, tempfile, subprocess + +from acme_util import expect, warning, verbose_print + +# Here are the tests belonging to acme suites. Format is +# .. +TEST_SUITES = { + "acme_developer" : + ['ERS.f19_g16_rx1.A', + 'ERS.f45_g37.B1850C5', + 'ERS.f45_g37_rx1.DTEST', + 'ERS.ne30_g16_rx1.A', + 'ERS_D.f45_g37.B1850C5', + 'ERS_IOP.f19_g16_rx1.A', + 'ERS_IOP.f45_g37_rx1.DTEST', + 'ERS_IOP.ne30_g16_rx1.A', + 'ERS_IOP4c.f19_g16_rx1.A', + 'ERS_IOP4c.ne30_g16_rx1.A', + 'ERS_IOP4p.f19_g16_rx1.A', + 'ERS_IOP4p.ne30_g16_rx1.A', + 'ERS_Ly21.f09_g16.TG', + 'NCK.f19_g16_rx1.A', + 'PEA_P1_M.f45_g37_rx1.A', + 'SMS.ne30_f19_g16_rx1.A'], + "acme_integration" : + ["ERB.f19_g16.B1850C5", + "ERB.f45_g37.B1850C5", + "ERH.f45_g37.B1850C5", + "ERS.f09_g16.B1850C5", + "ERS.f19_f19.FAMIPC5", + "ERS.f19_g16.B1850C5", + "ERS.f45_g37.B1850C5", + "ERS_D.f45_g37.B1850C5", + "ERS_IOP.f19_g16_rx1.A", + "ERS_IOP.f45_g37_rx1.DTEST", + "ERS_IOP.ne30_g16_rx1.A", + "ERS_IOP4c.f19_g16_rx1.A", + "ERS_IOP4c.ne30_g16_rx1.A", + "ERS_IOP4p.f19_g16_rx1.A", + "ERS_IOP4p.ne30_g16_rx1.A", + "ERS_IOP_Ld3.f19_f19.FAMIPC5", + "ERS_Ld3.f19_g16.FC5", + "ERS_Ld3.ne30_ne30.FC5", + "ERS_Ly21.f09_g16.TG", + "ERT.f19_g16.B1850C5", + "NCK.f19_g16_rx1.A", + "PEA_P1_M.f45_g37_rx1.A", + "PET_PT.f19_g16.X", + "PET_PT.f45_g37_rx1.A", + "PFS.ne30_ne30.FC5", + "SEQ_IOP_PFC.f19_g16.X", + "SEQ_PFC.f45_g37.B1850C5", + "SMS.ne16_ne16.FC5AQUAP", + "SMS.ne30_f19_g16_rx1.A", + "SMS_D.f19_g16.B20TRC5", + "SMS_D_Ld3.f19_f19.FC5"] +} + +############################################################################### +def find_all_machines(xml_file): +############################################################################### + f = open(xml_file, 'r') + lines = f.readlines() + f.close() + machine_set = set() + for line in lines: + if '') + 1 + j2 = line.index('<', j1) + machine = line[j1:j2] + machine_set.add((machine, compiler)) + return [m for m in machine_set] + +############################################################################### +def replace_testlist_xml(output, xml_file): +############################################################################### + # manage_xml_entries creates a temporary file intended for people to manually check the + # changes. This made sense before revision control, but not anymore. + if 'now writing the new test list to' in output: + i1 = output.index('now writing') + len('now writing the new test list to ') + i2 = output.index('xml') + 3 + new_xml_file = output[i1:i2] + shutil.move(new_xml_file, xml_file) + +############################################################################### +def generate_acme_test_entries(category, machines): +############################################################################### + tests = TEST_SUITES[category] + test_file = tempfile.NamedTemporaryFile(mode='w', delete = False) + for test in tests: + for machine, compiler in machines: + test_file.write('%s.%s_%s\n'%(test, machine, compiler)) + name = test_file.name + test_file.close() + return name + +############################################################################### +def update_acme_test(xml_file, category): +############################################################################### + # Fish all of the existing machine/compiler combos out of the XML file. + machines = find_all_machines(xml_file) + + # Try to find the manage_xml_entries script. Assume sibling of xml_file + manage_xml_entries = os.path.join(os.path.dirname(xml_file), "manage_xml_entries") + expect(os.path.isfile(manage_xml_entries), + "Couldn't find manage_xml_entries, expect sibling of '%s'" % xml_file) + + # Remove any existing acme test category from the file. + output = acme_util.run_cmd('%s -removetests -category %s' % (manage_xml_entries, category)) + replace_testlist_xml(output, xml_file) + + # Generate a list of test entries corresponding to our suite at the top + # of the file. + new_test_file = generate_acme_test_entries(category, machines) + output = acme_util.run_cmd("%s -addlist -file %s -category %s" % + (manage_xml_entries, new_test_file, category)) + os.unlink(new_test_file) + replace_testlist_xml(output, xml_file) + +############################################################################### +def _main_func(description): +############################################################################### + parser = argparse.ArgumentParser( + usage="\n%s testlist.xml" % os.path.basename(sys.argv[0]), + description=description, + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument("category", choices=TEST_SUITES.keys(), + help="The test category to update") + + parser.add_argument("test_list_path", help="The path to test lists XML file") + + args = parser.parse_args() + + expect(os.path.isfile(args.test_list_path), + "'%s' is not a valid file" % args.test_list_path) + + update_acme_test(args.test_list_path, args.category) + +if __name__ == "__main__": + _main_func(__doc__) diff --git a/scripts/acme/wait_for_tests b/scripts/acme/wait_for_tests index 568357dfd08f..9b050a731886 100755 --- a/scripts/acme/wait_for_tests +++ b/scripts/acme/wait_for_tests @@ -6,12 +6,17 @@ If the test passes, 0 is returned, otherwise a non-zero error code is returned. """ +import acme_util +acme_util.check_minimum_python_version(2, 7) + import argparse, sys, os, doctest, time, threading, Queue, signal, socket import distutils.spawn, subprocess, getpass + import xml.etree.ElementTree as xmlet from distutils.spawn import find_executable -VERBOSE = False +from acme_util import expect, warning, verbose_print + TEST_STATUS_FILENAME = "TestStatus" TEST_NOT_FINISHED_STATUS = ["GEN", "BUILD", "RUN", "PEND"] TEST_PASSED_STATUS = "PASS" @@ -27,33 +32,6 @@ CLEANUP = False THROUGHPUT_TEST_STR = ".tputcomp." -############################################################################### -def expect(condition, error_msg): -############################################################################### - if (not condition): - raise SystemExit(error_msg) - -############################################################################### -def verbose_print(msg): -############################################################################### - if (VERBOSE): - print msg - -############################################################################### -def warning(msg): -############################################################################### - print >> sys.stderr, "WARNING:", msg - -############################################################################### -def run_cmd(cmd, stdout_arg=None): -############################################################################### - proc = subprocess.Popen(cmd, shell=True, stdout=stdout_arg, stderr=subprocess.PIPE) - output, errput = proc.communicate() - stat = proc.wait() - expect(stat == 0, "Command: '%s' failed with error '%s'" % (cmd, errput)) - - return output - ############################################################################### def probe_batch_system(): ############################################################################### @@ -76,7 +54,7 @@ def signal_handler(signum, frame): if (CLEANUP): batch_system = probe_batch_system() if (batch_system is not None): - run_cmd(CLEANUP_ROUTINES[batch_system]) + acme_util.run_cmd(CLEANUP_ROUTINES[batch_system]) ############################################################################### def parse_command_line(args, description): @@ -122,8 +100,7 @@ formatter_class=argparse.ArgumentDefaultsHelpFormatter args = parser.parse_args(args[1:]) - global VERBOSE - VERBOSE = args.verbose + acme_util.set_verbosity(args.verbose) global CLEANUP CLEANUP = args.cleanup @@ -134,7 +111,7 @@ formatter_class=argparse.ArgumentDefaultsHelpFormatter def get_test_time(test_path): ############################################################################### cmd = "grep 'TOT Run Time' /dev/null $(find %s -name 'ccsm_timing*') || true" % test_path - output = run_cmd(cmd, subprocess.PIPE) + output = acme_util.run_cmd(cmd) tot_time = 0.0 for line in output.splitlines(): @@ -309,7 +286,7 @@ NightlyStartTime: 00:00:00 EST etree.write(os.path.join(data_rel_path, "Test.xml")) - run_cmd("ctest -D NightlySubmit") + acme_util.run_cmd("ctest -D NightlySubmit") ############################################################################### def parse_test_status_file(file_contents, status_file_path, check_throughput): diff --git a/scripts/ccsm_utils/Testlistxml/testlist.xml b/scripts/ccsm_utils/Testlistxml/testlist.xml index 2c20e84827e1..f90b5b462209 100644 --- a/scripts/ccsm_utils/Testlistxml/testlist.xml +++ b/scripts/ccsm_utils/Testlistxml/testlist.xml @@ -97,118 +97,196 @@ bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone @@ -226,45 +304,71 @@ bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach goldbach goldbach hopper hopper hopper + hopper + hopper hopper hopper intrepid + intrepid intrepid janus + janus janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -326,53 +430,105 @@ bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper hopper + intrepid intrepid + janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -392,44 +548,70 @@ bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach goldbach hopper hopper hopper + hopper + hopper hopper hopper intrepid + intrepid intrepid janus + janus janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -482,118 +664,196 @@ bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone @@ -690,20 +950,73 @@ + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky + titan titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper + hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky + titan titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone @@ -711,20 +1024,72 @@ yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky + titan titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky + titan titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone @@ -748,90 +1113,196 @@ + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper + hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper + hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone @@ -839,10 +1310,36 @@ yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone @@ -1299,16 +1796,42 @@ titan + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach goldbach goldbach + hopper + hopper hopper hopper + intrepid intrepid + janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -1979,41 +2502,67 @@ bluewaters + bluewaters cascade cascade cascade cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper hopper intrepid + intrepid janus + janus janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky redsky redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -2322,21 +2871,73 @@ + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -2498,14 +3099,40 @@ yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper hopper + intrepid intrepid + janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -2513,15 +3140,41 @@ + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach goldbach goldbach + hopper + hopper hopper + intrepid + janus janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -2537,15 +3190,41 @@ + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach goldbach goldbach + hopper + hopper hopper + intrepid + janus janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -2553,17 +3232,43 @@ yellowstone + bluewaters bluewaters cascade cascade + cetus cetus + eastwind + edison + edison edison + eos eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira mira + null + olympus redsky redsky + titan titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -2599,11 +3304,37 @@ yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach + hopper + hopper hopper + intrepid + janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -4795,37 +5526,66 @@ bluewaters + bluewaters cascade cascade + cascade + cascade cetus + cetus eastwind + eastwind edison edison + edison + edison eos + eos evergreen + evergreen goldbach goldbach goldbach goldbach + goldbach + goldbach + goldbach + goldbach hopper hopper hopper + hopper + hopper + hopper intrepid + intrepid janus + janus lawrencium-lr2 + lawrencium-lr2 mac + mac melvin + melvin mira + mira null + null olympus + olympus redsky - redsky redsky + redsky titan + titan yellowstone yellowstone yellowstone yellowstone + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -4980,16 +5740,42 @@ yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach goldbach goldbach + hopper + hopper hopper hopper + intrepid intrepid + janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone @@ -4998,14 +5784,40 @@ yellowstone + bluewaters cascade cascade + cetus + eastwind + edison + edison + eos + evergreen + goldbach + goldbach + goldbach + goldbach goldbach goldbach + hopper + hopper hopper + intrepid + janus janus + lawrencium-lr2 + mac + melvin + mira + null + olympus redsky redsky + titan + yellowstone + yellowstone + yellowstone + yellowstone yellowstone yellowstone yellowstone