diff --git a/container/runner.def b/container/runner.def index ff72a860..9dd0228b 100644 --- a/container/runner.def +++ b/container/runner.def @@ -3,14 +3,15 @@ From: ubuntu:latest %setup [ -d /tmp/EMOD3D ] || git clone --depth 1 git@github.com:ucgmsim/EMOD3D.git /tmp/EMOD3D - + [ -d /tmp/Velocity-Model ] || wget "https://www.dropbox.com/scl/fi/mzf5t4tdnv3qsgtbpx824/Velocity-Model.tar.zst?rlkey=df1uej7hd7xd18jerh357gy53&st=e9n8z0aw&dl=1" -O /tmp/Velocity-Model.tar.zst && cd /tmp && tar xf /tmp/Velocity-Model.tar.zst %files /tmp/EMOD3D /EMOD3D - + /tmp/Velocity-Model /Velocity-Model %post apt-get update && apt-get install -y \ build-essential \ cmake \ + curl \ gdal-bin \ gfortran \ ghostscript \ @@ -23,34 +24,35 @@ From: ubuntu:latest libfftw3-dev \ libopenmpi-dev \ libpapi-dev \ + openmpi-bin \ + openmpi-common \ python-is-python3 \ python3-pip \ sqlite3 \ - wget - wget "https://www.dropbox.com/scl/fi/b4m9g32x1j70ti69zyybq/genslip_velocity_model.vmod?rlkey=yxurhrdn8uvqh33hsb0inhsq0&st=o77aaccp&dl=0" -O /genslip_velocity_model.vmod - wget "https://www.dropbox.com/scl/fi/qakchhg6qu23aclcb02ye/Cant1D_v2-midQ_leer.1d?rlkey=wn1a6nnol2eaf5n6qsy5t1nym&st=8yahw7id&dl=0" -O /Cant1D_v2-midQ_leer.1d - wget "https://www.dropbox.com/scl/fi/tw1m15owloi0eo8h3u1kw/geoNet_stats-2023-06-28.vs30?rlkey=plu90zg0ti4lc2nvf51zu9xmg&st=iz8c2ls3&dl=0" -O /stations.vs30 - wget "https://www.dropbox.com/scl/fi/bb852b1f0rly6cfvs9p9b/geoNet_stats-2023-06-28.ll?rlkey=3y8k5qviy52nbksfdkm1n92yh&st=605h60u6&dl=0" -O /stations.ll + + + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + . $HOME/.cargo/env cd /EMOD3D && \ mkdir build && \ cd build && \ - cmake .. && \ - make -j $(nproc) genslip_v5.6.2 srf2stoch hb_high_binmod_v6.0.3 hb_high_binmod_v5.4.5 - + cmake -DHF_TIME_WINDOW=off -DUSE_FFTW=on -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fotran_COMPILER=mpicc .. && \ + make -j $(nproc) genslip_v5.6.2 srf2stoch generic_slip2srf hb_high_binmod_v6.0.3 hb_high_binmod_v5.4.5 emod3d-mpi_v3.0.13 + cd / # Remove all folders in EMOD3D except the tools folder find /EMOD3D -mindepth 1 -maxdepth 1 ! -name "tools" -exec rm -rf \{\} \; - git clone --depth 1 https://github.com/ucgmsim/Velocity-Model.git /Velocity-Model && \ cd /Velocity-Model && \ mkdir build && \ cd build && \ - cmake ../ -DCMAKE_C_FLAGS="-fopenmp" -DCMAKE_CXX_FLAGS="-fopenmp" && \ - make -j $(nproc) + cmake ../ -DCMAKE_C_FLAGS="-fopenmp" -DCMAKE_CXX_FLAGS="-fopenmp" && \ + make -j $(nproc) && \ + mv NZVM .. - pip install "git+https://github.com/ucgmsim/workflow@pegasus" --break-system-packages + pip install "git+https://github.com/ucgmsim/workflow@bb_sim_new" --break-system-packages %environment - export PATH="$PATH:/EMOD3D/tools:/Velocity-Model" + export PATH="$PATH:/root/.cargo/bin:/EMOD3D/tools:/Velocity-Model" diff --git a/pyproject.toml b/pyproject.toml index a70c389b..28879e4a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,52 +10,46 @@ readme = "README.md" requires-python = ">=3.12" dynamic = ["version"] dependencies = [ - # UCGMSim Dependencies - "im_calculation @ git+https://github.com/ucgmsim/IM_calculation.git", - "nshmdb @ git+https://github.com/ucgmsim/NSHM2022DB.git", - "oq_wrapper @ git+https://github.com/ucgmsim/Empirical_Engine.git#subdirectory=oq_wrapper", - "pygmt_helper @ git+https://github.com/ucgmsim/pygmt_helper.git", - "qcore @ git+https://github.com/ucgmsim/qcore.git", - "source_modelling @ git+https://github.com/ucgmsim/source_modelling.git", - "velocity_modelling @ git+https://github.com/ucgmsim/velocity_modelling.git", - - # Data Formats - "geopandas", - "h5py", - "pandas[parquet, hdf5]", - "pyyaml", - "xarray[io]", - - # Workflow Planner - "jinja2", - "networkx", - "printree", - "pyvis", - - # Numerics - "numexpr", - "numpy", - "scipy", - "shapely", - - # CLI - "tqdm", - "typer", - - # Misc. - "requests", # For gcmt-to-realisation - "schema", # For loading realisations - "structlog", # Logging. + # UCGMSim Dependencies + "im_calculation @ git+https://github.com/ucgmsim/IM_calculation.git", + "nshmdb @ git+https://github.com/ucgmsim/NSHM2022DB.git", + "oq_wrapper @ git+https://github.com/ucgmsim/Empirical_Engine.git#subdirectory=oq_wrapper", + "pygmt_helper @ git+https://github.com/ucgmsim/pygmt_helper.git", + "qcore @ git+https://github.com/ucgmsim/qcore.git", + "source_modelling @ git+https://github.com/ucgmsim/source_modelling.git", + "velocity_modelling @ git+https://github.com/ucgmsim/velocity_modelling.git", + + # Data Formats + "geopandas", + "h5py", + "pandas[parquet, hdf5]", + "pyyaml", + "xarray[io]", + + # Workflow Planner + "jinja2", + "networkx", + "printree", + + # Numerics + "numexpr", + "numpy", + "scipy", + "shapely", + + # CLI + "tqdm", + "typer", + + # Misc. + "requests", # For gcmt-to-realisation + "schema", # For loading realisations + "structlog", # Logging. ] [project.optional-dependencies] -test = [ - "pytest", -] -dev = [ - "ruff", - "deptry" -] +test = ["pytest"] +dev = ["ruff", "deptry"] [tool.deptry] pep621_dev_dependency_groups = ["test", "dev"] @@ -67,7 +61,6 @@ realisation-to-srf = "workflow.scripts.realisation_to_srf:app" generate-velocity-model-parameters = "workflow.scripts.generate_velocity_model_parameters:app" generate-velocity-model = "workflow.scripts.generate_velocity_model:app" generate-station-coordinates = "workflow.scripts.generate_station_coordinates:app" -generate-model-coordinates = "workflow.scripts.generate_model_coordinates:app" generate-rupture-propagation = "workflow.scripts.generate_rupture_propagation:app" copy-domain-parameters = "workflow.scripts.copy_velocity_model_parameters:app" create-e3d-par = "workflow.scripts.create_e3d_par:app" @@ -86,40 +79,38 @@ import-realisation = "workflow.scripts.import_realisation:app" workflow = "workflow" - - [tool.setuptools_scm] [tool.ruff.lint] extend-select = [ - # isort imports - "I", - # Use r'\s+' rather than '\s+' - "W605", - # All the naming errors, like using camel case for function names. - "N", - # Missing docstrings in classes, methods, and functions - "D101", - "D102", - "D103", - "D105", - "D107", - # Use f-string instead of a format call - "UP032", - # Standard library import is deprecated - "UP035", - # Missing function argument type-annotation - "ANN001", - "ANN002", - "ANN003", - "ANN201", - "ANN202", - "ANN204", - "ANN205", - "ANN206", - # Using except without specifying an exception type to catch - "BLE001", + # isort imports + "I", + # Use r'\s+' rather than '\s+' + "W605", + # All the naming errors, like using camel case for function names. + "N", + # Missing docstrings in classes, methods, and functions + "D101", + "D102", + "D103", + "D105", + "D107", + # Use f-string instead of a format call + "UP032", + # Standard library import is deprecated + "UP035", + # Missing function argument type-annotation + "ANN001", + "ANN002", + "ANN003", + "ANN201", + "ANN202", + "ANN204", + "ANN205", + "ANN206", + # Using except without specifying an exception type to catch + "BLE001", ] ignore = ["D104"] @@ -128,15 +119,15 @@ convention = "numpy" [tool.ruff.lint.isort] known-first-party = [ - "source_modelling", - "workflow", - "pygmt_helper", - "qcore", - "empirical", - "nshmdb", - "IM", - "mera", - "velocity_modelling", + "source_modelling", + "workflow", + "pygmt_helper", + "qcore", + "empirical", + "nshmdb", + "IM", + "mera", + "velocity_modelling", ] [tool.ruff.lint.per-file-ignores] @@ -150,24 +141,24 @@ omit = ["workflow/scripts/*.py"] [tool.numpydoc_validation] checks = [ - "GL05", - "GL08", - "GL10", - "PR01", - "PR02", - "PR03", - "PR04", - "PR05", - "PR06", - "PR07", - "RT01", - "RT02", - "RT03", - "RT04", - "YD01", + "GL05", + "GL08", + "GL10", + "PR01", + "PR02", + "PR03", + "PR04", + "PR05", + "PR06", + "PR07", + "RT01", + "RT02", + "RT03", + "RT04", + "YD01", ] # remember to use single quotes for regex in TOML exclude = [ # don't report on objects that match any of these regex - '\.undocumented_method$', - '\.__repr__$', + '\.undocumented_method$', + '\.__repr__$', ] diff --git a/uv.lock b/uv.lock index 14b41c1c..bddf3d87 100644 --- a/uv.lock +++ b/uv.lock @@ -41,11 +41,11 @@ wheels = [ [[package]] name = "asgiref" -version = "3.9.0" +version = "3.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/68/fb4fb78c9eac59d5e819108a57664737f855c5a8e9b76aec1738bb137f9e/asgiref-3.9.0.tar.gz", hash = "sha256:3dd2556d0f08c4fab8a010d9ab05ef8c34565f6bf32381d17505f7ca5b273767", size = 36772, upload-time = "2025-07-03T13:25:01.491Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142", size = 36870, upload-time = "2025-07-08T09:07:43.344Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/f9/76c9f4d4985b5a642926162e2d41fe6019b1fa929cfa58abb7d2dc9041e5/asgiref-3.9.0-py3-none-any.whl", hash = "sha256:06a41250a0114d2b6f6a2cb3ab962147d355b53d1de15eebc34a9d04a7b79981", size = 23788, upload-time = "2025-07-03T13:24:59.115Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c", size = 23790, upload-time = "2025-07-08T09:07:41.548Z" }, ] [[package]] @@ -105,7 +105,7 @@ wheels = [ [[package]] name = "blosc2" -version = "3.5.1" +version = "3.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "msgpack" }, @@ -116,18 +116,18 @@ dependencies = [ { name = "py-cpuinfo", marker = "platform_machine != 'wasm32'" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/a0/1abec67127972fabf07bc1b7208324399fb25576ba3a2104738dbd40fc8a/blosc2-3.5.1.tar.gz", hash = "sha256:5d72f7a9a8b3b523c588be9d66e9e7f2463483716c4c01e5056c1f7e37167f85", size = 3653626, upload-time = "2025-07-02T11:47:16.4Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/cb/ed9ee34a3835dcdee67927bcdc55ec3e912a9d08500612db05aebb885dd1/blosc2-3.6.1.tar.gz", hash = "sha256:0b6f05311fbee9e9dc23bd7f53a8690af3b60eef640a059f1eb624ca6699cc59", size = 3657993, upload-time = "2025-07-17T16:22:58.999Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/ab/bbc1771dc66815277c3d3e316d0f2864209bc15421608ee13ce955b9de3b/blosc2-3.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:780213c917d9ac28b52a09ac82baa761262e8421688937b67f6516987a96fc58", size = 4012189, upload-time = "2025-07-02T11:47:03.343Z" }, - { url = "https://files.pythonhosted.org/packages/20/84/dafbb363539313c5d5e2f4c082c42a652c5767831e7e1fe77eb509aed73e/blosc2-3.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e3d1d0885e955e184efae81168448106644d5a0a60c0911b98e94fe9d756fa9", size = 3372462, upload-time = "2025-07-02T11:47:05.053Z" }, - { url = "https://files.pythonhosted.org/packages/07/7f/8e77b054ce2eff7b7c9810378cfcc78f73a4e45c2bf122833395f5dce61d/blosc2-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7c23e48414283dcfa5676abc6a4be9fb92a7b372a20f7acf90438abc69a746e", size = 4278243, upload-time = "2025-07-02T11:47:06.757Z" }, - { url = "https://files.pythonhosted.org/packages/a6/fd/df0d0c7aec2d135b9c8df9d3d8136c84d614d04595f051b1f5b8aeab238d/blosc2-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5df464652ddcae9ef8d8b3354ad224b1e147187dde5b6470e0e9f95bec328756", size = 4420536, upload-time = "2025-07-02T11:47:07.974Z" }, - { url = "https://files.pythonhosted.org/packages/6b/64/a7497c8ba3aceed462d9cbe8227aeee20fbf77415702a0ced11a03fd0d5a/blosc2-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:530965c444186bfb92a4406ab4c2d801939df35a5c58658131000f68ce1a37ec", size = 2212429, upload-time = "2025-07-02T11:47:09.045Z" }, - { url = "https://files.pythonhosted.org/packages/c1/17/38adc448a44c8d0e6f3700de4c072d5cbf3cdd7dffdfe62ccf179c985641/blosc2-3.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:44b4e51fd0b5a7e6ccae8053e133037f5984f6990a1e9b787376f4ec42aaf5bf", size = 4010715, upload-time = "2025-07-02T11:47:10.49Z" }, - { url = "https://files.pythonhosted.org/packages/0c/3b/bd2803d030c204984f8b14ce9919bcb67b6582141898a28887ae1fa58d80/blosc2-3.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b59805aa56ff1f9e6e4ba2f293e54cdf356b64db983bb019dbdbac72f88f2e38", size = 3371665, upload-time = "2025-07-02T11:47:11.651Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c8/b86f3ecfecff76cab9c3c1f54fcbb05ab654b6d0a940b9b614b896f8105f/blosc2-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:485ca015db7352fa0e3b78b912c66ec495d60b94cab36a82abfb9f87715e6abd", size = 4280046, upload-time = "2025-07-02T11:47:12.913Z" }, - { url = "https://files.pythonhosted.org/packages/c9/38/8815054e054e45fda3c9d1e25ac77e6387d10d8e33c64bcf79f432b3c4fa/blosc2-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f88cfa1f1d64d77278c7fae0ab8c42291b7b2e8f36fcee154a0c55388e697fe9", size = 4422773, upload-time = "2025-07-02T11:47:14.184Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f0/55b5090c8fb6e9a12810cf141cd59875718148a78f62a4da818045f7e4b6/blosc2-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:9d36c4a8489c0f8719040a7543918e2701821340b8643d508c450d0d012259bf", size = 2213487, upload-time = "2025-07-02T11:47:15.297Z" }, + { url = "https://files.pythonhosted.org/packages/b5/08/b42e6f3babe94ffc19b84a05039f6e62134bf6426ae3ebbe325c670f482d/blosc2-3.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c68aac3dad63ea229ad09ea8a3595129abde493e5df90622ae005457795686a6", size = 4018049, upload-time = "2025-07-17T16:22:43.399Z" }, + { url = "https://files.pythonhosted.org/packages/a2/30/78649ca5699be9d234f3310ee2d0608d80120cf5c1fc1bdc6d79bb43804b/blosc2-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1bde827e1660a6fa9c6974923e56a3bd8db45b0eb90bc87cbb73c5b245ca6ef5", size = 3375727, upload-time = "2025-07-17T16:22:45.278Z" }, + { url = "https://files.pythonhosted.org/packages/5a/89/26f515c2d1d0fcdb262e640f2f60dafee249d15523d93f6af4358c19ece5/blosc2-3.6.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89e6e25a2cc1e8ba715bf4bd97bd75b2af9c7209799ffc2c4465acef05d1c8d5", size = 4286933, upload-time = "2025-07-17T16:22:46.774Z" }, + { url = "https://files.pythonhosted.org/packages/e5/73/d03c34900400d4c8e1bea1c7f8750e17b83f98ac6c940b029e45ee8a9d00/blosc2-3.6.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6f2379d75f1b29727655ff9f9a392431e15e997bb6e927605a83946f293b67c7", size = 4425921, upload-time = "2025-07-17T16:22:48.548Z" }, + { url = "https://files.pythonhosted.org/packages/48/55/2945d05f88d94ec11e9432fee3014b1cdbd16a13990ab304320c482c37ab/blosc2-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:0449067307f707139d57f91675e1d389cdea9d4c527aa443b88dfa18993b88b6", size = 2217651, upload-time = "2025-07-17T16:22:49.873Z" }, + { url = "https://files.pythonhosted.org/packages/96/6a/cb3c693bd13050d9f68e180e9c5f2fa22060c1fcd04164eae4dd6a97c831/blosc2-3.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47c4b5878795a4bd63f1c93c2bf286939a216e740227bcb18708654196972346", size = 4016932, upload-time = "2025-07-17T16:22:51.212Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a8/0ba60e4810af3d9daee1cc7f8b2a5f93da6b76e65e3e195b0a34a576bf06/blosc2-3.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c32b8ec2f878e77476c457cc57af57cb66e87a026850378d16659f543e1db2a", size = 3374697, upload-time = "2025-07-17T16:22:52.923Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2b/6df9bf29d698dab1f6ee63e96bcf689546e6875af3d0431b90ad2b491888/blosc2-3.6.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9fc209348cbbedce1779ea4d7ce91b349e9298bfd32b92c274c3b5eb444dc206", size = 4287893, upload-time = "2025-07-17T16:22:54.345Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a6/6af387f01b3442e5c14f02cd05ce67e0232984cb4f34dab31e6e319c3ad8/blosc2-3.6.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2332c14034a9f9f5739ec976af24f208677fe964fe1a196c9ae7603ba80ed886", size = 4426379, upload-time = "2025-07-17T16:22:55.692Z" }, + { url = "https://files.pythonhosted.org/packages/87/64/34c1e5c3cd4ada2bebc13880715647cab660f8db85a57210dc4932021167/blosc2-3.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:e440a600017592e37747f48592bfbc74baa848a74cf41513adf53287fd213015", size = 2218905, upload-time = "2025-07-17T16:22:57.169Z" }, ] [[package]] @@ -169,11 +169,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.6.15" +version = "2025.7.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753, upload-time = "2025-06-15T02:45:51.329Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650, upload-time = "2025-06-15T02:45:49.977Z" }, + { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" }, ] [[package]] @@ -516,11 +516,11 @@ wheels = [ [[package]] name = "docstring-parser" -version = "0.16" +version = "0.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/12/9c22a58c0b1e29271051222d8906257616da84135af9ed167c9e28f85cb3/docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e", size = 26565, upload-time = "2024-03-15T10:39:44.419Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/7c/e9fcff7623954d86bdc17782036cbf715ecab1bec4847c008557affe1ca8/docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637", size = 36533, upload-time = "2024-03-15T10:39:41.527Z" }, + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, ] [[package]] @@ -546,24 +546,24 @@ wheels = [ [[package]] name = "duckdb" -version = "1.3.1" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/ab/d89a4dd14311d5a0081711bc66db3fad73f7645fa7eb3844c423d2fa0a17/duckdb-1.3.1.tar.gz", hash = "sha256:8e101990a879533b1d33f003df2eb2a3c4bc7bdf976bd7ef7c32342047935327", size = 11628075, upload-time = "2025-06-16T13:57:04.119Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/24/a2e7fb78fba577641c286fe33185789ab1e1569ccdf4d142e005995991d2/duckdb-1.3.2.tar.gz", hash = "sha256:c658df8a1bc78704f702ad0d954d82a1edd4518d7a04f00027ec53e40f591ff5", size = 11627775, upload-time = "2025-07-08T10:41:14.444Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/cf/c9a76a15195ec1566b04a23c182ce16b60d1f06c7cdfec1aa538c8e8e0ae/duckdb-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:73f389f9c713325a6994dd9e04a7fa23bd73e8387883f8086946a9d3a1dd70e1", size = 15529437, upload-time = "2025-06-16T13:56:16.932Z" }, - { url = "https://files.pythonhosted.org/packages/d7/15/6cb79d988bedb19be6cfb654cd98b339cf4d06b7fc337f52c4051416b690/duckdb-1.3.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:87c99569274b453d8f9963e43fea74bc86901773fac945c1fe612c133a91e506", size = 32525563, upload-time = "2025-06-16T13:56:19.235Z" }, - { url = "https://files.pythonhosted.org/packages/14/7a/0acc37ec937a69a2fc325ab680cf68e7f1ed5d83b056dfade617502e40c2/duckdb-1.3.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:21da268355dfdf859b3d4db22180f7d5dd85a60517e077cb4158768cd5f0ee44", size = 17106064, upload-time = "2025-06-16T13:56:21.534Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a0/aef95020f5ada03e44eea0b23951b96cec45a85a0c42210639d5d5688603/duckdb-1.3.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77902954d15ba4aff92e82df700643b995c057f2d7d39af7ed226d8cceb9c2af", size = 19172380, upload-time = "2025-06-16T13:56:23.875Z" }, - { url = "https://files.pythonhosted.org/packages/9c/2a/3eae3acda60e178785835d6df85f3bf9ddab4362e9fd45d0fe4879973561/duckdb-1.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67b1a3c9e2c3474991da97edfec0a89f382fef698d7f64b2d8d09006eaeeea24", size = 21123030, upload-time = "2025-06-16T13:56:26.366Z" }, - { url = "https://files.pythonhosted.org/packages/f4/79/885c0ad2434fa7b353532580435d59bb007efb629740ba4eb273fc4c882c/duckdb-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f1d076b12f0d2a7f9090ad9e4057ac41af3e4785969e5997afd44922c7b141e0", size = 22774472, upload-time = "2025-06-16T13:56:29.884Z" }, - { url = "https://files.pythonhosted.org/packages/24/02/d294613e4fccfc86f4718b2cede365a9a6313c938bf0547c78ec196a0b9c/duckdb-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:bf7d6884bfb67aef67aebb0bd2460ea1137c55b3fd8794a3530c653dbe0d4019", size = 11302743, upload-time = "2025-06-16T13:56:31.868Z" }, - { url = "https://files.pythonhosted.org/packages/d0/2e/5e1bf9f0b43bcb37dbe729d3a2c55da8b232137c15b0b63d2d51f96793b6/duckdb-1.3.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:72bbc8479c5d88e839a92c458c94c622f917ff0122853323728d6e25b0c3d4e1", size = 15529541, upload-time = "2025-06-16T13:56:34.011Z" }, - { url = "https://files.pythonhosted.org/packages/bc/ab/6b2e1efb133b2f4990710bd9a54e734a12a147eaead1102e36dd8d126494/duckdb-1.3.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:937de83df6bbe4bee5830ce80f568d4c0ebf3ef5eb809db3343d2161e4f6e42b", size = 32525596, upload-time = "2025-06-16T13:56:36.048Z" }, - { url = "https://files.pythonhosted.org/packages/68/9f/879f6f33a1d5b4afee9dd4082e97d9b43c21cf734c90164d10fd7303edb5/duckdb-1.3.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:21440dd37f073944badd495c299c6d085cd133633450467ec420c71897ac1d5b", size = 17106339, upload-time = "2025-06-16T13:56:38.358Z" }, - { url = "https://files.pythonhosted.org/packages/9a/06/5755f93be743ec27986f275847a85d44bb1bd6d8631492d337729fbe9145/duckdb-1.3.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:663610b591ea6964f140441c81b718e745704cf098c540e905b200b9079e2a5c", size = 19173540, upload-time = "2025-06-16T13:56:40.304Z" }, - { url = "https://files.pythonhosted.org/packages/90/a6/c8577b741974f106e24f8eb3efedc399be1a23cbbdcf49dd4bea5bb8aa4e/duckdb-1.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8793b5abb365bbbf64ba3065f3a37951fe04f2d4506b0e24f3f8ecd08b3af4ba", size = 21122193, upload-time = "2025-06-16T13:56:42.321Z" }, - { url = "https://files.pythonhosted.org/packages/43/10/b4576bbfa895a0ab125697fd58c0fbe54338672a9df25e7311bdf21f9e04/duckdb-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:27d775a5af405d1c228561830c8ccbe4e2832dafb4012f16c05fde1cde206dee", size = 22773434, upload-time = "2025-06-16T13:56:46.414Z" }, - { url = "https://files.pythonhosted.org/packages/94/b9/f5ae51f7331f79c184fd96456c0896de875149fdeb092084fd20433ec97c/duckdb-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:3eb045a9bf92da890d890cde2f676b3bda61b9de3b7dc46cbaaf75875b41e4b0", size = 11302770, upload-time = "2025-06-16T13:56:48.325Z" }, + { url = "https://files.pythonhosted.org/packages/6c/5d/77f15528857c2b186ebec07778dc199ccc04aafb69fb7b15227af4f19ac9/duckdb-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2455b1ffef4e3d3c7ef8b806977c0e3973c10ec85aa28f08c993ab7f2598e8dd", size = 15538413, upload-time = "2025-07-08T10:40:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/78/67/7e4964f688b846676c813a4acc527cd3454be8a9cafa10f3a9aa78d0d165/duckdb-1.3.2-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:9d0ae509713da3461c000af27496d5413f839d26111d2a609242d9d17b37d464", size = 32535307, upload-time = "2025-07-08T10:40:31.632Z" }, + { url = "https://files.pythonhosted.org/packages/95/3d/2d7f8078194130dbf30b5ae154ce454bfc208c91aa5f3e802531a3e09bca/duckdb-1.3.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:72ca6143d23c0bf6426396400f01fcbe4785ad9ceec771bd9a4acc5b5ef9a075", size = 17110219, upload-time = "2025-07-08T10:40:34.072Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/36ff9000b9c6d2a68c1b248f133ee316fcac10c0ff817112cbf5214dbe91/duckdb-1.3.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b49a11afba36b98436db83770df10faa03ebded06514cb9b180b513d8be7f392", size = 19178569, upload-time = "2025-07-08T10:40:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/ac/73/f85acbb3ac319a86abbf6b46103d58594d73529123377219980f11b388e9/duckdb-1.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36abdfe0d1704fe09b08d233165f312dad7d7d0ecaaca5fb3bb869f4838a2d0b", size = 21129975, upload-time = "2025-07-08T10:40:38.3Z" }, + { url = "https://files.pythonhosted.org/packages/32/40/9aa3267f3631ae06b30fb1045a48628f4dba7beb2efb485c0282b4a73367/duckdb-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3380aae1c4f2af3f37b0bf223fabd62077dd0493c84ef441e69b45167188e7b6", size = 22781859, upload-time = "2025-07-08T10:40:41.691Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8d/47bf95f6999b327cf4da677e150cfce802abf9057b61a93a1f91e89d748c/duckdb-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:11af73963ae174aafd90ea45fb0317f1b2e28a7f1d9902819d47c67cc957d49c", size = 11395337, upload-time = "2025-07-08T10:40:43.651Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/8cac9713735864899e8abc4065bbdb3d1617f2130006d508a80e1b1a6c53/duckdb-1.3.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a3418c973b06ac4e97f178f803e032c30c9a9f56a3e3b43a866f33223dfbf60b", size = 15535350, upload-time = "2025-07-08T10:40:45.562Z" }, + { url = "https://files.pythonhosted.org/packages/c5/26/6698bbb30b7bce8b8b17697599f1517611c61e4bd68b37eaeaf4f5ddd915/duckdb-1.3.2-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:2a741eae2cf110fd2223eeebe4151e22c0c02803e1cfac6880dbe8a39fecab6a", size = 32534715, upload-time = "2025-07-08T10:40:47.615Z" }, + { url = "https://files.pythonhosted.org/packages/10/75/8ab4da3099a2fac7335ecebce4246706d19bdd5dad167aa436b5b27c43c4/duckdb-1.3.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:51e62541341ea1a9e31f0f1ade2496a39b742caf513bebd52396f42ddd6525a0", size = 17110300, upload-time = "2025-07-08T10:40:49.674Z" }, + { url = "https://files.pythonhosted.org/packages/d1/46/af81b10d4a66a0f27c248df296d1b41ff2a305a235ed8488f93240f6f8b5/duckdb-1.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e519de5640e5671f1731b3ae6b496e0ed7e4de4a1c25c7a2f34c991ab64d71", size = 19180082, upload-time = "2025-07-08T10:40:51.679Z" }, + { url = "https://files.pythonhosted.org/packages/68/fc/259a54fc22111a847981927aa58528d766e8b228c6d41deb0ad8a1959f9f/duckdb-1.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4732fb8cc60566b60e7e53b8c19972cb5ed12d285147a3063b16cc64a79f6d9f", size = 21128404, upload-time = "2025-07-08T10:40:53.772Z" }, + { url = "https://files.pythonhosted.org/packages/ab/dc/5d5140383e40661173dacdceaddee2a97c3f6721a5e8d76e08258110595e/duckdb-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97f7a22dcaa1cca889d12c3dc43a999468375cdb6f6fe56edf840e062d4a8293", size = 22779786, upload-time = "2025-07-08T10:40:55.826Z" }, + { url = "https://files.pythonhosted.org/packages/51/c9/2fcd86ab7530a5b6caff42dbe516ce7a86277e12c499d1c1f5acd266ffb2/duckdb-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:cd3d717bf9c49ef4b1016c2216517572258fa645c2923e91c5234053defa3fb5", size = 11395370, upload-time = "2025-07-08T10:40:57.655Z" }, ] [[package]] @@ -633,36 +633,36 @@ wheels = [ [[package]] name = "fonttools" -version = "4.58.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/97/5735503e58d3816b0989955ef9b2df07e4c99b246469bd8b3823a14095da/fonttools-4.58.5.tar.gz", hash = "sha256:b2a35b0a19f1837284b3a23dd64fd7761b8911d50911ecd2bdbaf5b2d1b5df9c", size = 3526243, upload-time = "2025-07-03T14:04:47.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/68/66b498ee66f3e7e92fd68476c2509508082b7f57d68c0cdb4b8573f44331/fonttools-4.58.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c3af3fefaafb570a03051a0d6899b8374dcf8e6a4560e42575843aef33bdbad6", size = 2754751, upload-time = "2025-07-03T14:03:52.976Z" }, - { url = "https://files.pythonhosted.org/packages/f1/1e/edbc14b79290980c3944a1f43098624bc8965f534964aa03d52041f24cb4/fonttools-4.58.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:688137789dbd44e8757ad77b49a771539d8069195ffa9a8bcf18176e90bbd86d", size = 2322342, upload-time = "2025-07-03T14:03:54.957Z" }, - { url = "https://files.pythonhosted.org/packages/c1/d7/3c87cf147185d91c2e946460a5cf68c236427b4a23ab96793ccb7d8017c9/fonttools-4.58.5-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af65836cf84cd7cb882d0b353bdc73643a497ce23b7414c26499bb8128ca1af", size = 4897011, upload-time = "2025-07-03T14:03:56.829Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d6/fbb44cc85d4195fe54356658bd9f934328b4f74ae14addd90b4b5558b5c9/fonttools-4.58.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2d79cfeb456bf438cb9fb87437634d4d6f228f27572ca5c5355e58472d5519d", size = 4942291, upload-time = "2025-07-03T14:03:59.204Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c8/453f82e21aedf25cdc2ae619c03a73512398cec9bd8b6c3b1c571e0b6632/fonttools-4.58.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0feac9dda9a48a7a342a593f35d50a5cee2dbd27a03a4c4a5192834a4853b204", size = 4886824, upload-time = "2025-07-03T14:04:01.517Z" }, - { url = "https://files.pythonhosted.org/packages/40/54/e9190001b8e22d123f78925b2f508c866d9d18531694b979277ad45d59b0/fonttools-4.58.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36555230e168511e83ad8637232268649634b8dfff6ef58f46e1ebc057a041ad", size = 5038510, upload-time = "2025-07-03T14:04:03.917Z" }, - { url = "https://files.pythonhosted.org/packages/cf/9c/07cdad4774841a6304aabae939f8cbb9538cb1d8e97f5016b334da98e73a/fonttools-4.58.5-cp312-cp312-win32.whl", hash = "sha256:26ec05319353842d127bd02516eacb25b97ca83966e40e9ad6fab85cab0576f4", size = 2188459, upload-time = "2025-07-03T14:04:06.103Z" }, - { url = "https://files.pythonhosted.org/packages/0e/4d/1eaaad22781d55f49d1b184563842172aeb6a4fe53c029e503be81114314/fonttools-4.58.5-cp312-cp312-win_amd64.whl", hash = "sha256:778a632e538f82c1920579c0c01566a8f83dc24470c96efbf2fbac698907f569", size = 2236565, upload-time = "2025-07-03T14:04:08.27Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ee/764dd8b99891f815241f449345863cfed9e546923d9cef463f37fd1d7168/fonttools-4.58.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f4b6f1360da13cecc88c0d60716145b31e1015fbe6a59e32f73a4404e2ea92cf", size = 2745867, upload-time = "2025-07-03T14:04:10.586Z" }, - { url = "https://files.pythonhosted.org/packages/e2/23/8fef484c02fef55e226dfeac4339a015c5480b6a496064058491759ac71e/fonttools-4.58.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a036822e915692aa2c03e2decc60f49a8190f8111b639c947a4f4e5774d0d7a", size = 2317933, upload-time = "2025-07-03T14:04:12.335Z" }, - { url = "https://files.pythonhosted.org/packages/ab/47/f92b135864fa777e11ad68420bf89446c91a572fe2782745586f8e6aac0c/fonttools-4.58.5-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d7709fcf4577b0f294ee6327088884ca95046e1eccde87c53bbba4d5008541", size = 4877844, upload-time = "2025-07-03T14:04:14.58Z" }, - { url = "https://files.pythonhosted.org/packages/3e/65/6c1a83511d8ac32411930495645edb3f8dfabebcb78f08cf6009ba2585ec/fonttools-4.58.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9b5099ca99b79d6d67162778b1b1616fc0e1de02c1a178248a0da8d78a33852", size = 4940106, upload-time = "2025-07-03T14:04:16.563Z" }, - { url = "https://files.pythonhosted.org/packages/fa/90/df8eb77d6cf266cbbba01866a1349a3e9121e0a63002cf8d6754e994f755/fonttools-4.58.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f2c05a8d82a4d15aebfdb3506e90793aea16e0302cec385134dd960647a36c0", size = 4879458, upload-time = "2025-07-03T14:04:19.584Z" }, - { url = "https://files.pythonhosted.org/packages/26/b1/e32f8de51b7afcfea6ad62780da2fa73212c43a32cd8cafcc852189d7949/fonttools-4.58.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79f0c4b1cc63839b61deeac646d8dba46f8ed40332c2ac1b9997281462c2e4ba", size = 5021917, upload-time = "2025-07-03T14:04:21.736Z" }, - { url = "https://files.pythonhosted.org/packages/89/72/578aa7fe32918dd763c62f447aaed672d665ee10e3eeb1725f4d6493fe96/fonttools-4.58.5-cp313-cp313-win32.whl", hash = "sha256:a1a9a2c462760976882131cbab7d63407813413a2d32cd699e86a1ff22bf7aa5", size = 2186827, upload-time = "2025-07-03T14:04:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/71/a3/21e921b16cb9c029d3308e0cb79c9a937e9ff1fc1ee28c2419f0957b9e7c/fonttools-4.58.5-cp313-cp313-win_amd64.whl", hash = "sha256:bca61b14031a4b7dc87e14bf6ca34c275f8e4b9f7a37bc2fe746b532a924cf30", size = 2235706, upload-time = "2025-07-03T14:04:26.082Z" }, - { url = "https://files.pythonhosted.org/packages/d7/d4/1d85a1996b6188cd2713230e002d79a6f3a289bb17cef600cba385848b72/fonttools-4.58.5-py3-none-any.whl", hash = "sha256:e48a487ed24d9b611c5c4b25db1e50e69e9854ca2670e39a3486ffcd98863ec4", size = 1115318, upload-time = "2025-07-03T14:04:45.378Z" }, +version = "4.59.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/27/ec3c723bfdf86f34c5c82bf6305df3e0f0d8ea798d2d3a7cb0c0a866d286/fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", size = 3532521, upload-time = "2025-07-16T12:04:54.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/77/b1c8af22f4265e951cd2e5535dbef8859efcef4fb8dee742d368c967cddb/fonttools-4.59.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9b3a78f69dcbd803cf2fb3f972779875b244c1115481dfbdd567b2c22b31f6b", size = 2767562, upload-time = "2025-07-16T12:04:06.895Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5a/aeb975699588176bb357e8b398dfd27e5d3a2230d92b81ab8cbb6187358d/fonttools-4.59.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:57bb7e26928573ee7c6504f54c05860d867fd35e675769f3ce01b52af38d48e2", size = 2335168, upload-time = "2025-07-16T12:04:08.695Z" }, + { url = "https://files.pythonhosted.org/packages/54/97/c6101a7e60ae138c4ef75b22434373a0da50a707dad523dd19a4889315bf/fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4536f2695fe5c1ffb528d84a35a7d3967e5558d2af58b4775e7ab1449d65767b", size = 4909850, upload-time = "2025-07-16T12:04:10.761Z" }, + { url = "https://files.pythonhosted.org/packages/bd/6c/fa4d18d641054f7bff878cbea14aa9433f292b9057cb1700d8e91a4d5f4f/fonttools-4.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:885bde7d26e5b40e15c47bd5def48b38cbd50830a65f98122a8fb90962af7cd1", size = 4955131, upload-time = "2025-07-16T12:04:12.846Z" }, + { url = "https://files.pythonhosted.org/packages/20/5c/331947fc1377deb928a69bde49f9003364f5115e5cbe351eea99e39412a2/fonttools-4.59.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6801aeddb6acb2c42eafa45bc1cb98ba236871ae6f33f31e984670b749a8e58e", size = 4899667, upload-time = "2025-07-16T12:04:14.558Z" }, + { url = "https://files.pythonhosted.org/packages/8a/46/b66469dfa26b8ff0baa7654b2cc7851206c6d57fe3abdabbaab22079a119/fonttools-4.59.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:31003b6a10f70742a63126b80863ab48175fb8272a18ca0846c0482968f0588e", size = 5051349, upload-time = "2025-07-16T12:04:16.388Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ebfb6b1f3a4328ab69787d106a7d92ccde77ce66e98659df0f9e3f28d93d/fonttools-4.59.0-cp312-cp312-win32.whl", hash = "sha256:fbce6dae41b692a5973d0f2158f782b9ad05babc2c2019a970a1094a23909b1b", size = 2201315, upload-time = "2025-07-16T12:04:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/09/45/d2bdc9ea20bbadec1016fd0db45696d573d7a26d95ab5174ffcb6d74340b/fonttools-4.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:332bfe685d1ac58ca8d62b8d6c71c2e52a6c64bc218dc8f7825c9ea51385aa01", size = 2249408, upload-time = "2025-07-16T12:04:20.489Z" }, + { url = "https://files.pythonhosted.org/packages/f3/bb/390990e7c457d377b00890d9f96a3ca13ae2517efafb6609c1756e213ba4/fonttools-4.59.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2", size = 2758704, upload-time = "2025-07-16T12:04:22.217Z" }, + { url = "https://files.pythonhosted.org/packages/df/6f/d730d9fcc9b410a11597092bd2eb9ca53e5438c6cb90e4b3047ce1b723e9/fonttools-4.59.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2", size = 2330764, upload-time = "2025-07-16T12:04:23.985Z" }, + { url = "https://files.pythonhosted.org/packages/75/b4/b96bb66f6f8cc4669de44a158099b249c8159231d254ab6b092909388be5/fonttools-4.59.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4", size = 4890699, upload-time = "2025-07-16T12:04:25.664Z" }, + { url = "https://files.pythonhosted.org/packages/b5/57/7969af50b26408be12baa317c6147588db5b38af2759e6df94554dbc5fdb/fonttools-4.59.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97", size = 4952934, upload-time = "2025-07-16T12:04:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e2/dd968053b6cf1f46c904f5bd409b22341477c017d8201619a265e50762d3/fonttools-4.59.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c", size = 4892319, upload-time = "2025-07-16T12:04:30.074Z" }, + { url = "https://files.pythonhosted.org/packages/6b/95/a59810d8eda09129f83467a4e58f84205dc6994ebaeb9815406363e07250/fonttools-4.59.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c", size = 5034753, upload-time = "2025-07-16T12:04:32.292Z" }, + { url = "https://files.pythonhosted.org/packages/a5/84/51a69ee89ff8d1fea0c6997e946657e25a3f08513de8435fe124929f3eef/fonttools-4.59.0-cp313-cp313-win32.whl", hash = "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3", size = 2199688, upload-time = "2025-07-16T12:04:34.444Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/f626cd372932d828508137a79b85167fdcf3adab2e3bed433f295c596c6a/fonttools-4.59.0-cp313-cp313-win_amd64.whl", hash = "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe", size = 2248560, upload-time = "2025-07-16T12:04:36.034Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9c/df0ef2c51845a13043e5088f7bb988ca6cd5bb82d5d4203d6a158aa58cf2/fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", size = 1128050, upload-time = "2025-07-16T12:04:52.687Z" }, ] [[package]] name = "fsspec" -version = "2025.5.1" +version = "2025.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/f7/27f15d41f0ed38e8fcc488584b57e902b331da7f7c6dcda53721b15838fc/fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475", size = 303033, upload-time = "2025-05-24T12:03:23.792Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/02/0835e6ab9cfc03916fe3f78c0956cfcdb6ff2669ffa6651065d5ebf7fc98/fsspec-2025.7.0.tar.gz", hash = "sha256:786120687ffa54b8283d942929540d8bc5ccfa820deb555a2b5d0ed2b737bf58", size = 304432, upload-time = "2025-07-15T16:05:21.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/61/78c7b3851add1481b048b5fdc29067397a1784e2910592bc81bb3f608635/fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462", size = 199052, upload-time = "2025-05-24T12:03:21.66Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e0/014d5d9d7a4564cf1c40b5039bc882db69fd881111e03ab3657ac0b218e2/fsspec-2025.7.0-py3-none-any.whl", hash = "sha256:8b012e39f63c7d5f10474de957f3ab793b47b45ae7d39f2fb735f8bbe25c0e21", size = 199597, upload-time = "2025-07-15T16:05:19.529Z" }, ] [[package]] @@ -691,39 +691,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/70/d5cd0696eff08e62fdbdebe5b46527facb4e7220eabe0ac6225efab50168/geopandas-1.1.1-py3-none-any.whl", hash = "sha256:589e61aaf39b19828843df16cb90234e72897e2579be236f10eee0d052ad98e8", size = 338365, upload-time = "2025-06-26T21:04:55.139Z" }, ] -[[package]] -name = "greenlet" -version = "3.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752, upload-time = "2025-06-05T16:16:09.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992, upload-time = "2025-06-05T16:11:23.467Z" }, - { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820, upload-time = "2025-06-05T16:38:52.882Z" }, - { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046, upload-time = "2025-06-05T16:41:36.343Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701, upload-time = "2025-06-05T16:48:19.604Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747, upload-time = "2025-06-05T16:13:04.628Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461, upload-time = "2025-06-05T16:12:50.792Z" }, - { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190, upload-time = "2025-06-05T16:36:48.59Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055, upload-time = "2025-06-05T16:12:40.457Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817, upload-time = "2025-06-05T16:29:49.244Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" }, - { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" }, - { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" }, - { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" }, - { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" }, - { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121, upload-time = "2025-06-05T16:12:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603, upload-time = "2025-06-05T16:20:12.651Z" }, - { url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479, upload-time = "2025-06-05T16:10:47.525Z" }, - { url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952, upload-time = "2025-06-05T16:38:55.125Z" }, - { url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917, upload-time = "2025-06-05T16:41:38.959Z" }, - { url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443, upload-time = "2025-06-05T16:48:23.113Z" }, - { url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995, upload-time = "2025-06-05T16:13:07.972Z" }, - { url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320, upload-time = "2025-06-05T16:12:53.453Z" }, - { url = "https://files.pythonhosted.org/packages/5c/4f/aab73ecaa6b3086a4c89863d94cf26fa84cbff63f52ce9bc4342b3087a06/greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a", size = 301236, upload-time = "2025-06-05T16:15:20.111Z" }, -] - [[package]] name = "h5netcdf" version = "1.6.3" @@ -760,15 +727,15 @@ wheels = [ [[package]] name = "hypothesis" -version = "6.135.26" +version = "6.136.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/83/15c4e30561a0d8c8d076c88cb159187823d877118f34c851ada3b9b02a7b/hypothesis-6.135.26.tar.gz", hash = "sha256:73af0e46cd5039c6806f514fed6a3c185d91ef88b5a1577477099ddbd1a2e300", size = 454523, upload-time = "2025-07-05T04:59:45.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/25/c0dad49241b9146fb165ac1f73b30b39abce5c44ae183f7aaa9a099f8e8d/hypothesis-6.136.2.tar.gz", hash = "sha256:57a04f750e79d6587ccf4cd2ff01d494bade0440bb1e245975ced8590c1c49bf", size = 457250, upload-time = "2025-07-21T21:22:57.305Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/78/db4fdc464219455f8dde90074660c3faf8429101b2d1299cac7d219e3176/hypothesis-6.135.26-py3-none-any.whl", hash = "sha256:fa237cbe2ae2c31d65f7230dcb866139ace635dcfec6c30dddf25974dd8ff4b9", size = 521517, upload-time = "2025-07-05T04:59:42.061Z" }, + { url = "https://files.pythonhosted.org/packages/62/66/fe2688be5d80ec57cb7011ac5e5626c27a6c703e6d69515b3f651f8074e1/hypothesis-6.136.2-py3-none-any.whl", hash = "sha256:4b6113ca65cb1d200ed1299e610bee1da49ec127f63b13b4c6ac0c36c1d8ded7", size = 524240, upload-time = "2025-07-21T21:22:53.122Z" }, ] [package.optional-dependencies] @@ -788,12 +755,11 @@ wheels = [ [[package]] name = "im-calculation" version = "0.0.0" -source = { git = "https://github.com/ucgmsim/IM_calculation.git#2459e77de0a4064d08adfdca308179104adbdcab" } +source = { git = "https://github.com/ucgmsim/IM_calculation.git#5d4301128ccfbac29cba77ab2580787c57307012" } dependencies = [ { name = "numba" }, { name = "numexpr" }, { name = "numpy" }, - { name = "obspy" }, { name = "pandas", extra = ["hdf5"] }, { name = "pint-xarray" }, { name = "qcore" }, @@ -1313,27 +1279,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, ] -[[package]] -name = "obspy" -version = "1.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "decorator" }, - { name = "lxml" }, - { name = "matplotlib" }, - { name = "numpy" }, - { name = "requests" }, - { name = "scipy" }, - { name = "setuptools" }, - { name = "sqlalchemy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/13/98/108c3349aa18e2a2efb15d8cf7ab5b568f2f1a96d2411ce758546958d4ad/obspy-1.4.2.tar.gz", hash = "sha256:dd93a17cda32be057937b551f096df07def6aa61ccf26558ce9cd1866a70397c", size = 17036293, upload-time = "2025-04-30T12:45:15.835Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/d0/64372c148fb552ea4b54fd9f44afed030430097a6b33540dcef7a195cae6/obspy-1.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c24018ccdebf8cbc170af2dd9a86679f4baf074a7d645bdf017d50e3198baa8f", size = 14143750, upload-time = "2025-04-30T12:44:55.076Z" }, - { url = "https://files.pythonhosted.org/packages/ba/53/c1546cf83b763566b86dd2556276a92ab1e9900f77e4825898f1b810ec81/obspy-1.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87bdde2cce9a12a85b77bd874bfe0d88457e8367aa21c653b78ab6c2e9f68622", size = 14523015, upload-time = "2025-04-30T12:44:57.576Z" }, - { url = "https://files.pythonhosted.org/packages/14/5f/e04dc347ae865c0c8e92aa9af8122d015fd1b85d5dd2bf29e522b6b94296/obspy-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:a6fdd8693e55fada63e9bf36e5cbdfe1ebd231f4723fe1398ed6a7a4ee5de2ad", size = 14113148, upload-time = "2025-04-30T12:45:00.101Z" }, -] - [[package]] name = "openquake-engine" version = "3.23.2" @@ -1660,37 +1605,31 @@ wheels = [ [[package]] name = "pyarrow" -version = "20.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload-time = "2025-04-27T12:34:23.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload-time = "2025-04-27T12:29:44.384Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload-time = "2025-04-27T12:29:52.038Z" }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload-time = "2025-04-27T12:29:59.452Z" }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload-time = "2025-04-27T12:30:06.875Z" }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload-time = "2025-04-27T12:30:13.954Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload-time = "2025-04-27T12:30:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload-time = "2025-04-27T12:30:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload-time = "2025-04-27T12:30:36.977Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload-time = "2025-04-27T12:30:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload-time = "2025-04-27T12:30:48.351Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload-time = "2025-04-27T12:30:55.238Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload-time = "2025-04-27T12:31:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload-time = "2025-04-27T12:31:15.675Z" }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload-time = "2025-04-27T12:31:24.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload-time = "2025-04-27T12:31:31.311Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload-time = "2025-04-27T12:31:39.406Z" }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload-time = "2025-04-27T12:31:45.997Z" }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload-time = "2025-04-27T12:31:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload-time = "2025-04-27T12:31:59.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload-time = "2025-04-27T12:32:05.369Z" }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload-time = "2025-04-27T12:32:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload-time = "2025-04-27T12:32:20.766Z" }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload-time = "2025-04-27T12:32:28.1Z" }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload-time = "2025-04-27T12:32:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload-time = "2025-04-27T12:32:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload-time = "2025-04-27T12:32:56.503Z" }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload-time = "2025-04-27T12:33:04.72Z" }, +version = "21.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload-time = "2025-07-18T00:57:31.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload-time = "2025-07-18T00:55:35.373Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload-time = "2025-07-18T00:55:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload-time = "2025-07-18T00:55:42.889Z" }, + { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload-time = "2025-07-18T00:55:47.069Z" }, + { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload-time = "2025-07-18T00:55:53.069Z" }, + { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload-time = "2025-07-18T00:55:57.714Z" }, + { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload-time = "2025-07-18T00:56:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload-time = "2025-07-18T00:56:04.42Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload-time = "2025-07-18T00:56:07.505Z" }, + { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload-time = "2025-07-18T00:56:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload-time = "2025-07-18T00:56:15.569Z" }, + { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload-time = "2025-07-18T00:56:19.531Z" }, + { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload-time = "2025-07-18T00:56:23.347Z" }, + { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload-time = "2025-07-18T00:56:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload-time = "2025-07-18T00:56:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload-time = "2025-07-18T00:56:33.935Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload-time = "2025-07-18T00:56:37.528Z" }, + { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload-time = "2025-07-18T00:56:41.483Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload-time = "2025-07-18T00:56:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload-time = "2025-07-18T00:56:52.568Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload-time = "2025-07-18T00:56:56.379Z" }, ] [[package]] @@ -1747,18 +1686,21 @@ wheels = [ [[package]] name = "pygmt-helper" version = "22.8.1" -source = { git = "https://github.com/ucgmsim/pygmt_helper.git#44b032bafac9443013e290c69f6b5cfab790cc6d" } +source = { git = "https://github.com/ucgmsim/pygmt_helper.git#baf9b007d36b7e3407c9571e870501ecafcd732c" } dependencies = [ { name = "geopandas" }, + { name = "netcdf4" }, { name = "numpy" }, { name = "pandas" }, { name = "pooch" }, + { name = "pyarrow" }, { name = "pygmt" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "qcore" }, { name = "scipy" }, { name = "shapely" }, + { name = "tqdm" }, { name = "xarray" }, ] @@ -1982,7 +1924,7 @@ wheels = [ [[package]] name = "qcore" version = "1.2" -source = { git = "https://github.com/ucgmsim/qcore.git#965d56a7113cb448c99b6862222cfaf2c8c513b4" } +source = { git = "https://github.com/ucgmsim/qcore.git#5b3605c6abd58d1535a630cb72d7f2c6c46c22db" } dependencies = [ { name = "alphashape" }, { name = "descartes" }, @@ -2078,27 +2020,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/3d/d9a195676f25d00dbfcf3cf95fdd4c685c497fcfa7e862a44ac5e4e96480/ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e", size = 4432239, upload-time = "2025-07-03T16:40:19.566Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/b6/2098d0126d2d3318fd5bec3ad40d06c25d377d95749f7a0c5af17129b3b1/ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be", size = 10369761, upload-time = "2025-07-03T16:39:38.847Z" }, - { url = "https://files.pythonhosted.org/packages/b1/4b/5da0142033dbe155dc598cfb99262d8ee2449d76920ea92c4eeb9547c208/ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e", size = 11155659, upload-time = "2025-07-03T16:39:42.294Z" }, - { url = "https://files.pythonhosted.org/packages/3e/21/967b82550a503d7c5c5c127d11c935344b35e8c521f52915fc858fb3e473/ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc", size = 10537769, upload-time = "2025-07-03T16:39:44.75Z" }, - { url = "https://files.pythonhosted.org/packages/33/91/00cff7102e2ec71a4890fb7ba1803f2cdb122d82787c7d7cf8041fe8cbc1/ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922", size = 10717602, upload-time = "2025-07-03T16:39:47.652Z" }, - { url = "https://files.pythonhosted.org/packages/9b/eb/928814daec4e1ba9115858adcda44a637fb9010618721937491e4e2283b8/ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b", size = 10198772, upload-time = "2025-07-03T16:39:49.641Z" }, - { url = "https://files.pythonhosted.org/packages/50/fa/f15089bc20c40f4f72334f9145dde55ab2b680e51afb3b55422effbf2fb6/ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d", size = 11845173, upload-time = "2025-07-03T16:39:52.069Z" }, - { url = "https://files.pythonhosted.org/packages/43/9f/1f6f98f39f2b9302acc161a4a2187b1e3a97634fe918a8e731e591841cf4/ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1", size = 12553002, upload-time = "2025-07-03T16:39:54.551Z" }, - { url = "https://files.pythonhosted.org/packages/d8/70/08991ac46e38ddd231c8f4fd05ef189b1b94be8883e8c0c146a025c20a19/ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4", size = 12171330, upload-time = "2025-07-03T16:39:57.55Z" }, - { url = "https://files.pythonhosted.org/packages/88/a9/5a55266fec474acfd0a1c73285f19dd22461d95a538f29bba02edd07a5d9/ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9", size = 11774717, upload-time = "2025-07-03T16:39:59.78Z" }, - { url = "https://files.pythonhosted.org/packages/87/e5/0c270e458fc73c46c0d0f7cf970bb14786e5fdb88c87b5e423a4bd65232b/ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da", size = 11646659, upload-time = "2025-07-03T16:40:01.934Z" }, - { url = "https://files.pythonhosted.org/packages/b7/b6/45ab96070c9752af37f0be364d849ed70e9ccede07675b0ec4e3ef76b63b/ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce", size = 10604012, upload-time = "2025-07-03T16:40:04.363Z" }, - { url = "https://files.pythonhosted.org/packages/86/91/26a6e6a424eb147cc7627eebae095cfa0b4b337a7c1c413c447c9ebb72fd/ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d", size = 10176799, upload-time = "2025-07-03T16:40:06.514Z" }, - { url = "https://files.pythonhosted.org/packages/f5/0c/9f344583465a61c8918a7cda604226e77b2c548daf8ef7c2bfccf2b37200/ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04", size = 11241507, upload-time = "2025-07-03T16:40:08.708Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b7/99c34ded8fb5f86c0280278fa89a0066c3760edc326e935ce0b1550d315d/ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342", size = 11717609, upload-time = "2025-07-03T16:40:10.836Z" }, - { url = "https://files.pythonhosted.org/packages/51/de/8589fa724590faa057e5a6d171e7f2f6cffe3287406ef40e49c682c07d89/ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a", size = 10523823, upload-time = "2025-07-03T16:40:13.203Z" }, - { url = "https://files.pythonhosted.org/packages/94/47/8abf129102ae4c90cba0c2199a1a9b0fa896f6f806238d6f8c14448cc748/ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639", size = 11629831, upload-time = "2025-07-03T16:40:15.478Z" }, - { url = "https://files.pythonhosted.org/packages/e2/1f/72d2946e3cc7456bb837e88000eb3437e55f80db339c840c04015a11115d/ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12", size = 10735334, upload-time = "2025-07-03T16:40:17.677Z" }, +version = "0.12.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435, upload-time = "2025-07-17T17:27:19.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824, upload-time = "2025-07-17T17:26:31.412Z" }, + { url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521, upload-time = "2025-07-17T17:26:35.084Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653, upload-time = "2025-07-17T17:26:37.897Z" }, + { url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993, upload-time = "2025-07-17T17:26:40.68Z" }, + { url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824, upload-time = "2025-07-17T17:26:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414, upload-time = "2025-07-17T17:26:46.219Z" }, + { url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216, upload-time = "2025-07-17T17:26:48.883Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756, upload-time = "2025-07-17T17:26:51.754Z" }, + { url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019, upload-time = "2025-07-17T17:26:54.265Z" }, + { url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890, upload-time = "2025-07-17T17:26:56.914Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539, upload-time = "2025-07-17T17:26:59.381Z" }, + { url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579, upload-time = "2025-07-17T17:27:02.462Z" }, + { url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982, upload-time = "2025-07-17T17:27:05.343Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331, upload-time = "2025-07-17T17:27:08.652Z" }, + { url = "https://files.pythonhosted.org/packages/35/cf/441b7fc58368455233cfb5b77206c849b6dfb48b23de532adcc2e50ccc06/ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93", size = 10267904, upload-time = "2025-07-17T17:27:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7e/20af4a0df5e1299e7368d5ea4350412226afb03d95507faae94c80f00afd/ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a", size = 11209038, upload-time = "2025-07-17T17:27:14.417Z" }, + { url = "https://files.pythonhosted.org/packages/11/02/8857d0dfb8f44ef299a5dfd898f673edefb71e3b533b3b9d2db4c832dd13/ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e", size = 10469336, upload-time = "2025-07-17T17:27:16.913Z" }, ] [[package]] @@ -2230,8 +2172,8 @@ wheels = [ [[package]] name = "source-modelling" -version = "0.1.dev520+gee4ab7d" -source = { git = "https://github.com/ucgmsim/source_modelling.git#ee4ab7d7f729d0c3d1b7585425b61b657b7ca0ca" } +version = "0.1.dev535+gb43e1ff" +source = { git = "https://github.com/ucgmsim/source_modelling.git#b43e1ffedcf5ddf0bf9a693b7d30c5c104780eed" } dependencies = [ { name = "fiona" }, { name = "geopandas" }, @@ -2242,22 +2184,7 @@ dependencies = [ { name = "qcore" }, { name = "scipy" }, { name = "shapely" }, -] - -[[package]] -name = "sqlalchemy" -version = "1.4.54" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ce/af/20290b55d469e873cba9d41c0206ab5461ff49d759989b3fe65010f9d265/sqlalchemy-1.4.54.tar.gz", hash = "sha256:4470fbed088c35dc20b78a39aaf4ae54fe81790c783b3264872a0224f437c31a", size = 8470350, upload-time = "2024-09-05T15:54:10.398Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/1b/aa9b99be95d1615f058b5827447c18505b7b3f1dfcbd6ce1b331c2107152/SQLAlchemy-1.4.54-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3f01c2629a7d6b30d8afe0326b8c649b74825a0e1ebdcb01e8ffd1c920deb07d", size = 1589983, upload-time = "2024-09-05T17:39:02.132Z" }, - { url = "https://files.pythonhosted.org/packages/59/47/cb0fc64e5344f0a3d02216796c342525ab283f8f052d1c31a1d487d08aa0/SQLAlchemy-1.4.54-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c24dd161c06992ed16c5e528a75878edbaeced5660c3db88c820f1f0d3fe1f4", size = 1630158, upload-time = "2024-09-05T17:50:13.255Z" }, - { url = "https://files.pythonhosted.org/packages/c0/8b/f45dd378f6c97e8ff9332ff3d03ecb0b8c491be5bb7a698783b5a2f358ec/SQLAlchemy-1.4.54-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5e0d47d619c739bdc636bbe007da4519fc953393304a5943e0b5aec96c9877c", size = 1629232, upload-time = "2024-09-05T17:48:15.514Z" }, - { url = "https://files.pythonhosted.org/packages/0d/3c/884fe389f5bec86a310b81e79abaa1e26e5d78dc10a84d544a6822833e47/SQLAlchemy-1.4.54-cp312-cp312-win32.whl", hash = "sha256:12bc0141b245918b80d9d17eca94663dbd3f5266ac77a0be60750f36102bbb0f", size = 1592027, upload-time = "2024-09-05T17:54:02.253Z" }, - { url = "https://files.pythonhosted.org/packages/01/c3/c690d037be57efd3a69cde16a2ef1bd2a905dafe869434d33836de0983d0/SQLAlchemy-1.4.54-cp312-cp312-win_amd64.whl", hash = "sha256:f941aaf15f47f316123e1933f9ea91a6efda73a161a6ab6046d1cde37be62c88", size = 1593827, upload-time = "2024-09-05T17:52:07.454Z" }, + { name = "xarray", extra = ["io"] }, ] [[package]] @@ -2350,14 +2277,14 @@ wheels = [ [[package]] name = "trimesh" -version = "4.6.13" +version = "4.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/c2/b97f9fea123b608d0027abb3bb87cfbecfb974ad8f1f034641e5fe4f0312/trimesh-4.6.13.tar.gz", hash = "sha256:2950dd6c3c9c9948a652f7a2966319b47130467bbbf447b254e02b9d90c94f14", size = 804497, upload-time = "2025-06-27T18:34:27.839Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/05/50656189ebd0563b2130ddd9b609b1db99eb241687dac0d2585882c35c33/trimesh-4.7.1.tar.gz", hash = "sha256:3863c2b2281fc7a99bf0b5de4a0011229bde4663babc0c1b53a1f855149ec898", size = 800778, upload-time = "2025-07-16T20:24:50.248Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/2f/03e3829bf98fdf77b8669174957f47e8a977385ffd2c810e818a603a32ca/trimesh-4.6.13-py3-none-any.whl", hash = "sha256:b20b4c3ff03d185ec5b2b0e3adce6e75d8d73508861f2c1be3e40ab47cf18fee", size = 712440, upload-time = "2025-06-27T18:34:24.768Z" }, + { url = "https://files.pythonhosted.org/packages/c6/64/99e785dd4bb5796881b5686b0869a6ebf75b1b7d00932af577eb343c4f72/trimesh-4.7.1-py3-none-any.whl", hash = "sha256:338c938ae78ad5b4d08dd6ceaa739498a47627bf0073147ee9a384ddd7435267", size = 709034, upload-time = "2025-07-16T20:24:47.256Z" }, ] [[package]] @@ -2537,16 +2464,16 @@ provides-extras = ["test", "dev"] [[package]] name = "xarray" -version = "2025.7.0" +version = "2025.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "packaging" }, { name = "pandas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/75/b5/d2f1fb2f583ae803b86280dcb7a4f81eef9d4c54f1ecde2307d1b6b1a147/xarray-2025.7.0.tar.gz", hash = "sha256:fd83ac8d638e7caef9d7f0c82bcdf380cede29d2ff84575133b2b95164af78ee", size = 3005754, upload-time = "2025-07-03T16:37:27.427Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c5/a31ba8605005ef080c3d35efc696ddd851aee0a7a22420f9afebec386281/xarray-2025.7.1.tar.gz", hash = "sha256:2884bf5672b540fcc6ff8c20a3196bda0d78fbfb4d67398d60526e97c2faceef", size = 3013717, upload-time = "2025-07-10T04:53:07.01Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/40/c9127ffdcceb865044267eb8cccfd8973ee5f8174677d2a67f50df626674/xarray-2025.7.0-py3-none-any.whl", hash = "sha256:7b5d7267bd554ae119c7a0062f62b50517b4dd1968efc11f2553826b7d99297f", size = 1316539, upload-time = "2025-07-03T16:37:25.016Z" }, + { url = "https://files.pythonhosted.org/packages/b2/ea/9554e5fb78eda4dbc9e9ccaf23034166fe3e9ea9af82ea6204b9578434bc/xarray-2025.7.1-py3-none-any.whl", hash = "sha256:e8647b659e53bd350d7c5a91c34dd4122ad6a3ca0bc41399d424a7c0273c7635", size = 1324464, upload-time = "2025-07-10T04:53:05.104Z" }, ] [package.optional-dependencies] @@ -2563,7 +2490,7 @@ io = [ [[package]] name = "zarr" -version = "3.0.10" +version = "3.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "donfig" }, @@ -2572,7 +2499,7 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/10/a1b6eabeb5a8681916568a7c6a7a1849c952131be127ccbd57e05d47d43e/zarr-3.0.10.tar.gz", hash = "sha256:1fd1318ade646f692d8f604be0e0ad125675a061196e612e3f7a2cfa9e957d1c", size = 263594, upload-time = "2025-07-03T17:29:27.733Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/66/852aa0905f906bc8ef0a6eb686d50c7ca8c46a38677c32152a8003bcce37/zarr-3.1.0.tar.gz", hash = "sha256:ace5b111dc69d5315cb1655dfd0f816c5acf9798d2ad92f43b608a52c8c8ac2b", size = 312546, upload-time = "2025-07-15T07:48:53.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/57/3329346940f78de49047ddcb03fdbca9e16450c3a942688bf24201a322e5/zarr-3.0.10-py3-none-any.whl", hash = "sha256:110724c045fbe4ff5509a8a2a6b6098cb244a6af43da85eaeecef9821473163f", size = 209508, upload-time = "2025-07-03T17:29:25.6Z" }, + { url = "https://files.pythonhosted.org/packages/94/72/c5fd70742126cab7403126a1719b4161a81b816d83a2fdb78b390d8ecc47/zarr-3.1.0-py3-none-any.whl", hash = "sha256:bd3d2f88d602d43f81df82e26dd115ea66635a2af5bf6da261d3c640bb4c1ce4", size = 254089, upload-time = "2025-07-15T07:48:51.334Z" }, ] diff --git a/workflow/scripts/plan_workflow.py b/workflow/scripts/plan_workflow.py index 6d256e2b..9d4d5ef7 100644 --- a/workflow/scripts/plan_workflow.py +++ b/workflow/scripts/plan_workflow.py @@ -1,23 +1,22 @@ -"""Create a Cylc workflow plan from a list of goals and stages to exclude. - -This is the starting point for most workflow usages, and can be used -to generate a base Cylc workflow to modify and extend. -""" - -import dataclasses -import tempfile -from collections.abc import Iterable -from enum import StrEnum +"""Workflow planning tool.""" + +import itertools +import tomllib +from collections import defaultdict +from collections.abc import Generator, Iterable +from dataclasses import dataclass, field +from enum import StrEnum, auto +from importlib import resources from pathlib import Path, PurePath -from typing import Annotated, Any, Optional, Self +from typing import Annotated, Any, BinaryIO, TypeVar import jinja2 import networkx as nx import printree -import tqdm import typer -from pyvis.network import Network +from jinja2.environment import TemplateStream +import workflow from qcore import cli from workflow import realisations from workflow.defaults import DefaultsVersion @@ -25,553 +24,327 @@ app = typer.Typer() -class WorkflowTarget(StrEnum): - """Enumeration of possible workflow targets.""" - - NeSI = "nesi" - Hypocentre = "hypocentre" - - -class StageIdentifier(StrEnum): - """Valid stage identifier in the workflow plan.""" - - CopyInput = "copy_input" - Archive = "archive" - GCMTToRealisation = "gcmt_to_realisation" - DomainGeneration = "generate_velocity_model_parameters" - VelocityModelGeneration = "generate_velocity_model" - StationSelection = "generate_station_coordinates" - ModelCoordinates = "write_model_coordinates" - SRFGeneration = "realisation_to_srf" - CheckSRF = "check_srf" - CopyDomainParameters = "copy_domain_parameters" - EMOD3DParameters = "create_e3d_par" - CheckDomain = "check_domain" - StochGeneration = "generate_stoch" - HighFrequency = "hf_sim" - LowFrequency = "emod3d" - Broadband = "bb_sim" - IntensityMeasureCalculation = "im_calc" - MergeTimeslices = "merge_ts" - NSHMToRealisation = "nshm_to_realisation" - - -class Source(StrEnum): - """Realisation source options.""" - - GCMT = "gcmt" - NSHM = "nshm" - - -class GroupIdentifier(StrEnum): - """Group identifiers to use to bulk target or exclude in workflow planning.""" - - Preprocessing = "preprocessing" - """Alias for all preprocessing stages.""" - HighFrequency = "high_frequency" - """Alias for the high frequency workflow.""" - LowFrequency = "low_frequency" - """Alias for the low frequency workflow.""" - Domain = "domain" +@dataclass +class Stage: + """A workflow stage.""" + + id: str + """The identifier of the stage, e.g. realisation_to_srf.""" + parameters: list[str] = field(default_factory=list) + """The cylc parameters that this stage takes.""" + requires_config: set[str] = field(default_factory=set) + """The configuration blocks required for this workflow stage.""" + requires_files: set[str] = field(default_factory=set) + """The files required for this workflow stage.""" + provides_config: set[str] = field(default_factory=set) + """The configuration blocks that this stage produces.""" + provides_files: set[str] = field(default_factory=set) + """The files that this stage generates.""" + follows: str | None = None + """An explicit reference to a stage that this stage must follow.""" + @property + def cylc_stage_identifier_template(self) -> str: + """Return a template for a cylc stage identifier. -GROUP_STAGES = { - GroupIdentifier.Preprocessing: { - StageIdentifier.DomainGeneration, - StageIdentifier.VelocityModelGeneration, - StageIdentifier.StationSelection, - StageIdentifier.ModelCoordinates, - StageIdentifier.SRFGeneration, - StageIdentifier.EMOD3DParameters, - StageIdentifier.NSHMToRealisation, - StageIdentifier.GCMTToRealisation, - StageIdentifier.StochGeneration, - StageIdentifier.CopyDomainParameters, - }, - GroupIdentifier.HighFrequency: { - StageIdentifier.HighFrequency, - }, - GroupIdentifier.LowFrequency: {StageIdentifier.LowFrequency}, - GroupIdentifier.Domain: { - StageIdentifier.VelocityModelGeneration, - StageIdentifier.StationSelection, - StageIdentifier.DomainGeneration, - StageIdentifier.CopyDomainParameters, - StageIdentifier.ModelCoordinates, - }, -} + Returns + ------- + str + The cylc stage identifier template. Comes in the form + {id}<{parameters}>. + """ + if not len(self.parameters): + return self.id + parameters = ", ".join("{" + parameter + "}" for parameter in self.parameters) + return f"{self.id}<{parameters}>" -GROUP_GOALS = { - GroupIdentifier.Preprocessing: { - StageIdentifier.EMOD3DParameters, - StageIdentifier.StochGeneration, - }, - GroupIdentifier.LowFrequency: {StageIdentifier.LowFrequency}, - GroupIdentifier.HighFrequency: {StageIdentifier.HighFrequency}, - GroupIdentifier.Domain: { - StageIdentifier.VelocityModelGeneration, - StageIdentifier.StationSelection, - StageIdentifier.ModelCoordinates, - StageIdentifier.CopyDomainParameters, - }, -} -CONTAINER_PATHS = { - WorkflowTarget.NeSI: Path("/nesi/nobackup/nesi00213/containers/runner_latest.sif"), - WorkflowTarget.Hypocentre: Path("/mnt/hypo_scratch/containers/runner_latest.sif"), -} +COPY_INPUT_STAGE = Stage("copy_input") -EMOD3D_PATHS = { - WorkflowTarget.NeSI: Path( - "/nesi/project/nesi00213/opt/EMOD3D_cylc/tools/emod3d-mpi_v3.0.8" - ), - WorkflowTarget.Hypocentre: Path("/mnt/hypo_scratch/EMOD3D/tools/emod3d-mpi_v3.0.8"), -} +@dataclass +class StageConfig: + """Per-host stage configuration for a workflow stage. -@dataclasses.dataclass -class Stage: - """Representation of a workflow stage in the output Cylc file.""" + Hosts create stage configs for each stage to adjust available + environment variables, slurm or pbs directives, module loading, + and platforms. + """ - identifier: StageIdentifier - """The stage identifier.""" - event: str | None - """The event the stage is running for.""" - sample: int | None - """The sample number of the realisation.""" + platform: str | None = None + """The default platform to target.""" + pre_script: str | None = None + """The pre-script to run (for loading modules, etc).""" + directives: dict[str, str] = field(default_factory=dict) + """The slurm or pbs directives to supply with the job.""" + environment: dict[str, str] = field(default_factory=dict) + """The environment variables to make available to the script.""" + settings: dict[str, str] = field(default_factory=dict) + """Additional settings for the stage""" - @property - def parent(self) -> Self: # numpydoc ignore=RT01 - """Stage: the parent stage of this stage.""" - return self.__class__(self.identifier, self.event, None) - @property - def directory(self) -> PurePath | None: # numpydoc ignore=RT01 - """PurePath: the directory for this stage.""" - if not self.event: - return None - directory = self.event - if self.sample: - directory += f"_{self.sample}" - return PurePath(directory) +def build_resource_graph(stages: list[Stage]) -> nx.DiGraph: + """Build a graph representing workflow stage and resource needs. - @property - def outputs(self) -> set[PurePath]: # numpydoc ignore=RT01 - """set[PurePath]: the outputs for this stage.""" - directory = self.directory - if not directory: - return set() - return {directory / output for output in stage_outputs(self.identifier)} + Parameters + ---------- + stages : list[Stage] + The stages to build the resource graph from. - @property - def inputs(self) -> set[PurePath]: # numpydoc ignore=RT01 - """set[PurePath]: the inputs for this stage.""" - directory = self.directory - if not self.event or not directory: - return set() - workflow_plan = realisation_workflow(self.event, self.sample) - try: - input_stages = list(workflow_plan.predecessors(self)) - inputs = set() - for stage in input_stages: - inputs |= stage.outputs - return inputs - except nx.NetworkXError: - return set() - - def __hash__(self) -> int: - """Hash the stage identifier, event and sample number. + Returns + ------- + nx.DiGraph + A directed bipartite graph containing resource and stage + nodes. An directed edge resource -> stage implies that a stage + requires a resource to run. A directed edge stage -> resource + implies that a stage produces a resource. + """ + resource_graph = nx.DiGraph() - Returns - ------- - int - The hash of the stage. - """ - return hash((self.identifier, self.event, self.sample)) + for stage in stages: + resource_graph.add_node(stage.id, type="stage") + for resource in stage.requires_files: + resource_graph.add_node( + f"_{resource}", type="resource", resource_type="file" + ) + resource_graph.add_edge(f"_{resource}", stage.id) + for resource in stage.requires_config: + resource_graph.add_node( + f"_{resource}", type="resource", resource_type="config" + ) + resource_graph.add_edge(f"_{resource}", stage.id) - def __str__(self) -> str: - """The string representation of the stage. + for resource in stage.provides_files: + resource_graph.add_node( + f"_{resource}", type="resource", resource_type="file" + ) + resource_graph.add_edge(stage.id, f"_{resource}") - Returns - ------- - str - The string representation of the stage.""" - _str = str(self.identifier) - if self.event: - _str += f"_{self.event}" - if self.sample: - _str += f"_{self.sample}" - return _str + for resource in stage.provides_config: + resource_graph.add_node( + f"_{resource}", type="resource", resource_type="config" + ) + resource_graph.add_edge(stage.id, f"_{resource}") + return resource_graph -def stage_config_outputs(identifier: StageIdentifier) -> set[str]: - """Get the realisation configuration outputs for a given stage. +def workflow_graph(stages: list[Stage]) -> nx.DiGraph: + """Build a workflow graph from a list of stages. Parameters ---------- - identifier : StageIdentifier - The stage to get outputs for. - + stages : list[Stage] + The stages to build the workflow graph from. Returns ------- - set[str] - The output config sections for this stage. + nx.DiGraph + A directed acyclic graph over workflow stages, where an edge + stage a -> stage b implies that stage b depends on the output + of stage a. The graph is not transitively reduced (hence, some + edges are redundant). """ - output_dictionary = { - StageIdentifier.NSHMToRealisation: { - realisations.SourceConfig._config_key, - realisations.RupturePropagationConfig._config_key, - realisations.RealisationMetadata._config_key, - }, - StageIdentifier.GCMTToRealisation: { - realisations.SourceConfig._config_key, - realisations.RupturePropagationConfig._config_key, - realisations.RealisationMetadata._config_key, - }, - StageIdentifier.EMOD3DParameters: {realisations.EMOD3DParameters._config_key}, - StageIdentifier.Broadband: {realisations.BroadbandParameters._config_key}, - StageIdentifier.VelocityModelGeneration: { - realisations.VelocityModelParameters._config_key - }, - StageIdentifier.HighFrequency: {realisations.HFConfig._config_key}, - StageIdentifier.IntensityMeasureCalculation: { - realisations.IntensityMeasureCalculationParameters._config_key - }, - StageIdentifier.CopyDomainParameters: { - realisations.VelocityModelParameters._config_key, - realisations.DomainParameters._config_key, - }, - StageIdentifier.DomainGeneration: { - realisations.VelocityModelParameters._config_key, - realisations.DomainParameters._config_key, - }, - StageIdentifier.SRFGeneration: {realisations.SRFConfig._config_key}, - StageIdentifier.StochGeneration: {realisations.HFConfig._config_key}, - } - return output_dictionary.get(identifier, set()) + resource_graph = build_resource_graph(stages) + workflow_plan = nx.DiGraph() + workflow_plan.add_nodes_from([stage.id for stage in stages]) + for node, data in resource_graph.nodes(data=True): + if data["type"] != "resource": + continue + producers = resource_graph.predecessors(node) + consumers = resource_graph.successors(node) + workflow_plan.add_edges_from(itertools.product(producers, consumers)) + for stage in stages: + if stage.follows: + # This order is required! If we add the stage.follows -> stage.id edge first we get a loop. + workflow_plan.add_edges_from( + (stage.id, neighbour) + for neighbour in workflow_plan.successors(stage.follows) + ) + workflow_plan.add_edge(stage.follows, stage.id) + + workflow_plan.add_node(COPY_INPUT_STAGE.id) + workflow_plan.add_edges_from( + (COPY_INPUT_STAGE.id, node) + for node in workflow_plan.nodes() + if node != COPY_INPUT_STAGE.id + ) + + return workflow_plan -def stage_outputs( - identifier: StageIdentifier, include_config_outputs: bool = True -) -> set[PurePath]: - """Return a set of stage outputs for the given stage identifier. +def dfs_paths( + workflow_plan: nx.DiGraph, roots: list[str] +) -> Generator[list[str], None, None]: + """Yield all DFS paths from a digraph beginning at any listed root. Parameters ---------- - identifier : StageIdentifier - The stage identifier to get outputs for. - include_config_outputs : bool, optional - Whether to include configuration outputs (default is True). - - Returns - ------- - set[PurePath] - A set of output paths for the stage. + workflow_plan : nx.DiGraph + The graph to generate DFS paths for. + roots : list[str] + The roots to begin recursion at. + + Yields + ------ + list[str] + A DFS path from the graph `workflow_graph` starting from a root in `roots`. """ - output_dictionary = { - StageIdentifier.SRFGeneration: { - PurePath("realisation.srf"), - }, - StageIdentifier.ModelCoordinates: { - PurePath("model") / "model_params", - PurePath("model") / "grid_file", - }, - StageIdentifier.StationSelection: { - PurePath("stations") / "stations.ll", - PurePath("stations") / "stations.statcords", - }, - StageIdentifier.VelocityModelGeneration: { - PurePath("Velocity_Model") / "rho3dfile.d", - PurePath("Velocity_Model") / "vp3dfile.p", - PurePath("Velocity_Model") / "vs3dfile.s", - PurePath("Velocity_Model") / "in_basin_mask.b", - }, - StageIdentifier.EMOD3DParameters: { - PurePath("LF"), - PurePath("LF") / "e3d.par", - }, - StageIdentifier.LowFrequency: {PurePath("LF")}, - StageIdentifier.StochGeneration: { - PurePath("realisation.stoch"), - }, - StageIdentifier.HighFrequency: {PurePath("realisation.hf")}, - StageIdentifier.Broadband: {PurePath("realisation.bb")}, - StageIdentifier.IntensityMeasureCalculation: { - PurePath("intensity_measures.parquet") - }, - StageIdentifier.MergeTimeslices: {PurePath("LF") / "OutBin" / "output.e3d"}, - } - file_outputs = output_dictionary.get(identifier, set()) - if include_config_outputs: - for output in stage_config_outputs(identifier): - file_outputs.add(PurePath("realisation.json") / output) - return file_outputs + def aux(path: list[str], visited: set[str]) -> Generator[list[str], None, None]: + """Auxiliary function to perform DFS recursion. + Parameters + ---------- + path : list[str] + The current path from a root. + visited : set[str] + The visited nodes. + + Yields + ------ + list[str] + A DFS path from the graph. + """ + cur = path[-1] + if cur in visited or workflow_plan.out_degree(cur) == 0: + visited.add(cur) # in the case where out-degree == 0, this is helpful + + # Paths must be copied at the end, or else the paths will + # be modified after yielding. + yield path.copy() + return + visited.add(cur) + for next in workflow_plan.neighbors(cur): + # As opposed to path + [next], which will create a new list for every call. + path.append(next) + yield from aux(path, visited) + path.pop() + + visited = set() + for root in roots: + yield from aux([root], visited) -def realisation_workflow(event: str, sample: int | None) -> nx.DiGraph: - """Add a realisation to a workflow plan. - Adds all stages for the realisation to run, and links to event - stages for shared resources (i.e. the velocity model). +def dfs_tree_cover(workflow_plan: nx.DiGraph) -> Generator[list[str], None, None]: + """Cover every edge with DFS paths. Parameters ---------- - event : str - The event to add. - sample : int or None - The sample number (or None, if the original event). - - Returns - ------- - nx.DiGraph - The workflow plan with the added realisation. + workflow_plan : nx.DiGraph + The graph to cover. + + Yields + ------ + list[str] + A DFS path of the graph `workflow_plan`. Every edge of + `workflow_plan` is guaranteed to be included in at least one + path. """ - requires_base = [ - StageIdentifier.SRFGeneration, - StageIdentifier.StochGeneration, - StageIdentifier.CheckSRF, - StageIdentifier.VelocityModelGeneration, - StageIdentifier.DomainGeneration, - StageIdentifier.EMOD3DParameters, - StageIdentifier.IntensityMeasureCalculation, - StageIdentifier.HighFrequency, - StageIdentifier.Broadband, - ] - requires_domain = [ - StageIdentifier.ModelCoordinates, - StageIdentifier.Broadband, - StageIdentifier.StationSelection, - StageIdentifier.CheckDomain, - StageIdentifier.CopyDomainParameters, - StageIdentifier.VelocityModelGeneration, - StageIdentifier.HighFrequency, - StageIdentifier.EMOD3DParameters, + + roots = [ + node for node in workflow_plan.nodes() if workflow_plan.in_degree(node) == 0 ] - workflow_plan = nx.from_dict_of_lists( - { - Stage(StageIdentifier.NSHMToRealisation, event, sample): [ - Stage(id, event, sample) for id in requires_base - ], - Stage(StageIdentifier.GCMTToRealisation, event, sample): [ - Stage(id, event, sample) for id in requires_base - ], - Stage(StageIdentifier.SRFGeneration, event, sample): [ - Stage(StageIdentifier.CheckSRF, event, sample), - Stage(StageIdentifier.LowFrequency, event, sample), - ], - Stage(StageIdentifier.CheckSRF, event, sample): [ - Stage(StageIdentifier.StochGeneration, event, sample), - Stage(StageIdentifier.EMOD3DParameters, event, sample), - ], - Stage(StageIdentifier.VelocityModelGeneration, event, None): [ - Stage(StageIdentifier.EMOD3DParameters, event, sample), - Stage(StageIdentifier.HighFrequency, event, sample), - Stage( - StageIdentifier.Broadband, event, sample - ), # This is a transitive dependency, but is useful for determining stage inputs - ], - Stage(StageIdentifier.StationSelection, event, None): [ - Stage(StageIdentifier.EMOD3DParameters, event, sample), - Stage(StageIdentifier.HighFrequency, event, sample), - ], - Stage(StageIdentifier.ModelCoordinates, event, None): [ - Stage(StageIdentifier.EMOD3DParameters, event, sample) - ], - Stage(StageIdentifier.EMOD3DParameters, event, sample): [ - Stage(StageIdentifier.CheckDomain, event, sample), - Stage(StageIdentifier.LowFrequency, event, sample), - ], - Stage(StageIdentifier.CheckDomain, event, sample): [ - Stage(StageIdentifier.LowFrequency, event, sample) - ], - Stage(StageIdentifier.LowFrequency, event, sample): [ - Stage(StageIdentifier.Broadband, event, sample), - Stage(StageIdentifier.MergeTimeslices, event, sample), - ], - Stage(StageIdentifier.StochGeneration, event, sample): [ - Stage(StageIdentifier.HighFrequency, event, sample) - ], - Stage(StageIdentifier.HighFrequency, event, sample): [ - Stage(StageIdentifier.Broadband, event, sample) - ], - Stage(StageIdentifier.Broadband, event, sample): [ - Stage(StageIdentifier.IntensityMeasureCalculation, event, sample) - ], - }, - create_using=nx.DiGraph, - ) - if not sample: - workflow_plan.add_edges_from( - [ - ( - Stage(StageIdentifier.NSHMToRealisation, event, sample), - Stage(StageIdentifier.DomainGeneration, event, sample), - ), - ( - Stage(StageIdentifier.GCMTToRealisation, event, sample), - Stage(StageIdentifier.DomainGeneration, event, sample), - ), - ( - Stage(StageIdentifier.DomainGeneration, event, sample), - Stage(StageIdentifier.EMOD3DParameters, event, sample), - ), - ( - Stage(StageIdentifier.DomainGeneration, event, sample), - Stage(StageIdentifier.VelocityModelGeneration, event, sample), - ), - ( - Stage(StageIdentifier.DomainGeneration, event, sample), - Stage(StageIdentifier.StationSelection, event, sample), - ), - ( - Stage(StageIdentifier.DomainGeneration, event, sample), - Stage(StageIdentifier.ModelCoordinates, event, sample), - ), - ] - ) - workflow_plan.add_edges_from( - [ - ( - Stage(StageIdentifier.DomainGeneration, event, sample), - Stage(id, event, sample), - ) - for id in requires_domain - ] - ) - else: - workflow_plan.add_edges_from( - [ - ( - Stage(StageIdentifier.DomainGeneration, event, None), - Stage(StageIdentifier.CopyDomainParameters, event, sample), - ), - ] - ) - workflow_plan.add_edges_from( - [ - ( - Stage(StageIdentifier.CopyDomainParameters, event, sample), - Stage(id, event, sample), - ) - for id in requires_domain - if id != StageIdentifier.CopyDomainParameters - ] - ) - return workflow_plan + yield from dfs_paths(workflow_plan, roots) -def create_abstract_workflow_plan( - realisations: set[tuple[str, int | None]], - goals: Iterable[StageIdentifier], - excluding: Iterable[StageIdentifier], -) -> nx.DiGraph: - """Create an abstract workflow graph from a list of goals and excluded stages. +def workflow_plan_as_cylc_template( + stages: list[Stage], workflow_plan: nx.DiGraph +) -> str: + """Render a workflow plan graph as a workflow plan template. Parameters ---------- - realisations : set[tuple[str, int | None]] - The realisations to generate the workflow for. - goals : Iterable[StageIdentifier] - The goal stages for the workflow. - excluding : Iterable[StageIdentifier] - The excluded stages for the workflow. + stages : list[Stage] + The stages to render. + workflow_plan : nx.DiGraph + The workflow plan to render. Returns ------- - nx.DiGraph - A abstract workflow plan. This workflow plan contains only - included stages that are required to reach the goals. If two - workflow stages depend on each other only through paths - consisting entirely of excluded nodes, then they are adjacent - directly in the abstract plan by edges. + str + A format-string template for the workflow graph. This + format-subtring can be substituted with named parameters to + yield a concrete cylc flow graph to output into a .flow file. """ - - excluding_stages = { - Stage(excluded, *realisation) - for excluded in excluding - for realisation in realisations - } - - output_graph = nx.DiGraph() - realisation_iteration = ( - realisations if len(realisations) < 100 else tqdm.tqdm(realisations) + stage_lookup = {stage.id: stage for stage in stages} + return "\n".join( + " => ".join( + stage_lookup[stage].cylc_stage_identifier_template for stage in path + ) + for path in dfs_tree_cover(workflow_plan) ) - for realisation in realisation_iteration: - workflow_plan = realisation_workflow(*realisation) - workflow_plan = nx.transitive_closure_dag(workflow_plan) - - for goal in goals: - reduced_graph = nx.transitive_reduction( - workflow_plan.subgraph( - ( - set(workflow_plan.predecessors(Stage(goal, *realisation))) - | {Stage(goal, *realisation)} - ) - - excluding_stages - ) - ) - output_graph.update( - edges=reduced_graph.edges(), nodes=reduced_graph.nodes() - ) - roots = [node for node, degree in output_graph.in_degree() if degree == 0] - ends = [node for node, degree in output_graph.out_degree() if degree == 0] - copy_input_stage = Stage(StageIdentifier.CopyInput, "", None) - archive_output_stage = Stage(StageIdentifier.Archive, "", None) +def load_workflow_stages() -> list[Stage]: + """Load workflow stages from the `stages.toml` definition file. - output_graph.add_node(copy_input_stage) - output_graph.add_node(archive_output_stage) - for root in roots: - output_graph.add_edge(copy_input_stage, root) - for end in ends: - output_graph.add_edge(end, archive_output_stage) - return output_graph + Returns + ------- + list[Stage] + A list of loaded stages. + """ + with resources.open_binary(workflow, "templates", "stages.toml") as f: + toml_parser = tomllib.load(f) + config_stages = [ + Stage( + id, + parameters=kwargs.get("parameters", []), + requires_files=set(kwargs.get("requires_files", set())), + requires_config=set(kwargs.get("requires_config", set())), + provides_files=set(kwargs.get("provides_files", set())), + provides_config=set(kwargs.get("provides_config", set())), + follows=kwargs.get("follows"), + ) + for id, kwargs in toml_parser.items() + ] + config_stages.append(COPY_INPUT_STAGE) + return config_stages -def pyvis_graph(workflow_plan: nx.DiGraph) -> Network: - """Convert a workflow plan into a pyvis diagram for visualisation. +def load_host_environment(environment_file: BinaryIO) -> defaultdict[str, StageConfig]: + """Load a host environment dictionary from its defining toml file. Parameters ---------- - workflow_plan : nx.DiGraph - The workflow plan to visualise. - + environment_file : BinaryIO + The host environment to load. Returns ------- - Network - A pyvis rendering for this workflow plan. + defaultdict[str, StageConfig] + A dictionary containing the loaded stage configs for the host. """ - network = Network( - width="100%", height="1500px", directed=True, layout="hierarchical" - ) - network.show_buttons(filter_=["physics"]) - roots = [node for node, degree in workflow_plan.in_degree() if degree == 0] - reversed_workflow = workflow_plan.reverse() - stage: Stage - for stage in workflow_plan.nodes(): - network.add_node( - str(stage), - group=f"{stage.event}_{stage.sample or ''}", - size=20, - level=max( - ( - len(path) - 1 - for root in roots - for path in nx.all_simple_paths(reversed_workflow, stage, root) - ), - default=0, - ), - ) - for stage, next_stage in workflow_plan.edges(): - network.add_edge(str(stage), str(next_stage)) - return network + raw = tomllib.load(environment_file) + host_environment = defaultdict(StageConfig) + for stage, config in raw.items(): + host_environment[stage] = StageConfig(**config) + + return host_environment + + +class WorkflowTarget(StrEnum): + """Enumeration of possible workflow targets.""" + + NeSI = auto() + """Target NeSI HPC environment.""" + Hypocentre = auto() + """Target Hypocentre or local environment.""" + TACC = auto() + """Target TACC environment.""" + RCH = auto() + """Target RCH environment.""" + + +class Source(StrEnum): + """Realisation source options.""" + + GCMT = auto() + """Source realisation information from GCMT solution.""" + NSHM = auto() + """Source realisation information from NSHM2022 database.""" -def parse_realisation(realisation_id: str) -> set[tuple[str, int | None]]: +def parse_realisation(realisation_id: str) -> tuple[str, int]: """Parse a realisation identifier string from the command line into a realisation identifier. Parameters @@ -581,16 +354,70 @@ def parse_realisation(realisation_id: str) -> set[tuple[str, int | None]]: Returns ------- - tuple[str, int | None] + tuple[str, Optional[int]] The parsed realisation event and sample number. """ try: index = realisation_id.rindex(":") - event, num_samples = realisation_id[:index], realisation_id[index + 1 :] - - return {(event, sample or None) for sample in range(int(num_samples))} + return realisation_id[:index], int(realisation_id[index + 1 :]) except ValueError: - return {(realisation_id, None)} + return (realisation_id, 1) + + +class GroupIdentifier(StrEnum): + """Group identifiers to use to bulk target or exclude in workflow planning.""" + + Preprocessing = "preprocessing" + """Alias for all preprocessing stages.""" + HighFrequency = "high_frequency" + """Alias for the high frequency workflow.""" + LowFrequency = "low_frequency" + """Alias for the low frequency workflow.""" + Domain = "domain" + """Alias for velocity model generation.""" + + +GROUP_STAGES = { + GroupIdentifier.Preprocessing: { + "generate_velocity_model_parameters", + "generate_velocity_model", + "generate_station_coordinates", + "realisation_to_srf", + "create_e3d_par", + "nshm_to_realisation", + "gcmt_to_realisation", + "generate_stoch", + }, + GroupIdentifier.HighFrequency: {"hf_sim"}, + GroupIdentifier.LowFrequency: {"emod3d"}, + GroupIdentifier.Domain: { + "generate_velocity_model", + "generate_station_coordinates", + "generate_velocity_model_parameters", + }, +} + + +T = TypeVar("T") + + +def union_all(sets: Iterable[set[T]]) -> set[T]: + """Union an iterable of sets. + + Parameters + ---------- + sets : Iterable[set[Any]] + The sets to union. + + Returns + ------- + set[Any] + A set containing the union of all `sets`. + """ + out = set() + for aset in sets: + out |= aset + return out def build_filetree(root_path: PurePath, files: set[PurePath]) -> dict[str, Any]: @@ -603,7 +430,6 @@ def build_filetree(root_path: PurePath, files: set[PurePath]) -> dict[str, Any]: files : set[PurePath] The set of files to construct a tree for. - Returns ------- dict[str, Any] @@ -615,34 +441,40 @@ def build_filetree(root_path: PurePath, files: set[PurePath]) -> dict[str, Any]: "grid_file": "Grid file for the model coordinates.", "stations.ll": "Station coordinates (lat, lon) in the simulation domain.", "stations.statcords": "Station coordinates (x, y) in the simulation domain.", - "rho3dfile.d": "3D density model file.", - "vp3dfile.p": "3D P-wave velocity model file.", - "vs3dfile.s": "3D S-wave velocity model file.", - "in_basin_mask.b": "In-basin mask file for the velocity model.", + "rho3dfile.d": "3D density model file (for first realisation ONLY).", + "vp3dfile.p": "3D P-wave velocity model file (for first realisation ONLY).", + "vs3dfile.s": "3D S-wave velocity model file (for first realisation ONLY).", + "in_basin_mask.b": "In-basin mask file for the velocity model (for first realisation ONLY).", "LF": "Directory containing low frequency simulation files.", "e3d.par": "EMOD3D parameter file.", "realisation.stoch": "Stochastic file for the realisation.", "realisation.hf": "High frequency waveform file for the realisation.", + "realisation.lf": "Low frequency waveform file for the realisation.", "realisation.bb": "Broadband waveform file for the realisation.", "intensity_measures.parquet": "Parquet file containing intensity measures.", "animation.mp4": "Animation of the timeslices.", - "output.e3d": "Merged output file from the low frequency simulation.", + "output.e3d": "Merged XYTS output file from the low frequency simulation.", } config_descriptions = { - realisations.RealisationMetadata._config_key: "Metadata for describing a realisation.", - realisations.SRFConfig._config_key: "Configuration for SRF generation.", - realisations.SourceConfig._config_key: "Configuration for defining sources.", - realisations.RupturePropagationConfig._config_key: "Configuration for rupture propagation.", - realisations.DomainParameters._config_key: "Parameters defining the spatial and temporal domain for simulation.", - realisations.VelocityModelParameters._config_key: "Parameters defining the velocity model.", - realisations.VelocityModel1D._config_key: "1D Velocity Model for SRF and HF.", - realisations.HFConfig._config_key: "High frequency simulation configuration.", - realisations.EMOD3DParameters._config_key: "Parameters for EMOD3D LF simulation.", - realisations.BroadbandParameters._config_key: "Parameters for broadband waveform merger.", - realisations.IntensityMeasureCalculationParameters._config_key: "Intensity measure calculation parameters.", + cls._config_key: cls.__doc__ + for cls in [ + realisations.RealisationMetadata, + realisations.SRFConfig, + realisations.RupturePropagationConfig, + realisations.DomainParameters, + realisations.VelocityModelParameters, + realisations.VelocityModel1D, + realisations.HFConfig, + realisations.EMOD3DParameters, + realisations.BroadbandParameters, + realisations.IntensityMeasureCalculationParameters, + realisations.Rakes, + realisations.Magnitudes, + realisations.SourceConfig, + ] } - filetree: dict[str, Any] = {} + filetree = {} root = filetree for part in root_path.parts: root[part] = {} @@ -651,7 +483,7 @@ def build_filetree(root_path: PurePath, files: set[PurePath]) -> dict[str, Any]: for file in sorted(files): cur = root for part in file.parts[:-1]: - if part not in cur: + if part not in cur or isinstance(cur[part], str): cur[part] = {} cur = cur[part] @@ -659,167 +491,266 @@ def build_filetree(root_path: PurePath, files: set[PurePath]) -> dict[str, Any]: cur[file.parts[-1]] = config_descriptions.get(file.name, {}) else: cur[file.parts[-1]] = file_descriptions.get(file.name, {}) - + if not root: + return {} return filetree +def print_required_files(stages: list[Stage]) -> None: + """Print the required files by stages. + + A resource is considered required if no stage in `stages` provides + that resource. + + Parameters + ---------- + stages : list[Stage] + The stages that will be run in the workflow. + """ + root_path = PurePath("cylc-src") / "WORKFLOW_NAME" / "inputs" / "REALISATION" + resource_graph = build_resource_graph(stages) + unmet_resources = { + PurePath(resource.lstrip("_")) + if data["resource_type"] == "file" + else PurePath("realisation.json") / resource.lstrip("_") + for resource, data in resource_graph.nodes(data=True) + # Only select nodes that are resources, and have no workflow + # stage providing them (i.e. in-degree in the resource graph + # is zero). + if data["type"] == "resource" and not resource_graph.in_degree(resource) + } + filetree = build_filetree(root_path, unmet_resources) + if not filetree: + print("You do not require any files (besides the flow.cylc).") + return + print("You require the following files for your simulation:") + print() + filetree["cylc-src"]["WORKFLOW_NAME"]["flow.cylc"] = "Cylc workflow file." + printree.ptree(filetree) + + +def resource_for_target_host(target_host: WorkflowTarget) -> BinaryIO: + """Open a binary host environment file for reading. + + Parameters + ---------- + target_host : WorkflowTarget- + The host to target + + Returns + ------- + BinaryIO + A handle to begin reading the environment definition. + """ + return resources.open_binary( + workflow, "templates", "environments", f"{target_host}.toml" + ) + + +def build_targeted_workflow_graph( + stages: list[Stage], goals: Iterable[str], excluding: set[str] +) -> nx.DiGraph: + """Build a workflow targetting `goals` while skipping stages in `excluding`. + + Parameters + ---------- + stages : list[Stage] + A list of all possible workflow stages. + goals : Iterable[str] + The goals for the workflow. + excluding : set[str] + The stages to skip. + + Returns + ------- + nx.DiGraph + A transitively reduced workflow digraph whose terminal nodes + are the elements of `goals`. The graph will not contain any + element of `excluding`. + """ + workflow = workflow_graph(stages) + workflow.remove_nodes_from(excluding) + reachable = union_all(nx.ancestors(workflow, goal) for goal in goals) | set(goals) + unreachable = set(workflow.nodes()) - reachable + workflow.remove_nodes_from(unreachable) + return nx.transitive_reduction(workflow) + + +def workflow_jinja_template( + realisations: list[tuple[str, int]], + workflow: nx.DiGraph, + stages: list[Stage], + host_environment: dict[str, StageConfig], +) -> TemplateStream: + """Construct a jinja template stream for a workflow. + + + + Parameters + ---------- + realisations : list[tuple[str, int]] + The realisations in the workflow. + workflow : nx.DiGraph + The workflow digraph to execute. + stages : list[Stage] + The stage definitions in the workflow. + host_environment : dict[str, StageConfig] + The host environment to target. + + + Returns + ------- + TemplateStream + A template stream that can be dumped to an output cylc file. + """ + workflow_graph_template = workflow_plan_as_cylc_template(stages, workflow) + environment = jinja2.Environment( + loader=jinja2.PackageLoader("workflow"), trim_blocks=True, lstrip_blocks=True + ) + template = environment.get_template("flow.cylc") + workflow_graph_string = workflow_graph_template.format(realisation=f"realisation") + + return template.stream( + realisations=realisations, + workflow_graph=workflow_graph_string, + stages=stages, + host_environment=host_environment, + ) + + @cli.from_docstring(app) def plan_workflow( - realisation_ids: Annotated[list[str], typer.Argument()], + realisations: Annotated[int, typer.Argument(min=1)], flow_file: Annotated[Path, typer.Argument(writable=True, dir_okay=False)], - goal: Annotated[ - list[StageIdentifier], - typer.Option(default_factory=lambda: [], rich_help_panel="Planning Workflows"), + goals: Annotated[ + list[str], + typer.Option( + "--goal", + default_factory=lambda: [], + rich_help_panel="Planning Workflows", + show_default=False, + metavar="STAGE", + ), ], group_goal: Annotated[ list[GroupIdentifier], - typer.Option(default_factory=lambda: [], rich_help_panel="Planning Workflows"), + typer.Option( + default_factory=lambda: [], + rich_help_panel="Planning Workflows", + show_default=False, + ), ], excluding: Annotated[ - list[StageIdentifier], - typer.Option(default_factory=lambda: [], rich_help_panel="Planning Workflows"), + list[str], + typer.Option( + default_factory=lambda: [], + rich_help_panel="Planning Workflows", + show_default=False, + metavar="STAGE", + ), ], - excluding_group: Annotated[ + excluding_groups: Annotated[ list[GroupIdentifier], - typer.Option(default_factory=lambda: [], rich_help_panel="Planning Workflows"), - ], - archive: Annotated[ - list[StageIdentifier], typer.Option( - default_factory=lambda: [ - StageIdentifier.Broadband, - StageIdentifier.IntensityMeasureCalculation, - ], - rich_help_panel="Archiving", + "--excluding-group", + default_factory=lambda: [], + rich_help_panel="Planning Workflows", + show_default=False, ), ], - visualise: Annotated[ - bool, typer.Option(rich_help_panel="Visualising Workflows") - ] = False, - show_required_files: Annotated[ - bool, typer.Option(rich_help_panel="Visualising Workflows") - ] = True, target_host: Annotated[ WorkflowTarget, typer.Option(rich_help_panel="Planning Workflows") ] = WorkflowTarget.NeSI, - source: Annotated[Optional[Source], typer.Option(rich_help_panel="Sources")] = None, + host_file: Annotated[ + Path | None, + typer.Option(rich_help_panel="Planning Workflows", exists=True, dir_okay=False), + ] = None, + source: Annotated[Source | None, typer.Option(rich_help_panel="Sources")] = None, defaults_version: Annotated[ - Optional[DefaultsVersion], typer.Option(rich_help_panel="Sources") + DefaultsVersion | None, typer.Option(rich_help_panel="Sources") ] = None, - container: Annotated[Optional[Path], typer.Option()] = None, - emod3d_path: Annotated[Optional[Path], typer.Option()] = None, + show_required_files: Annotated[ + bool, typer.Option(rich_help_panel="Visualising Workflows") + ] = True, ) -> None: - """Plan and generate a Cylc workflow file for a number of realisations. + """Plan a workflow. Parameters ---------- - realisation_ids : list[str] - List of realisations to generate workflows for. Realisations have the format event:realisation_count, such as Darfield:4. + realisations : int + Number of realisations for event. flow_file : Path Path to output flow file (e.g. ~/cylc-src/my-workflow/flow.cylc). - goal : list[StageIdentifier] + goals : list[str] List of workflow outputs to generate. group_goal : list[GroupIdentifier] List of group goals to generate. - excluding : list[StageIdentifier] + excluding : list[str] List of stages to exclude. - excluding_group : list[GroupIdentifier] + excluding_groups : list[GroupIdentifier] List of stage groups to exclude. - archive : list[StageIdentifier] - Add stage outputs to the archive tarball. - visualise : bool - Visualise the planned workflow as a graph. - show_required_files : bool - Print the expected directory tree at the start of the simulation. target_host : WorkflowTarget Select the target host where the workflow will be run. - source : Optional[Source] - If given, set the source of the realisation. For NSHM and GCMT, the realisation id corresponds to the rupture id and GCMT PublicID respectively. - defaults_version : Optional[DefaultsVersion] - The simulation defaults to apply for all realisations. Required if source is specified. - container : Optional[Path] - The container to use for the workflow. If not specified, the default container for the target environment will be used. - emod3d_path : Optional[Path] - The path to the EMOD3D installation. If not specified, the default path for the target environment will be used. + host_file : Path | None + Provide a custom host file for a new host environment. + Overrides the target host selection if present. + source : Source | None + If given, set the source of the realisation. For NSHM and + GCMT, the realisation id corresponds to the rupture id and + GCMT PublicID respectively. + defaults_version : DefaultsVersion | None + The simulation defaults to apply for all realisations. + Required if source is specified. + show_required_files : bool + Print the expected directory tree at the start of the simulation. """ - container = container or CONTAINER_PATHS[target_host] - emod3d_path = emod3d_path or EMOD3D_PATHS[target_host] - realisations = set.union( - *[parse_realisation(realisation_id) for realisation_id in realisation_ids] - ) if source and not defaults_version: - print( - "You must specify a defaults version if you specify a source. See the help text for options." - ) - raise typer.Exit(code=1) - excluding_set = set(excluding) - goal_set = set(goal) - if group_goal: - goal_set |= set.union(*[GROUP_GOALS[group] for group in group_goal]) - if excluding_group: - excluding_set |= set.union(*[GROUP_STAGES[group] for group in excluding_group]) - - excluding_source_map: dict[Optional[Source], set[StageIdentifier]] = { - Source.GCMT: {StageIdentifier.GCMTToRealisation}, - Source.NSHM: {StageIdentifier.NSHMToRealisation}, + print("Must specify a defaults version if source is specified.") + return + + if host_file: + with open(host_file, "rb") as host_file_handle: + host_environment = load_host_environment(host_file_handle) + elif target_host: + with resource_for_target_host(target_host) as host_file_handle: + host_environment = load_host_environment(host_file_handle) + else: + print("Must specify a host environment or provide a host environment file.") + return + + if defaults_version: + host_environment["root"].environment["DEFAULTS"] = defaults_version + + stages = load_workflow_stages() + + source_stage_map = { + Source.NSHM: {"nshm_to_realisation"}, + Source.GCMT: {"gcmt_to_realisation"}, + None: set(), } - excluding_set |= set.union( - *excluding_source_map.values() - ) - excluding_source_map.get(source, set()) - workflow_plan = create_abstract_workflow_plan(realisations, goal_set, excluding_set) - env = jinja2.Environment( - loader=jinja2.PackageLoader("workflow"), - ) - archiving = set() - for stage_id in archive: - archiving |= { - file.name for file in stage_outputs(stage_id, include_config_outputs=False) - } - - template = env.get_template("flow.cylc") - flow_template = template.render( - container=container, - emod3d_path=emod3d_path, - defaults_version=defaults_version, - realisations=realisations, - target_host=target_host, - archiving=archiving, - workflow_plan={ - node: sorted(dependents, key=lambda stage: str(stage)) - for node, dependents in sorted( - nx.to_dict_of_lists(workflow_plan).items(), - key=lambda kv: str(kv[0]), - ) - }, - ) - flow_file.write_text( - # strip empty lines from the output flow template - "\n".join(line for line in flow_template.split("\n") if line.strip()) + sources_to_remove = { + "nshm_to_realisation", + "gcmt_to_realisation", + } - source_stage_map[source] + + workflow = build_targeted_workflow_graph( + stages, + set(goals) | union_all(GROUP_STAGES[group] for group in group_goal), + set(excluding) + | sources_to_remove + | union_all(GROUP_STAGES[group] for group in excluding_groups), ) + + stage_lookup_map = {stage.id: stage for stage in stages} + workflow_stages = [stage_lookup_map[stage] for stage in workflow.nodes()] + + workflow_jinja_template( + realisations, workflow, workflow_stages, host_environment + ).dump(str(flow_file)) + if show_required_files: - root_path = Path("cylc-src") / "WORKFLOW_NAME" / "input" - inputs = { - PurePath( - Path("cylc-src") / "WORKFLOW_NAME" / "flow.cylc", - ) - } - outputs = set() - inputs = set() - for stage in workflow_plan.nodes: - inputs |= stage.inputs - outputs |= stage.outputs - - missing_file_tree = build_filetree(root_path, inputs - outputs) - - if missing_file_tree: - print("You require the following files for your simulation:") - print() - printree.ptree(missing_file_tree) - print() - print( - "You can find documentation for the output files at https://wiki.canterbury.ac.nz/display/QuakeCore/File+Formats+Used+In+Ground+Motion+Simulation." - ) - if visualise: - network = pyvis_graph(workflow_plan) - with tempfile.NamedTemporaryFile(suffix=".html", delete=False) as graph_render: - network.show(graph_render.name, notebook=False) + print_required_files(workflow_stages) + + +if __name__ == "__main__": + app() diff --git a/workflow/templates/environments/hypocentre.toml b/workflow/templates/environments/hypocentre.toml new file mode 100644 index 00000000..36f930d0 --- /dev/null +++ b/workflow/templates/environments/hypocentre.toml @@ -0,0 +1,8 @@ +[root] +platform = "localhost" + +[root.environment] +CONTAINER = "/mnt/hypo_scratch/containers/runner_latest.sif" + +[im_calc.environment] +KO_MATRIX_PATH = "/mnt/hypo_scratch/ko_matrices" diff --git a/workflow/templates/environments/nesi.toml b/workflow/templates/environments/nesi.toml new file mode 100644 index 00000000..43b25d9a --- /dev/null +++ b/workflow/templates/environments/nesi.toml @@ -0,0 +1,53 @@ +[root] +platform = "nesi-slurm" + +[root.environment] +CONTAINER = "/nesi/project/nesi00213/containers/runner_latest.sif" + +[root.directives] +--account = "nesi00213" +--partition = "genoa" + +[bb_sim.directives] +--cpus-per-task = 32 +--time = "01:00:00" + +[im_calc.environment] +KO_MATRIX_PATH = "/nesi/project/nesi00213/ko_matrices" + +[copy_input] +platform = "localhost" + +[copy_domain_parameters] +platform = "localhost" + +[create_e3d_par] +platform = "localhost" + +[emod3d.directives] +--ntasks = 160 +--mem-per-cpu = "2000MB" +--nodes = 2 +--time = "06:00:00" + +[gcmt_to_realisation] +platform = "localhost" + +[generate_station_coordinates] +platform = "localhost" + +[generate_velocity_model.directives] +--cpus-per-task = 32 +--time = "01:00:00" + +[hf_sim.directives] +--cpus-per-task = 32 +--time = "01:00:00" + +[im_calc.directives] +--cpus-per-task = 64 +--time = "01:00:00" +--mem = "100G" + +[nshm_to_realisation] +platform = "localhost" diff --git a/workflow/templates/environments/rch.toml b/workflow/templates/environments/rch.toml new file mode 100644 index 00000000..7b3d6fee --- /dev/null +++ b/workflow/templates/environments/rch.toml @@ -0,0 +1,49 @@ +[root] +platform = "rch-slurm" + +[root.environment] +CONTAINER = "/scratch/projects/rch-quakecore/containers/runner.sif" +EMOD3D = "/scratch/projects/rch-quakecore/EMOD3D/tools/emod3d-mpi_v3.0.13" + +[im_calc.environment] +KO_MATRIX_PATH = "/scratch/projects/rch-quakecore/ko_matrices" + +[copy_input] +platform = "localhost" + +[copy_domain_parameters] +platform = "localhost" + +[create_e3d_par] +platform = "localhost" +[create_e3d_par.environment] +APPTAINER_BINDPATH = "$TASK_SHARE,$EVENT_SHARE" + +[emod3d] +pre_script = "module load foss/2024a" +[emod3d.directives] +--ntasks = 160 +--mem-per-cpu = "2000MB" +--time = "06:00:00" + +[gcmt_to_realisation] +platform = "localhost" + +[generate_station_coordinates] +platform = "localhost" + +[generate_velocity_model.directives] +--cpus-per-task = 64 +--time = "03:00:00" + +[hf_sim.directives] +--cpus-per-task = 32 +--time = "01:00:00" + +[im_calc.directives] +--cpus-per-task = 64 +--time = "01:00:00" +--mem = "100G" + +[nshm_to_realisation] +platform = "localhost" diff --git a/workflow/templates/flow.cylc b/workflow/templates/flow.cylc index cfa9b6c6..1e5cc3b2 100644 --- a/workflow/templates/flow.cylc +++ b/workflow/templates/flow.cylc @@ -1,23 +1,23 @@ {% macro stage_node_identifier(stage) -%} -{{stage.identifier}}{% if stage.event %}_{{stage.event}}{% if stage.sample %}_{{stage.sample}}{% endif %}{% endif %} +{{stage.id}}{% if stage.parameters %}<{{stage.parameters | join(", ")}}>{% endif %} {%- endmacro -%} -{% macro realisation_identifier(stage) -%} -{{stage.event}}{% if stage.sample %}_{{stage.sample}}{% endif %} -{%- endmacro -%} +[task parameters] + realisation = 1..{{realisations}} [scheduling] [[graph]] R1 = """ - {% for stage, next_stages in workflow_plan.items() -%} - {% for next_stage in next_stages %} - {{ stage_node_identifier(stage) }} => {{ stage_node_identifier(next_stage) }} - {% endfor -%} - {% endfor -%} + {{workflow_graph | indent(8, false)}} """ - {% include target_host + '/queue.cylc' %} + {% include 'stages/queue.cylc' %} [runtime] - {% include target_host + '/root.cylc' %} - {% for stage, next_stages in workflow_plan.items() -%} - {% include target_host + '/' + stage.identifier + '.cylc' %} - {% endfor %} +[[JOB]] + [[[environment]]] + REALISATION = %(realisation)s + TASK_SHARE = $CYLC_WORKFLOW_SHARE_DIR/R%(realisation)s + APPTAINER_BINDPATH = "$PWD:/out,${TASK_SHARE}:/share,${EVENT_SHARE}:/event" +{% include 'stages/root.cylc' %} +{% for stage in stages %} +{% include 'stages/' + stage.id + '.cylc' %} +{% endfor %} diff --git a/workflow/templates/hypocentre/archive.cylc b/workflow/templates/hypocentre/archive.cylc deleted file mode 100644 index 282348c4..00000000 --- a/workflow/templates/hypocentre/archive.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = timestamp=$(date +%Y%m%d%H%M%S) && tar -caf "$timestamp.tar.xz" --files-from=<(find $CYLC_WORKFLOW_SHARE_DIR -type f \( -name "realisation.json" {%- for pattern in archiving %} -o -name "{{pattern}}" {%- endfor %} \)) && rclone copy "$timestamp.tar.xz" dropbox:/QuakeCoRE/Simulation\ Results\ Inbox/$USER/ diff --git a/workflow/templates/hypocentre/bb_sim.cylc b/workflow/templates/hypocentre/bb_sim.cylc deleted file mode 100644 index ecf8254f..00000000 --- a/workflow/templates/hypocentre/bb_sim.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}:/parent" {{container}} bb-sim /share/realisation.json /stations.vs30 /share/LF/OutBin /share/realisation.hf /parent/Velocity_Model /share/realisation.bb - inherit = large_job diff --git a/workflow/templates/hypocentre/check_domain.cylc b/workflow/templates/hypocentre/check_domain.cylc deleted file mode 100644 index 1aa04d7e..00000000 --- a/workflow/templates/hypocentre/check_domain.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}:/parent" {{container}} check-domain /share/realisation.json /share/realisation.srf /parent/Velocity_Model diff --git a/workflow/templates/hypocentre/check_srf.cylc b/workflow/templates/hypocentre/check_srf.cylc deleted file mode 100644 index 9fea5766..00000000 --- a/workflow/templates/hypocentre/check_srf.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} check-srf /share/realisation.json /share/realisation.srf diff --git a/workflow/templates/hypocentre/copy_domain_parameters.cylc b/workflow/templates/hypocentre/copy_domain_parameters.cylc deleted file mode 100644 index de0d7d70..00000000 --- a/workflow/templates/hypocentre/copy_domain_parameters.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}:/parent" {{container}} copy-domain-parameters /parent/realisation.json /share/realisation.json diff --git a/workflow/templates/hypocentre/copy_input.cylc b/workflow/templates/hypocentre/copy_input.cylc deleted file mode 100644 index d33d2ab4..00000000 --- a/workflow/templates/hypocentre/copy_input.cylc +++ /dev/null @@ -1,5 +0,0 @@ -[[copy_input]] - script = """ - mkdir -p {% for realisation in realisations %}$CYLC_WORKFLOW_SHARE_DIR/{{realisation[0]}}{% if realisation[1] %}_{{realisation[1]}}{% endif %} {% endfor %} - [[ ! -d $CYLC_WORKFLOW_RUN_DIR/input ]] || cp -rn $CYLC_WORKFLOW_RUN_DIR/input/. $CYLC_WORKFLOW_SHARE_DIR - """ diff --git a/workflow/templates/hypocentre/create_e3d_par.cylc b/workflow/templates/hypocentre/create_e3d_par.cylc deleted file mode 100644 index 90a29675..00000000 --- a/workflow/templates/hypocentre/create_e3d_par.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec --bind "/mnt:/mnt" {{container}} create-e3d-par $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/realisation.json $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/realisation.srf $CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/Velocity_Model $CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/stations $CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/model $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/LF --emod3d-path {{emod3d_path}} --scratch-ffp $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/LF diff --git a/workflow/templates/hypocentre/emod3d.cylc b/workflow/templates/hypocentre/emod3d.cylc deleted file mode 100644 index 5159f16c..00000000 --- a/workflow/templates/hypocentre/emod3d.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = mpirun --use-hwthread-cpus -n 48 {{emod3d_path}} -args "par=$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/LF/e3d.par" - inherit = large_job diff --git a/workflow/templates/hypocentre/gcmt_to_realisation.cylc b/workflow/templates/hypocentre/gcmt_to_realisation.cylc deleted file mode 100644 index 1ea59f29..00000000 --- a/workflow/templates/hypocentre/gcmt_to_realisation.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} gcmt-to-realisation {{stage.event}} {{defaults_version}} /share/realisation.json diff --git a/workflow/templates/hypocentre/generate_station_coordinates.cylc b/workflow/templates/hypocentre/generate_station_coordinates.cylc deleted file mode 100644 index 2c3c2ea2..00000000 --- a/workflow/templates/hypocentre/generate_station_coordinates.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-station-coordinates /share/realisation.json /share/stations --stat-file /stations.ll diff --git a/workflow/templates/hypocentre/generate_stoch.cylc b/workflow/templates/hypocentre/generate_stoch.cylc deleted file mode 100644 index 93aedd2c..00000000 --- a/workflow/templates/hypocentre/generate_stoch.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-stoch /share/realisation.json /share/realisation.srf /share/realisation.stoch diff --git a/workflow/templates/hypocentre/generate_velocity_model.cylc b/workflow/templates/hypocentre/generate_velocity_model.cylc deleted file mode 100644 index 261d4159..00000000 --- a/workflow/templates/hypocentre/generate_velocity_model.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} sh -c 'generate-velocity-model /share/realisation.json /share/Velocity_Model --num-threads $(nproc) --velocity-model-bin-path /Velocity-Model/NZVM' - inherit = large_job diff --git a/workflow/templates/hypocentre/generate_velocity_model_parameters.cylc b/workflow/templates/hypocentre/generate_velocity_model_parameters.cylc deleted file mode 100644 index 662608da..00000000 --- a/workflow/templates/hypocentre/generate_velocity_model_parameters.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-velocity-model-parameters /share/realisation.json diff --git a/workflow/templates/hypocentre/hf_sim.cylc b/workflow/templates/hypocentre/hf_sim.cylc deleted file mode 100644 index 434a956e..00000000 --- a/workflow/templates/hypocentre/hf_sim.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/stations:/stations" {{container}} hf-sim /share/realisation.json /share/realisation.stoch /stations/stations.ll /share/realisation.hf - inherit = large_job diff --git a/workflow/templates/hypocentre/im_calc.cylc b/workflow/templates/hypocentre/im_calc.cylc deleted file mode 100644 index c305c7d8..00000000 --- a/workflow/templates/hypocentre/im_calc.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,/mnt/hypo_scratch/ko_matrices:/ko_matrices" {{container}} im-calc /share/realisation.json /share/realisation.bb /share/intensity_measures.parquet --ko-directory /ko_matrices - inherit = large_job diff --git a/workflow/templates/hypocentre/merge_ts.cylc b/workflow/templates/hypocentre/merge_ts.cylc deleted file mode 100644 index 284f91d7..00000000 --- a/workflow/templates/hypocentre/merge_ts.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR:/share/{{realisation_identifier(stage)}}" merge-ts /share/LF/OutBin /share/LF/OutBin/output.e3d diff --git a/workflow/templates/hypocentre/nshm_to_realisation.cylc b/workflow/templates/hypocentre/nshm_to_realisation.cylc deleted file mode 100644 index 81f730d9..00000000 --- a/workflow/templates/hypocentre/nshm_to_realisation.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} nshm2022-to-realisation /nshmdb.db {{stage.event}} /share/realisation.json {{defaults_version}} diff --git a/workflow/templates/hypocentre/queue.cylc b/workflow/templates/hypocentre/queue.cylc deleted file mode 100644 index 2266ef98..00000000 --- a/workflow/templates/hypocentre/queue.cylc +++ /dev/null @@ -1,4 +0,0 @@ - [[queues]] - [[[large_job]]] - limit = 1 - members = large_job diff --git a/workflow/templates/hypocentre/realisation_to_srf.cylc b/workflow/templates/hypocentre/realisation_to_srf.cylc deleted file mode 100644 index 3d0c704b..00000000 --- a/workflow/templates/hypocentre/realisation_to_srf.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} realisation-to-srf /share/realisation.json /share/realisation.srf diff --git a/workflow/templates/hypocentre/root.cylc b/workflow/templates/hypocentre/root.cylc deleted file mode 100644 index 265bbcbd..00000000 --- a/workflow/templates/hypocentre/root.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[root]] - platform = localhost -[[large_job]] diff --git a/workflow/templates/hypocentre/write_model_coordinates.cylc b/workflow/templates/hypocentre/write_model_coordinates.cylc deleted file mode 100644 index c624bdc1..00000000 --- a/workflow/templates/hypocentre/write_model_coordinates.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-model-coordinates /share/realisation.json /share/model diff --git a/workflow/templates/nesi/archive.cylc b/workflow/templates/nesi/archive.cylc deleted file mode 100644 index 69204cab..00000000 --- a/workflow/templates/nesi/archive.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - platform = localhost - script = timestamp=$(date +%Y%m%d%H%M%S) && tar -caf "$timestamp.tar.xz" --files-from=<(find $CYLC_WORKFLOW_SHARE_DIR -type f \( -name "realisation.json" {%- for pattern in archiving %} -o -name "{{pattern}}" {%- endfor %} \)) && rclone copy "$timestamp.tar.xz" dropbox:/QuakeCoRE/Simulation\ Results\ Inbox/$USER/ diff --git a/workflow/templates/nesi/bb_sim.cylc b/workflow/templates/nesi/bb_sim.cylc deleted file mode 100644 index 2eaa52ba..00000000 --- a/workflow/templates/nesi/bb_sim.cylc +++ /dev/null @@ -1,6 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}:/parent" {{container}} bb-sim /share/realisation.json /stations.vs30 /share/LF/OutBin /share/realisation.hf /parent/Velocity_Model /share/realisation.bb - [[[directives]]] - --cpus-per-task = 32 - --time = 01:00:00 - --partition = milan diff --git a/workflow/templates/nesi/check_domain.cylc b/workflow/templates/nesi/check_domain.cylc deleted file mode 100644 index 1aa04d7e..00000000 --- a/workflow/templates/nesi/check_domain.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}:/parent" {{container}} check-domain /share/realisation.json /share/realisation.srf /parent/Velocity_Model diff --git a/workflow/templates/nesi/check_srf.cylc b/workflow/templates/nesi/check_srf.cylc deleted file mode 100644 index 9fea5766..00000000 --- a/workflow/templates/nesi/check_srf.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} check-srf /share/realisation.json /share/realisation.srf diff --git a/workflow/templates/nesi/copy_domain_parameters.cylc b/workflow/templates/nesi/copy_domain_parameters.cylc deleted file mode 100644 index 411873dd..00000000 --- a/workflow/templates/nesi/copy_domain_parameters.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - platform = localhost - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}:/parent" {{container}} copy-domain-parameters /parent/realisation.json /share/realisation.json diff --git a/workflow/templates/nesi/copy_input.cylc b/workflow/templates/nesi/copy_input.cylc deleted file mode 100644 index 017ff1c9..00000000 --- a/workflow/templates/nesi/copy_input.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[copy_input]] - platform = localhost - script = "[[ ! -d $CYLC_WORKFLOW_RUN_DIR/input ]] || cp -rn $CYLC_WORKFLOW_RUN_DIR/input/. $CYLC_WORKFLOW_SHARE_DIR" diff --git a/workflow/templates/nesi/create_e3d_par.cylc b/workflow/templates/nesi/create_e3d_par.cylc deleted file mode 100644 index 4bd37962..00000000 --- a/workflow/templates/nesi/create_e3d_par.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - platform = localhost - script = apptainer exec {{container}} create-e3d-par $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/realisation.json $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/realisation.srf $CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/Velocity_Model $CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/stations $CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/model $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/LF --emod3d-path /nesi/project/nesi00213/opt/maui/hybrid_sim_tools/emod3d-mpi_v3.0.8 --scratch-ffp $CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/LF diff --git a/workflow/templates/nesi/emod3d.cylc b/workflow/templates/nesi/emod3d.cylc deleted file mode 100644 index 90f7f115..00000000 --- a/workflow/templates/nesi/emod3d.cylc +++ /dev/null @@ -1,9 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - pre-script = module load foss/2023a - script = srun {{emod3d_path}} -args "par=$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}/LF/e3d.par" - [[[directives]]] - --partition = milan - --ntasks = 160 - --mem-per-cpu = 2000MB - --nodes = 2 - --time = 06:00:00 diff --git a/workflow/templates/nesi/gcmt_to_realisation.cylc b/workflow/templates/nesi/gcmt_to_realisation.cylc deleted file mode 100644 index 1ecb56d6..00000000 --- a/workflow/templates/nesi/gcmt_to_realisation.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - platform = localhost - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} gcmt-to-realisation {{stage.event}} {{defaults_version}} /share/realisation.json diff --git a/workflow/templates/nesi/generate_station_coordinates.cylc b/workflow/templates/nesi/generate_station_coordinates.cylc deleted file mode 100644 index 393ff70c..00000000 --- a/workflow/templates/nesi/generate_station_coordinates.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - platform = localhost - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-station-coordinates /share/realisation.json /share/stations --stat-file /stations.ll diff --git a/workflow/templates/nesi/generate_stoch.cylc b/workflow/templates/nesi/generate_stoch.cylc deleted file mode 100644 index 93aedd2c..00000000 --- a/workflow/templates/nesi/generate_stoch.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-stoch /share/realisation.json /share/realisation.srf /share/realisation.stoch diff --git a/workflow/templates/nesi/generate_velocity_model.cylc b/workflow/templates/nesi/generate_velocity_model.cylc deleted file mode 100644 index 60be0e20..00000000 --- a/workflow/templates/nesi/generate_velocity_model.cylc +++ /dev/null @@ -1,6 +0,0 @@ -[[ {{stage_node_identifier(stage)}} ]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} sh -c 'generate-velocity-model /share/realisation.json /share/Velocity_Model --num-threads $(nproc) --velocity-model-bin-path /Velocity-Model/NZVM' - [[[directives]]] - --cpus-per-task = 32 - --time = 01:00:00 - --partition = milan diff --git a/workflow/templates/nesi/generate_velocity_model_parameters.cylc b/workflow/templates/nesi/generate_velocity_model_parameters.cylc deleted file mode 100644 index 662608da..00000000 --- a/workflow/templates/nesi/generate_velocity_model_parameters.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-velocity-model-parameters /share/realisation.json diff --git a/workflow/templates/nesi/hf_sim.cylc b/workflow/templates/nesi/hf_sim.cylc deleted file mode 100644 index bda2cc29..00000000 --- a/workflow/templates/nesi/hf_sim.cylc +++ /dev/null @@ -1,6 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,$CYLC_WORKFLOW_SHARE_DIR/{{stage.event}}/stations:/stations" {{container}} hf-sim /share/realisation.json /share/realisation.stoch /stations/stations.ll /share/realisation.hf - [[[directives]]] - --cpus-per-task = 32 - --time = 01:00:00 - --partition = milan diff --git a/workflow/templates/nesi/im_calc.cylc b/workflow/templates/nesi/im_calc.cylc deleted file mode 100644 index f67582bf..00000000 --- a/workflow/templates/nesi/im_calc.cylc +++ /dev/null @@ -1,7 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share,/nesi/project/nesi00213/ko_matrices:/ko_matrices" {{container}} im-calc /share/realisation.json /share/realisation.bb /share/intensity_measures.h5 --num-processes 64 --psa-rotd-maximum-memory-allocation 40 --ko-directory /ko_matrices - [[[directives]]] - --cpus-per-task = 64 - --time = 01:00:00 - --mem = 100G - --partition = milan diff --git a/workflow/templates/nesi/merge_ts.cylc b/workflow/templates/nesi/merge_ts.cylc deleted file mode 100644 index 284f91d7..00000000 --- a/workflow/templates/nesi/merge_ts.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR:/share/{{realisation_identifier(stage)}}" merge-ts /share/LF/OutBin /share/LF/OutBin/output.e3d diff --git a/workflow/templates/nesi/nshm_to_realisation.cylc b/workflow/templates/nesi/nshm_to_realisation.cylc deleted file mode 100644 index 278fa9e4..00000000 --- a/workflow/templates/nesi/nshm_to_realisation.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - platform = localhost - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} nshm2022-to-realisation /nshmdb.db {{stage.event}} /share/realisation.json {{defaults_version}} diff --git a/workflow/templates/nesi/realisation_to_srf.cylc b/workflow/templates/nesi/realisation_to_srf.cylc deleted file mode 100644 index 3d0c704b..00000000 --- a/workflow/templates/nesi/realisation_to_srf.cylc +++ /dev/null @@ -1,2 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} realisation-to-srf /share/realisation.json /share/realisation.srf diff --git a/workflow/templates/nesi/root.cylc b/workflow/templates/nesi/root.cylc deleted file mode 100644 index 79ee4c35..00000000 --- a/workflow/templates/nesi/root.cylc +++ /dev/null @@ -1,7 +0,0 @@ -[[root]] - platform = mahuika-slurm - pre-script = """ - module load Apptainer - """ - [[[directives]]] - --account = nesi00213 diff --git a/workflow/templates/nesi/write_model_coordinates.cylc b/workflow/templates/nesi/write_model_coordinates.cylc deleted file mode 100644 index 8ba03376..00000000 --- a/workflow/templates/nesi/write_model_coordinates.cylc +++ /dev/null @@ -1,3 +0,0 @@ -[[{{stage_node_identifier(stage)}}]] - platform = localhost - script = apptainer exec -c --bind "$PWD:/out,$CYLC_WORKFLOW_SHARE_DIR/{{realisation_identifier(stage)}}:/share" {{container}} generate-model-coordinates /share/realisation.json /share/model diff --git a/workflow/templates/stage.cylc b/workflow/templates/stage.cylc new file mode 100644 index 00000000..5d9a7603 --- /dev/null +++ b/workflow/templates/stage.cylc @@ -0,0 +1,33 @@ +[[{{stage_node_identifier(stage)}}]] +{% if stage.parameters %} + inherit = "JOB" +{% endif %} +{% if host_environment[stage.id].platform %} + platform = {{host_environment[stage.id].platform}} +{% endif %} +{% if host_environment[stage.id].pre_script %} + pre-script = """ + {{host_environment[stage.id].pre_script}} + """ +{% endif %} + script = {% block script %}{% endblock %} +{% for variable, value in host_environment[stage.id].settings.items() %} +{{variable}} = {{value}} +{% endfor %} +{% if host_environment[stage.id].directives %} + + + [[[directives]]] +{% for directive, value in host_environment[stage.id].directives.items() %} + {{directive}} = {{value}} +{% endfor %} +{% endif %} + +{% if host_environment[stage.id].environment %} + [[[environment]]] +{% for directive, value in host_environment[stage.id].environment.items() %} + {{directive}} = {{value}} +{% endfor %} +{% endif %} + +{# explicit blank line between stages #} diff --git a/workflow/templates/stages.toml b/workflow/templates/stages.toml new file mode 100644 index 00000000..2fa4c732 --- /dev/null +++ b/workflow/templates/stages.toml @@ -0,0 +1,133 @@ +[nshm_to_realisation] +parameters = ["realisation"] +provides_config = [ + "sources", + "rupture_propagation", + "rakes", + "magnitudes", + "metadata", +] + +[gcmt_to_realisation] +parameters = ["realisation"] +provides_config = [ + "sources", + "rupture_propagation", + "rakes", + "magnitudes", + "metadata", +] + +[create_e3d_par] +parameters = ["realisation"] +requires_files = [ + "realisation.srf", + "Velocity_Model/rho3dfile.d", + "Velocity_Model/vs3dfile.s", + "Velocity_Model/vp3dfile.p", + "stations/stations.ll", + "stations/stations.statcords", +] +requires_config = ["domain", "velocity_model_parameters", "metadata"] +provides_config = ["emod3d_parameters"] +provides_files = ["LF/e3d.par"] + +[bb_sim] +parameters = ["realisation"] +requires_config = ["metadata", "domain"] +requires_files = ["realisation.lf", "realisation.hf", "stations/stations.vs30"] +provides_config = ["broadband_parameters"] +provides_files = ["realisation.bb"] + +[generate_velocity_model] +requires_config = ["domain", "metadata"] +provides_config = ["velocity_model_parameters"] +provides_files = [ + "Velocity_Model/rho3dfile.d", + "Velocity_Model/vp3dfile.p", + "Velocity_Model/vs3dfile.s", + "Velocity_Model/in_basin_mask.b", +] + +[hf_sim] +parameters = ["realisation"] +requires_config = ["metadata", "domain"] +requires_files = ["stations/stations.ll", "realisation.stoch"] +provides_config = ["hf_config"] +provides_files = ["realisation.hf"] + +[im_calc] +parameters = ["realisation"] +requires_files = ["realisation.bb"] +requires_config = [ + "broadband_parameters", + "metadata", + "sources", + "rupture_propagation", +] +provides_config = ["intensity_measure_calculation_parameters"] +provides_files = ["intensity_measures.h5"] + +[generate_velocity_model_parameters] +requires_config = [ + "metadata", + "sources", + "magnitudes", + "rakes", + "rupture_propagation", +] +provides_config = ["velocity_model_parameters", "domain"] + +[realisation_to_srf] +parameters = ["realisation"] +requires_config = [ + "metadata", + "rupture_propagation", + "rakes", + "magnitudes", + "sources", +] +provides_config = ["srf_config"] +provides_files = ["realisation.srf"] + +[generate_stoch] +parameters = ["realisation"] +requires_files = ["realisation.srf"] +requires_config = ["metadata", "sources"] +provides_files = ["realisation.stoch"] + +[generate_station_coordinates] +requires_config = ["domain"] +requires_files = ["stations/stations_input.ll"] +provides_files = ["stations/stations.ll", "stations/stations.statcords"] + +[emod3d] +parameters = ["realisation"] +requires_files = [ + "LF/e3d.par", + "Velocity_Model/rho3dfile.d", + "Velocity_Model/vp3dfile.p", + "Velocity_Model/vs3dfile.s", + "Velocity_Model/in_basin_mask.b", + "realisation.srf", + "stations/stations.ll", + "stations/stations.statcords", +] +provides_files = ["LF"] + +[lf_to_xarray] +parameters = ["realisation"] +requires_files = ["LF"] +provides_files = ["realisation.lf"] + +[check_srf] +parameters = ["realisation"] +follows = "realisation_to_srf" + +[check_domain] +parameters = ["realisation"] +follows = "generate_velocity_model" + +[copy_domain_parameters] +parameters = ["realisation"] +follows = "check_domain" diff --git a/workflow/templates/stages/bb_sim.cylc b/workflow/templates/stages/bb_sim.cylc new file mode 100644 index 00000000..7fddfda8 --- /dev/null +++ b/workflow/templates/stages/bb_sim.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" bb-sim /share/realisation.json /event/stations/stations.vs30 /share/realisation.lf /share/realisation.hf /share/realisation.bb{% endblock %} diff --git a/workflow/templates/stages/check_domain.cylc b/workflow/templates/stages/check_domain.cylc new file mode 100644 index 00000000..ef1f1633 --- /dev/null +++ b/workflow/templates/stages/check_domain.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" check-domain /share/realisation.json /share/realisation.srf /event/Velocity_Model{% endblock %} diff --git a/workflow/templates/stages/check_srf.cylc b/workflow/templates/stages/check_srf.cylc new file mode 100644 index 00000000..2c18e92f --- /dev/null +++ b/workflow/templates/stages/check_srf.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" check-srf /share/realisation.json /share/realisation.srf{% endblock %} diff --git a/workflow/templates/stages/copy_domain_parameters.cylc b/workflow/templates/stages/copy_domain_parameters.cylc new file mode 100644 index 00000000..3a41527c --- /dev/null +++ b/workflow/templates/stages/copy_domain_parameters.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" copy-domain-parameters /event/realisation.json /share/realisation.json{% endblock %} diff --git a/workflow/templates/stages/copy_input.cylc b/workflow/templates/stages/copy_input.cylc new file mode 100644 index 00000000..1bd55d98 --- /dev/null +++ b/workflow/templates/stages/copy_input.cylc @@ -0,0 +1,13 @@ +[[copy_input]] + platform = localhost + script = """ + set -eu pipefail + + mkdir -p "$CYLC_WORKFLOW_SHARE_DIR/event" + + for r in $(seq 1 {{realisations}}); do + mkdir -p "$CYLC_WORKFLOW_SHARE_DIR/R$r" + done + + rsync -a --ignore-existing "$CYLC_WORKFLOW_RUN_DIR/input/" "$CYLC_WORKFLOW_SHARE_DIR" + """ diff --git a/workflow/templates/stages/create_e3d_par.cylc b/workflow/templates/stages/create_e3d_par.cylc new file mode 100644 index 00000000..bd09d30a --- /dev/null +++ b/workflow/templates/stages/create_e3d_par.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c $CONTAINER create-e3d-par $TASK_SHARE/realisation.json $TASK_SHARE/realisation.srf $EVENT_SHARE/Velocity_Model $EVENT_SHARE/stations $TASK_SHARE/LF{% endblock %} diff --git a/workflow/templates/stages/emod3d.cylc b/workflow/templates/stages/emod3d.cylc new file mode 100644 index 00000000..782b87e5 --- /dev/null +++ b/workflow/templates/stages/emod3d.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}srun $EMOD3D -args par=$TASK_SHARE/LF/e3d.par{% endblock %} diff --git a/workflow/templates/stages/environment.toml b/workflow/templates/stages/environment.toml new file mode 100644 index 00000000..b729d8d7 --- /dev/null +++ b/workflow/templates/stages/environment.toml @@ -0,0 +1,3 @@ +CONTAINER = "/nesi/project/nesi00213/containers/runner_latest.sif" +EMOD3D = "/nesi/project/nesi00213/EMOD3D/tools/emod3d-mpi_v3.0.13" +KO_MATRIX_PATH = "/nesi/project/nesi00213/ko_matrices/" diff --git a/workflow/templates/stages/gcmt_to_realisation.cylc b/workflow/templates/stages/gcmt_to_realisation.cylc new file mode 100644 index 00000000..79a37b64 --- /dev/null +++ b/workflow/templates/stages/gcmt_to_realisation.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" gcmt-to-realisation "$EVENT" "$DEFAULTS" /share/realisation.json{% endblock %} diff --git a/workflow/templates/stages/generate_station_coordinates.cylc b/workflow/templates/stages/generate_station_coordinates.cylc new file mode 100644 index 00000000..189199cb --- /dev/null +++ b/workflow/templates/stages/generate_station_coordinates.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" generate-station-coordinates /share/realisation.json /event/stations/stations_input.ll /event/stations/{% endblock %} diff --git a/workflow/templates/stages/generate_stoch.cylc b/workflow/templates/stages/generate_stoch.cylc new file mode 100644 index 00000000..a9606cc5 --- /dev/null +++ b/workflow/templates/stages/generate_stoch.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" generate-stoch /share/realisation.json /share/realisation.srf /share/realisation.stoch{% endblock %} diff --git a/workflow/templates/stages/generate_velocity_model.cylc b/workflow/templates/stages/generate_velocity_model.cylc new file mode 100644 index 00000000..0c671822 --- /dev/null +++ b/workflow/templates/stages/generate_velocity_model.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" generate-velocity-model /share/realisation.json /event/Velocity_Model --velocity-model-bin-path /Velocity-Model/NZVM{% endblock %} diff --git a/workflow/templates/stages/generate_velocity_model_parameters.cylc b/workflow/templates/stages/generate_velocity_model_parameters.cylc new file mode 100644 index 00000000..e6653a28 --- /dev/null +++ b/workflow/templates/stages/generate_velocity_model_parameters.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" generate-velocity-model-parameters /share/realisation.json{% endblock %} diff --git a/workflow/templates/stages/hf_sim.cylc b/workflow/templates/stages/hf_sim.cylc new file mode 100644 index 00000000..a33f78dc --- /dev/null +++ b/workflow/templates/stages/hf_sim.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" hf-sim /share/realisation.json /share/realisation.stoch /event/stations/stations.ll /share/realisation.hf{% endblock %} diff --git a/workflow/templates/stages/im_calc.cylc b/workflow/templates/stages/im_calc.cylc new file mode 100644 index 00000000..cf25509f --- /dev/null +++ b/workflow/templates/stages/im_calc.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" im-calc /share/realisation.json /share/realisation.bb /share/intensity_measures.h5 --num-processes 64 --psa-rotd-maximum-memory-allocation 40 --ko-directory /ko_matrices{% endblock %} diff --git a/workflow/templates/stages/lf_to_xarray.cylc b/workflow/templates/stages/lf_to_xarray.cylc new file mode 100644 index 00000000..610b3e7e --- /dev/null +++ b/workflow/templates/stages/lf_to_xarray.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" lf-to-xarray /share/LF/OutBin /share/realisation.lf{% endblock %} diff --git a/workflow/templates/stages/nshm_to_realisation.cylc b/workflow/templates/stages/nshm_to_realisation.cylc new file mode 100644 index 00000000..a1025c87 --- /dev/null +++ b/workflow/templates/stages/nshm_to_realisation.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" nshm2022-to-realisation /nshmdb.db "$EVENT" /share/realisation.json "$DEFAULTS"{% endblock %} diff --git a/workflow/templates/nesi/queue.cylc b/workflow/templates/stages/queue.cylc similarity index 100% rename from workflow/templates/nesi/queue.cylc rename to workflow/templates/stages/queue.cylc diff --git a/workflow/templates/stages/realisation_to_srf.cylc b/workflow/templates/stages/realisation_to_srf.cylc new file mode 100644 index 00000000..faa3d236 --- /dev/null +++ b/workflow/templates/stages/realisation_to_srf.cylc @@ -0,0 +1,2 @@ +{% extends "stage.cylc" %} +{% block script %}apptainer exec -c "$CONTAINER" realisation-to-srf /share/realisation.json /share/realisation.srf --genslip-path /EMOD3D/tools/genslip_v5.6.2{% endblock %} diff --git a/workflow/templates/stages/root.cylc b/workflow/templates/stages/root.cylc new file mode 100644 index 00000000..8a305a91 --- /dev/null +++ b/workflow/templates/stages/root.cylc @@ -0,0 +1,28 @@ +[[root]] + +{% if host_environment['root'].platform %} + platform = {{host_environment['root'].platform}} +{% endif %} +{% if host_environment['root'].pre_script %} + pre-script = """ + {{host_environment['root'].pre_script}} + """ +{% endif %} +{% if host_environment['root'].directives %} + [[[directives]]] +{% for variable, value in host_environment['root'].directives.items() %} + {{variable}} = {{value}} +{% endfor %} +{% endif %} + +{% if host_environment['root'].environment %} + [[[environment]]] + EVENT_SHARE = "$CYLC_WORKFLOW_SHARE_DIR/event" + TASK_SHARE = "$CYLC_WORKFLOW_SHARE_DIR/R1" + APPTAINER_BINDPATH = "$PWD:/out,${TASK_SHARE}:/share,${EVENT_SHARE}:/event" +{% for variable, value in host_environment['root'].environment.items() %} + {{variable}} = {{value}} +{% endfor %} +{% endif %} + +{# deliberate blank line at end of root #}