vortex-nwp 2.1.0__tar.gz → 2.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/PKG-INFO +1 -1
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/pyproject.toml +1 -1
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/__init__.py +9 -7
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/components.py +4 -1
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/mpitools.py +10 -6
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/config.py +11 -7
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/abstractstores.py +8 -1
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/handlers.py +92 -2
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/providers.py +4 -3
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/stores.py +19 -26
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/stores.py +11 -7
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/toolbox.py +81 -21
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/grib.py +2 -2
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/schedulers.py +36 -41
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/services.py +21 -7
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/storage.py +3 -1
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex_nwp.egg-info/PKG-INFO +1 -1
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex_nwp.egg-info/SOURCES.txt +1 -0
- vortex_nwp-2.1.2/tests/test_ecflow.py +37 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/LICENSE +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/README.md +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/setup.cfg +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/mpitools_templates/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/mpitools_templates/envelope_wrapper_default.tpl +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/mpitools_templates/envelope_wrapper_mpiauto.tpl +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/mpitools_templates/wrapstd_wrapper_default.tpl +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/algo/serversynctools.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/containers.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/contents.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/executables.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/flow.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/geometries.ini +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/geometries.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/outflow.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/resources.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/data/sync_templates/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/gloves.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/layout/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/layout/contexts.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/layout/dataflow.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/layout/monitor.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/assim.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/clim.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/coupling.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/eda.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/eps.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/forecasts.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/fpserver.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/ifsnaming.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/ifsroot.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/monitoring.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/mpitools.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/odbtools.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/oopsroot.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/oopstests.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/request.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/algo/stdpost.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/assim.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/boundaries.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/climfiles.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/configfiles.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/consts.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/ctpini.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/diagnostics.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/eda.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/eps.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/executables.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/fields.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/gridfiles.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/logs.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/modelstates.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/monitoring.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/namelists.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/obs.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/oopsexec.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/providers.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/query.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/data/surfex.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/syntax/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/syntax/stdattrs.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/addons.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/agt.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/bdap.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/bdcp.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/bdm.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/bdmp.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/conftools.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/drhook.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/grib.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/gribdiff.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/ifstools.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/igastuff.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/mars.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/odb.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/partitioning.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/tools/satrad.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/async.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/beacon.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/diffpygram.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/ens.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/hooks.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/taskdeco.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/usepygram.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/nwp/util/usetnt.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/proxy.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/sessions.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/syntax/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/syntax/stdattrs.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/syntax/stddeco.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/actions.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/addons.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/arm.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/compression.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/date.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/ddhpack.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/delayedactions.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/env.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/folder.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/lfi.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/listings.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/names.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/net.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/odb.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/parallelism.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/prestaging.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/rawfiles.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/surfex.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/systems.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/tools/targets.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/__init__.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/config.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/empty.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/helpers.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/introspection.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/iosponge.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/roles.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/storefunctions.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/structs.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex/util/worker.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex_nwp.egg-info/dependency_links.txt +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex_nwp.egg-info/requires.txt +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/src/vortex_nwp.egg-info/top_level.txt +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_algo_server.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_arpifs_listings_integration.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_cfgparser.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_cfgtemplating.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_compression.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_config.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_conftools.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_containers.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_doctests.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_ecmwf_interface.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_env.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_epygram.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_gco.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_ifstools.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_import.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_iosponge.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_job_examples.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_layoutappconf.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_layoutjobs.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_layoutmonitor.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_layoutnodes.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_net_netstat.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_net_ssh.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_partitioning.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_providers.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_sessions_stuff.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_simpleworkflow.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_smartftget.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_ssh.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_storage.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_stores.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_syntax.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_targets.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_templates.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_toolsodb.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_uget.py +0 -0
- {vortex_nwp-2.1.0 → vortex_nwp-2.1.2}/tests/test_vortexnames.py +0 -0
|
@@ -21,8 +21,8 @@ strongly advised.
|
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
23
|
import atexit
|
|
24
|
+
from pathlib import Path
|
|
24
25
|
import sys
|
|
25
|
-
import os
|
|
26
26
|
|
|
27
27
|
# importlib.metadata included in stdlib from 3.8 onwards.
|
|
28
28
|
# For older versions, import third-party importlib_metadata
|
|
@@ -53,10 +53,10 @@ from .toolbox import algo as task
|
|
|
53
53
|
|
|
54
54
|
from . import nwp as nwp # footprints import
|
|
55
55
|
|
|
56
|
-
__version__ = "2.1.
|
|
56
|
+
__version__ = "2.1.2"
|
|
57
57
|
__prompt__ = "Vortex v-" + __version__ + ":"
|
|
58
58
|
|
|
59
|
-
__nextversion__ = "2.1.
|
|
59
|
+
__nextversion__ = "2.1.3"
|
|
60
60
|
__tocinfoline__ = "VORTEX core package"
|
|
61
61
|
|
|
62
62
|
__all__ = [
|
|
@@ -111,11 +111,13 @@ footprints.setup.callback = vortexfpdefaults
|
|
|
111
111
|
ticket = sessions.get
|
|
112
112
|
sh = sessions.system
|
|
113
113
|
|
|
114
|
-
# If a config file can be found in current dir, load it else load
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
# If a config file can be found in current dir, load it else load
|
|
115
|
+
# .vortex.d/vortex.toml
|
|
116
|
+
confname = Path("vortex.toml")
|
|
117
|
+
if confname.exists():
|
|
118
|
+
config.load_config(confname)
|
|
117
119
|
else:
|
|
118
|
-
config.load_config(
|
|
120
|
+
config.load_config(Path.home() / ".vortex.d" / confname)
|
|
119
121
|
|
|
120
122
|
# Load some superstars sub-packages
|
|
121
123
|
|
|
@@ -1841,7 +1841,10 @@ class Parallel(xExecutableAlgoComponent):
|
|
|
1841
1841
|
def _mpitool_attributes(self, opts):
|
|
1842
1842
|
"""Return the dictionary of attributes needed to create the mpitool object."""
|
|
1843
1843
|
# Read the appropriate configuration in the target file
|
|
1844
|
-
|
|
1844
|
+
if not config.is_defined(section="mpitool"):
|
|
1845
|
+
conf_dict = {}
|
|
1846
|
+
else:
|
|
1847
|
+
conf_dict = config.from_config(section="mpitool")
|
|
1845
1848
|
if self.mpiname:
|
|
1846
1849
|
conf_dict["mpiname"] = self.mpiname
|
|
1847
1850
|
# Make "mpirun" the default mpi command name
|
|
@@ -84,6 +84,7 @@ from vortex.tools import env
|
|
|
84
84
|
from vortex.tools.arm import ArmForgeTool
|
|
85
85
|
from vortex.tools.systems import ExecutionError
|
|
86
86
|
from vortex.util import config
|
|
87
|
+
from vortex.config import is_defined, ConfigurationError
|
|
87
88
|
|
|
88
89
|
#: No automatic export
|
|
89
90
|
__all__ = []
|
|
@@ -1431,12 +1432,15 @@ class SRun(MpiTool):
|
|
|
1431
1432
|
@property
|
|
1432
1433
|
def _actual_slurmversion(self):
|
|
1433
1434
|
"""Return the slurm major version number."""
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
if not slurmversion:
|
|
1438
|
-
raise
|
|
1439
|
-
|
|
1435
|
+
if self.slurmversion:
|
|
1436
|
+
return self.slurmversion
|
|
1437
|
+
|
|
1438
|
+
if not is_defined(section="mpitool", key="slurmversion"):
|
|
1439
|
+
raise ConfigurationError(
|
|
1440
|
+
"Using 'srun' MPI tool but slurm version is not configured. See "
|
|
1441
|
+
"https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#mpitool"
|
|
1442
|
+
)
|
|
1443
|
+
return from_config(section="mpitool", key="slurmversion")
|
|
1440
1444
|
|
|
1441
1445
|
def _set_binaries_hack(self, binaries):
|
|
1442
1446
|
"""Set the list of :class:`MpiBinaryDescription` objects associated with this instance."""
|
|
@@ -3,6 +3,7 @@ the value of configuration options, respectively.
|
|
|
3
3
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
+
from pathlib import Path
|
|
6
7
|
import tomli
|
|
7
8
|
|
|
8
9
|
from bronx.fancies import loggers
|
|
@@ -24,7 +25,7 @@ class ConfigurationError(Exception):
|
|
|
24
25
|
"""Something is wrong with the provided configuration"""
|
|
25
26
|
|
|
26
27
|
|
|
27
|
-
def load_config(configpath="vortex.toml"):
|
|
28
|
+
def load_config(configpath=Path("vortex.toml")):
|
|
28
29
|
"""Load configuration from a TOML configuration file
|
|
29
30
|
|
|
30
31
|
Existing configuration values are overriden. The configuration
|
|
@@ -41,19 +42,22 @@ def load_config(configpath="vortex.toml"):
|
|
|
41
42
|
# ...
|
|
42
43
|
"""
|
|
43
44
|
global VORTEX_CONFIG
|
|
45
|
+
configpath = Path(configpath)
|
|
44
46
|
try:
|
|
45
|
-
with open(
|
|
47
|
+
with configpath.open(mode="rb") as f:
|
|
46
48
|
VORTEX_CONFIG = tomli.load(f)
|
|
47
|
-
print(f"Successfully read configuration file {configpath}")
|
|
49
|
+
print(f"Successfully read configuration file {configpath.absolute()}")
|
|
48
50
|
except FileNotFoundError:
|
|
49
|
-
print(
|
|
51
|
+
print(
|
|
52
|
+
f"Could not read configuration file {configpath.absolute()} (not found)."
|
|
53
|
+
)
|
|
50
54
|
print("Use load_config(/path/to/config) to update the configuration")
|
|
51
55
|
|
|
52
56
|
|
|
53
57
|
def print_config():
|
|
54
58
|
"""Print configuration (key, value) pairs"""
|
|
55
59
|
if VORTEX_CONFIG:
|
|
56
|
-
for k, v in VORTEX_CONFIG:
|
|
60
|
+
for k, v in VORTEX_CONFIG.items():
|
|
57
61
|
print(k.upper(), v)
|
|
58
62
|
|
|
59
63
|
|
|
@@ -65,10 +69,10 @@ def from_config(section, key=None):
|
|
|
65
69
|
"""
|
|
66
70
|
try:
|
|
67
71
|
subconfig = VORTEX_CONFIG[section]
|
|
68
|
-
except KeyError:
|
|
72
|
+
except KeyError as e:
|
|
69
73
|
raise ConfigurationError(
|
|
70
74
|
f"Missing configuration section {section}",
|
|
71
|
-
)
|
|
75
|
+
) from e
|
|
72
76
|
if not key:
|
|
73
77
|
return subconfig
|
|
74
78
|
|
|
@@ -14,7 +14,7 @@ from bronx.system import hash as hashutils
|
|
|
14
14
|
import footprints
|
|
15
15
|
|
|
16
16
|
from vortex import sessions
|
|
17
|
-
from vortex.config import from_config, ConfigurationError
|
|
17
|
+
from vortex.config import from_config, ConfigurationError, is_defined
|
|
18
18
|
from vortex.syntax.stdattrs import (
|
|
19
19
|
hashalgo,
|
|
20
20
|
hashalgo_avail_list,
|
|
@@ -870,6 +870,13 @@ class ArchiveStore(Store):
|
|
|
870
870
|
@property
|
|
871
871
|
def actual_storetube(self):
|
|
872
872
|
"""This archive network name (potentially read form the configuration file)."""
|
|
873
|
+
if self._actual_storetube:
|
|
874
|
+
return self._actual_storetube
|
|
875
|
+
if not is_defined(section="storage", key="protocol"):
|
|
876
|
+
raise ConfigurationError(
|
|
877
|
+
"Using remote data tree but protocol is not configured. See "
|
|
878
|
+
"https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#storage"
|
|
879
|
+
)
|
|
873
880
|
if self._actual_storetube is None:
|
|
874
881
|
self._actual_storetube = from_config(
|
|
875
882
|
section="storage",
|
|
@@ -134,7 +134,26 @@ class Handler:
|
|
|
134
134
|
return str(self.__dict__)
|
|
135
135
|
|
|
136
136
|
def _get_resource(self):
|
|
137
|
-
"""Getter for ``resource`` property.
|
|
137
|
+
"""Getter for ``resource`` property.
|
|
138
|
+
|
|
139
|
+
**Example**
|
|
140
|
+
|
|
141
|
+
>>> rh = vortex.input(
|
|
142
|
+
... vapp="arpege",
|
|
143
|
+
... vconf="4dvarfr",
|
|
144
|
+
... cutoff="production",
|
|
145
|
+
... date="202506160000",
|
|
146
|
+
... term=1,
|
|
147
|
+
... geometry="global1798",
|
|
148
|
+
... model="arpege",
|
|
149
|
+
... block="forecast",
|
|
150
|
+
... kind="modelstate",
|
|
151
|
+
... experiment="oper",
|
|
152
|
+
... local="myfile",
|
|
153
|
+
... )
|
|
154
|
+
>>> print(rh.resource)
|
|
155
|
+
<vortex.nwp.data.modelstates.Historic object at 0x7b430874a620 | model='arpege' date='2025-06-16T00:00:00Z' cutoff='production' geometry='<vortex.data.geometries.GaussGeometry | tag='global1798' id='ARPEGE TL1798c2.2 stretched-rotated geometry' tl=1798 c=2.2>' term='01:00' subset='None'>
|
|
156
|
+
"""
|
|
138
157
|
return self._resource
|
|
139
158
|
|
|
140
159
|
def _set_resource(self, value):
|
|
@@ -534,7 +553,29 @@ class Handler:
|
|
|
534
553
|
return rst
|
|
535
554
|
|
|
536
555
|
def locate(self, **extras):
|
|
537
|
-
"""
|
|
556
|
+
r"""
|
|
557
|
+
Try to figure out what would be the physical location of the resource.
|
|
558
|
+
|
|
559
|
+
:returns: A semiclon separated string listing the various locations where the resource can be found.
|
|
560
|
+
|
|
561
|
+
>>> rh = vortex.input(
|
|
562
|
+
... vapp="arpege",
|
|
563
|
+
... vconf="4dvarfr",
|
|
564
|
+
... cutoff="production",
|
|
565
|
+
... date="202506160000",
|
|
566
|
+
... term=1,
|
|
567
|
+
... geometry="global1798",
|
|
568
|
+
... model="arpege",
|
|
569
|
+
... block="forecast",
|
|
570
|
+
... kind="modelstate",
|
|
571
|
+
... experiment="oper",
|
|
572
|
+
... local="myfile",
|
|
573
|
+
... )
|
|
574
|
+
>>> print("\n".join(rh.locate().split(";")))
|
|
575
|
+
/home/user/.vortex.d/arpege/4dvarfr/OPER/20250616T0000P/forecast/historic.arpege.tl1798-c22+0001:00.fa
|
|
576
|
+
user@archive:/data/archive/arpege/4dvarfr/OPER/2025/06/16/T0000P/forecast/historic.arpege.tl1798-c22+0001:00.fa
|
|
577
|
+
|
|
578
|
+
"""
|
|
538
579
|
rst = None
|
|
539
580
|
if self.resource and self.provider:
|
|
540
581
|
store = self.store
|
|
@@ -825,6 +866,32 @@ class Handler:
|
|
|
825
866
|
* When **insitu** is False, an attempt to get the resource is systematically
|
|
826
867
|
made except if **alternate** is defined and the local container already
|
|
827
868
|
exists.
|
|
869
|
+
|
|
870
|
+
**Example**
|
|
871
|
+
|
|
872
|
+
.. code:: python
|
|
873
|
+
|
|
874
|
+
rhandlers = vortex.input(
|
|
875
|
+
kind='gridpoint',
|
|
876
|
+
term=1,
|
|
877
|
+
geometry='eurw1s40',
|
|
878
|
+
nativefmt='grib',
|
|
879
|
+
model='arome',
|
|
880
|
+
cutoff='production',
|
|
881
|
+
date=['2024060121', '2024060122'],
|
|
882
|
+
origin='historic',
|
|
883
|
+
vapp='arome',
|
|
884
|
+
vconf='pefrance',
|
|
885
|
+
member=[1,2,5],
|
|
886
|
+
experiment='myexp',
|
|
887
|
+
block='forecast',
|
|
888
|
+
local='gribfile_[member].grib',
|
|
889
|
+
format='grib',
|
|
890
|
+
)
|
|
891
|
+
|
|
892
|
+
for rh in rhandlers:
|
|
893
|
+
rh.get()
|
|
894
|
+
|
|
828
895
|
"""
|
|
829
896
|
return self._get_proxy(self._actual_get, alternate=alternate, **extras)
|
|
830
897
|
|
|
@@ -1010,6 +1077,29 @@ class Handler:
|
|
|
1010
1077
|
|
|
1011
1078
|
Conversely, the low-level stores are made aware of the previous successful
|
|
1012
1079
|
put. That way, a local container is not put twice to the same destination.
|
|
1080
|
+
|
|
1081
|
+
.. code:: python
|
|
1082
|
+
|
|
1083
|
+
rhandlers = vortex.output(
|
|
1084
|
+
kind='gridpoint',
|
|
1085
|
+
term=1,
|
|
1086
|
+
geometry='eurw1s40',
|
|
1087
|
+
nativefmt='grib',
|
|
1088
|
+
model='arome',
|
|
1089
|
+
cutoff='production',
|
|
1090
|
+
date=['2024060121', '2024060122'],
|
|
1091
|
+
origin='historic',
|
|
1092
|
+
vapp='arome',
|
|
1093
|
+
vconf='pefrance',
|
|
1094
|
+
member=[1,2,5],
|
|
1095
|
+
experiment='myexp',
|
|
1096
|
+
block='forecast',
|
|
1097
|
+
local='gribfile_[member].grib',
|
|
1098
|
+
format='grib',
|
|
1099
|
+
)
|
|
1100
|
+
|
|
1101
|
+
for rh in rhandlers:
|
|
1102
|
+
rh.put()
|
|
1013
1103
|
"""
|
|
1014
1104
|
rst = False
|
|
1015
1105
|
if self.complete:
|
|
@@ -279,6 +279,7 @@ class Vortex(Provider):
|
|
|
279
279
|
|
|
280
280
|
_DEFAULT_NAME_BUILDER = names.VortexNameBuilder()
|
|
281
281
|
_CUSTOM_NAME_BUILDERS = dict()
|
|
282
|
+
_SPECIAL_EXPS = ("oper", "dble", "test", "mirr")
|
|
282
283
|
|
|
283
284
|
_footprint = [
|
|
284
285
|
block,
|
|
@@ -365,8 +366,8 @@ class Vortex(Provider):
|
|
|
365
366
|
self._namebuilder = self._CUSTOM_NAME_BUILDERS[self.namebuild]
|
|
366
367
|
else:
|
|
367
368
|
self._namebuilder = self._DEFAULT_NAME_BUILDER
|
|
368
|
-
if self.experiment in (
|
|
369
|
-
self.experiment = self.experiment.
|
|
369
|
+
if self.experiment in (n.upper() for n in self._SPECIAL_EXPS):
|
|
370
|
+
self.experiment = self.experiment.lower()
|
|
370
371
|
|
|
371
372
|
# Ensure compatibility with deprecated namespace attribute
|
|
372
373
|
# Under the hood the namespace attribute is still used to
|
|
@@ -426,7 +427,7 @@ class Vortex(Provider):
|
|
|
426
427
|
|
|
427
428
|
def netloc(self, resource):
|
|
428
429
|
"""Returns the current ``namespace``."""
|
|
429
|
-
if self.experiment in
|
|
430
|
+
if self.experiment in self._SPECIAL_EXPS:
|
|
430
431
|
return "vsop." + self.namespace.domain
|
|
431
432
|
return self.namespace.netloc
|
|
432
433
|
|
|
@@ -748,13 +748,12 @@ class VortexStdBaseArchiveStore(_VortexBaseArchiveStore):
|
|
|
748
748
|
)
|
|
749
749
|
except config.ConfigurationError as e:
|
|
750
750
|
msg = (
|
|
751
|
-
"Trying to write to archive but location is not configured
|
|
751
|
+
"Trying to write to archive but location is not configured. "
|
|
752
752
|
'Make sure key "rootdir" is defined in storage section of '
|
|
753
753
|
"the configuration.\n"
|
|
754
754
|
"See https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#storage"
|
|
755
755
|
)
|
|
756
|
-
|
|
757
|
-
raise e
|
|
756
|
+
raise config.ConfigurationError(msg) from e
|
|
758
757
|
return remote
|
|
759
758
|
|
|
760
759
|
remap_write = remap_read
|
|
@@ -813,12 +812,11 @@ class VortexOpBaseArchiveStore(_VortexBaseArchiveStore):
|
|
|
813
812
|
except config.ConfigurationError as e:
|
|
814
813
|
msg = (
|
|
815
814
|
"Trying to write to operational data archive but location"
|
|
816
|
-
'is not configured
|
|
815
|
+
' is not configured. Make sure key "op_rootdir" is defined in '
|
|
817
816
|
"the storage section of the configuration.\n"
|
|
818
817
|
"See https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#storage"
|
|
819
818
|
)
|
|
820
|
-
|
|
821
|
-
raise e
|
|
819
|
+
raise config.ConfigurationError(msg) from e
|
|
822
820
|
xpath = remote["path"].split("/")
|
|
823
821
|
if len(xpath) >= 5 and re.match(r"^\d{8}T\d{2,4}", xpath[4]):
|
|
824
822
|
# If a date is detected
|
|
@@ -910,16 +908,9 @@ class VortexArchiveStore(MultiStore):
|
|
|
910
908
|
|
|
911
909
|
def alternates_netloc(self):
|
|
912
910
|
"""Return netlocs describing both base and stacked archives."""
|
|
913
|
-
netloc_m = re.match(
|
|
914
|
-
r"(?P<base>v.*)\.archive\.(?P<country>\w+)", self.netloc
|
|
915
|
-
)
|
|
916
911
|
return [
|
|
917
|
-
"{
|
|
918
|
-
|
|
919
|
-
),
|
|
920
|
-
"{base:s}.stacked-archive-legacy.{country:s}".format(
|
|
921
|
-
**netloc_m.groupdict()
|
|
922
|
-
),
|
|
912
|
+
f"{self.netloc.firstname}.archive-legacy.fr",
|
|
913
|
+
f"{self.netloc.firstname}.stacked-archive-legacy.fr",
|
|
923
914
|
]
|
|
924
915
|
|
|
925
916
|
def alternates_fpextras(self):
|
|
@@ -1027,18 +1018,16 @@ class VortexCacheOp2ResearchStore(_VortexCacheBaseStore):
|
|
|
1027
1018
|
|
|
1028
1019
|
def __init__(self, *args, **kw):
|
|
1029
1020
|
super().__init__(*args, **kw)
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
except config.ConfigurationError as e:
|
|
1036
|
-
logger.error(
|
|
1037
|
-
"Cannot use special experiment cache without providing",
|
|
1038
|
-
"cache location",
|
|
1021
|
+
if not config.is_defined(section="data-tree", key="op_rootdir"):
|
|
1022
|
+
raise config.ConfigurationError(
|
|
1023
|
+
"Using special experiment but corresponding cache location "
|
|
1024
|
+
'is not configured. Bet sure to set "op_rootdir" in configuration. '
|
|
1025
|
+
"See https://vortex-nwp.readthedocs.io/en/latest/user-guide/oper-dble-data-trees"
|
|
1039
1026
|
)
|
|
1040
|
-
|
|
1041
|
-
|
|
1027
|
+
cachepath = config.from_config(
|
|
1028
|
+
section="data-tree",
|
|
1029
|
+
key="op_rootdir",
|
|
1030
|
+
)
|
|
1042
1031
|
self.location = os.path.join(cachepath, "vortex")
|
|
1043
1032
|
|
|
1044
1033
|
|
|
@@ -1343,6 +1332,10 @@ class PromiseCacheStore(VortexCacheMtStore):
|
|
|
1343
1332
|
),
|
|
1344
1333
|
)
|
|
1345
1334
|
|
|
1335
|
+
def __init__(self, *args, **kw):
|
|
1336
|
+
super().__init__(*args, **kw)
|
|
1337
|
+
self.location = os.path.join(get_cache_location(), "promise")
|
|
1338
|
+
|
|
1346
1339
|
@staticmethod
|
|
1347
1340
|
def _add_default_options(options):
|
|
1348
1341
|
options_upd = options.copy()
|
|
@@ -12,6 +12,7 @@ from bronx.fancies import loggers
|
|
|
12
12
|
from bronx.stdtypes import date
|
|
13
13
|
from vortex.data.abstractstores import Store
|
|
14
14
|
from vortex.syntax.stdattrs import compressionpipeline
|
|
15
|
+
from vortex import config
|
|
15
16
|
|
|
16
17
|
#: No automatic export
|
|
17
18
|
__all__ = []
|
|
@@ -109,14 +110,17 @@ class BdpeStore(Store):
|
|
|
109
110
|
if s_archive == "True":
|
|
110
111
|
extraenv["BDPE_LECTURE_ARCHIVE_AUTORISEE"] = "oui"
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
wscommand = self.system.default_target.get("bdpe:wsclient_path", None)
|
|
116
|
-
if wscommand is None:
|
|
117
|
-
raise RuntimeError(
|
|
118
|
-
"bdpe:wsclient_path has to be set in the target config"
|
|
113
|
+
try:
|
|
114
|
+
wsinterpreter = config.from_config(
|
|
115
|
+
section="bdpe", key="wsclient_interpreter"
|
|
119
116
|
)
|
|
117
|
+
except config.ConfigurationError:
|
|
118
|
+
wsinterpreter = "bash"
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
wscommand = config.from_config(section="bdpe", key="wsclient_path")
|
|
122
|
+
except config.ConfigurationError:
|
|
123
|
+
wscommand = "/opt/softs/sopra/bin/lirepe.sh"
|
|
120
124
|
|
|
121
125
|
args.insert(0, wscommand)
|
|
122
126
|
if wsinterpreter is not None:
|
|
@@ -485,15 +485,39 @@ def add_section(section, args, kw):
|
|
|
485
485
|
|
|
486
486
|
# noinspection PyShadowingBuiltins
|
|
487
487
|
def input(*args, **kw): # @ReservedAssignment
|
|
488
|
-
"""
|
|
488
|
+
r"""Declare one or more input resources.
|
|
489
|
+
|
|
490
|
+
This function takes an abitrary of keyword arguments forming the resource
|
|
491
|
+
description.
|
|
492
|
+
|
|
493
|
+
:return: A list of :py:class:`Handler <vortex.data.handlers.Handler>` objects.
|
|
494
|
+
|
|
495
|
+
**Example:**
|
|
496
|
+
|
|
497
|
+
The following call to ``input`` returns a list of 6
|
|
498
|
+
:py:class:`Handler <vortex.data.handlers.Handler>` objects, one
|
|
499
|
+
for each date and member:
|
|
500
|
+
|
|
501
|
+
.. code:: python
|
|
502
|
+
|
|
503
|
+
rhandlers = vortex.input(
|
|
504
|
+
kind='gridpoint',
|
|
505
|
+
term=1,
|
|
506
|
+
geometry='eurw1s40',
|
|
507
|
+
nativefmt='grib',
|
|
508
|
+
model='arome',
|
|
509
|
+
cutoff='production',
|
|
510
|
+
date=['2024060121', '2024060122'],
|
|
511
|
+
origin='historic',
|
|
512
|
+
vapp='arome',
|
|
513
|
+
vconf='pefrance',
|
|
514
|
+
member=[1,2,5],
|
|
515
|
+
experiment='myexp',
|
|
516
|
+
block='forecast',
|
|
517
|
+
local='gribfile_[member].grib',
|
|
518
|
+
format='grib',
|
|
519
|
+
)
|
|
489
520
|
|
|
490
|
-
Relies on the :func:`add_section` function (see its documentation), with:
|
|
491
|
-
|
|
492
|
-
* It's ``section`` attribute is automatically set to 'input';
|
|
493
|
-
* The ``kw``'s *insitu* item is set to :data:`active_insitu` by default.
|
|
494
|
-
|
|
495
|
-
:return: A list of :class:`vortex.data.handlers.Handler` objects (associated
|
|
496
|
-
with the newly created class:`~vortex.layout.dataflow.Section` objects).
|
|
497
521
|
"""
|
|
498
522
|
kw.setdefault("insitu", active_insitu)
|
|
499
523
|
kw.setdefault("batch", active_batchinputs)
|
|
@@ -532,14 +556,39 @@ def show_inputs(context=None):
|
|
|
532
556
|
|
|
533
557
|
|
|
534
558
|
def output(*args, **kw):
|
|
535
|
-
"""
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
559
|
+
r"""Declare one or more output resources.
|
|
560
|
+
|
|
561
|
+
This function takes an abitrary of keyword arguments forming the resource
|
|
562
|
+
description.
|
|
563
|
+
|
|
564
|
+
:return: A list of :py:class:`Handler <vortex.data.handlers.Handler>` objects.
|
|
565
|
+
|
|
566
|
+
**Example:**
|
|
567
|
+
|
|
568
|
+
The following call to ``output`` returns a list of 6
|
|
569
|
+
:py:class:`Handler <vortex.data.handlers.Handler>` objects, one
|
|
570
|
+
for each date and member:
|
|
571
|
+
|
|
572
|
+
.. code:: python
|
|
573
|
+
|
|
574
|
+
rhandlers = vortex.output(
|
|
575
|
+
kind='gridpoint',
|
|
576
|
+
term=1,
|
|
577
|
+
geometry='eurw1s40',
|
|
578
|
+
nativefmt='grib',
|
|
579
|
+
model='arome',
|
|
580
|
+
cutoff='production',
|
|
581
|
+
date=['2024060121', '2024060122'],
|
|
582
|
+
origin='historic',
|
|
583
|
+
vapp='arome',
|
|
584
|
+
vconf='pefrance',
|
|
585
|
+
member=[1,2,5],
|
|
586
|
+
experiment='myexp',
|
|
587
|
+
block='forecast',
|
|
588
|
+
local='gribfile_[member].grib',
|
|
589
|
+
format='grib',
|
|
590
|
+
)
|
|
540
591
|
|
|
541
|
-
:return: A list of :class:`vortex.data.handlers.Handler` objects (associated
|
|
542
|
-
with the newly created class:`~vortex.layout.dataflow.Section` objects).
|
|
543
592
|
"""
|
|
544
593
|
# Strip the metadatacheck option depending on active_metadatacheck
|
|
545
594
|
if not active_promise:
|
|
@@ -607,15 +656,26 @@ def promise(*args, **kw):
|
|
|
607
656
|
|
|
608
657
|
|
|
609
658
|
def executable(*args, **kw):
|
|
610
|
-
"""
|
|
659
|
+
r"""Declare one or more executable resources.
|
|
611
660
|
|
|
612
|
-
|
|
661
|
+
This function takes an abitrary of keyword arguments forming the
|
|
662
|
+
executable resource description.
|
|
613
663
|
|
|
614
|
-
|
|
615
|
-
|
|
664
|
+
:return: A list of :py:class:`Handler <vortex.data.handlers.Handler>` objects.
|
|
665
|
+
|
|
666
|
+
**Example:**
|
|
667
|
+
|
|
668
|
+
The following call to ``input`` returns a list of one
|
|
669
|
+
:py:class:`Handler <vortex.data.handlers.Handler>` object:
|
|
670
|
+
|
|
671
|
+
.. code:: python
|
|
672
|
+
|
|
673
|
+
rhandlers = vortex.executable(
|
|
674
|
+
kind="mfmodel",
|
|
675
|
+
local="ARPEGE",
|
|
676
|
+
remote="/path/to/binaries/ARPEGE.EX",
|
|
677
|
+
)
|
|
616
678
|
|
|
617
|
-
:return: A list of :class:`vortex.data.handlers.Handler` objects (associated
|
|
618
|
-
with the newly created class:`~vortex.layout.dataflow.Section` objects).
|
|
619
679
|
"""
|
|
620
680
|
kw.setdefault("insitu", active_insitu)
|
|
621
681
|
return add_section("executable", args, kw)
|
|
@@ -567,7 +567,7 @@ class EcGribDecoMixin(AlgoComponentDecoMixin):
|
|
|
567
567
|
def _eccodes_envsetup(
|
|
568
568
|
self,
|
|
569
569
|
eccodes_lib,
|
|
570
|
-
envvar="
|
|
570
|
+
envvar="ECCODES_DEFINITION_PATH",
|
|
571
571
|
tgt_path="definitions",
|
|
572
572
|
):
|
|
573
573
|
"""Export envirionment variables required by ECCODES
|
|
@@ -612,7 +612,7 @@ class EcGribDecoMixin(AlgoComponentDecoMixin):
|
|
|
612
612
|
if eccodes_lib is not None:
|
|
613
613
|
defvar = self._eccodes_envsetup(
|
|
614
614
|
eccodes_lib,
|
|
615
|
-
envvar="
|
|
615
|
+
envvar="ECCODES_DEFINITION_PATH",
|
|
616
616
|
tgt_path="definitions",
|
|
617
617
|
)
|
|
618
618
|
subdir = Path("ifs_samples") / (
|