Started by user ha:////4PM3P9yyJudgDk1jkkaxxiynkv9mrkPsuMLy2ZODkh/3AAAAmR+LCAAAAAAAAP9b85aBtbiIQTGjNKU4P08vOT+vOD8nVc83PyU1x6OyILUoJzMv2y+/JJUBAhiZGBgqihhk0NSjKDWzXb3RdlLBUSYGJk8GtpzUvPSSDB8G5tKinBIGIZ+sxLJE/ZzEvHT94JKizLx0a6BxUmjGOUNodHsLgAz+EgZe/dLi1CL9jNLUpJzUIgDHv5uJwgAAAA==Gunther Huebler Obtained jenkins_tests/clubb_release_diff_test/Jenkinsfile from git https://github.com/larson-group/clubb.git ha:////4Cjittq30hkYZjMOAEpajcZR0V8yygtTgYIvukrI0KfJAAAAoh+LCAAAAAAAAP9tjTEOwjAQBM8BClpKHuFItIiK1krDC0x8GCfWnbEdkooX8TX+gCESFVvtrLSa5wtWKcKBo5UdUu8otU4GP9jS5Mixv3geZcdn2TIl9igbHBs2eJyx4YwwR1SwULBGaj0nRzbDRnX6rmuvydanHMu2V1A5c4MHCFXMWcf8hSnC9jqYxPTz/BXAFEIGsfuclm8zQVqFvQAAAA==[Pipeline] Start of Pipeline ha:////4OfoazyckbArggUo3ISfTGPxmxxRdP+stEFkv8dA98gsAAAApR+LCAAAAAAAAP9tjTEOwjAUQ3+KOrAycohUghExsUZZOEFIQkgb/d8mKe3EibgadyBQiQlLlmxL1nu+oE4RjhQdby12HpP2vA+jK4lPFLtroIm3dOGaMFGwXNpJkrGnpUrKFhaxClYC1hZ1oOTRZdiIVt1VExS65pxj2Q4CKm8GeAAThZxVzN8yR9jeRpMIf5y/AJj7DGxXvP/86jduZBmjwAAAAA==[Pipeline] node Still waiting to schedule task Waiting for next available executor Running on ha:////4P4XGYfl7slFMUiRNJZtdx5ZzG2JwY5xJku6zLhWWlDCAAAAoR+LCAAAAAAAAP9b85aBtbiIQTGjNKU4P08vOT+vOD8nVc83PyU1x6OyILUoJzMv2y+/JJUBAhiZGBgqihhk0NSjKDWzXb3RdlLBUSYGJk8GtpzUvPSSDB8G5tKinBIGIZ+sxLJE/ZzEvHT94JKizLx0a6BxUmjGOUNodHsLgAz2EgZR/eT83ILSktQifY2k0sycEt3MPE19AHHxbH3KAAAAJenkins in /home/jenkins/workspace/clubb_release_diff_test ha:////4FDlcnFr9e5989JzoK959XjJGyMMLx4dByuovsdbc3KZAAAApR+LCAAAAAAAAP9tjTEOwjAUQ3+KOrAycoh0gA0xsUZZOEFIQkgb/d8mKe3EibgadyBQiQlLlmxL1nu+oE4RjhQdby12HpP2vA+jK4lPFLtroIm3dOGaMFGwXNpJkrGnpUrKFhaxClYC1hZ1oOTRZdiIVt1VExS65pxj2Q4CKm8GeAAThZxVzN8yR9jeRpMIf5y/AJj7DGxXvP/86jfoP95RwAAAAA==[Pipeline] { ha:////4AE7Ft0kRt6yDHyl9I4e/bM1ttJPxUELiw6uNZ0QbR7MAAAApR+LCAAAAAAAAP9tjTEOwjAUQ3+KOrAycoh0gQkxsUZZOEFIQkgb/d8mKe3EibgadyBQiQlLlmxL1nu+oE4RjhQdby12HpP2vA+jK4lPFLtroIm3dOGaMFGwXNpJkrGnpUrKFhaxClYC1hZ1oOTRZdiIVt1VExS65pxj2Q4CKm8GeAAThZxVzN8yR9jeRpMIf5y/AJj7DGxXvP/86jc09154wAAAAA==[Pipeline] stage ha:////4FkD70+B6a5J0827ONeUqfTiQDpR4+VE+gWaygTpm9OWAAAApR+LCAAAAAAAAP9tjTEOwjAUQ3+KOrAycoh0ggUxsUZZOEFIQkgb/d8mKe3EibgadyBQiQlLlmxL1nu+oE4RjhQdby12HpP2vA+jK4lPFLtroIm3dOGaMFGwXNpJkrGnpUrKFhaxClYC1hZ1oOTRZdiIVt1VExS65pxj2Q4CKm8GeAAThZxVzN8yR9jeRpMIf5y/AJj7DGxXvP/86jek7ggRwAAAAA==[Pipeline] { (Declarative: Checkout SCM) ha:////4DWhhCSzqWCnqMgye1segLjeKHvm/Xy9xZ/t+WlCd57ZAAAAoh+LCAAAAAAAAP9tjTEOAiEURD9rLGwtPQTbaWGsbAmNJ0AWEZb8zwLrbuWJvJp3kLiJlZNMMm+a93rDOic4UbLcG+wdZu14DKOti0+U+lugiXu6ck2YKRguzSSpM+cFJRUDS1gDKwEbgzpQdmgLbIVXD9UGhba9lFS/o4DGdQM8gYlqLiqVL8wJdvexy4Q/z18BzLEA29ce4gfg7KmOvAAAAA==[Pipeline] checkout The recommended git tool is: git Wiping out workspace first. Cloning the remote Git repository Cloning repository https://github.com/larson-group/clubb.git > git init /home/jenkins/workspace/clubb_release_diff_test # timeout=10 Fetching upstream changes from https://github.com/larson-group/clubb.git > git --version # timeout=10 > git --version # 'git version 2.34.1' using GIT_ASKPASS to set credentials larsongroupsysadmin github token > git fetch --tags --force --progress -- https://github.com/larson-group/clubb.git +refs/heads/*:refs/remotes/origin/* # timeout=10 > git config remote.origin.url https://github.com/larson-group/clubb.git # timeout=10 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10 Avoid second fetch > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 Checking out Revision 1d1abb1d2fcf29eef75bfe3182b8b213a1c6001e (refs/remotes/origin/master) > git config core.sparsecheckout # timeout=10 > git checkout -f 1d1abb1d2fcf29eef75bfe3182b8b213a1c6001e # timeout=10 Commit message: "Standardize script arguments (#1373)" > git rev-list --no-walk ec38f6a3b0805ee6ac8db48d845ddee0e7d11ac3 # timeout=10 ha:////4M0lBXi8L0O4N1wFY5lRb5LBLalDgJBC9nNrfR5OtcBNAAAAoh+LCAAAAAAAAP9tjTEOAiEURD9rLGwtPQTbGRNjZUtoPAGyiLDkfxZYdytP5NW8g8RNrJxkknnTvNcb1jnBiZLl3mDvMGvHYxhtXXyi1N8CTdzTlWvCTMFwaSZJnTkvKKkYWMIaWAnYGNSBskNbYCu8eqg2KLTtpaT6HQU0rhvgCUxUc1GpfGFOsLuPXSb8ef4KYI6xADvU7j9Dg2gqvAAAAA==[Pipeline] } ha:////4C9gVc/RMYuh4P3VFxhWoDv34M8ROVTApORMFM74AFZeAAAAoh+LCAAAAAAAAP9tjTEOAiEURD9rLGwtPQRbWRhjZUtoPAGyiLDkfxZYdytP5NW8g8RNrJxkknnTvNcb1jnBiZLl3mDvMGvHYxhtXXyi1N8CTdzTlWvCTMFwaSZJnTkvKKkYWMIaWAnYGNSBskNbYCu8eqg2KLTtpaT6HQU0rhvgCUxUc1GpfGFOsLuPXSb8ef4KYI6xADvU7j9J+wGOvAAAAA==[Pipeline] // stage ha:////4OMUaFGtWHpXHrnJEqNuTaTTH7zYW1TXuR1OOwesYqpuAAAAph+LCAAAAAAAAP9tjTEOwjAQBM9BKWgpeYQDEh2iorXc8AITG+PEugv2haTiRXyNPxCIRMVWOyut5vmCMic4UPKycdgGzHWQXez91ORAqb1EGmRDZ1kTZopOajdosu44oyZ2MEcUsFCwdFhHygE9w0o15m6qaNBXJ07TtldQBHuDBwg1mdkk/sKYYH3tbSb8ef4KYOwYxI6h2G4+x/INtuQqUcEAAAA=[Pipeline] withEnv ha:////4POBlF/w66TdRjLOMaZmbKoF4qlP3EsxWZ8MwJufSwVuAAAApR+LCAAAAAAAAP9tjTEOwjAUQ3+DOrAycoiUzoiJNerCCUITQtLo/zZJSSdOxNW4Ay2VmPBg2Zas93pDGQOcKBjuNHYWY2t570czJ54pdDdPmTu68pYwkte80bkhpc9rbShpWFUw2AjYamw9RYsmwU44+ZCVl2iqSwrzdhTArBrgCYWYyUmG9C1TgP19VJHwx/kLgKlPwOrDYvXyLD8BobDcwgAAAA==[Pipeline] { ha:////4CZMEuZltkWrpbK+PirOYQRSCqpH7y+OE712fANE7n/gAAAAph+LCAAAAAAAAP9tjTEOwjAUQ3+LOrAycohUZUVMrFEWThCaEJJG/7dJSjpxIq7GHWipxIQHy7ZkvdcbqhjgRMEwp7GzGFvLej+aObFMobt5yszRlbWEkbxmQmdBSp/XKihpWFWUsOGw1dh6ihZNgh138iFrL9HUlxTm7cihtGqAJxR8JicZ0rdMAfb3UUXCH+cvAKY+Qdk0ix2WZ/UBbwyqm8IAAAA=[Pipeline] stage ha:////4KUMCWFfscl/TOIZTM5EUNA/xqZlP8Dml1BjSoC8QS+sAAAAph+LCAAAAAAAAP9tjTEOwjAUQ3+LOrAycohUwIiYukZZOEFoQkgb/V9+UtqJE3E17kBLJSY8WLYl673eUESGE7ETjcXWY6y96ELvpiQG4vYaaBANXURNGClYoeygyNhqqYqShUVZDisJa4t1oOjRJdjIRj90GTS68px42o4Scm/u8IRMTuSkOX3LyLC99SYS/jh/ATB2CfLdfrbD/Cw+y7kUycIAAAA=[Pipeline] { (Checkout Clubb and Clubb_Release) ha:////4ANXFJd3P2uH6oG6fHcMxklx/Urd1yvPwqSjWMs4SBztAAAApB+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIiBB2iSmu54QUmNsaJdWdsh6TiRXyNPxCIRMUWq51t5vmCZYpw5GixNdQ5So3D4Hs7LRw4dhfPA7Z8xoYpsTcozSBZm3pGydnAnKKEhYCVocZzcmQzrEWr7qryimx1ynH6DgJKp2/wgEJM5qxi/sIYYXPtdWL6ef4KYAwZyu3uU/vwBgq0rvS+AAAA[Pipeline] sh + git clone https://github.com/larson-group/clubb.git Cloning into 'clubb'... + git clone https://github.com/larson-group/clubb_release.git Cloning into 'clubb_release'... ha:////4HhaSfPPAiGCqYCWgOSOnTKEXCDVzERShhXph91HbicNAAAApB+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIihKgQVVrLDS8wsTFOrDtjOyQVL+Jr/IFAJCq2WO1sM88XLFOEI0eLraHOUWocBt/baeHAsbt4HrDlMzZMib1BaQbJ2tQzSs4G5hQlLASsDDWekyObYS1adVeVV2SrU47TdxBQOn2DBxRiMmcV8xfGCJtrrxPTz/NXAGMIGcrt/lO7N7BnLt++AAAA[Pipeline] } ha:////4FVL20V4kFZmoupJ3yD+ARu1qGTPdJik5rudocilzqMlAAAApB+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIiKGgQVVrLDS8wsTFOrDtjOyQVL+Jr/IFAJCq2WO1sM88XLFOEI0eLraHOUWocBt/baeHAsbt4HrDlMzZMib1BaQbJ2tQzSs4G5hQlLASsDDWekyObYS1adVeVV2SrU47TdxBQOn2DBxRiMmcV8xfGCJtrrxPTz/NXAGMIGcrt/lO7N4glvS6+AAAA[Pipeline] // stage ha:////4GMEqHjUfYXAoMs0hqFp6DevraMZMFu0DPhP4N7yQmvYAAAApx+LCAAAAAAAAP9tjTEOwjAUQ3+LOrAycohUnRgQE2uUhROEJoSk0f9tkpJOnIircQdaKjHhwbItWe/1hioGOFEwzGnsLMbWst6PZk4sU+hunjJzdGUtYSSvmdBZkNLntQpKGlYVJWw4bDW2nqJFk2DHnXzI2ks09SWFeTtyKK0a4AkFn8lJhvQtU4D9fVSR8Mf5C4CpT1A2zWKH5Vl9ANydZ8vCAAAA[Pipeline] stage ha:////4JQl56uZsMv+8JjlsYRZ9i8KX7vcTdAxCqZjHZrE7A7YAAAApx+LCAAAAAAAAP9tjTEOwjAUQ3+LOrAycohUTCAhpq5RFk4QmhDSRv+Xn5R24kRcjTvQUokJD5ZtyXqvNxSR4UTsRGOx9RhrL7rQuymJgbi9BhpEQxdRE0YKVig7KDK2WqqiZGFRlsNKwtpiHSh6dAk2stEPXQaNrjwnnrajhNybOzwhkxM5aU7fMjJsb72JhD/OXwCMXYJ8t5/tMD+LD0rlhNLCAAAA[Pipeline] { (Diff) ha:////4CK4bwxOvxmA4DE5Mgve/HabCo+37fityp5hdwwJL6T6AAAApB+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIiOhCiSmu54QUmNsaJdWdsh6TiRXyNPxCIRMUWq51t5vmCZYpw5GixNdQ5So3D4Hs7LRw4dhfPA7Z8xoYpsTcozSBZm3pGydnAnKKEhYCVocZzcmQzrEWr7qryimx1ynH6DgJKp2/wgEJM5qxi/sIYYXPtdWL6ef4KYAwZyu3uU/vwBr2eB0O+AAAA[Pipeline] sh + diff --exclude=.git --exclude=version_clubb_core.txt --exclude=version_silhs.txt -r clubb clubb_release diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/clubb_jax/README.md clubb_release/clubb_jax/README.md 175c175 < -cases arm bomex -workers 2 \ --- > -cases arm bomex -jobs 2 \ 208,209c208,209 < ./clubb_jax/run_jax.py -init_env < ./clubb_jax/run_jax.py -profile=gpu -init_env --- > ./clubb_jax/run_jax.py --init_env > ./clubb_jax/run_jax.py --profile=gpu --init_env 232c232 < ./clubb_jax/run_jax.py -init_env --- > ./clubb_jax/run_jax.py --init_env 241,242c241,242 < ./clubb_jax/run_jax.py -profile=cpu -info < ./clubb_jax/run_jax.py -profile=gpu -info --- > ./clubb_jax/run_jax.py --profile=cpu --info > ./clubb_jax/run_jax.py --profile=gpu --info 253c253 < ./clubb_jax/run_jax.py -profile=gpu -info=json --- > ./clubb_jax/run_jax.py --profile=gpu --info=json 308c308 < `-profile=gpu -xla_prealloc`. --- > `--profile=gpu --xla-prealloc`. diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/clubb_jax/run_jax.py clubb_release/clubb_jax/run_jax.py 39,41c39,41 < return """Usage: clubb_jax/run_jax.py [-profile=cpu|gpu] [namelist-path] [driver-args...] < clubb_jax/run_jax.py [-profile=cpu|gpu] -init_env < clubb_jax/run_jax.py [-profile=cpu|gpu] -info[=json] --- > return """Usage: clubb_jax/run_jax.py [--profile=cpu|gpu] [namelist-path] [driver-args...] > clubb_jax/run_jax.py [--profile=cpu|gpu] --init_env > clubb_jax/run_jax.py [--profile=cpu|gpu] --info[=json] 47c47 < -options=VALUE Parse the value forwarded by run_scm.py -jax=VALUE: --- > --options=VALUE Parse the value forwarded by run_scm.py -jax=VALUE: 49,54c49,54 < -profile=cpu|gpu Select CPU or the host-native GPU backend < -accelerator=VALUE Select an explicit backend: cpu, cuda13, or metal < -xla_prealloc Enable CUDA memory preallocation (CUDA only) < -init_env Prepare the environment without running a case < -info[=json] Inspect hardware and runtime readiness without setup < -launcher_help Show this help --- > --profile=cpu|gpu Select CPU or the host-native GPU backend > --accelerator=VALUE Select an explicit backend: cpu, cuda13, or metal > --xla-prealloc Enable CUDA memory preallocation (CUDA only) > --init_env Prepare the environment without running a case > --info[=json] Inspect hardware and runtime readiness without setup > --launcher-help Show this help 67c67 < fail("-options requires a profile; supported profiles are cpu and gpu") --- > fail("--options requires a profile; supported profiles are cpu and gpu") 99c99 < if token.startswith("-options="): --- > if token.startswith("--options="): 101c101 < fail("-options may be specified only once") --- > fail("--options may be specified only once") 103c103 < fail("-options cannot be combined with -profile or -accelerator") --- > fail("--options cannot be combined with --profile or --accelerator") 112c112 < elif token.startswith("-profile="): --- > elif token.startswith("--profile="): 114c114 < fail("-profile may be specified only once and cannot follow -options") --- > fail("--profile may be specified only once and cannot follow --options") 116c116 < fail("-profile and -accelerator cannot be combined") --- > fail("--profile and --accelerator cannot be combined") 119c119 < fail("-profile requires cpu or gpu") --- > fail("--profile requires cpu or gpu") 121c121 < elif token.startswith("-accelerator="): --- > elif token.startswith("--accelerator="): 123c123 < fail("-accelerator cannot be combined with -options or -profile") --- > fail("--accelerator cannot be combined with --options or --profile") 125c125 < fail("-accelerator may be specified only once") --- > fail("--accelerator may be specified only once") 128c128 < fail("-accelerator requires cpu, cuda13, or metal") --- > fail("--accelerator requires cpu, cuda13, or metal") 130c130 < elif token == "-xla_prealloc": --- > elif token == "--xla-prealloc": 135c135 < elif token == "-init_env": --- > elif token == "--init_env": 137c137 < fail("-init_env may be specified only once") --- > fail("--init_env may be specified only once") 139c139 < elif token in ("-info", "-info=json"): --- > elif token in ("--info", "--info=json"): 141c141 < fail("-info may be specified only once") --- > fail("--info may be specified only once") 143,145c143,145 < elif token.startswith("-info="): < fail("-info supports only the optional '=json' format") < elif token == "-launcher_help": --- > elif token.startswith("--info="): > fail("--info supports only the optional '=json' format") > elif token == "--launcher-help": 152c152 < fail("-init_env and -info cannot be used together") --- > fail("--init_env and --info cannot be used together") 323c323 < "-profile", --- > "--profile", 325c325 < "-accelerator", --- > "--accelerator", 327c327 < "-requirements", --- > "--requirements", 329c329 < "-venv", --- > "--venv", 331c331 < "-required_jax", --- > "--required-jax", 333c333 < "-python_version", --- > "--python-version", 335c335 < "-format", --- > "--format", 339c339 < command.append("-require_selectable") --- > command.append("--require-selectable") 351c351 < "-resolve_visible_devices", --- > "--resolve-visible-devices", 493c493 < result = subprocess.run([str(SCRIPT_DIR / "run_jax.py"), "-init_env"]) --- > result = subprocess.run([str(SCRIPT_DIR / "run_jax.py"), "--init_env"]) 529c529 < fail("-xla_prealloc is a CUDA-only option") --- > fail("--xla-prealloc is a CUDA-only option") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/clubb_jax/runtime_info.py clubb_release/clubb_jax/runtime_info.py 645c645 < if len(sys.argv) == 3 and sys.argv[1] == "-resolve_visible_devices": --- > if len(sys.argv) == 3 and sys.argv[1] == "--resolve-visible-devices": 653,661c653,660 < parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < parser.add_argument('-profile', dest='profile', choices=("cpu", "gpu"), required=True) < parser.add_argument('-accelerator', dest='accelerator', required=True) < parser.add_argument('-requirements', dest='requirements', type=Path, required=True) < parser.add_argument('-venv', dest='venv', type=Path, required=True) < parser.add_argument('-required_jax', dest='required_jax', required=True) < parser.add_argument('-python_version', dest='python_version') < parser.add_argument('-format', dest='format', choices=("human", "json"), default="human") --- > parser = argparse.ArgumentParser() > parser.add_argument("--profile", choices=("cpu", "gpu"), required=True) > parser.add_argument("--accelerator", required=True) > parser.add_argument("--requirements", type=Path, required=True) > parser.add_argument("--venv", type=Path, required=True) > parser.add_argument("--required-jax", required=True) > parser.add_argument("--python-version") > parser.add_argument("--format", choices=("human", "json"), default="human") 663c662 < '-require_selectable', dest='require_selectable', --- > "--require-selectable", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/clubb_jax/tests/test_jax_cli_options.py clubb_release/clubb_jax/tests/test_jax_cli_options.py 32c32 < assert captured[0][1:] == ([] if value is None else [f"-options={value}"]) --- > assert captured[0][1:] == ([] if value is None else [f"--options={value}"]) 46c46 < assert command == [str(wrapper)] + ([] if value is None else [f"-options={value}"]) --- > assert command == [str(wrapper)] + ([] if value is None else [f"--options={value}"]) 57c57 < result = subprocess.run([str(wrapper), f"-options={value}", "-init_env"], --- > result = subprocess.run([str(wrapper), f"--options={value}", "--init_env"], 66,68c66,68 < ["-options=cpu", "-profile=gpu"], < ["-options=cpu", "-options=gpu"], < ["-options=gpu,xla_prealloc", "-xla_prealloc"], --- > ["--options=cpu", "--profile=gpu"], > ["--options=cpu", "--options=gpu"], > ["--options=gpu,xla_prealloc", "--xla-prealloc"], 72c72 < result = subprocess.run([str(wrapper), *options, "-info=json"], --- > result = subprocess.run([str(wrapper), *options, "--info=json"], 80c80 < result = subprocess.run([str(wrapper), "-profile=cpu", "-xla_prealloc", "-info=json"], --- > result = subprocess.run([str(wrapper), "--profile=cpu", "--xla-prealloc", "--info=json"], 92c92 < values, driver_args = run_jax.parse_launcher_args(["-profile=gpu", "arm.in"]) --- > values, driver_args = run_jax.parse_launcher_args(["--profile=gpu", "arm.in"]) 184c184 < assert setup == [[str(run_jax.SCRIPT_DIR / "run_jax.py"), "-init_env"]] --- > assert setup == [[str(run_jax.SCRIPT_DIR / "run_jax.py"), "--init_env"]] diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/clubb_jax/tests/test_kk_rico_oracle.py clubb_release/clubb_jax/tests/test_kk_rico_oracle.py 23c23 < python run_scripts/run_scm.py rico -legacy -max_iters 10 -output_dir output/rico_fort --- > python run_scripts/run_scm.py rico -legacy -max_iters 10 -out_dir output/rico_fort diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/clubb_jax/tests/test_runtime_info.py clubb_release/clubb_jax/tests/test_runtime_info.py 75,81c75 < commands = [] < < def query(command, **_kwargs): < commands.append(command) < return next(responses) < < monkeypatch.setattr(runtime_info.subprocess, "run", query) --- > monkeypatch.setattr(runtime_info.subprocess, "run", lambda *_args, **_kwargs: next(responses)) 86,91d79 < assert len(commands) == 2 < assert all(command[0] == "/usr/bin/nvidia-smi" < and command[2] == "--format=csv,noheader,nounits" < for command in commands) < assert "compute_cap" in commands[0][1] < assert "compute_cap" not in commands[1][1] 232c220 < [str(wrapper), "-accelerator=cuda13", "-init_env"], --- > [str(wrapper), "--accelerator=cuda13", "--init_env"], 272c260 < options = ["-accelerator=cuda13"] + (["-xla_prealloc"] if flag else []) --- > options = ["--accelerator=cuda13"] + (["--xla-prealloc"] if flag else []) 278c266 < [str(wrapper), *options, "-info=json"], --- > [str(wrapper), *options, "--info=json"], 304c292 < [str(wrapper), *options, '-init_env'], --- > [str(wrapper), *options, '--init_env'], diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/CMakeLists.txt clubb_release/CMakeLists.txt 78c78 < -install_dir ${CMAKE_INSTALL_PREFIX} -output_dir ${TEST_OUT_DIR}/${TEST_NAME} ${ARGN}" --- > -install_dir ${CMAKE_INSTALL_PREFIX} -out_dir ${TEST_OUT_DIR}/${TEST_NAME} ${ARGN}" diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/compile.py clubb_release/compile.py 355,356c355 < parser = argparse.ArgumentParser(description="Compile CLUBB with CMake", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Compile CLUBB with CMake") 359c358 < parser.add_argument('-install_dir', dest='install', metavar="DIR", help="Install directory for latest executables") --- > parser.add_argument("-install", metavar="DIR", help="Install directory for latest executables") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/compile_tab/build_selector.py clubb_release/dash_app/compile_tab/build_selector.py 36c36 < [str(wrapper), f"-profile={profile}", "-info=json"], --- > [str(wrapper), f"--profile={profile}", "--info=json"], diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/compile_tab/runtime.py clubb_release/dash_app/compile_tab/runtime.py 424c424 < argv.extend(["-install_dir", install]) --- > argv.extend(["-install", install]) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/plot_tab/pyplotgen_runtime.py clubb_release/dash_app/plot_tab/pyplotgen_runtime.py 67c67 < command = [sys.executable, "-u", str(PYPLOTGEN_SCRIPT), "-les", "-clubb", *selected, "-output_dir", str(output_dir)] --- > command = [sys.executable, "-u", str(PYPLOTGEN_SCRIPT), "-l", "-c", *selected, "-o", str(output_dir)] diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/profile_tab/runtime.py clubb_release/dash_app/profile_tab/runtime.py 154c154 < "-multicol", "--multicol", "-batch_size", "--batch_size", "-output_dir", "--out_dir", --- > "-multicol", "--multicol", "-batch_size", "--batch_size", "-out_dir", "--out_dir", 193c193 < "-process_counts", --- > "-processes", 201c201 < "-output_root", --- > "-output", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/pytests/test_compile_tab_build_status.py clubb_release/dash_app/pytests/test_compile_tab_build_status.py 101c101 < assert "-install_dir" in argv --- > assert "-install" in argv 124c124 < assert "-install_dir" not in argv --- > assert "-install" not in argv diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/pytests/test_profile_tab.py clubb_release/dash_app/pytests/test_profile_tab.py 186c186 < assert command[command.index("-process_counts") + 1] == "1,4" --- > assert command[command.index("-processes") + 1] == "1,4" diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/pytests/test_pyplotgen_export.py clubb_release/dash_app/pytests/test_pyplotgen_export.py 56c56 < "-les", --- > "-l", 58c58 < assert captured["command"][4:7] == ["-clubb", str(input_a), str(input_b)] --- > assert captured["command"][4:7] == ["-c", str(input_a), str(input_b)] diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/run_tab/runtime.py clubb_release/dash_app/run_tab/runtime.py 219c219 < for flag, key in (("-multicol", "multicol"), ("-batch_size", "batch_size"), ("-max_iters", "max_iters"), ("-debug", "debug"), ("-dt_main", "dt_main"), ("-dt_rad", "dt_rad"), ("-tout", "tout"), ("-output_dir", "out_dir")): --- > for flag, key in (("-multicol", "multicol"), ("-batch_size", "batch_size"), ("-max_iters", "max_iters"), ("-debug", "debug"), ("-dt_main", "dt_main"), ("-dt_rad", "dt_rad"), ("-tout", "tout"), ("-out_dir", "out_dir")): 256c256 < for flag, key in (("-multicol", "multicol"), ("-batch_size", "batch_size"), ("-max_iters", "max_iters"), ("-debug", "debug"), ("-dt_main", "dt_main"), ("-dt_rad", "dt_rad"), ("-tout", "tout"), ("-output_dir", "out_dir")): --- > for flag, key in (("-multicol", "multicol"), ("-batch_size", "batch_size"), ("-max_iters", "max_iters"), ("-debug", "debug"), ("-dt_main", "dt_main"), ("-dt_rad", "dt_rad"), ("-tout", "tout"), ("-out_dir", "out_dir")): 261c261 < cmd.extend(["-params_file", params_path]) --- > cmd.extend(["-params", params_path]) 265c265 < cmd.extend(["-silhs_params_file", silhs_path]) --- > cmd.extend(["-silhs_params", silhs_path]) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/dash_app/tune_tab/runtime.py clubb_release/dash_app/tune_tab/runtime.py 281c281 < "-output_dir", --- > "-out_dir", 289c289 < "-params_file", --- > "-params", 301c301 < "-output_dir", --- > "-out_dir", 305c305 < "-params_file", --- > "-params", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/experimental/experimental_pdfs/python/dash_additions/utilities/refresh_pdf9_parcel_ensemble_lab.py clubb_release/experimental/experimental_pdfs/python/dash_additions/utilities/refresh_pdf9_parcel_ensemble_lab.py 43c43 < "-output_dir", --- > "-out_dir", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/input/flag_sets/README.md clubb_release/input/flag_sets/README.md 45c45 < 1. `run_scripts/run_clubb_w_varying_flags.py -flag_config_file .json` (or `tests/run_jax_vs_fortran_cases.py -flag_config_file .json`) --- > 1. `run_scripts/run_clubb_w_varying_flags.py -f .json` (or `tests/run_jax_vs_fortran_cases.py -flag_config_file .json`) 48c48 < The varying-flags runner can omit it with `-skip_default_flags`; `default` --- > The varying-flags runner can omit it with `--skip-default-flags`; `default` diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_basic_full_run/Jenkinsfile clubb_release/jenkins_tests/clubb_basic_full_run/Jenkinsfile 20c20 < run_scripts/run_scm_all.py -workers 8 --- > run_scripts/run_scm_all.py -nproc 8 34c34 < run_scripts/run_scm_all.py -workers 8 --- > run_scripts/run_scm_all.py -nproc 8 diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_column_mirror/Jenkinsfile clubb_release/jenkins_tests/clubb_column_mirror/Jenkinsfile 12c12 < python3 tests/check_mirrored_multi_col_output.py -multicol 3 -workers 2 --- > python3 tests/check_mirrored_multi_col_output.py -n 3 -nproc 2 diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_driver/Jenkinsfile clubb_release/jenkins_tests/clubb_driver/Jenkinsfile 21,22c21,22 < run_scripts/run_scm_all.py -workers 4 -multicol 4 -max_iters 500 -output_dir driver_test/standalone_ifx < run_scripts/run_scm_all.py -workers 4 -multicol 4 -max_iters 500 -output_dir driver_test/driver_ifx -driver_test --- > run_scripts/run_scm_all.py -nproc 4 -multicol 4 -max_iters 500 -out_dir driver_test/standalone_ifx > run_scripts/run_scm_all.py -nproc 4 -multicol 4 -max_iters 500 -out_dir driver_test/driver_ifx -driver_test 42,43c42,43 < run_scripts/run_scm_all.py -workers 1 -min_cases -multicol 8 -max_iters 200 -output_dir driver_test/standalone_nvhpc -override l_lh_straight_mc=.true. < run_scripts/run_scm_all.py -workers 1 -min_cases -multicol 8 -max_iters 200 -output_dir driver_test/driver_nvhpc -driver_test -override l_lh_straight_mc=.true. --- > run_scripts/run_scm_all.py -nproc 1 -min_cases -multicol 8 -max_iters 200 -out_dir driver_test/standalone_nvhpc -override l_lh_straight_mc=.true. > run_scripts/run_scm_all.py -nproc 1 -min_cases -multicol 8 -max_iters 200 -out_dir driver_test/driver_nvhpc -driver_test -override l_lh_straight_mc=.true. diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_generalized_grid/Jenkinsfile clubb_release/jenkins_tests/clubb_generalized_grid/Jenkinsfile 26,27c26,27 < -workers 8 \ < -flag_config_file input/flag_sets/run_bindiff_w_flags_config_core_flags.json \ --- > -nproc 8 \ > -f input/flag_sets/run_bindiff_w_flags_config_core_flags.json \ 56,57c56,57 < -workers 8 \ < -flag_config_file input/flag_sets/run_bindiff_w_flags_config_host_flags.json \ --- > -nproc 8 \ > -f input/flag_sets/run_bindiff_w_flags_config_host_flags.json \ 82c82 < -workers 8 \ --- > -nproc 8 \ 110c110 < -workers 8 \ --- > -nproc 8 \ diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_gpu_async_output_matching/Jenkinsfile clubb_release/jenkins_tests/clubb_gpu_async_output_matching/Jenkinsfile 24,28c24,28 < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/normal arm < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/normal atex < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/normal bomex < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/normal -override l_lh_straight_mc=true rico_silhs < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/normal -override l_lh_straight_mc=true mpace_b_silhs --- > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/normal arm > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/normal atex > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/normal bomex > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/normal -override l_lh_straight_mc=true rico_silhs > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/normal -override l_lh_straight_mc=true mpace_b_silhs 54,58c54,58 < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/async arm < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/async atex < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/async bomex < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/async -override l_lh_straight_mc=true rico_silhs < run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -output_dir gpu_async/async -override l_lh_straight_mc=true mpace_b_silhs --- > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/async arm > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/async atex > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/async bomex > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/async -override l_lh_straight_mc=true rico_silhs > run_scripts/run_scm.py -multicol C8/0.4:0.9/16 -stats input/stats/multi_col_stats.in -debug 0 -out_dir gpu_async/async -override l_lh_straight_mc=true mpace_b_silhs 65c65 < sh '''run_scripts/run_bindiff_all.py output/gpu_async/normal output/gpu_async/async -verbose 2''' --- > sh '''run_scripts/run_bindiff_all.py output/gpu_async/normal output/gpu_async/async -v 2''' diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_gpu_vs_cpu_diffness/Jenkinsfile clubb_release/jenkins_tests/clubb_gpu_vs_cpu_diffness/Jenkinsfile 14c14 < sh '''utilities/create_multi_col_params.py -multicol 32 -mode dup_tweak''' --- > sh '''utilities/create_multi_col_params.py -n 32 -mode dup_tweak''' 40,42c40,42 < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -override l_lh_straight_mc=.true. arm < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 500 -override l_lh_straight_mc=.true. cobra < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 10 -override l_lh_straight_mc=.true. rico_silhs --- > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -override l_lh_straight_mc=.true. arm > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 500 -override l_lh_straight_mc=.true. cobra > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 10 -override l_lh_straight_mc=.true. rico_silhs 72,74c72,74 < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -override l_lh_straight_mc=.true. arm < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 500 -override l_lh_straight_mc=.true. cobra < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 10 -override l_lh_straight_mc=.true. rico_silhs --- > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -override l_lh_straight_mc=.true. arm > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 500 -override l_lh_straight_mc=.true. cobra > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 10 -override l_lh_straight_mc=.true. rico_silhs 106,108c106,108 < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -override l_lh_straight_mc=.true. arm < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 500 -override l_lh_straight_mc=.true. cobra < run_scripts/run_scm.py -params_file clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 10 -override l_lh_straight_mc=.true. rico_silhs --- > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -override l_lh_straight_mc=.true. arm > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 500 -override l_lh_straight_mc=.true. cobra > run_scripts/run_scm.py -params clubb_params_multi_col.in -stats input/stats/multi_col_stats.in -debug 0 -max_iters 10 -override l_lh_straight_mc=.true. rico_silhs 120c120 < sh '''run_scripts/run_bindiff_all.py -verbose 2 -threshold 1e-6 -scale cpu_output acc_output''' --- > sh '''run_scripts/run_bindiff_all.py -v 2 -t 1e-6 -s cpu_output acc_output''' 128c128 < sh '''run_scripts/run_bindiff_all.py -verbose 2 -threshold 1e-6 -scale cpu_output omp_output''' --- > sh '''run_scripts/run_bindiff_all.py -v 2 -t 1e-6 -s cpu_output omp_output''' diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_G_unit/Jenkinsfile clubb_release/jenkins_tests/clubb_G_unit/Jenkinsfile 41c41 < python tests/run_G_unit_tests.py -rev_direction_grid_test --- > python tests/run_G_unit_tests.py --rev_direction_grid_test diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_jax/Jenkinsfile clubb_release/jenkins_tests/clubb_jax/Jenkinsfile 35c35 < ./tests/run_jax_vs_fortran_cases.py -workers 8 --- > ./tests/run_jax_vs_fortran_cases.py -j 8 47c47 < python3 tests/run_jax_vs_fortran_cases.py -debug 0 -max_iters 5 -workers 8 -flag_config_file input/flag_sets/config_core_flags_wo_never_supported_jax_features.json --- > python3 tests/run_jax_vs_fortran_cases.py -debug 0 -max_iters 5 -j 8 -flag_config_file input/flag_sets/config_core_flags_wo_never_supported_jax_features.json diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_plots/Jenkinsfile clubb_release/jenkins_tests/clubb_plots/Jenkinsfile 33c33 < run_scripts/run_scm_all.py -workers 4 --- > run_scripts/run_scm_all.py -nproc 4 37c37 < sh 'python postprocessing/pyplotgen/pyplotgen.py -les -clubb cpu_* cur_out/cpu_* -output_dir ${commit}_vs_master_$(cat cur_out/commit)' --- > sh 'python postprocessing/pyplotgen/pyplotgen.py -l -c cpu_* cur_out/cpu_* -o ${commit}_vs_master_$(cat cur_out/commit)' 66c66 < run_scripts/run_scm_all.py -workers 4 -priority_cases -override l_lh_straight_mc=.true. --- > run_scripts/run_scm_all.py -nproc 4 -priority_cases -override l_lh_straight_mc=.true. 77c77 < run_scripts/run_scm_all.py -workers 1 -priority_cases -override l_lh_straight_mc=.true. --- > run_scripts/run_scm_all.py -nproc 1 -priority_cases -override l_lh_straight_mc=.true. 82c82 < sh 'python postprocessing/pyplotgen/pyplotgen.py -les -clubb cpu_* cur_out/cpu_* gpu_* cur_out/gpu_* -output_dir ${commit}_vs_master_$(cat cur_out/commit)' --- > sh 'python postprocessing/pyplotgen/pyplotgen.py -l -c cpu_* cur_out/cpu_* gpu_* cur_out/gpu_* -o ${commit}_vs_master_$(cat cur_out/commit)' 110,111c110,111 < sh '''run_scripts/run_scm_all.py -workers 4 -priority_cases -output_dir solver_compare/lapack_output -override penta_solve_method=1,tridiag_solve_method=1''' < sh '''run_scripts/run_scm_all.py -workers 4 -priority_cases -output_dir solver_compare/custom_lu_output''' --- > sh '''run_scripts/run_scm_all.py -nproc 4 -priority_cases -out_dir solver_compare/lapack_output -override penta_solve_method=1,tridiag_solve_method=1''' > sh '''run_scripts/run_scm_all.py -nproc 4 -priority_cases -out_dir solver_compare/custom_lu_output''' 114c114 < sh '''run_scripts/run_scm_all.py -workers 4 -priority_cases -output_dir solver_compare/bicgstab_output -override penta_solve_method=3''' --- > sh '''run_scripts/run_scm_all.py -nproc 4 -priority_cases -out_dir solver_compare/bicgstab_output -override penta_solve_method=3''' 118c118 < sh 'python postprocessing/pyplotgen/pyplotgen.py -les -clubb output/solver_compare/lapack_output output/solver_compare/custom_lu_output output/solver_compare/bicgstab_output -output_dir output/${commit}_solver' --- > sh 'python postprocessing/pyplotgen/pyplotgen.py -l -c output/solver_compare/lapack_output output/solver_compare/custom_lu_output output/solver_compare/bicgstab_output -o output/${commit}_solver' diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_python/Jenkinsfile clubb_release/jenkins_tests/clubb_python/Jenkinsfile 54c54 < python3 tests/run_python_vs_fortran_cases.py -workers 4 --- > python3 tests/run_python_vs_fortran_cases.py -j 4 diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_single_prec_build/Jenkinsfile clubb_release/jenkins_tests/clubb_single_prec_build/Jenkinsfile 15c15 < sh '''run_scripts/run_scm_all.py -workers 4''' --- > sh '''run_scripts/run_scm_all.py -nproc 4''' diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/clubb_tuner/Jenkinsfile clubb_release/jenkins_tests/clubb_tuner/Jenkinsfile 23c23 < -output_dir output/new_tuner_test/loss_driver_fortran \ --- > -out_dir output/new_tuner_test/loss_driver_fortran \ 33c33 < -output_dir output/new_tuner_test/loss_driver_python \ --- > -out_dir output/new_tuner_test/loss_driver_python \ 49,50c49,50 < -param_ranges C8:0.2:0.8 \ < -workers 4 \ --- > -params C8:0.2:0.8 \ > -max_workers 4 \ 53c53 < -output_run_dir output/new_tuner_test/simple --- > -run_out_dir output/new_tuner_test/simple 68c68 < -param_ranges C8:0.2:0.8 C11:0.1:1.0 \ --- > -params C8:0.2:0.8 C11:0.1:1.0 \ 71c71 < -workers 2 \ --- > -max_workers 2 \ 79c79 < -output_run_dir output/new_tuner_test/complex --- > -run_out_dir output/new_tuner_test/complex 94c94 < -require_param_variation --- > --require_param_variation diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/jenkins_tests/run_bindiff_w_varying_flags_against_master/Jenkinsfile clubb_release/jenkins_tests/run_bindiff_w_varying_flags_against_master/Jenkinsfile 20,24c20,24 < -overwrite_existing \ < -compile_arg=-debug \ < -branches master,${TEST_BRANCH} \ < -output_root "${WORKSPACE}/bindiff_against_master" \ < -flag_config_file input/flag_sets/run_bindiff_w_flags_config_core_flags.json \ --- > --overwrite-existing \ > --compile-arg=-debug \ > -b master,${TEST_BRANCH} \ > -d "${WORKSPACE}/bindiff_against_master" \ > -f input/flag_sets/run_bindiff_w_flags_config_core_flags.json \ diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/LLM_prompts/update_python_api_and_drivers.md clubb_release/LLM_prompts/update_python_api_and_drivers.md 84,86c84,86 < python run_scripts/run_scm.py -max_iters 5 -output_dir /tmp/clubb_bomex_fortran bomex < python run_scripts/run_scm.py -max_iters 5 -python -output_dir /tmp/clubb_bomex_python bomex < python run_scripts/run_bindiff_all.py -verbose 2 -case bomex -threshold 1e-12 -percent_threshold 1e-12 /tmp/clubb_bomex_python /tmp/clubb_bomex_fortran --- > python run_scripts/run_scm.py -max_iters 5 -out_dir /tmp/clubb_bomex_fortran bomex > python run_scripts/run_scm.py -max_iters 5 -python -out_dir /tmp/clubb_bomex_python bomex > python run_scripts/run_bindiff_all.py -v 2 -case bomex -t 1e-12 -pt 1e-12 /tmp/clubb_bomex_python /tmp/clubb_bomex_fortran 95,98c95,98 < ./tests/run_python_vs_fortran_cases.py -cases bomex -workers 1 < ./tests/run_python_vs_fortran_cases.py -cases atex -workers 1 < ./tests/run_jax_vs_fortran_cases.py -cases bomex -workers 1 < ./tests/run_jax_vs_fortran_cases.py -cases atex -workers 1 --- > ./tests/run_python_vs_fortran_cases.py --cases bomex --jobs 1 > ./tests/run_python_vs_fortran_cases.py --cases atex --jobs 1 > ./tests/run_jax_vs_fortran_cases.py -cases bomex -jobs 1 > ./tests/run_jax_vs_fortran_cases.py -cases atex -jobs 1 101c101 < - `-workers 1` makes JAX comparison logs easier to inspect; the Python comparison script still uses `-workers 1`. --- > - `-jobs 1` makes JAX comparison logs easier to inspect; the Python comparison script still uses `--jobs 1`. 107,108c107,108 < ./tests/run_python_vs_fortran_cases.py -workers 1 < ./tests/run_jax_vs_fortran_cases.py -workers 1 --- > ./tests/run_python_vs_fortran_cases.py --jobs 1 > ./tests/run_jax_vs_fortran_cases.py -jobs 1 140,141c140,141 < - `./tests/run_python_vs_fortran_cases.py -workers 1` passes. < - `./tests/run_jax_vs_fortran_cases.py -workers 1` passes. --- > - `./tests/run_python_vs_fortran_cases.py --jobs 1` passes. > - `./tests/run_jax_vs_fortran_cases.py -jobs 1` passes. diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/latin_hypercube_plotting/variance_analysis_scripts/rms_vs_sample_points/silhs_varying_sp_output.sh clubb_release/postprocessing/latin_hypercube_plotting/variance_analysis_scripts/rms_vs_sample_points/silhs_varying_sp_output.sh 105c105 < -output_dir $OUTPUT_DIR/silhs_"$num_samples"_"$iseed" $CASE_NAME &>/dev/null --- > -out_dir $OUTPUT_DIR/silhs_"$num_samples"_"$iseed" $CASE_NAME &>/dev/null diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/Style_definitions.py clubb_release/postprocessing/pyplotgen/config/Style_definitions.py 94c94 < HQ_DPI = 100 # This value overwrites the default IMG_OUTPUT_DPI when -high_quality is passed in via command line --- > HQ_DPI = 100 # This value overwrites the default IMG_OUTPUT_DPI when --high-quality is passed in via command line diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/pyplotgen.py clubb_release/postprocessing/pyplotgen/pyplotgen.py 152c152 < # If -replace flag was set, delete old output folder --- > # If --replace flag was set, delete old output folder 212c212 < freeze_support() # Required for multiprocessing --- > freeze_support() # Required for multithreading 231c231 < "(i.e. following -sam, -clubb, -e3sm, -wrf, -cam), and confirm that\n" --- > "(i.e. following --sam, --clubb, --e3sm, --wrf, --cam), and confirm that\n" 258,259c258,259 < If -pdf was specified, this prints a pdf. Otherwise, this does nothing. < If -pdf and -pdf_filesize_limit were specified, this will loop over the run() method, reducing image size on --- > If --pdf was specified, this prints a pdf. Otherwise, this does nothing. > If --pdf and --pdf-filesize-limit were specified, this will loop over the run() method, reducing image size on 633,635c633,634 < parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < parser.add_argument('-replace', dest='replace', help="If the output folder already exists, replace it with the new one.", --- > parser = argparse.ArgumentParser() > parser.add_argument("-r", "--replace", help="If the output folder already exists, replace it with the new one.", 637,638c636,637 < parser.add_argument('-les', dest='les', help="Plot LES dependent_data for comparison.", action="store_true") < parser.add_argument('-e3sm', dest='e3sm', --- > parser.add_argument("-l", "--les", help="Plot LES dependent_data for comparison.", action="store_true") > parser.add_argument("-e", "--e3sm", 645c644 < parser.add_argument('-plot_golaz_best', dest='plot_golaz_best', help="Plot Chris Golaz Best Ever dependent_data for comparison.", --- > parser.add_argument("-g", "--plot-golaz-best", help="Plot Chris Golaz Best Ever dependent_data for comparison.", 647c646 < parser.add_argument('-plot_hoc_2005', dest='plot_hoc_2005', help="Plot !HOC 12/17/2015 dependent_data for comparison.", --- > parser.add_argument("-d", "--plot-hoc-2005", help="Plot !HOC 12/17/2015 dependent_data for comparison.", 649c648 < parser.add_argument('-all_best', dest='all_best', --- > parser.add_argument("-a", "--all-best", 652,653c651,652 < parser.add_argument('-zip', dest='zip', help="Output dependent_data into a compressed zip file.", action="store_true") < parser.add_argument('-show_alphabetic_id', dest='show_alphabetic_id', help="Add an identifying character to the top right of a panel.", --- > parser.add_argument("-z", "--zip", help="Output dependent_data into a compressed zip file.", action="store_true") > parser.add_argument("--show-alphabetic-id", help="Add an identifying character to the top right of a panel.", 655,657c654,656 < parser.add_argument('-thin', dest='thin', help="Plot using thin solid lines.", action="store_true") < parser.add_argument('-no_legends', dest='no_legends', help="Plot without legend boxes defining the line types.", action="store_true") < parser.add_argument('-plot_budgets', dest='plot_budgets', help="Plot all defined budgets of moments.", --- > parser.add_argument("--thin", help="Plot using thin solid lines.", action="store_true") > parser.add_argument("--no-legends", help="Plot without legend boxes defining the line types.", action="store_true") > parser.add_argument("-b", "--plot-budgets", help="Plot all defined budgets of moments.", 659c658 < parser.add_argument('-lumped_buoy_budgets', dest='lumped_buoy_budgets', help="Lump together wpxp_bp and wpxp_pr3 terms in CLUBB's budgets.", --- > parser.add_argument("--lumped-buoy-budgets", help="Lump together wpxp_bp and wpxp_pr3 terms in CLUBB's budgets.", 661c660 < parser.add_argument('-background_rcm', dest='background_rcm', help="Show a height-based 'contour' plot of time-averaged rcm behind CLUBB profiles.", --- > parser.add_argument("--background-rcm", help="Show a height-based 'contour' plot of time-averaged rcm behind CLUBB profiles.", 663c662 < parser.add_argument('-plot_subcolumns', dest='plot_subcolumns', help="Plot all defined subcolumns.", --- > parser.add_argument("--plot-subcolumns", help="Plot all defined subcolumns.", 665c664 < parser.add_argument('-time_height_plots', dest='time_height_plots', --- > parser.add_argument("-t", "--time-height-plots", 669c668 < parser.add_argument('-movies', dest='movies', --- > parser.add_argument("-m", "--movies", 671c670 < "-pdf, -eps, or -svg. FRAMES_PER_SECOND can be adjusted in " + --- > "--pdf, --eps, or --svg. FRAMES_PER_SECOND can be adjusted in " + 674c673 < parser.add_argument('-bu_morr', dest='bu_morr', --- > parser.add_argument("--bu-morr", 677c676 < parser.add_argument('-benchmark_only', dest='benchmark_only', --- > parser.add_argument("--benchmark-only", 682,683c681,682 < parser.add_argument('-diff', dest='diff', help="Plot the difference between two clubb folders", action="store") < parser.add_argument('-clubb', dest='clubb', help="Input folder(s) containing clubb netcdf data.", action="store", --- > parser.add_argument("--diff", help="Plot the difference between two clubb folders", action="store") > parser.add_argument("-c", "--clubb", help="Input folder(s) containing clubb netcdf data.", action="store", 685c684 < parser.add_argument('-sam', dest='sam', help="Input folder(s) containing sam netcdf data.", action="store", --- > parser.add_argument("-s", "--sam", help="Input folder(s) containing sam netcdf data.", action="store", 687c686 < parser.add_argument('-cam', dest='cam', help="Input folder(s) containing cam netcdf data.", action="store", --- > parser.add_argument("--cam", help="Input folder(s) containing cam netcdf data.", action="store", 689c688 < parser.add_argument('-wrf', dest='wrf', help="Input folder(s) containing wrf netcdf data.", action="store", --- > parser.add_argument("-w", "--wrf", help="Input folder(s) containing wrf netcdf data.", action="store", 691,693c690,692 < parser.add_argument('-output_dir', dest='output', help="Name of folder to create and store plots into.", action="store", < default="./output", metavar='DIR') < parser.add_argument('-nightly', dest='nightly', help="Apply special parameters only relevant when running as part of a nightly " --- > parser.add_argument("-o", "--output", help="Name of folder to create and store plots into.", action="store", > default="./output") > parser.add_argument("--nightly", help="Apply special parameters only relevant when running as part of a nightly " 701,702c700,705 < parser.add_argument('-serial', dest='disable_multithreading', help="Generate plots serially instead of using the process pool.", action="store_true") < parser.add_argument('-high_quality', dest='high_quality', --- > parser.add_argument("--disable-multithreading", help="This forces pyplotgen to run on a single thread. This isn't " > "recommended, but if you're having issues with multithreading " > "or want text output to appear sequentially and don't care" > "about performance, use this option.", > action="store_true") > parser.add_argument("--high-quality", "--hq", 706c709 < parser.add_argument('-svg', dest='svg', --- > parser.add_argument("--svg", 708c711 < "like png.This argument is not compatible with -eps or -pdf. " --- > "like png.This argument is not compatible with --eps or --pdf. " 711c714 < parser.add_argument('-eps', dest='eps', --- > parser.add_argument("--eps", 713c716 < "like png. This argument is not compatible with -svg or -pdf. " --- > "like png. This argument is not compatible with --svg or --pdf. " 716c719 < parser.add_argument('-pdf', dest='pdf', --- > parser.add_argument("--pdf", 722,723c725,726 < parser.add_argument('-pdf_filesize_limit', dest='pdf_filesize_limit', help="Adjust pdf filesize so that it is no larger than the given size " < "in MB. Note that this argument only works if -pdf is also " --- > parser.add_argument("--pdf-filesize-limit", help="Adjust pdf filesize so that it is no larger than the given size " > "in MB. Note that this argument only works if --pdf is also " 726c729 < parser.add_argument('-cases', dest='cases', help="Case names separated by spaces or commas. Only these cases are plotted. Each " --- > parser.add_argument("--cases", help="A set of case name(s) to be ran. Cases not listed here will not be ran. The " 728c731 < "Case_definitions.py. E.g. -cases bomex arm wangara", --- > "Case_definitions.py. E.g. --cases bomex arm wangara", 731c734 < parser.add_argument('-priority_variables', dest='priority_variables', help="Plot only variables with the 'priority' key.", --- > parser.add_argument("--priority-variables", help="Plot only variables with the 'priority' key.", 733c736 < parser.add_argument('-sam_style_budgets', dest='sam_style_budgets', help="Lump together certain CLUBB budget terms so that the relevant " --- > parser.add_argument("--sam-style-budgets", help="Lump together certain CLUBB budget terms so that the relevant " 737,740d739 < if args.cases: < args.cases = [case.strip() for value in args.cases for case in value.split(",") if case.strip()] < if not args.cases: < parser.error("-cases must contain at least one case name") 772c771 < raise RuntimeError("The -movies option currently only works with .png images. Please remove -eps or -svg " --- > raise RuntimeError("The --movies option currently only works with .png images. Please remove --eps or --svg " 780,781c779,780 < raise RuntimeError("The -svg and -eps options are not compatible with one another. Please select either -eps " < "or -svg but not both.") --- > raise RuntimeError("The --svg and --eps options are not compatible with one another. Please select either --eps " > "or --svg but not both.") 785,786c784,785 < "the FPDF engine used. Please remove either the -svg or -eps option (whichever was used) or " < "remove the -pdf option. Note that you can create -svg/-eps output if desired, and then " --- > "the FPDF engine used. Please remove either the --svg or --eps option (whichever was used) or " > "remove the --pdf option. Note that you can create --svg/--eps output if desired, and then " 793c792 < raise ValueError('Error: Command line parameters -time_height_plots and -movies cannot be used in conjunction.') --- > raise ValueError('Error: Command line parameter -t and -m cannot be used in conjunction.') 796c795 < raise ValueError('Error: Command line parameters -pdf and -movies cannot be used in conjunction.') --- > raise ValueError('Error: Command line parameters --pdf and --movies cannot be used in conjunction.') 799c798 < raise ValueError('Error: Command line parameters -time_height_plots and -plot_budgets cannot ' --- > raise ValueError('Error: Command line parameters --time-height-plots and -b (--plot-budgets) cannot ' diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/README.md clubb_release/postprocessing/pyplotgen/README.md 7,8c7,8 < To plot clubb output located in `/home/USERNAME/clubb_issue_834/output/default_run` < and save the generated plots in `/home/USERNAME/clubb/output/pyplots_default_run`, --- > To plot clubb output located in `/home/USERNAME/clubb_issue_834/output/default_run` > and save the generated plots in `/home/USERNAME/clubb/output/pyplots_default_run`, 11c11 < `python3 ./pyplotgen.py -clubb /home/USERNAME/clubb_issue_834/output/default_run -output_dir /home/USERNAME/clubb/output/pyplots_default_run` --- > `python3 ./pyplotgen.py -c /home/USERNAME/clubb_issue_834/output/default_run -o /home/USERNAME/clubb/output/pyplots_default_run` 15c15 < `python3 ./pyplotgen.py -plot_budgets -les -clubb /home/USERNAME/clubb_issue_834/output/default_run -output_dir /home/USERNAME/clubb/output/pyplots_default_run` --- > `python3 ./pyplotgen.py --plot-budgets -l -c /home/USERNAME/clubb_issue_834/output/default_run -o /home/USERNAME/clubb/output/pyplots_default_run` 19c19 < `python3 ./pyplotgen.py`
--- > `python3 ./pyplotgen.py`
28,29c28,29 < to the index.html file. Then go to a web browser URL bar, type "file://" then the path, < and then "/index.html". --- > to the index.html file. Then go to a web browser URL bar, type "file://" then the path, > and then "/index.html". 35c35 < `python3 ./pyplotgen.py -cases bomex -sam /path/to/sam/output/ -output_dir ./sam_plots` --- > `python3 ./pyplotgen.py --cases bomex -s /path/to/sam/output/ -o ./sam_plots` 37c37 < But, in the /path/to/sam/output/ directory, pyplotgen will look for a file named BOMEX_SAM_CLUBB.nc. This is because by default, in config/Case_definitions.py in the case definition block for BOMEX, the SAM file is given as --- > But, in the /path/to/sam/output/ directory, pyplotgen will look for a file named BOMEX_SAM_CLUBB.nc. This is because by default, in config/Case_definitions.py in the case definition block for BOMEX, the SAM file is given as 39c39 < `'sam_file': {'sam': sam_output_root + "/BOMEX_SAM_CLUBB.nc"}` --- > `'sam_file': {'sam': sam_output_root + "/BOMEX_SAM_CLUBB.nc"}` 46,48c46 < Use single-dash options with underscores. `-h` or `-help` shows accepted values. < < | Option | Purpose | --- > | *Option Flag* | *Description* | 50,84c48,78 < | `-h / -help` | Show this help and exit. | < | `-replace` | If the output folder already exists, replace it with the new one. | < | `-les` | Plot LES dependent_data for comparison. | < | `-e3sm` | Plot E3SM dependent_data for comparison. | < | `-plot_golaz_best` | Plot Chris Golaz Best Ever dependent_data for comparison. | < | `-plot_hoc_2005` | Plot !HOC 12/17/2015 dependent_data for comparison. | < | `-all_best` | Same as -lgd. | < | `-zip` | Output dependent_data into a compressed zip file. | < | `-show_alphabetic_id` | Add an identifying character to the top right of a panel. | < | `-thin` | Plot using thin solid lines. | < | `-no_legends` | Plot without legend boxes defining the line types. | < | `-plot_budgets` | Plot all defined budgets of moments. | < | `-lumped_buoy_budgets` | Lump together wpxp_bp and wpxp_pr3 terms in CLUBB's budgets. | < | `-background_rcm` | Show a height-based 'contour' plot of time-averaged rcm behind CLUBB profiles. | < | `-plot_subcolumns` | Plot all defined subcolumns. | < | `-time_height_plots` | Instead of averaged profiles, create contour plots from 2d data. | < | `-movies` | Instead of averaged profiles, plot animations of time steps. | < | `-bu_morr` | For morrison microphysics: breaks microphysical source terms into component processes. | < | `-benchmark_only` | Prevents autoplotting of clubb's default output folder when no input folders are specified. | < | `-diff` | Plot the difference between two clubb folders. | < | `-clubb` | Input folder(s) containing clubb netcdf data. | < | `-sam` | Input folder(s) containing sam netcdf data. | < | `-cam` | Input folder(s) containing cam netcdf data. | < | `-wrf` | Input folder(s) containing wrf netcdf data. | < | `-output_dir` | Name of folder to create and store plots into. | < | `-nightly` | Apply special parameters only relevant when running as part of a nightly test. | < | `-serial` | Generate plots serially instead of using the process pool. | < | `-high_quality` | Outputs higher resolution images. | < | `-svg` | Outputs images to a lossless vector-graphics format .svg instead of a rasterized image like png.This argument is not compatible with -eps or -pdf. | < | `-eps` | Outputs images to Encapsulated PostScript eps instead of a rasterized image like png. | < | `-pdf` | In addition to pyplotgen's regular output, this also generates a pdf file from the plots.html output. | < | `-pdf_filesize_limit` | Adjust pdf filesize so that it is no larger than the given size in MB. | < | `-cases` | A set of case name(s) to be ran. | < | `-priority_variables` | Plot only variables with the 'priority' key. | < | `-sam_style_budgets` | Lump together certain CLUBB budget terms so that the relevant CLUBB budgets look comparable to SAM's budgets. | --- > | -r --replace | Overwrite the output folder if it already exists | > | -c --clubb [FOLDER PATHNAME(S)] | Adds lines from CLUBB model output to plot. To plot lines in the specified folder for a given case, update the `'clubb_file': None,` parameter in the case's definition (`config/Case_Definitions.py`)for the desired case to contain the location of the clubb file. | > | --cam [FOLDER PATHNAME(S)] | Adds lines from CAM model output to plot. The filenames in the folder must either match the intended casename, e.g. `bomex.nc` (using the lowercase version of the casename as defined in the `Case_definitions.py` file), or else you must rewrite the `'cam_file': None,` parameter for the desired case to contain the location of the cam file.| > | -e --e3sm [FOLDER PATHNAME(S)] | Adds lines from E3SM model output to plot. The filenames in the folder must either match the casename intended to run it, e.g. `bomex.nc` (using the lowercase version of the casename as defined in the `Case_definitions.py` file), or rewrite the `'e3sm_file': None,` parameter for the desired case to contain the location of the e3sm file.| > | -s --sam [FOLDER PATHNAME(S)] | Adds lines from SAM model output to plot. To plot lines in the specified folder for a given case, update the `'sam_file': None,` parameter in the case's definition (`config/Case_Definitions.py`)for the desired case to contain the location of the SAM file. For example, adding SAM output for the ARM case may look like `'sam_file': sam_output_root+ "/GCSSARM_96x96x110_67m_40m_1s.nc",`| > | -w --wrf [FOLDER PATHNAME(S)] | Adds lines from WRF model output to plot. To plot lines in the specified folder for a given case, update the `'wrf_file': None,` parameter in the case's definition (`config/Case_Definitions.py`)for the desired case to contain the location of the WRF file.| > | -g --plot-golaz-best | Plots clubb r408 'best ever' plots | > | -l --les | Overplot LES output data. The nc files for les output can be overwritten by changing the directory listed for a given case inside the `Case_Definitions.py` file. | > | -d --plot-hoc-2005 | Plots HOC benchmark output | > | -a --all-best | Identical to -lgd. Adds golaz best, les, and hoc benchmark output to the plots | > | --thin | Plot lines with a thin width | > | -b --plot-budgets | Includes budget panels in output | > | --lumped-buoy-budgets | Lump together wpxp_bp and wpxp_pr3 terms in CLUBB's budgets | > | --background_rcm | Show a height-based "contour" plot of time-averaged rcm behind CLUBB profiles | > | -t --time-height-plots | Instead of time-averaged profiles, create contour plots from 2d data | > | --diff [FOLDER PATHNAME] | (Experimental) Plots the difference between the input folder and the folder specified after --diff instead of plotting a regular profile | > | --no-legends | Panels are drawn without a line legend | > | -o --output | Manually specify an output folder. If not specified, will automatically output to `pyplotgen/output` | > | --show-alphabetic-id | Adds an alphanumeric ID to each plot on a perc-case basis (e.g. the first plot will be labeled "a") > | --nightly | Apply special parameters only relevant when running as part of a nightly test. This is currently limited to disabling case output if not all models have data for a given case. E.g. this prevents wrf plots from including cases that only have clubb plots and no wrf plots. Do not plot this with clubb-only plots, just plot clubb normally for clubb nightly tests. > | --disable-multithreading | Turns off multithreading support. Useful for debugging as it ensures text is printed sequentially. | > | --hq --high-quality | Outputs higher resolution images. The dpi used for hi resolution images can be customized in Style_definitions.py | > | --svg | Output images to .svg lossless format instead of .png | > | --eps | Output images to .eps format instead of .png | > | --pdf | This will generate a pdf from pyplotgen's output. Note that --svg and --eps are not compatible with this option | > | --pdf-filesize-limit [NUMERICAL VALUE IN MB] | This parameter will run --pdf multiple times, with each iteration lowering pyplotgens output image quality until the resulting pdf fits within the given file size in MB. Note: --pdf is required for this parameter to do anything. | > | --plot-subcolumns | This adds subcolumn (silhs) to the pyplotgen output. Currently only CLUBB subcolumns are supported. | > | --cases | A set of case name(s) to be ran. Cases not listed here will not be ran. The casename specified must match the 'name' parameter of the case's definition Case_definitions.py. E.g. --cases bomex arm wangara | > | --movies [OPTIONAL TYPE] | Creates animated plots of all standard variables except type_timeseries. Basic usage is e.g. --movies=mp4. If no argument (like 'mp4') is given, it defaults to mp4. Can be used with --plot_budgets, --plot-subcolumns, and other 2D data like --les. Cannot be used with --pdf, --time-height-plots, or --eps or --svg. Currently .mp4 and .avi are supported, but .mp4 is probably more compatible with most web browsers. To adjust the frame rate, change the FRAMES_PER_SECOND variable in config/Style_definitions.py. | > | --priority-variables | Outputs a small subset of interesting variables (including budgets for these variables if used with the -b option). The subset can be modified by going into a VariableGroup file in the [config folder](https://github.com/larson-group/clubb_release/tree/master/postprocessing/pyplotgen/config) and editing the Priority property. Useful for cutting down time for generating movies (animations). | > | --sam-style-budgets | Outputs CLUBB budgets similar to SAM budgets, i.e. by gathering terms so that they can be viewed in comparison to SAM budgets. Must be used with the -b or --plot-budgets option. | 94c88 < _How to reduce the time taken to generate animations_: Animations can take considerable time to generate, with the main factor being the number of time steps you wish to use---for example, in config/Case_definitions.py, BOMEX will by default be trimmed to 180 time steps in length, which means for each animation panel (and there will be dozens of panels at a minimum, possibly many more if budgets, etc. are included), 180 images will need to be processed. This is time consuming but feasible. The ARM_97 case by default, includes over 1000 images per animation---this would take hours of processing time, even with multiprocessing. Another consideration is that an .html page that contains a lot of movies (meaning many cases---ARM,BOMEX,etc.---being plotted together) can take a long time to load. --- > _How to reduce the time taken to generate animations_: Animations can take considerable time to generate, with the main factor being the number of time steps you wish to use---for example, in config/Case_definitions.py, BOMEX will by default be trimmed to 180 time steps in length, which means for each animation panel (and there will be dozens of panels at a minimum, possibly many more if budgets, etc. are included), 180 images will need to be processed. This is time consuming but feasible. The ARM_97 case by default, includes over 1000 images per animation---this would take hours of processing time, even with multithreading. Another consideration is that an .html page that contains a lot of movies (meaning many cases---ARM,BOMEX,etc.---being plotted together) can take a long time to load. 96c90 < One way of reducing the amount of output or the time it takes to generate movies is to reduce the number of variables plotted. To do so, use the -priority_variables option in conjunction with -movies, see above. Another way is to create one case of movies at a time rather than submit a huge job with many CLUBB cases. --- > One way of reducing the amount of output or the time it takes to generate movies is to reduce the number of variables plotted. To do so, use the --priority-variables option in conjunction with --movies, see above. Another way is to create one case of movies at a time rather than submit a huge job with many CLUBB cases. 103,104c97,98 < _Note: This process has become obsolete. While this is still possible, it is better to use the `-cases` command line parameter < described above._ --- > _Note: This process has become obsolete. While this is still possible, it is better to use the `--cases` command line parameter > described above._ 106c100 < If someone wants to run only a few cases, reguardless of how many datasets were outputted to a folder, they can do so by editing the last line of the `pyplotgen/config/Case_definitions.py` file such that it defines `ALL_CASES` to contain only the cases they wish to plot. --- > If someone wants to run only a few cases, reguardless of how many datasets were outputted to a folder, they can do so by editing the last line of the `pyplotgen/config/Case_definitions.py` file such that it defines `ALL_CASES` to contain only the cases they wish to plot. 163c157 < In the `config/Style_definitions.py` file there are two relavent variables: `COLOR_ROTATION` and `STYLE_ROTATION`. --- > In the `config/Style_definitions.py` file there are two relavent variables: `COLOR_ROTATION` and `STYLE_ROTATION`. 165c159 < time. All others should be commented out. For publication, it is suggested to use the print-safe definitions. Using a set --- > time. All others should be commented out. For publication, it is suggested to use the print-safe definitions. Using a set 169,171c163,165 < Matplotlib (the plotting engine used in the background of pyplotgen) allows for LaTeX style math text formatting. < Pyplotgen allows for titles and dependent axis labels to be overriden. To create a custom title/axis label, simply < include a 'title' or 'axis_title' parameter in the variables definition. Additionally, these custom titles can utilize --- > Matplotlib (the plotting engine used in the background of pyplotgen) allows for LaTeX style math text formatting. > Pyplotgen allows for titles and dependent axis labels to be overriden. To create a custom title/axis label, simply > include a 'title' or 'axis_title' parameter in the variables definition. Additionally, these custom titles can utilize 173c167 < For more information on matplotlib's text formatting, see here: https://matplotlib.org/1.3.1/users/mathtext.html --- > For more information on matplotlib's text formatting, see here: https://matplotlib.org/1.3.1/users/mathtext.html 194,195c188,189 < Changing the text on a legend label for non-budget plots is easy. To do so, simply change the foldername of the data being imported. Note < that underscores (`_`) will be replaced with spaces automatically. This is done to make the legends more readable, as it --- > Changing the text on a legend label for non-budget plots is easy. To do so, simply change the foldername of the data being imported. Note > that underscores (`_`) will be replaced with spaces automatically. This is done to make the legends more readable, as it 207c201 < | --- | --- | --- > | --- | --- | 265c259 < Creating a new calculator function is relatively simple, but must be done correctly. --- > Creating a new calculator function is relatively simple, but must be done correctly. 267c261 < Steps: --- > Steps: 277,278c271,272 < :param self: < :param dataset_override: --- > :param self: > :param dataset_override: 303,305c297,299 < :param self: < :param dataset_override: < :return: --- > :param self: > :param dataset_override: > :return: 315c309 < Once this method is created, simply add this function to the variable's entry in the self.variable_definitions list at the top of the file. --- > Once this method is created, simply add this function to the variable's entry in the self.variable_definitions list at the top of the file. 318c312 < {'var_names': { --- > {'var_names': { 322c316 < } --- > } 325,326c319,320 < **Note**: do NOT include () when giving the functions name, here we are using functional programming to pass the method itself as a parameter, not a call to the method, so we must not use the (). < --- > **Note**: do NOT include () when giving the functions name, here we are using functional programming to pass the method itself as a parameter, not a call to the method, so we must not use the (). > 394,396c388,390 < The VariableGroups `VariableGroupSamBudgets`, `VariableGroupSamProfiles` and `VariableGroupSamMultilineProfiles` were added to recreate the SAM plots done with corplot (python_sam_budgets_plotter). < Pyplotgen will automatically generate the `VariableGroupSamBudgets` plots when using the `-plot_budgets` flag with SAM input. < To generate the SAM profile plots, add the VariableGroups to the `var_groups` list in the definition of the cases to be plotted and, if not wanted, remove or comment out the other VariableGroups. --- > The VariableGroups `VariableGroupSamBudgets`, `VariableGroupSamProfiles` and `VariableGroupSamMultilineProfiles` were added to recreate the SAM plots done with corplot (python_sam_budgets_plotter). > Pyplotgen will automatically generate the `VariableGroupSamBudgets` plots when using the `--plot-budgets` flag with SAM input. > To generate the SAM profile plots, add the VariableGroups to the `var_groups` list in the definition of the cases to be plotted and, if not wanted, remove or comment out the other VariableGroups. 399,400c393,394 < With the '-s' option multiple SAM input folders containing NetCDF files can be specified. < To plot SAM data for a specific case the name of the input NetCDF file needs to be the same as the string given under the key `sam_file` in the same case defintion. --- > With the '-s' option multiple SAM input folders containing NetCDF files can be specified. > To plot SAM data for a specific case the name of the input NetCDF file needs to be the same as the string given under the key `sam_file` in the same case defintion. 404c398 < --- > 420c414 < python3 ./pyplotgen.py -sam first/path/to/SAM/folder second/path/to/SAM/folder --- > python3 ./pyplotgen.py -s first/path/to/SAM/folder second/path/to/SAM/folder 425,427c419,421 < This will take care of most problems concerning interoperability. < Running pyplotgen on Windows was tested using Git Bash which is part of the git installation for windows and can be found [here](https://git-scm.com/). < Using Git Bash one can simply follow the same procedure as for regular Linux bash to run pyplotgen. --- > This will take care of most problems concerning interoperability. > Running pyplotgen on Windows was tested using Git Bash which is part of the git installation for windows and can be found [here](https://git-scm.com/). > Using Git Bash one can simply follow the same procedure as for regular Linux bash to run pyplotgen. diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/src/CaseGallerySetup.py clubb_release/postprocessing/pyplotgen/src/CaseGallerySetup.py 210c210 < If self.diff_datasets is true (i.e. -diff passed in via command line) then this will generate panels that --- > If self.diff_datasets is true (i.e. --diff passed in via command line) then this will generate panels that 215c215 < # Convert panels to difference panels if user passed in -diff <> --- > # Convert panels to difference panels if user passed in --diff <> 418c418 < When -show_alphabetic_id is passed in as a run parameter, pyplotgen will add an alphabetic label to each --- > When --show-alphabetic-id is passed in as a run parameter, pyplotgen will add an alphabetic label to each diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/convergence_run/convergence_config.py clubb_release/run_scripts/convergence_run/convergence_config.py 48,49c48 < parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser() 59c58 < help='Record that you already modified Tsfc in the sounding file; this option does not change it.') --- > help='note that the Tscf in the sounding file has been modified (user must have modified file)') 61c60 < help='Initial simulation time in seconds.') --- > help='time (in seconds) to simulate') 63c62 < help='Final simulation time in seconds.') --- > help='time (in seconds) to simulate') 66c65 < parser.add_argument('-output_name',dest='output_name', --- > parser.add_argument('-output-name',dest='output_name', 68c67 < parser.add_argument('-micro_off', dest='turn_off_microphysics', action='store_true', --- > parser.add_argument('-micro-off', dest='turn_off_microphysics', action='store_true', 70c69 < parser.add_argument('-rad_off', dest='turn_off_radiation', action='store_true', --- > parser.add_argument('-rad-off', dest='turn_off_radiation', action='store_true', 72c71 < parser.add_argument('-binary_out', dest='default_format', action='store_true', --- > parser.add_argument('-binary-out', dest='default_format', action='store_true', 74c73 < parser.add_argument('-new_bc', dest='modified_bc', action='store_true', --- > parser.add_argument('-new-bc', dest='modified_bc', action='store_true', 76c75 < parser.add_argument('-new_ic', dest='modified_ic', action='store_true', --- > parser.add_argument('-new-ic', dest='modified_ic', action='store_true', 78,82c77,81 < parser.add_argument('-fix_fc', dest='fixed_forcing', action='store_true', < help='Ignore prescribed forcings for this convergence run.') < parser.add_argument('-splat_off', dest='turn_off_splat', action='store_true', < help='Disable splatting by setting C_wp2_splat to zero.') < parser.add_argument('-standard_aterms', dest='standard_aterms', action='store_true', --- > parser.add_argument('-fix-fc', dest='fixed_forcing', action='store_true', > help='use non-time-dependent forcing instead of method in default case setup (time-dependent)') > parser.add_argument('-splat-off', dest='turn_off_splat', action='store_true', > help='use nonzero spatting terms in default case setup instead of setting them to zero') > parser.add_argument('-standard-aterms', dest='standard_aterms', action='store_true', 84,88c83,87 < parser.add_argument('-smooth_tau', dest='smoothed_tau', action='store_true', < help='Use a smoothed Heaviside function in the wpxp timescale.') < parser.add_argument('-lin_diff', dest='linear_diffusion', action='store_true', < help='Use linear diffusion by disabling the nonlinear diffusion coefficients.') < parser.add_argument('-new_lim', dest='modified_BVF_Ri_limiter', action='store_true', --- > parser.add_argument('-smooth-tau', dest='smoothed_tau', action='store_true', > help='use formula of tau (for wpxp) in default case setup without smoothed Heavidise function') > parser.add_argument('-lin-diff', dest='linear_diffusion', action='store_true', > help='use nonlinear diffusion in default case setup instead of linear diffusion') > parser.add_argument('-new-lim', dest='modified_BVF_Ri_limiter', action='store_true', 90c89 < parser.add_argument('-new_wp3cl', dest='modified_wp3_clip', action='store_true', --- > parser.add_argument('-new-wp3cl', dest='modified_wp3_clip', action='store_true', 96c95 < parser.add_argument('-skip_check', dest='skip_check', action='store_true', --- > parser.add_argument('-skip-check', action='store_true', 98c97 < parser.add_argument('-warm_init', dest='restart_run', action='store_true', --- > parser.add_argument('-warm-init', dest='restart_run', action='store_true', diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/README.md clubb_release/run_scripts/README.md 23c23 < - `python3 run_scripts/run_scm.py -output_dir bomex_short -max_iters 10 bomex` --- > - `python3 run_scripts/run_scm.py -out_dir bomex_short -max_iters 10 bomex` 66c66 < - `python3 run_scripts/run_scm_all.py -priority_cases -workers 4` --- > - `python3 run_scripts/run_scm_all.py -priority_cases -nproc 4` 72c72 < - `python3 run_scripts/run_scm_all.py -short_cases -show_output` --- > - `python3 run_scripts/run_scm_all.py -short_cases -v` 90c90 < - `python3 run_scripts/run_clubb_w_varying_flags.py -priority_cases -workers 4` --- > - `python3 run_scripts/run_clubb_w_varying_flags.py --priority-cases -nproc 4` 93c93 < - `python3 run_scripts/run_clubb_w_varying_flags.py -flag_config_file input/flag_sets/run_bindiff_w_flags_config_host_flags.json -min_cases` --- > - `python3 run_scripts/run_clubb_w_varying_flags.py -f input/flag_sets/run_bindiff_w_flags_config_host_flags.json --min-cases` 96c96 < - `python3 run_scripts/run_clubb_w_varying_flags.py -skip_default_flags -max_iters 10 bomex` --- > - `python3 run_scripts/run_clubb_w_varying_flags.py --skip-default-flags --max-iters 10 bomex` 113c113 < - `python3 run_scripts/run_bindiff_all.py -verbose 2 output_a output_b` --- > - `python3 run_scripts/run_bindiff_all.py -v 2 output_a output_b` 123c123 < - `python3 run_scripts/run_bindiff_all.py -case bomex -threshold 1e-12 -percent_threshold 1e-12 output_a output_b` --- > - `python3 run_scripts/run_bindiff_all.py -case bomex -t 1e-12 -pt 1e-12 output_a output_b` 126c126 < - `python3 run_scripts/run_bindiff_all.py -log_mode replace -verbose 2 output_a output_b` --- > - `python3 run_scripts/run_bindiff_all.py -f replace -v 2 output_a output_b` 129c129 < - `python3 run_scripts/run_bindiff_all.py -result_json comparison.json output_a output_b` --- > - `python3 run_scripts/run_bindiff_all.py --result-json comparison.json output_a output_b` 134c134 < - `python3 run_scripts/run_bindiff_all.py -flag_sets old_output new_output` --- > - `python3 run_scripts/run_bindiff_all.py --flag-sets old_output new_output` 142c142 < run unless `-dry_run` is used. --- > run unless `--dry-run` is used. 150c150 < - `python3 run_scripts/run_clubb_and_pyplotgen.py -name smoke -cases bomex arm -max_iters 10` --- > - `python3 run_scripts/run_clubb_and_pyplotgen.py --name smoke --cases bomex arm --max-iters 10` 154c154 < - `python3 run_scripts/run_clubb_and_pyplotgen.py -skip_compile -name trial -compare baseline` --- > - `python3 run_scripts/run_clubb_and_pyplotgen.py --skip-compile --name trial --compare baseline` 158c158 < - `python3 run_scripts/run_clubb_and_pyplotgen.py -dry_run -name check -cases bomex` --- > - `python3 run_scripts/run_clubb_and_pyplotgen.py --dry-run --name check --cases bomex` 194c194 < - `python3 run_scripts/run_tuner.py -initial_output -run_case fire` --- > - `python3 run_scripts/run_tuner.py -i --run-case fire` 197c197 < - `python3 run_scripts/run_tuner.py -run_type multiple -model_mult fire atex` --- > - `python3 run_scripts/run_tuner.py --run-type multiple --model-mult fire atex` 200c200 < - `python3 run_scripts/run_tuner.py -nightly -run_case fire` --- > - `python3 run_scripts/run_tuner.py -n --run-case fire` 211c211 < - `python3 run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -param_ranges C8:0.2:0.8` --- > - `python3 run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -params C8:0.2:0.8` 214c214 < - `python3 run_scripts/run_tuner_job.py -cases arm:10800:21600:10800 bomex:7200:18000:2700 -fields cloud_frac rcm -param_ranges C8:0.2:0.8 C11:0.1:1.0 -strategy resolve:0.1` --- > - `python3 run_scripts/run_tuner_job.py -cases arm:10800:21600:10800 bomex:7200:18000:2700 -fields cloud_frac rcm -params C8:0.2:0.8 C11:0.1:1.0 -strategy resolve:0.1` 218c218 < - `python3 run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -param_ranges C8:0.2:0.8 -dry_run` --- > - `python3 run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -params C8:0.2:0.8 -dry_run` 221c221 < - `python3 run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -param_ranges C8:0.2:0.8 -run_top complete -top_n 3` --- > - `python3 run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -params C8:0.2:0.8 -run_top complete -top_n 3` 239c239 < - `(cd run_scripts && python3 convergence_run/convergence_config.py bomex -dt 60 -dz 20 -skip_check)` --- > - `(cd run_scripts && python3 convergence_run/convergence_config.py bomex -dt 60 -dz 20 -skip-check)` 243c243 < - `(cd run_scripts && python3 convergence_run/convergence_config.py rico -dt 30 -ref 2 -rad_off -micro_off -skip_check)` --- > - `(cd run_scripts && python3 convergence_run/convergence_config.py rico -dt 30 -ref 2 -rad-off -micro-off -skip-check)` 246c246 < - `(cd run_scripts && python3 convergence_run/convergence_config.py dycoms2_rf02_nd -dt 10 -ref 3 -new_ic -new_bc -skip_check)` --- > - `(cd run_scripts && python3 convergence_run/convergence_config.py dycoms2_rf02_nd -dt 10 -ref 3 -new-ic -new-bc -skip-check)` 340,361d339 < < ## Shared command-line conventions < < Use single-dash options with underscores and `-h` or `-help` for help. < CPU worker pools use `-workers`, defaulting to half the logical CPUs available < through CPU affinity (at least one). GPU comparison runs remain serial. < `-threads` controls OpenMP threads; `-process_counts` selects a benchmark sweep. < Pyplotgen chooses its own pool size; `-serial` disables that pool. < < Use `-params_file` for model parameters, `-silhs_params_file` for SILHS parameters, < and `-param_ranges` for tuner search ranges. `-batch_size` controls model column < batching, including parameter samples represented by columns in tuner workers. < `-multicol NUM` selects count-based generation; `-multicol C8/0.2:0.8/4` selects < an explicit grid. The standalone generator also preserves advanced `-mode` < settings; `-mode hypergrid` interprets NUM as points per parameter dimension. < < Output locations use `-output_dir`, `-output_root`, or `-output_file`. < Tuner destinations are `-output_job_dir` and `-output_run_dir`; its internal < scheduler's `-job_dir` selects an existing job. Relative-path resolution follows < each script's documented behavior. Case lists accept commas and spaces. < Model options pass through wrappers to the SCM runner; namelist definitions and < JSON `-override` resolution are shared in `create_case_namelist.py`. diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_bindiff_all.py clubb_release/run_scripts/run_bindiff_all.py 34c34 < python run_bindiff_all.py -flag_sets [options] --- > python run_bindiff_all.py --flag-sets [options] 37,40c37,40 < -verbose {0,1,2} Verbosity (0=summary, 1=per-file, 2=full diff tables) < -threshold THRESHOLD Min avg absolute diff to report a variable < -percent_threshold THRESHOLD Min avg absolute percent diff to report a variable < -scale Scale diffs by average field magnitude --- > -v {0,1,2} Verbosity (0=summary, 1=per-file, 2=full diff tables) > -t THRESHOLD Min avg absolute diff to report a variable > -pt THRESHOLD Min avg absolute percent diff to report a variable > -s Scale diffs by average field magnitude 43,44c43,44 < -result_json PATH Write machine-readable comparison diagnostics < -log_mode {skip,replace,enumerate} Write per-case diff logs to output/bindiffs/ --- > --result-json PATH Write machine-readable comparison diagnostics > -f {skip,replace,enumerate} Write per-case diff logs to output/bindiffs/ 112,114c112,113 < parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter, add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < parser.add_argument('-log_mode', dest='fileout', action="store", choices=["skip", "replace", "enumerate"], default=None, --- > parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter) > parser.add_argument("-f", "--fileout", action="store", choices=["skip", "replace", "enumerate"], default=None, 122c121 < parser.add_argument('-verbose', dest='verbose', action="store", type=int, default=1, help="Choose level of verbosity for outputs, i.e. what is printed to console.\n"+ --- > parser.add_argument("-v", "--verbose", action="store", type=int, default=1, help="Choose level of verbosity for outputs, i.e. what is printed to console.\n"+ 126,129c125,128 < parser.add_argument('-threshold', dest="threshold", type=float, action="store", help="(float) Define the maximum absolute difference for an individual variable to be treated as different.") < parser.add_argument('-percent_threshold', dest="percent_thresh", type=float, action="store", help="(float) Define the maximum average absolute percent difference for an individual variable to be treated as different.") < parser.add_argument('-scale', dest='scale', action="store_true", help="Scale absolute differences by the average field value.") < parser.add_argument('-case', dest='case', action="store", default=None, help="Compare only the specified case name (e.g. 'bomex'). When omitted, all cases found in both directories are compared.") --- > parser.add_argument("-t", "--threshold", dest="threshold", type=float, action="store", help="(float) Define the maximum absolute difference for an individual variable to be treated as different.") > parser.add_argument("-pt", "--percent_thresh", dest="percent_thresh", type=float, action="store", help="(float) Define the maximum average absolute percent difference for an individual variable to be treated as different.") > parser.add_argument("-s", "--scale", action="store_true", help="Scale absolute differences by the average field value.") > parser.add_argument("-case", "--case", action="store", default=None, help="Compare only the specified case name (e.g. 'bomex'). When omitted, all cases found in both directories are compared.") 131,132c130,131 < parser.add_argument('-flag_sets', dest='flag_sets', action="store_true", help="Treat each immediate child directory as one flag-set output directory and compare matching flag sets.") < parser.add_argument('-result_json', dest='result_json', help="Write machine-readable comparison diagnostics to a JSON file for analysis by other scripts.") --- > parser.add_argument("--flag-sets", action="store_true", help="Treat each immediate child directory as one flag-set output directory and compare matching flag sets.") > parser.add_argument("--result-json", help="Write machine-readable comparison diagnostics to a JSON file for analysis by other scripts.") 136c135 < parser.error("-result_json is only supported for per-case comparisons") --- > parser.error("--result-json is only supported for per-case comparisons") 557,558c556,557 < # save_to_file: Value of the -output_file command line argument < # verbose: Value of the -verbose command line argument, level of verbosity --- > # save_to_file: Value of the --outfile command line argument > # verbose: Value of the --verbose command line argument, level of verbosity diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_clubb_and_pyplotgen.py clubb_release/run_scripts/run_clubb_and_pyplotgen.py 40c40 < PYPLOTGEN_BASE_OPTIONS = ["-plot_budgets", "-les"] --- > PYPLOTGEN_BASE_OPTIONS = ["--plot-budgets", "-l"] 47,48c47 < description="Run selected CLUBB cases and plot the output with pyplotgen.", < add_help=False, allow_abbrev=False --- > description="Run selected CLUBB cases and plot the output with pyplotgen." 50d48 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 52c50 < '-cases', dest='cases', --- > "--cases", 58c56 < '-name', dest='name', --- > "--name", 63c61 < '-output_root', dest='output_root', --- > "--output-root", 65d62 < metavar='DIR', 68c65 < '-compare', dest='compare', --- > "--compare", 77c74 < '-skip_compile', dest='skip_compile', --- > "--skip-compile", 82c79 < '-max_iters', dest='max_iters', --- > "--max-iters", 87c84 < '-parallel_plots', dest='enable_plot_multithreading', --- > "--enable-plot-multithreading", 92c89 < '-dry_run', dest='dry_run', --- > "--dry-run", 96,100c93 < args = parser.parse_args() < args.cases = [case.strip() for value in args.cases for case in value.split(",") if case.strip()] < if not args.cases: < parser.error("-cases requires at least one case") < return args --- > return parser.parse_args() 182c175 < "-output_dir", --- > "-out_dir", 202c195 < pyplotgen_options = [*PYPLOTGEN_BASE_OPTIONS, "-cases", *cases, "-clubb"] --- > pyplotgen_options = [*PYPLOTGEN_BASE_OPTIONS, "--cases", *cases, "-c"] 204c197 < pyplotgen_options.insert(0, "-serial") --- > pyplotgen_options.insert(0, "--disable-multithreading") 213c206 < [sys.executable, pyplotgen, *pyplotgen_options, *plot_inputs, "-output_dir", pyplots_output_path], --- > [sys.executable, pyplotgen, *pyplotgen_options, *plot_inputs, "-o", pyplots_output_path], 224c217 < if "-dry_run" not in sys.argv[1:]: --- > if "--dry-run" not in sys.argv[1:]: diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_clubb_w_varying_flags.py clubb_release/run_scripts/run_clubb_w_varying_flags.py 13c13 < ./run_clubb_w_varying_flags.py rico --- > ./run_clubb_flags.py rico 17c17 < ./run_clubb_w_varying_flags.py -short_cases --- > ./run_clubb_flags.py --short-cases 29,33c29 < SCRIPT_DIR = Path(__file__).resolve().parent < REPO_ROOT = SCRIPT_DIR.parent < sys.path.insert(0, str(REPO_ROOT)) < < from run_scripts.run_scm_all import ( --- > from run_scm_all import ( 42c38,43 < from utilities.flag_sets import build_override_arg, get_flag_sets, read_flag_settings # noqa: E402 --- > SCRIPT_DIR = Path(__file__).resolve().parent > REPO_ROOT = SCRIPT_DIR.parent > if str(REPO_ROOT) not in sys.path: > sys.path.insert(0, str(REPO_ROOT)) > # Make sure utilities folder can be found. We could omit this and run python3 -m run_scripts.run_clubb_w_varying_flags. > # But this has become the python scripts convention :/ 44,45c45 < from tuner.system_defaults import default_max_workers as default_workers < from utilities.create_case_namelist import parse_forwarded_args --- > from utilities.flag_sets import build_override_arg, get_flag_sets, read_flag_settings # noqa: E402 47c47 < DEFAULT_MAX_WORKERS = default_workers() --- > DEFAULT_MAX_WORKERS = 8 56d55 < 60,61c59 < formatter_class=argparse.RawTextHelpFormatter, < add_help=False, allow_abbrev=False --- > formatter_class=argparse.RawTextHelpFormatter 63d60 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 72c69 < " -all, -short_cases, -priority_cases, -min_cases." --- > " --all, --short-cases, --priority-cases, --min-cases." 77c74 < '-all', dest='all', --- > "--all", 83c80 < '-short_cases', dest='short_cases', action="store_true", default=False, --- > "--short-cases", action="store_true", default=False, 87c84 < '-priority_cases', dest='priority_cases', action="store_true", default=False, --- > "--priority-cases", action="store_true", default=False, 91c88 < '-min_cases', dest='min_cases', action="store_true", default=False, --- > "--min-cases", action="store_true", default=False, 95c92 < '-skip_default_flags', dest='skip_default_flags', action="store_true", default=False, --- > "--skip-default-flags", action="store_true", default=False, 99c96 < '-flag_config_file', dest='flag_config_file', type=str, default=str(DEFAULT_FLAG_CONFIG_FILE), --- > "-f", "--flag-config-file", type=str, default=str(DEFAULT_FLAG_CONFIG_FILE), 103c100,114 < '-workers', --- > "--max-iters", "-max_iters", > dest="max_iters", > type=int, > default=None, > help="Maximum number of iterations to pass to run_scm.py.", > ) > parser.add_argument( > "--tout", "-tout", > dest="tout", > type=int, > default=None, > help="Stats output interval in seconds to pass to run_scm.py.", > ) > parser.add_argument( > "--nproc", "-nproc", 111d121 < metavar='N', 117c127 < args, run_scm_extra_args = parse_forwarded_args(parser) --- > args, run_scm_extra_args = parser.parse_known_args() 132c142 < " -all, -short_cases, -priority_cases, -min_cases\n") --- > " --all, --short-cases, --priority-cases, --min-cases\n") 137c147 < "-all, -short_cases, -priority_cases, or -min_cases.\n") --- > "--all, --short-cases, --priority-cases, or --min-cases.\n") 177c187 < "-output_dir", out_dir, --- > "-out_dir", out_dir, 179a190,195 > > if args.tout is not None: > cmd += ["-tout", str(args.tout)] > > if args.max_iters is not None: > cmd += ["-max_iters", str(args.max_iters)] diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_scm_all.py clubb_release/run_scripts/run_scm_all.py 54,59c54,55 < sys.path.insert(0, str(Path(__file__).resolve().parents[1])) < from tuner.system_defaults import default_max_workers as default_workers < from utilities.create_case_namelist import parse_forwarded_args < < < def positive_int(value: str) -> int: --- > def positive_int(value): > """Argparse type checker for strictly positive integers.""" 66,72d61 < def split_values(values) -> list[str]: < """Normalize space-separated and comma-separated CLI lists.""" < if isinstance(values, str): < values = [values] < return [part.strip() for value in values or [] for part in value.split(",") if part.strip()] < < 121,122c110 < description="Run selected CLUBB cases concurrently; defaults to the 31 standard cases.", < add_help=False, allow_abbrev=False --- > description="Simplified CLUBB SCM runner (no nightly mode, predefined case lists)" 124,130c112,116 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < selection = parser.add_mutually_exclusive_group() < selection.add_argument("-all", action="store_true", help="Run ALL cases, even unmaintained ones") < selection.add_argument("-short_cases", action="store_true", help="Run short cases only") < selection.add_argument("-priority_cases", action="store_true", help="Run priority cases only") < selection.add_argument("-min_cases", action="store_true", help="Run minimal case set") < selection.add_argument( --- > parser.add_argument("-all", action="store_true", help="Run ALL cases, even unmaintained ones") > parser.add_argument("-short_cases", action="store_true", help="Run short cases only") > parser.add_argument("-priority_cases", action="store_true", help="Run priority cases only") > parser.add_argument("-min_cases", action="store_true", help="Run minimal case set") > parser.add_argument( 132,134c118,120 < nargs="+", < metavar="CASE", < help="Case names separated by spaces or commas.", --- > type=parse_cases, > metavar="CASE1,CASE2,...", > help="Run an explicit comma-separated case list (for example: arm,bomex,atex)", 137c123 < '-workers', dest='nproc', --- > "-nproc", 139c125 < default=default_workers(), --- > default=8, 141c127 < help="Maximum concurrent cases (default: half the available logical CPUs).", --- > help="Number of processes to use (default: 8)", 143c129 < parser.add_argument('-show_output', dest='verbose', action="store_true", help="Show output from each run_scm.py call") --- > parser.add_argument("-v", "--verbose", action="store_true", help="Show output from each run_scm.py call") 145,150c131 < args, extra_opts = parse_forwarded_args(parser) < if args.cases: < try: < args.cases = parse_cases(",".join(split_values(args.cases))) < except argparse.ArgumentTypeError as exc: < parser.error(str(exc)) --- > args, extra_opts = parser.parse_known_args() diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_scm_loss.py clubb_release/run_scripts/run_scm_loss.py 142,143c142 < parser = argparse.ArgumentParser(description="Run the in-memory CLUBB loss driver.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Run the in-memory CLUBB loss driver.") 148,149c147,148 < parser.add_argument('-params_file', dest='params', metavar="[FILE]", < help="Define the tunable parameters. Used to override params file selected by -config") --- > parser.add_argument("-params", metavar="[FILE]", > help="Define the tunable parameters. Used to override params file defined by --config") 151,152c150,151 < help="Model flags file. Used to override flags file selected by -config") < parser.add_argument('-output_dir', dest='out_dir', metavar="[DIR]", --- > help="Model flags file. Used to override flags file defined by --config") > parser.add_argument("-out_dir", metavar="[DIR]", 159c158 < "Use an integer for dup_tweak mode, e.g. -multicol 4, or a parameter-grid spec like " --- > "Use an integer for dup_tweak mode, e.g. -multicol 4, or an hr spec like " 182c181 < "-override", action="append", metavar="ASSIGNMENTS|JSON", --- > "-override", 184,185c183,184 < "Assignments, inline JSON, or a JSON file, with all/case settings. " < "Repeat to apply in order; later values win." --- > "Comma-separated key=value overrides. Values may be column lists when used " > "with -multicol, e.g. -override C8=0.8,0.7,C11=1.0,1.1" 191c190 < help="Case names separated by spaces or commas, e.g. -cases atex arm.", --- > help="Comma-separated case names to run, e.g. -cases atex,arm", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_scm.py clubb_release/run_scripts/run_scm.py 17c17 < from utilities.create_case_namelist import add_namelist_arguments # noqa: E402 --- > from utilities.create_case_namelist import validate_multicol # noqa: E402 174c174 < run_cmd.append(f"-options={args.jax_options}") --- > run_cmd.append(f"--options={args.jax_options}") 208c208 < cmd = [sys.executable, CREATE_CASE_NAMELIST, "-output_dir", output_dir] --- > cmd = [sys.executable, CREATE_CASE_NAMELIST, "-out_dir", output_dir] 212c212 < ("-params_file", args.params), --- > ("-params", args.params), 214c214 < ("-silhs_params_file", args.silhs_params), --- > ("-silhs_params", args.silhs_params), 250,251c250 < parser = argparse.ArgumentParser(description="Run the standalone CLUBB model", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Run the standalone CLUBB model") 254,255c253,282 < namelist_group = parser.add_argument_group("Model settings passed to create_case_namelist.py") < add_namelist_arguments(namelist_group) --- > namelist_group = parser.add_argument_group("Namelist options passed to create_case_namelist.py") > > namelist_group.add_argument("-config", metavar="[NAME|DIR]", > help=("Tunable config name under input/parameter_and_flag_configs, or a directory containing:\n" > " tunable_parameters.in\n" > " configurable_model_flags.in\n" > " silhs_parameters.in\n" > "Defaults to default if not given.")) > > namelist_group.add_argument("-params", metavar="[FILE]", > help=("Define the tunable parameters.\n" > "Used to override params file defined by --config")) > namelist_group.add_argument("-flags", metavar="[FILE]", > help=("Model flags file.\n" > "Used to override flags file defined by --config")) > namelist_group.add_argument("-silhs_params", metavar="[FILE]", > help=("SILHS parameters file.\n" > "Used to override silhs_params file defined by --config")) > > namelist_group.add_argument("-zt_grid", metavar="[FILE]", > help="Specify a zt grid file from input/grid.\nDefault: unused") > namelist_group.add_argument("-zm_grid", metavar="[FILE]", > help="Specify a zm grid file from input/grid.\nDefault: unused") > namelist_group.add_argument("-nzmax", metavar="[NUM]", type=int, > help="Max number of levels (required if specifying a zt/zm grid)") > > namelist_group.add_argument("-stats", metavar="[FILE]", > help=("Stats file defining fields to output.\n" > "Default: input/stats/standard_stats.in.\n" > "Use 'none' to disable stats output.")) 271c298 < "forwarded unchanged; see clubb_jax/run_jax.py -launcher_help.")) --- > "forwarded unchanged; see clubb_jax/run_jax.py --launcher-help.")) 278a306,342 > run_group.add_argument("-out_dir", metavar="[DIR]", > help=( > "Output directory for results. Bare names are rooted under output/ " > "(e.g. -out_dir test1 writes output/test1). Existing files with the " > "same names are overwritten. Default: output" > )) > > namelist_group.add_argument("-debug", metavar="[NUM]", > help="Debug level (0–3) that controls CLUBB's runtime checks (0 is no checks).\nDefault specified in model file.") > namelist_group.add_argument("-max_iters", metavar="[NUM]", type=int, > help="Maximum number of iterations") > namelist_group.add_argument("-dt_main", metavar="[SECONDS]", type=int, > help="Main timestep (s).\nDefault from model file.") > namelist_group.add_argument("-dt_rad", metavar="[SECONDS]", type=int, > help="Radiation timestep (s).\nDefault from model file.") > namelist_group.add_argument("-tout", metavar="[SECONDS]", type=int, > help="Stats output interval (s). Use 0 to disable.\nDefault from model file.") > namelist_group.add_argument("-stats_tstart", metavar="[SECONDS]", type=float, > help="Stats output window start time (s). Default from model file or driver.") > namelist_group.add_argument("-stats_tend", metavar="[SECONDS]", type=float, > help="Stats output window end time (s). Default from model file or driver.") > namelist_group.add_argument("-multicol", metavar="[NUM|SPEC]", type=validate_multicol, > help=("Generate a multi-column parameter file. " > "Use an integer for dup_tweak mode, e.g. -multicol 4, or an hr spec like " > "-multicol C8/0.2:0.8/4")) > namelist_group.add_argument("-batch_size", metavar="[NUM]", type=int, > help=( > "Runtime batch size written to &multicol_def. Requires -multicol. " > "Values larger than ngrdcol are clipped to ngrdcol." > )) > > namelist_group.add_argument( > "-override", action="append", metavar="ASSIGNMENTS|JSON", > help=("Assignments, inline JSON, or a JSON file, forwarded to create_case_namelist. " > "JSON may map settings to values or cases to settings. Repeat to apply in order; " > "later values win. Use namelist.key to add a key.")) > 294c358 < print("\n\033[93mWARNING: Specifying -nzmax will have no effect without specifying a -zm_grid or -zt_grid\033[0m") --- > print("\n\033[93mWARNING: Specifying --nzmax will have no effect without specifying a --zm_grid or --zt_grid\033[0m") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_tuner_job.py clubb_release/run_scripts/run_tuner_job.py 12c12 < -param_ranges C8:0.2:0.8 --- > -params C8:0.2:0.8 41c41 < python -m tuner.tune_clubb -job_dir --- > python -m tuner.tune_clubb --job-dir 238c238 < raise argparse.ArgumentTypeError("-cases must include at least one case unless -preset is used") --- > raise argparse.ArgumentTypeError("-cases must include at least one case unless --preset is used") 240c240 < raise argparse.ArgumentTypeError("-fields must include at least one field unless -preset is used") --- > raise argparse.ArgumentTypeError("-fields must include at least one field unless --preset is used") 242c242 < raise argparse.ArgumentTypeError("-param_ranges must include at least one PARAM:MIN:MAX range unless -preset is used") --- > raise argparse.ArgumentTypeError("-params must include at least one PARAM:MIN:MAX range unless --preset is used") 651c651 < "-output_dir", --- > "-out_dir", 659c659 < "-params_file", --- > "-params", 671c671 < "-output_dir", --- > "-out_dir", 675c675 < "-params_file", --- > "-params", 729c729 < " python run_scripts/run_tuner_job.py -preset wpxp -strategy random:8\n" --- > " python run_scripts/run_tuner_job.py --preset wpxp -strategy random:8\n" 731c731 < "-param_ranges C8:0.2:0.8 -strategy random:8\n" --- > "-params C8:0.2:0.8 -strategy random:8\n" 733c733 < "-fields cloud_frac rcm -param_ranges C8:0.2:0.8 C11:0.1:1.0 -strategy resolve:0.1\n" --- > "-fields cloud_frac rcm -params C8:0.2:0.8 C11:0.1:1.0 -strategy resolve:0.1\n" 735c735 < "-param_ranges C8:0.2:0.8 -strategy simann:2000:1.0:1e-12\n" --- > "-params C8:0.2:0.8 -strategy simann:2000:1.0:1e-12\n" 737c737 < "-param_ranges C8:0.2:0.8 -strategy adam:100:0.01:0.05:2\n" --- > "-params C8:0.2:0.8 -strategy adam:100:0.01:0.05:2\n" 739d738 < add_help=False, allow_abbrev=False 741d739 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 748,750c746,748 < parser.add_argument('-param_ranges', dest='params', nargs="+", help="Ranges as PARAM:MIN:MAX or linked PARAM=PARAM:MIN:MAX.", metavar='RANGE') < parser.add_argument('-preset', dest='preset', help="Named tuner preset; explicit -cases/-fields/-param_ranges override its pieces.") < parser.add_argument('-list_presets', dest='list_presets', action="store_true", help="List available Tune presets and exit.") --- > parser.add_argument("-params", nargs="+", help="Ranges as PARAM:MIN:MAX or linked PARAM=PARAM:MIN:MAX.") > parser.add_argument("--preset", help="Named tuner preset; explicit -cases/-fields/-params override its pieces.") > parser.add_argument("--list-presets", action="store_true", help="List available Tune presets and exit.") 766c764 < parser.add_argument("-batch_size", type=int, default=8, help="Parameter samples per CLUBB column batch. Default: 8.") --- > parser.add_argument("-batch_size", type=int, default=8, help="Parameter batch size. Default: 8.") 768c766 < '-workers', dest='max_workers', --- > "-max_workers", 771,772c769 < help=f"Maximum active case evaluations (default: half the available logical CPUs, {DEFAULT_MAX_WORKERS}).", < metavar='N', --- > help=f"Maximum concurrent case workers. Default: {DEFAULT_MAX_WORKERS}.", 795,796c792,793 < parser.add_argument('-output_job_dir', dest='job_dir', help="Exact job directory to create. Must be empty if it exists.", metavar='DIR') < parser.add_argument("-output_root", default=str(OUTPUT_TUNER_DIR), help="Root for generated job directories.", metavar='DIR') --- > parser.add_argument("-job_dir", help="Exact job directory to create. Must be empty if it exists.") > parser.add_argument("-output_root", default=str(OUTPUT_TUNER_DIR), help="Root for generated job directories.") 805c802 < parser.add_argument('-output_run_dir', dest='run_out_dir', default=str(CLUBB_OUTPUT_DIR), help="Output directory for post-tuning runs.", metavar='DIR') --- > parser.add_argument("-run_out_dir", default=str(CLUBB_OUTPUT_DIR), help="Output directory for post-tuning runs.") 812c809 < parser.error("-workers must be >= 1") --- > parser.error("-max_workers must be >= 1") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_tuner.py clubb_release/run_scripts/run_tuner.py 99c99 < "-params_file", --- > "-params", 103c103 < "-silhs_params_file", --- > "-silhs_params", 145,148c145,147 < parser = argparse.ArgumentParser(description="Run CLUBB tuner with Python tooling.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < parser.add_argument('-initial_output', dest='initial_output', action="store_true", help="Save pre-tuning outputs.") < parser.add_argument('-nightly', dest='nightly', action="store_true", help="Enable nightly mode behavior.") --- > parser = argparse.ArgumentParser(description="Run CLUBB tuner with Python tooling.") > parser.add_argument("-i", "--initial-output", action="store_true", help="Save pre-tuning outputs.") > parser.add_argument("-n", "--nightly", action="store_true", help="Enable nightly mode behavior.") 150c149 < '-run_type', dest='run_type', --- > "--run-type", 155c154 < parser.add_argument('-run_case', dest='run_case', default="fire", help="Case name used for tuner input selection.") --- > parser.add_argument("--run-case", default="fire", help="Case name used for tuner input selection.") 157c156 < '-model_mult', dest='model_mult', --- > "--model-mult", 163c162 < '-stats_tune', dest='stats_tune', --- > "--stats-tune", 168c167 < '-stats_opt', dest='stats_opt', --- > "--stats-opt", 205c204 < print("No cases specified for -model_mult") --- > print("No cases specified for --model-mult") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/CLUBB_core/stats_netcdf.F90 clubb_release/src/CLUBB_core/stats_netcdf.F90 699,700d698 < ! NetCDF has process-wide state, so all threads use the same I/O lock. < !$omp critical(clubb_netcdf) 717d714 < !$omp end critical(clubb_netcdf) 804d800 < !$omp critical(clubb_netcdf) 806d801 < !$omp end critical(clubb_netcdf) 2340d2334 < !$omp critical(clubb_netcdf) 2343d2336 < !$omp end critical(clubb_netcdf) 2351d2343 < !$omp critical(clubb_netcdf) 2354d2345 < !$omp end critical(clubb_netcdf) 2378d2368 < !$omp critical(clubb_netcdf) 2382d2371 < !$omp end critical(clubb_netcdf) 2400d2388 < !$omp critical(clubb_netcdf) 2414d2401 < !$omp end critical(clubb_netcdf) 2420d2406 < !$omp critical(clubb_netcdf) 2425d2410 < !$omp end critical(clubb_netcdf) 2651,2652d2635 < ! SILHS output shares the same NetCDF lock as the regular statistics. < !$omp critical(clubb_netcdf) 2713d2695 < !$omp end critical(clubb_netcdf) 2757d2738 < !$omp critical(clubb_netcdf) 2762d2742 < !$omp end critical(clubb_netcdf) 2830d2809 < !$omp critical(clubb_netcdf) 2835d2813 < !$omp end critical(clubb_netcdf) 2847d2824 < !$omp critical(clubb_netcdf) 2853d2829 < !$omp end critical(clubb_netcdf) 2863d2838 < !$omp critical(clubb_netcdf) 2869d2843 < !$omp end critical(clubb_netcdf) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/analyze_tuner_sample_history.py clubb_release/tests/analyze_tuner_sample_history.py 497c497 < "-metric all -modes 5 -top 10 -min_samples 8 -require_param_variation\n" --- > "-metric all -modes 5 -top 10 -min_samples 8 --require_param_variation\n" 499d498 < add_help=False, allow_abbrev=False 501d499 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 515c513 < '-require_param_variation', dest='require_param_variation', --- > "--require_param_variation", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/check_budget_balance.py clubb_release/tests/check_budget_balance.py 40,41c40 < description="Run SCM cases and then run postprocessing/check_budgets_balance/checkBudget.py.", < add_help=False, allow_abbrev=False --- > description="Run SCM cases and then run postprocessing/check_budgets_balance/checkBudget.py." 43d41 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/check_mirrored_multi_col_output.py clubb_release/tests/check_mirrored_multi_col_output.py 17c17 < # -output_root). Stop on build/run failure and report the log. Two positional output --- > # -out_dir). Stop on build/run failure and report the log. Two positional output 24,25c24,25 < # must be <= -tolerance (default 0); diagnostics also report maximum differences. < # Print stages, cases, parameter order and per-case PASS/FAIL; -verbose lists fields. --- > # must be <= -t/--tol (default 0); diagnostics also report maximum differences. > # Print stages, cases, parameter order and per-case PASS/FAIL; -v lists fields. 32c32 < # unchanged. The printed run_bindiff_all.py -verbose 2 command uses these copies; --- > # unchanged. The printed run_bindiff_all.py -v 2 command uses these copies; 65c65 < from utilities.create_case_namelist import resolve_tunable_config_dir, parse_forwarded_args --- > from utilities.create_case_namelist import resolve_tunable_config_dir 68c68 < from run_scripts.run_scm_all import STANDARD_CASES, positive_int, split_values --- > from run_scripts.run_scm_all import STANDARD_CASES 71,72d70 < from tuner.system_defaults import default_max_workers as default_workers < 206c204 < str(forward_directory.resolve()), str(aligned.resolve()), "-verbose", "2", --- > str(forward_directory.resolve()), str(aligned.resolve()), "-v", "2", 254c252 < "-multicol", spec, "-params_file", str(base_params), "-output_file", str(forward), --- > "-hr", spec, "-param_file", str(base_params), "-out_file", str(forward), 301d298 < add_help=False 303d299 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 308,311c304,308 < cases.add_argument("-cases", nargs="+", help="Case names separated by spaces or commas.") < parser.add_argument("-multicol", default="3", metavar="NUM|SPEC", < help="Column count for C8 in 0.2:0.8, or an explicit parameter grid (default: 3).") < parser.add_argument('-params_file', dest='params', help="Base single-column parameter file (default: from -config)", metavar='FILE') --- > cases.add_argument("-cases", help="Comma-separated case list, passed to run_scm_all.py") > columns = parser.add_mutually_exclusive_group() > columns.add_argument("-n", type=int, help="Number of columns with C8 evenly spaced from 0.2 to 0.8 (default: 3)") > columns.add_argument("-hr", help="Parameter range specification accepted by create_multi_col_params.py") > parser.add_argument("-params", help="Base single-column parameter file (default: from -config)") 313,315c310,312 < parser.add_argument('-output_root', dest='out_dir', default="column_mirror_test", < help="Output parent; a fresh run directory is retained inside it", metavar='DIR') < parser.add_argument('-workers', dest='nproc', type=positive_int, default=default_workers(), help="Concurrent cases for a case list (default: half the available logical CPUs)", metavar='N') --- > parser.add_argument("-out_dir", default="column_mirror_test", > help="Output parent; a fresh run directory is retained inside it") > parser.add_argument("-nproc", type=int, default=2, help="Concurrent cases for a case list (default: 2)") 318c315 < parser.add_argument('-tolerance', dest='tol', type=float, default=0.0, --- > parser.add_argument("-t", "--tol", type=float, default=0.0, 320,321c317,348 < parser.add_argument('-verbose', dest='verbose', action="store_true", help="Print every checked variable") < args, extra = parse_forwarded_args(parser, argv) --- > parser.add_argument("-v", "--verbose", action="store_true", help="Print every checked variable") > # Partition before parsing: parse_known_args would mistake -tout for -t, > # -nzmax for -n, and forwarded option values for positional directories. > test_args, extra = [], [] > index = 0 > while index < len(argv): > token = argv[index] > option = token.split("=", 1)[0] > action = parser._option_string_actions.get(option) > # Preserve argparse's compact numeric forms, e.g. -n3 and -t1e-8. > compact = False > if action is None and token[:2] in {"-n", "-t"} and len(token) > 2: > candidate = parser._option_string_actions[token[:2]] > try: > candidate.type(token[2:]) > except ValueError: > pass > else: > action, compact = candidate, True > if action is not None: > test_args.append(token) > if action.nargs != 0 and "=" not in token and not compact and index + 1 < len(argv): > index += 1 > test_args.append(argv[index]) > elif token.startswith("-"): > extra.append(token) > while index + 1 < len(argv) and not argv[index + 1].startswith("-"): > index += 1 > extra.append(argv[index]) > else: > test_args.append(token) > index += 1 323,326c350 < if args.cases is not None: < args.cases = ",".join(split_values(args.cases)) < if not args.cases: < parser.error("-cases must contain at least one case name") --- > args = parser.parse_args(test_args) 332c356 < comparison_options = {"-tolerance", "-verbose"} --- > comparison_options = {"-t", "--tol", "-v", "--verbose"} 335c359 < parser.error("saved-directory comparison accepts only -tolerance and -verbose") --- > parser.error("saved-directory comparison accepts only -t and -v") 336a361,362 > if args.n is not None and args.n < 2: > parser.error("-n must be at least 2") 338,346c364,365 < parser.error("-workers and -max_iters must be positive") < try: < count = int(args.multicol) < except ValueError: < args.spec = args.multicol < else: < if count < 2: < parser.error("-multicol must generate at least two columns") < args.spec = f"C8/0.2:0.8/{count}" --- > parser.error("-nproc and -max_iters must be positive") > args.spec = args.hr or f"C8/0.2:0.8/{args.n or 3}" 355,356c374,375 < reserved = {"-params_file", "-config", "-output_dir", "-multicol", "-batch_size", "-override", < "-max_iters", "-workers", "-cases", "-all", "-min_cases", "-short_cases", "-priority_cases"} --- > reserved = {"-params", "-config", "-out_dir", "-multicol", "-batch_size", "-override", > "-max_iters", "-nproc", "-cases", "-all", "-min_cases", "-short_cases", "-priority_cases"} 429c448 < print(f" Grid: -multicol {args.spec}" + (" (columns reversed)" if order == "reverse" else ""), flush=True) --- > print(f" Grid: -hr {args.spec}" + (" (columns reversed)" if order == "reverse" else ""), flush=True) 432,433c451,452 < "-config", str(config_dir), "-params_file", str(param_file), < "-output_dir", str(run_dir / order), "-max_iters", str(args.max_iters), --- > "-config", str(config_dir), "-params", str(param_file), > "-out_dir", str(run_dir / order), "-max_iters", str(args.max_iters), 438c457 < command += ["-workers", str(args.nproc)] --- > command += ["-nproc", str(args.nproc)] diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/pytests/test_bindiff_report.py clubb_release/tests/pytests/test_bindiff_report.py 159c159 < [sys.executable, str(BINDIFF), "-result_json", str(report_path), str(left), str(right)], --- > [sys.executable, str(BINDIFF), "--result-json", str(report_path), str(left), str(right)], 188,189c188,189 < [sys.executable, str(BINDIFF), "-verbose", "0", "-case", "case", "-threshold", "1e-6", < "-percent_threshold", "1e-7", "-result_json", str(report), str(left), str(right)], --- > [sys.executable, str(BINDIFF), "-v", "0", "-case", "case", "-t", "1e-6", > "-pt", "1e-7", "--result-json", str(report), str(left), str(right)], diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/pytests/test_column_mirror.py clubb_release/tests/pytests/test_column_mirror.py 57c57 < params = read_params(command[command.index('-params_file') + 1]) --- > params = read_params(command[command.index('-params') + 1]) 61c61 < out = Path(command[command.index('-output_dir') + 1]) --- > out = Path(command[command.index('-out_dir') + 1]) 67c67 < assert mirror.main(['-case', 'rico', '-multicol', '4', '-output_root', str(tmp_path), --- > assert mirror.main(['-case', 'rico', '-n', '4', '-out_dir', str(tmp_path), 81c81 < assert 'Grid: -multicol C8/0.2:0.8/4' in output --- > assert 'Grid: -hr C8/0.2:0.8/4' in output 90c90 < assert command[-2:] == ['-verbose', '2'] --- > assert command[-2:] == ['-v', '2'] 176c176 < assert mirror.main(['-cases', 'rico,bomex', '-output_root', str(tmp_path), '-workers', '2']) == 1 --- > assert mirror.main(['-cases', 'rico,bomex', '-out_dir', str(tmp_path)]) == 1 179c179 < assert commands[0][commands[0].index('-workers') + 1] == '2' --- > assert commands[0][commands[0].index('-nproc') + 1] == '2' 206c206 < assert mirror.main(['-tolerance', '0.001', str(a), str(b)]) == 0 --- > assert mirror.main(['-t', '0.001', str(a), str(b)]) == 0 212,213c212,213 < ['-multicol', '1'], ['-multicol', 'C8/1:1/3'], ['-multicol', 'C8/0:1/1'], < ['-multicol', 'C8/0:nan/3'], ['-tolerance', 'nan'], ['-workers', '0'], --- > ['-n', '1'], ['-hr', 'C8/1:1/3'], ['-hr', 'C8/0:1/1'], > ['-hr', 'C8/0:nan/3'], ['-t', 'nan'], ['-nproc', '0'], 225c225 < (['-debug', '1', '-case', 'rico', '-tout', '60', '-multicol', '4', '-nzmax', '128'], --- > (['-debug', '1', '-case', 'rico', '-tout', '60', '-n', '4', '-nzmax', '128'], 232,233c232,233 < (['-multicol=3', '-tolerance=1e-8', '-debug', '1'], ['-debug', '1']), < (['-case', 'rico', '--', '-verbose'], ['-verbose']), --- > (['-n3', '-t1e-8', '-debug', '1'], ['-debug', '1']), > (['-case', 'rico', '--', '-v'], ['-v']), 245,249d244 < if option == '-multicol=5' and not separator: < args, forwarded = mirror.parse_args(['-case', 'rico', option]) < assert args.spec == 'C8/0.2:0.8/5' < assert not forwarded < return 302c297 < assert mirror.main(['-case', 'rico', '-output_root', str(tmp_path)]) == 1 --- > assert mirror.main(['-case', 'rico', '-out_dir', str(tmp_path)]) == 1 349,354d343 < < < def test_mirror_rejects_empty_explicit_case_list(): < with pytest.raises(SystemExit) as error: < mirror.parse_args(["-cases", ","]) < assert error.value.code == 2 diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/pytests/test_jax_compare_forwarding.py clubb_release/tests/pytests/test_jax_compare_forwarding.py 3,4d2 < import os < import subprocess 14c12 < "run_jax_vs_fortran_cases.py", "-cases", "rico", "-workers", "2", --- > "run_jax_vs_fortran_cases.py", "-cases", "rico", "-jobs", "2", 25c23 < @pytest.mark.parametrize("option", ["-output_dir", "-jax", "-override"]) --- > @pytest.mark.parametrize("option", ["-out_dir", "-jax", "-override"]) 67,88d64 < < < def test_comparison_rejects_empty_explicit_case_list(): < with pytest.raises(SystemExit) as error: < harness.parse_args(["-cases", ","]) < assert error.value.code == 2 < < < def test_mutation_snapshot_can_start_comparison_without_checkout_imports(tmp_path): < from tests import run_jax_comparison_mutation_test as mutation_test < < snapshot = tmp_path / "snapshot" < mutation_test.make_snapshot(snapshot) < environment = os.environ.copy() < environment.pop("PYTHONPATH", None) < environment["PYTHONDONTWRITEBYTECODE"] = "1" < result = subprocess.run( < [sys.executable, str(snapshot / mutation_test.HARNESS), "-help"], < cwd=snapshot, env=environment, capture_output=True, text=True, timeout=30, < ) < assert result.returncode == 0, result.stdout + result.stderr < assert "-workers" in result.stdout diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/pytests/test_run_clubb_conv_test.py clubb_release/tests/pytests/test_run_clubb_conv_test.py 27c27 < assert command[command.index("-output_dir") + 1] == str(run_clubb_conv_test.OUTPUT_DIR) --- > assert command[command.index("-out_dir") + 1] == str(run_clubb_conv_test.OUTPUT_DIR) 39c39 < ["run_clubb_conv_test.py", "-plot_result", "-override", "l_diag_Lscale_from_tau=.true."], --- > ["run_clubb_conv_test.py", "-p", "-override", "l_diag_Lscale_from_tau=.true."], diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/README.md clubb_release/tests/README.md 57c57 < python3 tests/check_mirrored_multi_col_output.py -case rico -multicol 3 --- > python3 tests/check_mirrored_multi_col_output.py -case rico -n 3 60c60 < `-multicol 3` varies `C8` evenly from 0.2 to 0.8: --- > `-n 3` varies `C8` evenly from 0.2 to 0.8: 70,72c70,72 < between columns. Any bug that could cause information from one column to < infect other columns should cause this test to fail, because changing < the column order should change which column is the infectious one. --- > between columns. Any bug that could cause information from one column to > infect other columns should cause this test to fail, because changing > the column order should change which column is the infectious one. 74c74 < Use `-multicol PARAM/MIN:MAX/NPOINTS` for custom parameter ranges. Multiple ranges --- > Use `-hr PARAM/MIN:MAX/NPOINTS` for custom parameter ranges. Multiple ranges 78c78 < python3 tests/check_mirrored_multi_col_output.py -case rico -multicol 'C8/0.2:0.8/3,C11/0.2:0.8/2' --- > python3 tests/check_mirrored_multi_col_output.py -case rico -hr 'C8/0.2:0.8/3,C11/0.2:0.8/2' 88c88 < (`-max_iters`), and half the available logical CPUs for concurrent cases (`-workers`). Use `-config` / `-params_file` --- > (`-max_iters`), and two concurrent cases (`-nproc`). Use `-config` / `-params` 90c90 < for example `-debug 1`; the `--` separator is optional. See `-help` for options and --- > for example `-debug 1`; the `--` separator is optional. See `--help` for options and 104c104 < - `python3 tests/run_G_unit_tests.py -all` --- > - `python3 tests/run_G_unit_tests.py --all` 107c107 < - `python3 tests/run_G_unit_tests.py -KK_unit_tests` --- > - `python3 tests/run_G_unit_tests.py --KK_unit_tests` 110c110 < - `python3 tests/run_G_unit_tests.py -smooth_heaviside_test -smooth_min_max_test` --- > - `python3 tests/run_G_unit_tests.py --smooth_heaviside_test --smooth_min_max_test` 127c127 < resulting output trees with `run_scripts/run_bindiff_all.py -flag_sets`. --- > resulting output trees with `run_scripts/run_bindiff_all.py --flag-sets`. 131c131 < - `python3 tests/run_bindiff_w_flags.py -branches master,my_branch -d /tmp/clubb_bindiff` --- > - `python3 tests/run_bindiff_w_flags.py -b master,my_branch -d /tmp/clubb_bindiff` 134c134 < - `python3 tests/run_bindiff_w_flags.py -overwrite_existing -branches master,my_branch -d /tmp/clubb_bindiff -max_iters 360` --- > - `python3 tests/run_bindiff_w_flags.py --overwrite-existing -b master,my_branch -d /tmp/clubb_bindiff -max_iters 360` 138c138 < - `python3 tests/run_bindiff_w_flags.py -branches master,my_branch -flag_config_file input/flag_sets/run_bindiff_w_flags_config_example.json -priority_cases -workers 4` --- > - `python3 tests/run_bindiff_w_flags.py -b master,my_branch -f input/flag_sets/run_bindiff_w_flags_config_example.json --priority-cases -nproc 4` 142c142 < - `python3 tests/run_bindiff_w_flags.py -branches old_ref,new_ref -no_compile -skip_default_flags` --- > - `python3 tests/run_bindiff_w_flags.py -b old_ref,new_ref --no-compile --skip-default-flags` 185c185 < `-output_dir PATH` selects a new destination; `-timeout SECONDS` adjusts the --- > `-output-dir PATH` selects a new destination; `-timeout SECONDS` adjusts the 202c202 < - `python3 tests/run_clubb_conv_test.py -case rico -var cloud_frac` --- > - `python3 tests/run_clubb_conv_test.py --case rico --var cloud_frac` 205c205 < - `python3 tests/run_clubb_conv_test.py -plot_result -case bomex -var rcm` --- > - `python3 tests/run_clubb_conv_test.py -p --case bomex --var rcm` 230c230 < `run_bindiff_all.py -flag_sets`, which is what the final combined diff does. --- > `run_bindiff_all.py --flag-sets`, which is what the final combined diff does. 241c241 < - `python3 tests/run_jax_vs_fortran_cases.py -cases bomex -workers 1` --- > - `python3 tests/run_jax_vs_fortran_cases.py -cases bomex -jobs 1` 267c267 < - `python3 tests/run_loss_output_consistency.py bomex -output_root output/loss_check` --- > - `python3 tests/run_loss_output_consistency.py bomex -out_root output/loss_check` 280c280 < - `python3 tests/run_python_vs_fortran_cases.py -cases bomex -workers 1` --- > - `python3 tests/run_python_vs_fortran_cases.py --cases bomex --jobs 1` 283c283 < - `python3 tests/run_python_vs_fortran_cases.py -cases bomex atex -max_iters 3` --- > - `python3 tests/run_python_vs_fortran_cases.py --cases bomex atex --max-iters 3` 286c286 < - `python3 tests/run_python_vs_fortran_cases.py -bindiff_verbose 2 -bindiff_threshold 1e-12` --- > - `python3 tests/run_python_vs_fortran_cases.py --bindiff-verbose 2 --bindiff-threshold 1e-12` 289c289 < - `python3 tests/run_python_vs_fortran_cases.py -keep_existing` --- > - `python3 tests/run_python_vs_fortran_cases.py --keep-existing` 302c302 < - `python3 tests/run_restart_test.py rico_silhs -var rcm` --- > - `python3 tests/run_restart_test.py rico_silhs -v rcm` 305c305 < - `python3 tests/run_restart_test.py bomex -keep_artifacts` --- > - `python3 tests/run_restart_test.py bomex --keep_artifacts` 318c318 < - `python3 tests/run_silhs_test.py -case rico_silhs -n_small 8 -n_large 1000` --- > - `python3 tests/run_silhs_test.py --case rico_silhs --n-small 8 --n-large 1000` 321c321 < - `python3 tests/run_silhs_test.py -stats input/stats/all_stats.in -show_output` --- > - `python3 tests/run_silhs_test.py --stats input/stats/all_stats.in --verbose` 324c324 < - `python3 tests/run_silhs_test.py -keep_outputs` --- > - `python3 tests/run_silhs_test.py --keep-outputs` 360c360 < - `python3 tests/run_thread_test.py -threads 4` --- > - `python3 tests/run_thread_test.py --threads 4` 408,411d407 < < Branch bindiff accepts the current option names and translates them for cloned < revisions that still expose the older interfaces. This preserves comparisons < against master and older refs without retaining old aliases in current scripts. diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_bindiff_w_flags.py clubb_release/tests/run_bindiff_w_flags.py 37c37 < The unmodified default flag set is included unless -skip_default_flags is --- > The unmodified default flag set is included unless --skip-default-flags is 46,49c46,49 < -branches master,my_branch \\ < -flag_config_file input/flag_sets/run_bindiff_w_flags_config_example.json \\ < -output_root ~/clubb_bindiff \\ < -priority_cases -workers 4 -max_iters 3 --- > -b master,my_branch \\ > -f input/flag_sets/run_bindiff_w_flags_config_example.json \\ > -d ~/clubb_bindiff \\ > --priority-cases -nproc 4 -max_iters 3 51c51 < In that example, -priority_cases and -workers are consumed by --- > In that example, --priority-cases and -nproc are consumed by 56c56 < output has already been generated. Use -overwrite_existing for noninteractive --- > output has already been generated. Use --overwrite-existing for noninteractive 63d62 < import ast 101c100 < "That script consumes case-selection options such as -priority_cases " --- > "That script consumes case-selection options such as --priority-cases " 104d102 < add_help=False, allow_abbrev=False 106d103 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 108c105,106 < '-branches', dest='branches', --- > "-b", > "--branches", 117c115,116 < '-flag_config_file', dest='flag_config_file', --- > "-f", > "--flag-config-file", 122c121,122 < '-output_root', dest='destination_dir', --- > "-d", > "--destination-dir", 125d124 < metavar='DIR', 128c127 < '-skip_default_flags', dest='skip_default_flags', --- > "--skip-default-flags", 134c133,134 < '-verbose', dest='verbose', --- > "-v", > "--verbose", 140c140 < '-repo_url', dest='repo_url', --- > "--repo-url", 145c145 < '-compile_arg', dest='compile_arg', --- > "--compile-arg", 150c150 < "Use -compile_arg=-debug for values that begin with '-'." --- > "Use --compile-arg=-debug for values that begin with '-'." 154c154 < '-no_compile', dest='no_compile', --- > "--no-compile", 160c160 < '-overwrite_existing', dest='overwrite_existing', --- > "--overwrite-existing", 169c169 < parser.error("at least two branches or refs must be provided with -branches") --- > parser.error("at least two branches or refs must be provided with -b/--branches") 249,250c249 < [sys.executable, str(compile_script), < *clone_arguments(clone_dir, args.compile_arg, ["compile.py"])], --- > [sys.executable, str(compile_script), *args.compile_arg], 257,290d255 < < def clone_arguments(clone_dir, arguments, scripts): < """Translate canonical options when comparing refs with older script interfaces.""" < supported = set() < for script in scripts: < path = clone_dir / script < if not path.is_file(): < continue < for node in ast.walk(ast.parse(path.read_text())): < if isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr == "add_argument": < supported.update(arg.value for arg in node.args < if isinstance(arg, ast.Constant) and isinstance(arg.value, str)) < legacy = { < "-workers": ("-nproc", "--nproc"), < "-flag_config_file": ("--flag-config-file", "-f"), < "-skip_default_flags": ("--skip-default-flags",), < "-all": ("--all",), < "-short_cases": ("--short-cases",), < "-priority_cases": ("--priority-cases",), < "-min_cases": ("--min-cases",), < "-output_dir": ("-out_dir",), < "-params_file": ("-params",), < "-silhs_params_file": ("-silhs_params",), < "-install_dir": ("-install",), < } < translated = [] < for token in arguments: < option, separator, value = token.partition("=") < if option not in supported: < option = next((old for old in legacy.get(option, ()) if old in supported), option) < translated.append(option + separator + value) < return translated < < 296c261 < "-flag_config_file", --- > "-f", 301c266 < command.append("-skip_default_flags") --- > command.append("--skip-default-flags") 304,306c269 < scripts = ["run_scripts/run_clubb_w_varying_flags.py", "run_scripts/run_scm.py", < "utilities/create_case_namelist.py"] < return command[:2] + clone_arguments(clone_dir, command[2:], scripts) --- > return command 339,340c302,303 < "-flag_sets", < "-verbose", --- > "--flag-sets", > "-v", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_clubb_conv_test.py clubb_release/tests/run_clubb_conv_test.py 21c21 < ensure_python_venv("plot" if {"-p", "-plot_result"} & set(sys.argv[1:]) else "python") --- > ensure_python_venv("plot" if {"-p", "--plot-result"} & set(sys.argv[1:]) else "python") 36,37c36 < parser = argparse.ArgumentParser(description="Run CLUBB timestep convergence test.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Run CLUBB timestep convergence test.") 39c38,39 < '-plot_result', dest='plot_result', --- > "-p", > "--plot-result", 44c44 < '-case', dest='case', --- > "--case", 49c49 < '-var', dest='var', --- > "--var", 122c122 < "-output_dir", --- > "-out_dir", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_G_unit_tests.py clubb_release/tests/run_G_unit_tests.py 75,76c75 < description="Run CLUBB G_unit_tests with selectable subsets of tests.", < add_help=False, allow_abbrev=False --- > description="Run CLUBB G_unit_tests with selectable subsets of tests." 78d76 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 80c78 < parser.add_argument('-all', dest='all', action="store_true", help="Enable all tests") --- > parser.add_argument("--all", action="store_true", help="Enable all tests") 85c83 < f"-{flag}", --- > f"--{flag}", 106c104 < # -all → force everything on --- > # --all → force everything on diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_jax_comparison_mutation_test.py clubb_release/tests/run_jax_comparison_mutation_test.py 129,130c129 < # The comparison and batch runner share worker defaults from tuner. < for name in ("clubb_jax", "run_scripts", "utilities", "tuner"): --- > for name in ("clubb_jax", "run_scripts", "utilities"): 147c146 < "-cases", CASE, "-workers", "1", "-max_iters", str(TIMESTEPS_TO_RUN), --- > "-cases", CASE, "-jobs", "1", "-max_iters", str(TIMESTEPS_TO_RUN), 394,395c393,394 < parser.add_argument('-output_dir', dest='output_dir', type=Path, < help="New directory for source copies, logs and outputs (must not exist).", metavar='DIR') --- > parser.add_argument("-output-dir", type=Path, > help="New directory for source copies, logs and outputs (must not exist).") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_jax_vs_fortran_cases.py clubb_release/tests/run_jax_vs_fortran_cases.py 31,34d30 < from tuner.system_defaults import default_max_workers as default_workers < from utilities.create_case_namelist import parse_forwarded_args < from run_scripts.run_scm_all import positive_int, split_values < 104c100 < # Run logs are kept out of both output roots: run_bindiff_all.py -flag_sets treats --- > # Run logs are kept out of both output roots: run_bindiff_all.py --flag-sets treats 338c334 < # them separate immediate directories, also understood by -flag_sets. --- > # them separate immediate directories, also understood by --flag-sets. 365,366c361,362 < jax_cmd = [sys.executable, *common_args, "-jax", "-output_dir", str(jax_run_out_dir)] < f90_cmd = [sys.executable, *common_args, "-output_dir", str(f90_run_out_dir)] --- > jax_cmd = [sys.executable, *common_args, "-jax", "-out_dir", str(jax_run_out_dir)] > f90_cmd = [sys.executable, *common_args, "-out_dir", str(f90_run_out_dir)] 430c426 < "-verbose", "2", --- > "-v", "2", 433,435c429,431 < "-threshold", str(task.bindiff_threshold), < "-percent_threshold", str(task.bindiff_percent_threshold), < "-result_json", str(diff_report), --- > "-t", str(task.bindiff_threshold), > "-pt", str(task.bindiff_percent_threshold), > "--result-json", str(diff_report), 485c481 < def parse_args(argv=None) -> argparse.Namespace: --- > def parse_args() -> argparse.Namespace: 493d488 < add_help=False 495,497c490,491 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < parser.add_argument('-workers', dest="jobs", type=positive_int, default=default_workers(), < help="Number of concurrent case pairs (default: half the available logical CPUs; each JAX compilation can use several GiB).", metavar='N') --- > parser.add_argument("-j", "-jobs", dest="jobs", type=int, default=1, > help="Number of concurrent case pairs (default: 1; each JAX compilation can use several GiB).") 518,521c512 < args, forwarded = parse_forwarded_args(parser, argv) < args.cases = split_values(args.cases) if args.cases is not None else None < if args.cases == []: < parser.error("-cases must contain at least one case name") --- > args, forwarded = parser.parse_known_args() 523c514 < parser.error("-workers must be positive") --- > parser.error("-jobs must be positive") 526c517 < "-output_dir", "-multicol", "-override", "-install_dir"} --- > "-out_dir", "-multicol", "-override", "-install_dir"} 553c544 < "multiple JAX workers contending for the same device; forcing -workers 1." --- > "multiple JAX workers contending for the same device; forcing -j 1." 736c727 < # do not fail it; it cannot override any per-case failure. -flag_sets also --- > # do not fail it; it cannot override any per-case failure. --flag-sets also 742c733 < "-flag_sets", --- > "--flag-sets", 744,746c735,737 < "-verbose", str(args.bindiff_verbose), < "-threshold", str(tasks[0].bindiff_threshold), < "-percent_threshold", str(max(task.bindiff_percent_threshold for task in tasks)), --- > "-v", str(args.bindiff_verbose), > "-t", str(tasks[0].bindiff_threshold), > "-pt", str(max(task.bindiff_percent_threshold for task in tasks)), diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_loss_output_consistency.py clubb_release/tests/run_loss_output_consistency.py 165c165 < "-params_file", --- > "-param_file", 167c167 < "-output_file", --- > "-out_file", 169c169 < "-multicol", --- > "-hr", 230c230 < "-params_file", --- > "-params", 234c234 < "-output_dir", --- > "-out_dir", 259c259 < "-params_file", --- > "-params", 261c261 < "-output_dir", --- > "-out_dir", 753,754c753 < ), < add_help=False, allow_abbrev=False --- > ) 756d754 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 759c757 < '-output_root', dest='out_root', --- > "-out_root", 762d759 < metavar='DIR', 769c766 < "-params_file is also supplied." --- > "-params is also supplied." 773c770 < '-params_file', dest='params', --- > "-params", 775d771 < metavar='FILE', diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_python_vs_fortran_cases.py clubb_release/tests/run_python_vs_fortran_cases.py 48,52d47 < sys.path.insert(0, str(Path(__file__).resolve().parents[1])) < from tuner.system_defaults import default_max_workers as default_workers < from utilities.create_case_namelist import parse_forwarded_args < from run_scripts.run_scm_all import positive_int, split_values < 104d98 < run_scm_args: tuple[str, ...] = (), 119,121c113,114 < common_args.extend(run_scm_args) < py_cmd = [sys.executable, *common_args, "-python", "-output_dir", str(py_out), case] < f90_cmd = [sys.executable, *common_args, "-output_dir", str(f90_out), case] --- > py_cmd = [sys.executable, *common_args, "-python", "-out_dir", str(py_out), case] > f90_cmd = [sys.executable, *common_args, "-out_dir", str(f90_out), case] 167c160 < "-verbose", "2", --- > "-v", "2", 169,171c162,164 < "-threshold", str(bindiff_threshold), < "-percent_threshold", str(bindiff_threshold), < "-result_json", str(diff_report), --- > "-t", str(bindiff_threshold), > "-pt", str(bindiff_threshold), > "--result-json", str(diff_report), 205d197 < run_scm_args, 217d208 < run_scm_args=run_scm_args, 221c212 < def parse_args(argv=None) -> argparse.Namespace: --- > def parse_args() -> argparse.Namespace: 226,227c217 < ), < add_help=False, allow_abbrev=False --- > ) 229d218 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 231,235c220,224 < '-workers', dest='jobs', < type=positive_int, < default=default_workers(), < help="Maximum concurrent case pairs (default: half the available logical CPUs).", < metavar='N', --- > "-j", > "--jobs", > type=int, > default=8, > help=f"Number of parallel case workers.", 238c227 < '-stats', dest='stats', --- > "--stats", 243c232 < '-max_iters', dest='max_iters', --- > "--max-iters", 249c238 < '-bindiff_verbose', dest='bindiff_verbose', --- > "--bindiff-verbose", 256c245 < '-bindiff_threshold', dest='bindiff_threshold', --- > "--bindiff-threshold", 259c248 < help="Difference threshold passed to run_bindiff_all.py via -threshold.", --- > help="Difference threshold passed to run_bindiff_all.py via -t.", 262c251 < '-keep_existing', dest='keep_existing', --- > "--keep-existing", 267c256 < '-cases', dest='cases', --- > "--cases", 272,284c261 < args, forwarded = parse_forwarded_args(parser, argv) < reserved = {"-jax", "-python", "-exe", "-driver_test", "-gdb", < "-output_dir", "-multicol", "-override", "-install_dir"} < for argument in forwarded: < if argument.split("=", 1)[0] in reserved: < parser.error(f"{argument} is controlled by the comparison harness") < if args.max_iters is not None and args.max_iters < 1: < parser.error("-max_iters must be positive") < args.cases = split_values(args.cases) if args.cases is not None else None < if args.cases == []: < parser.error("-cases must contain at least one case name") < args.run_scm_args = tuple(forwarded) < return args --- > return parser.parse_args() 329d305 < args.run_scm_args, 386,389c362,365 < "-verbose", str(args.bindiff_verbose), < "-threshold", str(args.bindiff_threshold), < "-percent_threshold", str(args.bindiff_threshold), < "-result_json", str(final_bindiff_report), --- > "-v", str(args.bindiff_verbose), > "-t", str(args.bindiff_threshold), > "-pt", str(args.bindiff_threshold), > "--result-json", str(final_bindiff_report), diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_restart_test.py clubb_release/tests/run_restart_test.py 126c126 < " -output_dir, -tout, -stats, etc. change the output location or contents,\n" --- > " -out_dir, -tout, -stats, etc. change the output location or contents,\n" 129d128 < add_help=False, allow_abbrev=False 131d129 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 134c132 < '-var', dest='var', default="thlm", help="Variable name to compare (default: thlm)" --- > "-v", "--var", default="thlm", help="Variable name to compare (default: thlm)" 137c135 < '-keep_artifacts', dest='keep_artifacts', --- > "--keep_artifacts", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_silhs_test.py clubb_release/tests/run_silhs_test.py 36,37c36 < description="Run SILHS convergence test (Python port of run_silhs_test.bash).", < add_help=False, allow_abbrev=False --- > description="Run SILHS convergence test (Python port of run_silhs_test.bash)." 39d37 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 41c39 < '-case', dest='case', --- > "--case", 46c44 < '-n_small', dest='n_small', --- > "--n-small", 52c50 < '-n_large', dest='n_large', --- > "--n-large", 58c56 < '-keep_outputs', dest='keep_outputs', --- > "--keep-outputs", 63c61 < '-stats', dest='stats', --- > "--stats", 68c66 < '-show_output', dest='verbose', --- > "--verbose", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_stats_output_consistency.py clubb_release/tests/run_stats_output_consistency.py 313c313 < "-output_dir", --- > "-out_dir", 325c325 < ("-params_file", args.params), --- > ("-params", args.params), 327c327 < ("-silhs_params_file", args.silhs_params), --- > ("-silhs_params", args.silhs_params), 897,898c897 < ), < add_help=False, allow_abbrev=False --- > ) 900d898 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 908c906 < '-output_root', dest='out_root', --- > "-out_root", 911d908 < metavar='DIR', 962c959 < parser.add_argument('-params_file', dest='params', help="Optional params file forwarded to run_scm.py", metavar='FILE') --- > parser.add_argument("-params", help="Optional params file forwarded to run_scm.py") 965c962 < '-silhs_params_file', dest='silhs_params', --- > "-silhs_params", 967d963 < metavar='FILE', diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/run_thread_test.py clubb_release/tests/run_thread_test.py 159,160c159 < parser = argparse.ArgumentParser(description="Run CLUBB thread-safety regression test.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Run CLUBB thread-safety regression test.") 162c161 < '-threads', dest='threads', --- > "--threads", 205c204 < "-verbose", --- > "-v", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/test_fire_tuner.py clubb_release/tests/test_fire_tuner.py 35,36c35 < parser = argparse.ArgumentParser(description="Configure and run FIRE tuning.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Configure and run FIRE tuning.") 100c99 < "-run_type", --- > "--run-type", 102c101 < "-run_case", --- > "--run-case", 104c103 < "-stats_tune", --- > "--stats-tune", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tests/test_monoflux_limiter_GPU.py clubb_release/tests/test_monoflux_limiter_GPU.py 199c199 < "-multicol", --- > "-n", 203c203 < "-params_file", --- > "-param_file", 205c205 < "-output_file", --- > "-out_file", 241c241 < "-params_file", --- > "-params", diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tuner/job_runtime.py clubb_release/tuner/job_runtime.py 215c215 < [sys.executable, "-m", "tuner.tune_clubb", "-job_dir", str(self.job_dir)], --- > [sys.executable, "-m", "tuner.tune_clubb", "--job-dir", str(self.job_dir)], diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tuner/presets.py clubb_release/tuner/presets.py 105c105 < a preset alone or modify only ``-param_ranges``/``-cases``/``-fields``. --- > a preset alone or modify only ``-params``/``-cases``/``-fields``. diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tuner/README.md clubb_release/tuner/README.md 15c15 < `python run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -param_ranges C8:0.2:0.8 -strategy random:8`. --- > `python run_scripts/run_tuner_job.py -cases bomex -fields cloud_frac -params C8:0.2:0.8 -strategy random:8`. 17c17 < - `python -m tuner.tune_clubb -job_dir ` runs one tuning job from a job --- > - `python -m tuner.tune_clubb --job-dir ` runs one tuning job from a job 36c36 < 3. Dash starts `python -m tuner.tune_clubb -job_dir ` as a subprocess and --- > 3. Dash starts `python -m tuner.tune_clubb --job-dir ` as a subprocess and 76c76 < stop request. Direct `python -m tuner.tune_clubb -job_dir ...` runs are not --- > stop request. Direct `python -m tuner.tune_clubb --job-dir ...` runs are not 111c111 < `run_scripts/run_tuner_job.py -list_presets` lists the checked-in experiment --- > `run_scripts/run_tuner_job.py --list-presets` lists the checked-in experiment 113c113 < override; explicitly supplied `-cases`, `-fields`, or `-param_ranges` replace that --- > override; explicitly supplied `-cases`, `-fields`, or `-params` replace that 117c117 < python run_scripts/run_tuner_job.py -preset wpxp -strategy random:2000 --- > python run_scripts/run_tuner_job.py --preset wpxp -strategy random:2000 122c122 < `-param_ranges C6rt=C6thl:0:4`. The sampler treats it as one coordinate while the --- > `-params C6rt=C6thl:0:4`. The sampler treats it as one coordinate while the diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tuner/system_defaults.py clubb_release/tuner/system_defaults.py 1c1 < """CPU availability and worker defaults shared by scripts and tuner front ends.""" --- > """System-dependent defaults for tuner front ends.""" 9c9 < """Count logical CPUs available to this process, respecting CPU affinity.""" --- > """Return the logical CPUs available to this process.""" 17c17 < """Use half the available logical CPUs, rounded down, with at least one worker.""" --- > """Return a conservative physical-core worker default.""" diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/tuner/tune_clubb.py clubb_release/tuner/tune_clubb.py 30,32c30,31 < parser = argparse.ArgumentParser(description="Run one CLUBB tuning job from a job directory.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < parser.add_argument('-job_dir', dest='job_dir', required=True, help="Job directory containing request/control/status/results files.") --- > parser = argparse.ArgumentParser(description="Run one CLUBB tuning job from a job directory.") > parser.add_argument("--job-dir", required=True, help="Job directory containing request/control/status/results files.") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/api_analysis/api_commitment_test.py clubb_release/utilities/api_analysis/api_commitment_test.py 21c21 < python api_commitment_test.py [-h] [-cpu] clubbSrcDir searchDir [-exclude_dir EXCLUDEDIR [EXCLUDEDIR ...]] --- > python api_commitment_test.py [-h] [-cpu] clubbSrcDir searchDir [--exclude-dir EXCLUDEDIR [EXCLUDEDIR ...]] 210,211c210 < parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) 215c214 < parser.add_argument('-exclude_dir', help="list of directories to exclude", dest='excludeDir', required=False, --- > parser.add_argument('--exclude-dir', help="list of directories to exclude", dest='excludeDir', required=False, diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/api_analysis/create_module_table.py clubb_release/utilities/api_analysis/create_module_table.py 124,125c124 < parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/api_analysis/run_full_api_diagnostics.bash clubb_release/utilities/api_analysis/run_full_api_diagnostics.bash 148c148 < python api_commitment_test.py -cpu CLUBB_core $samDir -exclude_dir CLUBB SILHS > $samTxt --- > python api_commitment_test.py -cpu CLUBB_core $samDir --exclude-dir CLUBB SILHS > $samTxt 157c157 < python api_commitment_test.py -cpu CLUBB_core $camDir -exclude_dir spcam cime clubb silhs > $camTxt --- > python api_commitment_test.py -cpu CLUBB_core $camDir --exclude-dir spcam cime clubb silhs > $camTxt 166c166 < python api_commitment_test.py -cpu CLUBB_core $wrfDir/WRF -exclude_dir clubb silhs > $wrfTxt --- > python api_commitment_test.py -cpu CLUBB_core $wrfDir/WRF --exclude-dir clubb silhs > $wrfTxt diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/benchmark_converter.py clubb_release/utilities/benchmark_converter.py 1302c1302 < raise ValueError("Could not auto-detect LES source type; pass -source sam or -source coamps") --- > raise ValueError("Could not auto-detect LES source type; pass --source sam or --source coamps") 1396,1397c1396 < parser = argparse.ArgumentParser(description="Convert a SAM/COAMPS benchmark file to CLUBB-facing field names.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Convert a SAM/COAMPS benchmark file to CLUBB-facing field names.") 1400,1403c1399,1402 < parser.add_argument('-source', dest='source', choices=("auto", "sam", "coamps"), default="auto", help="Input LES source type.") < parser.add_argument('-fields', dest='fields', nargs="+", help="Optional CLUBB field names to convert. Defaults to all supported fields.") < parser.add_argument('-no_clobber', dest='no_clobber', action="store_true", help="Fail if the output file already exists.") < parser.add_argument('-list_fields', dest='list_fields', action="store_true", help="Print supported normalized field names and exit.") --- > parser.add_argument("--source", choices=("auto", "sam", "coamps"), default="auto", help="Input LES source type.") > parser.add_argument("--fields", nargs="+", help="Optional CLUBB field names to convert. Defaults to all supported fields.") > parser.add_argument("--no-clobber", action="store_true", help="Fail if the output file already exists.") > parser.add_argument("--list-fields", action="store_true", help="Print supported normalized field names and exit.") 1414c1413 < raise SystemExit("input and output are required unless -list_fields is used") --- > raise SystemExit("input and output are required unless --list-fields is used") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/CLUBBStandardsCheck.py clubb_release/utilities/CLUBBStandardsCheck.py 771,773c771,772 < parser = argparse.ArgumentParser(description="CLUBB Standards Check (Python version)", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < parser.add_argument('-verbose', dest='verbose', action="store_true", help="Print verbose messages during checks") --- > parser = argparse.ArgumentParser(description="CLUBB Standards Check (Python version)") > parser.add_argument("-v", "--verbose", action="store_true", help="Print verbose messages during checks") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/convert_to_async.py clubb_release/utilities/convert_to_async.py 7d6 < import sys 27,30c26 < sys.path.insert(0, str(Path(__file__).resolve().parents[1])) < from tuner.system_defaults import default_max_workers as default_workers < < DEFAULT_WORKERS = default_workers() --- > DEFAULT_WORKERS = 12 40d35 < 282d276 < add_help=False, allow_abbrev=False 284d277 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 291c284 < '-workers', dest='nproc', --- > "-nproc", 295d287 < metavar='N', diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/create_case_namelist.py clubb_release/utilities/create_case_namelist.py 13c13 < output/CASE.in, but callers can choose another directory with -output_dir. --- > output/CASE.in, but callers can choose another directory with -out_dir. 166c166 < cmd = [sys.executable, MULTI_COL_PARAMS_SCRIPT, "-params_file", params_file, "-output_file", out_file] --- > cmd = [sys.executable, MULTI_COL_PARAMS_SCRIPT, "-param_file", params_file, "-out_file", out_file] 171c171 < cmd.extend(["-multicol", multicol_spec]) --- > cmd.extend(["-hr", multicol_spec]) 173c173 < cmd.extend(["-mode", integer_mode, "-multicol", str(ngrdcol)]) --- > cmd.extend(["-mode", integer_mode, "-n", str(ngrdcol)]) 498c498 < _require_existing_file("-params_file", params_file) --- > _require_existing_file("-params", params_file) 500c500 < _require_existing_file("-silhs_params_file", silhs_params_file) --- > _require_existing_file("-silhs_params", silhs_params_file) 822,823c822,823 < def add_namelist_arguments(parser): < """Declare model settings once; configuration and override resolution stays here.""" --- > def main(): > parser = argparse.ArgumentParser(description="Create an aggregated CLUBB case namelist.") 828,829c828,829 < parser.add_argument('-params_file', dest='params', metavar="[FILE]", < help="Parameter file; overrides the tunable_parameters.in selected by -config.") --- > parser.add_argument("-params", metavar="[FILE]", > help="Define the tunable parameters. Used to override params file defined by --config") 831,833c831,833 < help="Model flags file. Used to override flags file selected by -config") < parser.add_argument('-silhs_params_file', dest='silhs_params', metavar="[FILE]", < help="SILHS parameters file. Used to override silhs_params file selected by -config") --- > help="Model flags file. Used to override flags file defined by --config") > parser.add_argument("-silhs_params", metavar="[FILE]", > help="SILHS parameters file. Used to override silhs_params file defined by --config") 838,839c838,839 < parser.add_argument('-output_dir', dest='out_dir', metavar="[DIR]", < help="Output directory for the generated namelist and run results. Relative paths are rooted under output/ unless they already start with output/; absolute paths are used directly. Default: output") --- > parser.add_argument("-out_dir", metavar="[DIR]", > help="Output directory for the aggregated namelist.\nDefault: output") 842c842 < "Use an integer for dup_tweak mode, e.g. -multicol 4, or a parameter-grid spec like " --- > "Use an integer for dup_tweak mode, e.g. -multicol 4, or an hr spec like " 874,921d873 < < < def parse_forwarded_args(parser, argv=None): < """Keep model option values away from a wrapper's optional positional case.""" < model = argparse.ArgumentParser(add_help=False, allow_abbrev=False) < add_namelist_arguments(model) < actions = dict(model._option_string_actions) < # Backend controls belong to run_scm, not the namelist generator. < for name in ("-exe", "-install_dir"): < actions[name] = model.add_argument(name) < for name in ("-driver_test", "-python", "-jax", "-gdb"): < actions[name] = model.add_argument(name, action="store_true") < own, forwarded = [], [] < tokens = list(sys.argv[1:] if argv is None else argv) < index = 0 < while index < len(tokens): < token = tokens[index] < if token == "--": < forwarded.extend(tokens[index + 1:]) < break < option = token.split("=", 1)[0] < action = parser._option_string_actions.get(option) < target = own < if action is None and option in actions: < action, target = actions[option], forwarded < elif action is None and token.startswith("-"): < parser.error(f"unrecognized argument: {token}") < target.append(token) < index += 1 < if action is None or action.nargs == 0 or "=" in token: < continue < if action.nargs in ("+", "*"): < while index < len(tokens) and not tokens[index].startswith("-"): < target.append(tokens[index]) < index += 1 < else: < count = action.nargs if isinstance(action.nargs, int) else 1 < if index + count > len(tokens): < parser.error(f"{option} requires a value") < target.extend(tokens[index:index + count]) < index += count < return parser.parse_args(own), forwarded < < < def main(): < parser = argparse.ArgumentParser(description="Create an aggregated CLUBB case namelist.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") < add_namelist_arguments(parser) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/create_multi_col_params.py clubb_release/utilities/create_multi_col_params.py 145c145 < f"Invalid -multicol entry '{item}'. Expected PARAM/MIN:MAX/NPOINTS." --- > f"Invalid -hr entry '{item}'. Expected PARAM/MIN:MAX/NPOINTS." 150c150 < raise ValueError(f"Invalid -multicol entry '{item}': missing parameter name.") --- > raise ValueError(f"Invalid -hr entry '{item}': missing parameter name.") 155c155 < f"Invalid -multicol entry '{item}'. Range must look like MIN:MAX." --- > f"Invalid -hr entry '{item}'. Range must look like MIN:MAX." 162c162 < f"Invalid -multicol entry '{item}'. NPOINTS must be >= 1." --- > f"Invalid -hr entry '{item}'. NPOINTS must be >= 1." 174c174 < raise ValueError("The -multicol specification did not contain any parameter ranges.") --- > raise ValueError("The -hr specification did not contain any parameter ranges.") 228,229c228 < parser = argparse.ArgumentParser(description="Process CLUBB parameters.", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Process CLUBB parameters.") 231,232c230 < parser.add_argument("-multicol", required=True, metavar="NUM|SPEC", < help="Column count or PARAM/MIN:MAX/NPOINTS parameter grid.") --- > parser.add_argument( "-n", type=int, help="Number of grid columns (ngrdcol)") 235,236c233,234 < parser.add_argument( '-params_file', dest='param_file', type=str, help="Path to the CLUBB parameters file", < default = str(tunable_parameters_default_path) , metavar='FILE') --- > parser.add_argument( "-param_file", type=str, help="Path to the CLUBB parameters file", > default = str(tunable_parameters_default_path) ) 238,239c236,237 < parser.add_argument( '-output_file', dest='out_file', type=str, help="Output namelist file", < default = "clubb_params_multi_col.in" , metavar='FILE') --- > parser.add_argument( "-out_file", type=str, help="Output namelist file", > default = "clubb_params_multi_col.in" ) 241,242c239 < parser.add_argument( "-mode", type=str, choices=("duplicate", "dup_tweak", "hypergrid"), < help="Count mode (default: dup_tweak); hypergrid interprets NUM as points per axis." ) --- > parser.add_argument( "-mode", type=str, help="Parameter generation mode" ) 261a259,263 > parser.add_argument( > "-hr", > type=str, > help="Custom hypergrid spec: PARAM/MIN:MAX/NPOINTS,PARAM/MIN:MAX/NPOINTS,...", > ) 267c269 < ngrdcol = None --- > ngrdcol = args.n 273,278c275 < try: < ngrdcol = int(args.multicol) < except ValueError: < hr_mode_requested = True < else: < hr_mode_requested = False --- > hr_mode_requested = args.hr is not None 280,281c277,278 < if hr_mode_requested and any(arg.split("=", 1)[0] == "-mode" for arg in sys.argv[1:]): < sys.exit("Do not specify -mode when using -multicol.") --- > if hr_mode_requested and any(arg == "-mode" for arg in sys.argv[1:]): > sys.exit("Do not specify -mode when using -hr.") 285c282 < hr_specs = parse_hypergrid_range_spec(args.multicol) --- > hr_specs = parse_hypergrid_range_spec(args.hr) 290,292c287,288 < ngrdcol = int(args.multicol) < if ngrdcol < 1: < sys.exit("-multicol column count must be >= 1.") --- > if ngrdcol is None or ngrdcol < 1: > sys.exit("-n (ngrdcol) must be >= 1 unless -hr is used.") 319c315 < print(f" - Spec: {args.multicol}") --- > print(f" - Spec: {args.hr}") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/parse_argument_list/replace_err_code_type.py clubb_release/utilities/parse_argument_list/replace_err_code_type.py 662,663c662 < parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/print_tunable_parameters_table.py clubb_release/utilities/print_tunable_parameters_table.py 43,44c43 < parser = argparse.ArgumentParser(description="Parse tunable_parameters for parameter-value pairs", add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description="Parse tunable_parameters for parameter-value pairs") 47,48c46,47 < parser.add_argument('-output_file', dest='outfile', action='store', help='output file to write the parsed information into', metavar='FILE') < parser.add_argument('-format', dest='format', action='store_true', help='For each input file, create a new tunable_parameters.in file that strips away superfluous content and forces a unified formatting.'+ --- > parser.add_argument('-o', '--outfile', action='store', help='output file to write the parsed information into') > parser.add_argument('-f', '--format', action='store_true', help='For each input file, create a new tunable_parameters.in file that strips away superfluous content and forces a unified formatting.'+ 50,51c49,50 < parser.add_argument('-bare', dest='bare', action='store_true', help='Reduced output only listing the differences between the given files.') < parser.add_argument('-commented', dest='commented', action='store', choices=['col', 'sym', 'skip'], default='skip', help='Include commented out paramters in output. If the choice is "skip" (default) the commented out parameters will not be listed. Otherwise, they will be included and either noted in an additional column "commented" or as a symbol "!" in the value column.') --- > parser.add_argument('-b', '--bare', action='store_true', help='Reduced output only listing the differences between the given files.') > parser.add_argument('-c', '--commented', action='store', choices=['col', 'sym', 'skip'], default='skip', help='Include commented out paramters in output. If the choice is "skip" (default) the commented out parameters will not be listed. Otherwise, they will be included and either noted in an additional column "commented" or as a symbol "!" in the value column.') Only in clubb/utilities/pytests: test_run_script_arguments.py diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/pytests/test_time_clubb.py clubb_release/utilities/pytests/test_time_clubb.py 71c71 < output_dir = Path(option("-output_dir")) --- > output_dir = Path(option("-out_dir")) 203c203 < "-process_counts", --- > "-processes", 205c205 < "-batch_sizes", --- > "-columns", 207c207 < "-output_root", --- > "-output", 237c237 < @pytest.mark.parametrize("option", ["-multicol", "-batch_size", "-output_dir"]) --- > @pytest.mark.parametrize("option", ["-multicol", "-batch_size", "-out_dir"]) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/setup_python_venv.py clubb_release/utilities/setup_python_venv.py 161,162c161 < parser = argparse.ArgumentParser(description=__doc__, add_help=False, allow_abbrev=False) < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") --- > parser = argparse.ArgumentParser(description=__doc__) diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/split_stats_to_legacy.py clubb_release/utilities/split_stats_to_legacy.py 6c6 < -input output/rico_silhs_stats.nc --- > --input output/rico_silhs_stats.nc 72,73c72 < description="Split one *_stats.nc file into legacy-style stats files.", < add_help=False, allow_abbrev=False --- > description="Split one *_stats.nc file into legacy-style stats files." 75d73 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 77c75 < '-input', dest='input', --- > "--input", 82c80 < '-output_dir', dest='output_dir', --- > "--output-dir", 85d82 < metavar='DIR', 88c85 < '-prefix', dest='prefix', --- > "--prefix", 93c90 < '-col_index', dest='col_index', --- > "--col-index", 99c96 < '-overwrite', dest='overwrite', --- > "--overwrite", 188c185 < raise FileExistsError(f"{out_path} already exists (use -overwrite to replace)") --- > raise FileExistsError(f"{out_path} already exists (use --overwrite to replace)") 227c224 < raise FileExistsError(f"{out_path} already exists (use -overwrite to replace)") --- > raise FileExistsError(f"{out_path} already exists (use --overwrite to replace)") diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/time_clubb.py clubb_release/utilities/time_clubb.py 8c8 < utilities/time_clubb.py arm -process_counts 1,4 -batch_sizes 1,8 \ --- > utilities/time_clubb.py arm -processes 1,4 -batch_sizes 1,8 \ 11c11 < ``-multicol``, ``-batch_size``, and ``-output_dir`` are reserved because this --- > ``-multicol``, ``-batch_size``, and ``-out_dir`` are reserved because this 202d201 < add_help=False 204d202 < parser.add_argument("-h", "-help", action="help", help="Show this help and exit.") 207c205,206 < '-process_counts', dest='processes', --- > "-processes", > "--processes", 214c213,216 < '-batch_sizes', --- > "-batch_sizes", > "--batch-sizes", > "-columns", > "--columns", 221,222c223,224 < parser.add_argument('-warmups', dest='warmups', type=nonnegative_int, default=1) < parser.add_argument('-repeats', dest="repetitions", type=positive_int, default=3) --- > parser.add_argument("-warmups", "--warmups", type=nonnegative_int, default=1) > parser.add_argument("-repeats", "--repeats", dest="repetitions", type=positive_int, default=3) 224c226,227 < '-output_root', dest='output', --- > "-output", > "--output", 228d230 < metavar='DIR', 230c232 < parser.add_argument('-name', dest='name', default=None, help="Benchmark label (default: case name)") --- > parser.add_argument("-name", "--name", default=None, help="Benchmark label (default: case name)") 232c234,235 < '-overwrite', dest='overwrite', --- > "-overwrite", > "--overwrite", 236c239 < parser.add_argument('-timeout', dest='timeout', type=positive_float, default=None, metavar="SECONDS") --- > parser.add_argument("-timeout", "--timeout", type=positive_float, default=None, metavar="SECONDS") 238c241,242 < '-continue_on_error', dest='continue_on_error', --- > "-continue_on_error", > "--continue-on-error", 266c270 < "-output_dir", "--out_dir", --- > "-out_dir", "--out_dir", 285c289 < if not _option_occurrences(forwarded, ("-stats",)): --- > if not _option_occurrences(forwarded, ("-stats", "--stats")): 298c302 < for option in ("-multicol", "--multicol", "-batch_size", "--batch_size", "-output_dir", "--out_dir"): --- > for option in ("-multicol", "--multicol", "-batch_size", "--batch_size", "-out_dir", "--out_dir"): 526c530 < "-output_dir", --- > "-out_dir", ha:////4PBxYFW1qansOBRF8vjWk2A2+fKCYjrl9XqTZ8JM7D6+AAAApR+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOICVEgoFa3lhheYxBgn1l2wHZyKF/E1/oBFJCq2WO1sM683LIOHmr3BTlNvKTQWBzeavDCx76+OE3Z8wYYpsNModZLc6tOMkqOGOUUJCwErTY3jYMlEWItOPVTlFJnqHH3+jgJK297hCYXI5qh8/MLkYXMb28D08/wVwDQMEcr9Ntfu8AEWNdkpvgAAAA==[Pipeline] } ha:////4FTjaDN1tsiKbmkwo+u5WB7iWrd+XE+6/XnQiFvhcctHAAAApR+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOKi0FAgqrRWGl5gYmOcWHfGdkgqXsTX+AMWkajYYrWzzbzesI4BThwM9poGS7Gz6N1o8sKJw3B1PGHPF+yYIjuNrZ5aVrpZsOWkYUlRwkrARlPnOFoyCbailw9ZOUmmOqeQv6OA0qo7PKEQ2ZxkSF+YA+xuo4pMP89fAczeJyj3da768AEi+zpyvgAAAA==[Pipeline] // stage ha:////4Gw8diTLMHUvSwHa5aMsEvd21mIKgWME44e54gCk5a0FAAAAph+LCAAAAAAAAP9tjTEOwjAUQ3+DOrAycohU7YqYWKMunCCkISSN/m+TlHbiRFyNOxCoxIQHy7ZkvecLyhjgSMFwp7G3GJXlg59MTnym0F89zdzRhSvCSF7zVs8tdfq01paShlUFg42ArUblKVo0CXbCybusvERTnVPI20EAs90IDyhEJicZ0rcsAfa3qYuEP85fACxDAlbX2Zrm8yzf8hZCqsIAAAA=[Pipeline] stage ha:////4EHW9M+AzisJ1DJtlx+O3AMKFOw6mdDMDP4A8VYjFlCfAAAAph+LCAAAAAAAAP9tjTEOwjAUQ3+LOrAycohUKiNiYo2ycILQhJA0+r9NUtKJE3E17kBLJSY8WLYl673eUMUAJwqGOY2dxdha1vvRzIllCt3NU2aOrqwljOQ1EzoLUvq8VkFJw6qihA2HrcbWU7RoEuy4kw9Ze4mmvqQwb0cOpVUDPKHgMznJkL5lCrC/jyoS/jh/ATD1CcqmWeywPKsPpnFij8IAAAA=[Pipeline] { (Declarative: Post Actions) ha:////4IIRHCKDUS+e6cuM806ul60TWe7KTu1DeWKranq+bSHnAAAApx+LCAAAAAAAAP9tjTEOwjAUQ3+LOrAycohUAjbE1DXKwglCE0La6P/yk9JOnIircQdaKjHhwbItWe/1hiIynIidaCy2HmPtRRd6NyUxELfXQINo6CJqwkjBCmUHRcZWS1WULCzKclhJWFusA0WPLsFGNvqhy6DRlefE03aUkHtzhydkciInzelbRobtrTeR8Mf5C4CxS5Dv9rMd5mfxAd6e6VPCAAAA[Pipeline] script ha:////4Ez7w+3SHQWSvOr3Pfgi3L7AmYofqfAhw6mrACnkKX8xAAAApx+LCAAAAAAAAP9tjTEOwjAUQ3+LOrAycohUQjAhpq5RFk4QmhDSRv+Xn5R24kRcjTvQUokJD5ZtyXqvNxSR4UTsRGOx9RhrL7rQuymJgbi9BhpEQxdRE0YKVig7KDK2WqqiZGFRlsNKwtpiHSh6dAk2stEPXQaNrjwnnrajhNybOzwhkxM5aU7fMjJsb72JhD/OXwCMXYJ8t5/tMD+LD/hYjrHCAAAA[Pipeline] { ha:////4ApIS/+yDaCAeCUe3GlBhBs6JENWYDHW9nmnFJ4xq9OIAAAApR+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIiIUGDqNJabniBiY1xYt0Z2yGpeBFf4w8EIlGxxWpnm3m+YJkiHDlabA11jlLjMPjeTgsHjt3F84Atn7FhSuwNSjNI1qaeUXI2MKcoYSFgZajxnBzZDGvRqruqvCJbnXKcvoOA0ukbPKAQkzmrmL8wRthce52Yfp6/AhhDhnK7+9Q+vAEIWoEpvgAAAA==[Pipeline] emailext Sending email to: messnermet@uwm.edu ha:////4GoCn5wpPswlrJSmOgpYpn/OiEVZI2WZisVlUpMN5+qTAAAApR+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIiISEKRJXWcsMLTGyME+vO2A5JxYv4Gn8gEImKLVY728zzBcsU4cjRYmuoc5Qah8H3dlo4cOwungds+YwNU2JvUJpBsjb1jJKzgTlFCQsBK0ON5+TIZliLVt1V5RXZ6pTj9B0ElE7f4AGFmMxZxfyFMcLm2uvE9PP8FcAYQoZyu//U7g3QKkBhvgAAAA==[Pipeline] } ha:////4Cl83QS9TFYHf4pk7HFRqZM0N4p5FhfEu8cZcFaMcl+2AAAApR+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIiIQokRJXWcsMLTGyME+vO2A5JxYv4Gn8gEImKLVY728zzBcsU4cjRYmuoc5Qah8H3dlo4cOwungds+YwNU2JvUJpBsjb1jJKzgTlFCQsBK0ON5+TIZliLVt1V5RXZ6pTj9B0ElE7f4AGFmMxZxfyFMcLm2uvE9PP8FcAYQoZyu//U7g2TqBHnvgAAAA==[Pipeline] // script ha:////4CKzrNHdeckS3bT41Dt34tMpr+5IFKexyqjbfNWqvJK5AAAApB+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPOIiQYUQVVrLDS8wsTFOrDtjOyQVL+Jr/IFAJCq2WO1sM88XLFOEI0eLraHOUWocBt/baeHAsbt4HrDlMzZMib1BaQbJ2tQzSs4G5hQlLASsDDWekyObYS1adVeVV2SrU47TdxBQOn2DBxRiMmcV8xfGCJtrrxPTz/NXAGMIGcrt/lO7N5XuKbK+AAAA[Pipeline] } ha:////4HcxcSK2bBQ+BrMxmkYL5w8DcEgMkYxjsTha5BcLIf/rAAAApB+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPMJBoURUaa00vMDEh3Fi3RnbIal4EV/jD1hEomKL1c4283rDOgY4cTCiRxosxc4K70aTl5g4DFfHk+j5IjqmyA5Fi1PLGpsFW04IS4oSVhI2SJ3jaMkk2MpePVTlFJnqnEL+jhJKq+/whEJmc1IhfWEOsLuNOjL9PH8FMHufoDzsc9X1B3+EVkS+AAAA[Pipeline] // stage ha:////4E+1p592JdFZqBom2GbTEFWdGY1wmooP+FmJKJRJ7sgjAAAApB+LCAAAAAAAAP9tjTEOwjAQBC9BFLSUPMJRRImoaC03vMAkxtix7ox9Ial4EV/jD1hEomKL1c4283rDOic4UrLCGxwc5s6JGEZblpgoDddAk/B0ER1hpmCEMpOi3pwWVMQGllQ1rCRsDHaBskPLsJVeP3QTNNrmzKl8Bwm16+/whEoWM+vEX5gT7G5jnwl/nr8CmGNkqPdtqbb9AKNVLj2+AAAA[Pipeline] } ha:////4Dmds9hi3s1MfRgmAzDuInpeVukYpjbC9tny0bpBMUceAAAApB+LCAAAAAAAAP9tjTsOwjAQRDdBFLSUHGLDp0SpaC03nMAkxjixdoPt4FSciKtxBywiUTHFaN407/WGZfBQszfYaeothcbi4EaTFyb2/dVxwo4v2DAFdhqlTpJbfZpRctQwpyhhIWClqXEcLJkIa9Gph6qcIlOdo8/fUUBp2zs8oRDZHJWPX5g8bG5jG5h+nr8CmIYhQnnY59ptP5sXvcy+AAAA[Pipeline] // withEnv ha:////4HVzd2VDFsK2IIEAjl3vfcm2OPifv2ROaxPgk96RocpAAAAAoh+LCAAAAAAAAP9tjTESgjAQRT84FraWHiIU2DlWthkaTxAhxkBmF5NFqDyRV/MOMjJj5a/+e817vbFOEUeOTrWWOk+p9qoPg5ufGjl218CjavmiaqbEwarKjhU39rRgxWKxLMux0thYqgMnT06w1a15mCIYcsVZ4uwOGrlv7ngi03NZTJQvTBG729Akpl/nbwBT3wvyshRk+w9e8C3YvQAAAA==[Pipeline] } ha:////4LhNz8I7YTGQqQChA/YaUTUGHXAhZq1XD5TgaVMigPAPAAAAoh+LCAAAAAAAAP9tjTESgjAQRT84FraWHiIU2DlWthkaTxAhxkBmF5NFqDyRV/MOMjJj5a/+e817vbFOEUeOTrWWOk+p9qoPg5ufGjl218CjavmiaqbEwarKjhU39rRgxWKxLMux0thYqgMnT06w1a15mCIYcsVZ4uwOGrlv7ngi03NZTJQvTBG729Akpl/nbwBT3wvyci/Iyg/tuWn0vQAAAA==[Pipeline] // node ha:////4BvtvcTZMrvCiMwvb/k5bPVyBDEbzd+z66QWtbr48UaSAAAAox+LCAAAAAAAAP9tjTEOwjAQBDdBFLSUPMKRQFSIitZKwwtMYowT6y7YF5KKF/E1/kBEJCq22plmXm8sU8SRo1ONpdZTqrzqQu+mpwaO7TXwoBq+qIopcbCqtEPJtT3NWLJYzMtyLDRWlqrAyZMTrHVjHqYIhlxxlji5g0bu6zueyPRUFhPlC2PE5tbXienX+RvA2HWCfLcXZNsPy6AOvr0AAAA=[Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE