vortex-nwp 2.0.0b2__tar.gz → 2.1.1__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.
Files changed (186) hide show
  1. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/PKG-INFO +3 -2
  2. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/pyproject.toml +1 -1
  3. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/__init__.py +21 -5
  4. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/algo/components.py +6 -6
  5. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/algo/mpitools.py +12 -12
  6. vortex_nwp-2.1.1/src/vortex/algo/mpitools_templates/__init__.py +1 -0
  7. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/config.py +11 -7
  8. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/handlers.py +102 -6
  9. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/stores.py +15 -25
  10. vortex_nwp-2.1.1/src/vortex/data/sync_templates/__init__.py +0 -0
  11. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/forecasts.py +7 -15
  12. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/ifsroot.py +5 -0
  13. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/monitoring.py +5 -0
  14. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/mpitools.py +12 -2
  15. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/odbtools.py +20 -0
  16. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/oopsroot.py +5 -0
  17. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/toolbox.py +81 -21
  18. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/actions.py +5 -82
  19. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/grib.py +48 -31
  20. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/net.py +27 -5
  21. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/services.py +2 -2
  22. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/storage.py +3 -1
  23. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/systems.py +25 -14
  24. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/config.py +2 -1
  25. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex_nwp.egg-info/PKG-INFO +3 -2
  26. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex_nwp.egg-info/SOURCES.txt +4 -0
  27. vortex_nwp-2.1.1/tests/test_smartftget.py +81 -0
  28. vortex_nwp-2.1.1/tests/test_ssh.py +23 -0
  29. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/LICENSE +0 -0
  30. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/README.md +0 -0
  31. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/setup.cfg +0 -0
  32. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/algo/__init__.py +0 -0
  33. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/algo/mpitools_templates/envelope_wrapper_default.tpl +0 -0
  34. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/algo/mpitools_templates/envelope_wrapper_mpiauto.tpl +0 -0
  35. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/algo/mpitools_templates/wrapstd_wrapper_default.tpl +0 -0
  36. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/algo/serversynctools.py +0 -0
  37. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/__init__.py +0 -0
  38. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/abstractstores.py +0 -0
  39. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/containers.py +0 -0
  40. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/contents.py +0 -0
  41. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/executables.py +0 -0
  42. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/flow.py +0 -0
  43. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/geometries.ini +0 -0
  44. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/geometries.py +0 -0
  45. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/outflow.py +0 -0
  46. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/providers.py +0 -0
  47. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/data/resources.py +0 -0
  48. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/gloves.py +0 -0
  49. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/layout/__init__.py +0 -0
  50. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/layout/contexts.py +0 -0
  51. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/layout/dataflow.py +0 -0
  52. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/layout/monitor.py +0 -0
  53. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/__init__.py +0 -0
  54. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/__init__.py +0 -0
  55. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/assim.py +0 -0
  56. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/clim.py +0 -0
  57. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/coupling.py +0 -0
  58. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/eda.py +0 -0
  59. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/eps.py +0 -0
  60. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/fpserver.py +0 -0
  61. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/ifsnaming.py +0 -0
  62. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/oopstests.py +0 -0
  63. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/request.py +0 -0
  64. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/algo/stdpost.py +0 -0
  65. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/__init__.py +0 -0
  66. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/assim.py +0 -0
  67. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/boundaries.py +0 -0
  68. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/climfiles.py +0 -0
  69. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/configfiles.py +0 -0
  70. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/consts.py +0 -0
  71. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/ctpini.py +0 -0
  72. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/diagnostics.py +0 -0
  73. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/eda.py +0 -0
  74. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/eps.py +0 -0
  75. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/executables.py +0 -0
  76. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/fields.py +0 -0
  77. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/gridfiles.py +0 -0
  78. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/logs.py +0 -0
  79. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/modelstates.py +0 -0
  80. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/monitoring.py +0 -0
  81. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/namelists.py +0 -0
  82. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/obs.py +0 -0
  83. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/oopsexec.py +0 -0
  84. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/providers.py +0 -0
  85. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/query.py +0 -0
  86. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/stores.py +0 -0
  87. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/data/surfex.py +0 -0
  88. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/syntax/__init__.py +0 -0
  89. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/syntax/stdattrs.py +0 -0
  90. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/__init__.py +0 -0
  91. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/addons.py +0 -0
  92. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/agt.py +0 -0
  93. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/bdap.py +0 -0
  94. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/bdcp.py +0 -0
  95. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/bdm.py +0 -0
  96. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/bdmp.py +0 -0
  97. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/conftools.py +0 -0
  98. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/drhook.py +0 -0
  99. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/grib.py +0 -0
  100. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/gribdiff.py +0 -0
  101. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/ifstools.py +0 -0
  102. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/igastuff.py +0 -0
  103. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/mars.py +0 -0
  104. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/odb.py +0 -0
  105. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/partitioning.py +0 -0
  106. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/tools/satrad.py +0 -0
  107. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/__init__.py +0 -0
  108. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/async.py +0 -0
  109. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/beacon.py +0 -0
  110. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/diffpygram.py +0 -0
  111. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/ens.py +0 -0
  112. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/hooks.py +0 -0
  113. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/taskdeco.py +0 -0
  114. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/usepygram.py +0 -0
  115. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/nwp/util/usetnt.py +0 -0
  116. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/proxy.py +0 -0
  117. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/sessions.py +0 -0
  118. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/syntax/__init__.py +0 -0
  119. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/syntax/stdattrs.py +0 -0
  120. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/syntax/stddeco.py +0 -0
  121. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/__init__.py +0 -0
  122. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/addons.py +0 -0
  123. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/arm.py +0 -0
  124. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/compression.py +0 -0
  125. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/date.py +0 -0
  126. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/ddhpack.py +0 -0
  127. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/delayedactions.py +0 -0
  128. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/env.py +0 -0
  129. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/folder.py +0 -0
  130. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/lfi.py +0 -0
  131. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/listings.py +0 -0
  132. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/names.py +0 -0
  133. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/odb.py +0 -0
  134. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/parallelism.py +0 -0
  135. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/prestaging.py +0 -0
  136. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/rawfiles.py +0 -0
  137. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/schedulers.py +0 -0
  138. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/surfex.py +0 -0
  139. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/tools/targets.py +0 -0
  140. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/__init__.py +0 -0
  141. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/empty.py +0 -0
  142. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/helpers.py +0 -0
  143. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/introspection.py +0 -0
  144. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/iosponge.py +0 -0
  145. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/roles.py +0 -0
  146. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/storefunctions.py +0 -0
  147. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/structs.py +0 -0
  148. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex/util/worker.py +0 -0
  149. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex_nwp.egg-info/dependency_links.txt +0 -0
  150. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex_nwp.egg-info/requires.txt +0 -0
  151. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/src/vortex_nwp.egg-info/top_level.txt +0 -0
  152. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_algo_server.py +0 -0
  153. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_arpifs_listings_integration.py +0 -0
  154. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_cfgparser.py +0 -0
  155. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_cfgtemplating.py +0 -0
  156. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_compression.py +0 -0
  157. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_config.py +0 -0
  158. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_conftools.py +0 -0
  159. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_containers.py +0 -0
  160. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_doctests.py +0 -0
  161. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_ecmwf_interface.py +0 -0
  162. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_env.py +0 -0
  163. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_epygram.py +0 -0
  164. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_gco.py +0 -0
  165. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_ifstools.py +0 -0
  166. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_import.py +0 -0
  167. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_iosponge.py +0 -0
  168. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_job_examples.py +0 -0
  169. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_layoutappconf.py +0 -0
  170. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_layoutjobs.py +0 -0
  171. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_layoutmonitor.py +0 -0
  172. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_layoutnodes.py +0 -0
  173. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_net_netstat.py +0 -0
  174. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_net_ssh.py +0 -0
  175. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_partitioning.py +0 -0
  176. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_providers.py +0 -0
  177. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_sessions_stuff.py +0 -0
  178. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_simpleworkflow.py +0 -0
  179. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_storage.py +0 -0
  180. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_stores.py +0 -0
  181. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_syntax.py +0 -0
  182. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_targets.py +0 -0
  183. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_templates.py +0 -0
  184. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_toolsodb.py +0 -0
  185. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_uget.py +0 -0
  186. {vortex_nwp-2.0.0b2 → vortex_nwp-2.1.1}/tests/test_vortexnames.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: vortex-nwp
3
- Version: 2.0.0b2
3
+ Version: 2.1.1
4
4
  Summary: A Python library to write Numerical Weather Prediction pipelines components
5
5
  Author-email: The Vortex Team <vortex.support@meteo.fr>
6
6
  License: CECILL-C
@@ -21,6 +21,7 @@ Requires-Dist: sphinx-copybutton; extra == "docs"
21
21
  Provides-Extra: dev
22
22
  Requires-Dist: ruff==0.9.1; extra == "dev"
23
23
  Requires-Dist: pytest; extra == "dev"
24
+ Dynamic: license-file
24
25
 
25
26
  ## vortex
26
27
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "vortex-nwp"
7
- version = "2.0.0b2"
7
+ version = "2.1.1"
8
8
  description = "A Python library to write Numerical Weather Prediction pipelines components"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.7"
@@ -21,7 +21,18 @@ strongly advised.
21
21
  """
22
22
 
23
23
  import atexit
24
- import importlib.metadata
24
+ from pathlib import Path
25
+ import sys
26
+
27
+ # importlib.metadata included in stdlib from 3.8 onwards.
28
+ # For older versions, import third-party importlib_metadata
29
+ if sys.version_info < (3, 8):
30
+ import importlib_metadata
31
+ import importlib
32
+
33
+ importlib.metadata = importlib_metadata
34
+ else:
35
+ import importlib.metadata
25
36
 
26
37
  from bronx.fancies import loggers as bloggers
27
38
  import bronx.stdtypes.date
@@ -42,10 +53,10 @@ from .toolbox import algo as task
42
53
 
43
54
  from . import nwp as nwp # footprints import
44
55
 
45
- __version__ = "2.0.0b2"
56
+ __version__ = "2.1.1"
46
57
  __prompt__ = "Vortex v-" + __version__ + ":"
47
58
 
48
- __nextversion__ = "2.0.0b3"
59
+ __nextversion__ = "2.1.1"
49
60
  __tocinfoline__ = "VORTEX core package"
50
61
 
51
62
  __all__ = [
@@ -100,8 +111,13 @@ footprints.setup.callback = vortexfpdefaults
100
111
  ticket = sessions.get
101
112
  sh = sessions.system
102
113
 
103
- # If a config file can be found in current dir, load it
104
- config.load_config()
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)
119
+ else:
120
+ config.load_config(Path.home() / ".vortex.d" / confname)
105
121
 
106
122
  # Load some superstars sub-packages
107
123
 
@@ -50,7 +50,7 @@ from bronx.syntax.decorators import nicedeco
50
50
  import footprints
51
51
  from taylorism import Boss
52
52
  import vortex
53
- from vortex.config import from_config
53
+ import vortex.config as config
54
54
  from vortex.algo import mpitools
55
55
  from vortex.syntax.stdattrs import DelayedEnvValue
56
56
  from vortex.tools.parallelism import ParallelResultParser
@@ -704,15 +704,15 @@ class AlgoComponent(footprints.FootprintBase, metaclass=AlgoComponentMeta):
704
704
 
705
705
  def export(self, packenv):
706
706
  """Export environment variables in given pack."""
707
- for k, v in from_config(section=packenv).items():
707
+ for k, v in config.from_config(section=packenv).items():
708
708
  if k not in self.env:
709
709
  logger.info("Setting %s env %s = %s", packenv.upper(), k, v)
710
710
  self.env[k] = v
711
711
 
712
712
  def prepare(self, rh, opts):
713
713
  """Set some defaults env values."""
714
- if opts.get("fortran", True):
715
- self.export("fortran")
714
+ if config.is_defined(section="env"):
715
+ self.export("env")
716
716
 
717
717
  def absexcutable(self, xfile):
718
718
  """Retuns the absolute pathname of the ``xfile`` executable."""
@@ -1841,7 +1841,7 @@ 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
- conf_dict = from_config(section="mpitool")
1844
+ conf_dict = config.from_config(section="mpitool")
1845
1845
  if self.mpiname:
1846
1846
  conf_dict["mpiname"] = self.mpiname
1847
1847
  # Make "mpirun" the default mpi command name
@@ -1850,7 +1850,7 @@ class Parallel(xExecutableAlgoComponent):
1850
1850
  possible_attrs = functools.reduce(
1851
1851
  lambda s, t: s | t,
1852
1852
  [
1853
- set(cls._footprint.attr.keys())
1853
+ set(cls.footprint_retrieve().attr.keys())
1854
1854
  for cls in footprints.proxy.mpitools
1855
1855
  ],
1856
1856
  )
@@ -182,8 +182,8 @@ class MpiTool(footprints.FootprintBase):
182
182
  )
183
183
 
184
184
  _envelope_bit_kind = "basicenvelopebit"
185
- _envelope_wrapper_tpl = "@envelope_wrapper_default.tpl"
186
- _wrapstd_wrapper_tpl = "@wrapstd_wrapper_default.tpl"
185
+ _envelope_wrapper_tpl = "envelope_wrapper_default.tpl"
186
+ _wrapstd_wrapper_tpl = "wrapstd_wrapper_default.tpl"
187
187
  _envelope_wrapper_name = "./global_envelope_wrapper.py"
188
188
  _wrapstd_wrapper_name = "./global_wrapstd_wrapper.py"
189
189
  _envelope_rank_var = "MPIRANK"
@@ -700,11 +700,11 @@ class MpiTool(footprints.FootprintBase):
700
700
  if not self.mpiwrapstd:
701
701
  return None
702
702
  # Create the launchwrapper
703
- with importlib.resources.as_file(
704
- importlib.resources.files("vortex.algo")
705
- ) as path:
706
- tplpath = path / "mpitools_templates" / self._wrapstd_wrapper_tpl
707
- wtpl = config.load_template(tplpath, encoding="utf-8")
703
+ with importlib.resources.path(
704
+ "vortex.algo.mpitools_templates",
705
+ self._wrapstd_wrapper_tpl,
706
+ ) as tplpath:
707
+ wtpl = config.load_template(tplpath, encoding="utf-8")
708
708
  with open(self._wrapstd_wrapper_name, "w", encoding="utf-8") as fhw:
709
709
  fhw.write(
710
710
  wtpl.substitute(
@@ -911,11 +911,11 @@ class MpiTool(footprints.FootprintBase):
911
911
  "Here are the envelope details:\n%s", "\n".join(binding_str)
912
912
  )
913
913
  # Create the launchwrapper
914
- with importlib.resources.as_file(
915
- importlib.resources.files("vortex.algo")
916
- ) as path:
917
- tplpath = path / "mpitools_templates" / self._envelope_wrapper_tpl
918
- wtpl = config.load_template(tplpath, encoding="utf-8")
914
+ with importlib.resources.path(
915
+ "vortex.algo.mpitools_templates",
916
+ self._envelope_wrapper_tpl,
917
+ ) as tplpath:
918
+ wtpl = config.load_template(tplpath, encoding="utf-8")
919
919
  with open(self._envelope_wrapper_name, "w", encoding="utf-8") as fhw:
920
920
  fhw.write(
921
921
  wtpl.substitute(
@@ -0,0 +1 @@
1
+ # Empty init file
@@ -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(configpath, "rb") as f:
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(f"Could not read configuration file {configpath} (not found).")
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
 
@@ -5,6 +5,7 @@ the various caches or archives".
5
5
  """
6
6
 
7
7
  import functools
8
+ import importlib
8
9
  import re
9
10
  import sys
10
11
 
@@ -133,7 +134,26 @@ class Handler:
133
134
  return str(self.__dict__)
134
135
 
135
136
  def _get_resource(self):
136
- """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
+ """
137
157
  return self._resource
138
158
 
139
159
  def _set_resource(self, value):
@@ -533,7 +553,29 @@ class Handler:
533
553
  return rst
534
554
 
535
555
  def locate(self, **extras):
536
- """Try to figure out what would be the physical location of the resource."""
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
+ """
537
579
  rst = None
538
580
  if self.resource and self.provider:
539
581
  store = self.store
@@ -824,6 +866,32 @@ class Handler:
824
866
  * When **insitu** is False, an attempt to get the resource is systematically
825
867
  made except if **alternate** is defined and the local container already
826
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
+
827
895
  """
828
896
  return self._get_proxy(self._actual_get, alternate=alternate, **extras)
829
897
 
@@ -1009,6 +1077,29 @@ class Handler:
1009
1077
 
1010
1078
  Conversely, the low-level stores are made aware of the previous successful
1011
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()
1012
1103
  """
1013
1104
  rst = False
1014
1105
  if self.complete:
@@ -1116,18 +1207,23 @@ class Handler:
1116
1207
  self,
1117
1208
  pr_getter=None,
1118
1209
  tplfile=None,
1119
- tplskip="@sync-skip.tpl",
1120
- tplfetch="@sync-fetch.tpl",
1121
1210
  py_exec=sys.executable,
1122
1211
  py_opts="",
1123
1212
  ):
1124
1213
  """Build a getter for the expected resource."""
1125
1214
  if tplfile is None:
1126
- tplfile = tplfetch if self.is_expected() else tplskip
1215
+ tplfile = (
1216
+ "sync-" + ("fetch" if self.is_expected() else "skip") + ".tpl"
1217
+ )
1218
+ with importlib.resources.path(
1219
+ "vortex.data.sync_templates",
1220
+ tplfile,
1221
+ ) as tplpath:
1222
+ tpl = config.load_template(tplpath)
1127
1223
  if pr_getter is None:
1128
1224
  pr_getter = self.container.localpath() + ".getpr"
1129
1225
  t = self._cur_session
1130
- tpl = config.load_template(t, tplfile)
1226
+
1131
1227
  with open(pr_getter, "w", encoding="utf-8") as fd:
1132
1228
  fd.write(
1133
1229
  tpl.substitute(
@@ -527,6 +527,10 @@ class _VortexBaseArchiveStore(ArchiveStore, _VortexStackedStorageMixin):
527
527
  """Remap actual remote path to distant store path for intrusive actions."""
528
528
  raise NotImplementedError
529
529
 
530
+ def remap_write(self, remote, options):
531
+ """Remap actual remote path to distant store path for intrusive actions."""
532
+ raise NotImplementedError
533
+
530
534
  def remap_list(self, remote, options):
531
535
  """Reformulates the remote path to compatible vortex namespace."""
532
536
  if len(remote["path"].split("/")) >= 4:
@@ -537,8 +541,6 @@ class _VortexBaseArchiveStore(ArchiveStore, _VortexStackedStorageMixin):
537
541
  )
538
542
  return None
539
543
 
540
- remap_write = remap_read
541
-
542
544
  @property
543
545
  def stacks_autorefill(self):
544
546
  """Where to refill a stack retrieved from the archive."""
@@ -746,15 +748,16 @@ class VortexStdBaseArchiveStore(_VortexBaseArchiveStore):
746
748
  )
747
749
  except config.ConfigurationError as e:
748
750
  msg = (
749
- "Trying to write to archive but location is not configured.\n"
751
+ "Trying to write to archive but location is not configured. "
750
752
  'Make sure key "rootdir" is defined in storage section of '
751
753
  "the configuration.\n"
752
754
  "See https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#storage"
753
755
  )
754
- logger.error(msg)
755
- raise e
756
+ raise config.ConfigurationError(msg) from e
756
757
  return remote
757
758
 
759
+ remap_write = remap_read
760
+
758
761
 
759
762
  class VortexStdStackedArchiveStore(VortexStdBaseArchiveStore):
760
763
  """Archive for casual VORTEX experiments: Support for legacy/Olive XPIDs.
@@ -809,12 +812,11 @@ class VortexOpBaseArchiveStore(_VortexBaseArchiveStore):
809
812
  except config.ConfigurationError as e:
810
813
  msg = (
811
814
  "Trying to write to operational data archive but location"
812
- 'is not configured.\nMake sure key "rootdir" is defined in '
815
+ ' is not configured. Make sure key "op_rootdir" is defined in '
813
816
  "the storage section of the configuration.\n"
814
817
  "See https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#storage"
815
818
  )
816
- logger.error(msg)
817
- raise e
819
+ raise config.ConfigurationError(msg) from e
818
820
  xpath = remote["path"].split("/")
819
821
  if len(xpath) >= 5 and re.match(r"^\d{8}T\d{2,4}", xpath[4]):
820
822
  # If a date is detected
@@ -1105,16 +1107,10 @@ class VortexCacheStore(_AbstractVortexCacheMultiStore):
1105
1107
 
1106
1108
  def alternates_netloc(self):
1107
1109
  """For Non-Op users, Op caches may be accessed in read-only mode."""
1108
- netloc_m = re.match(
1109
- r"(?P<base>vortex.*)\.cache\.(?P<country>\w+)", self.netloc
1110
- )
1111
- mt_netloc = "{base:s}.cache-mt.{country:s}".format(
1112
- **netloc_m.groupdict()
1113
- )
1114
- s_mt_netloc = "{base:s}.stacked-cache-mt.{country:s}".format(
1115
- **netloc_m.groupdict()
1116
- )
1117
- return [mt_netloc, s_mt_netloc]
1110
+ return [
1111
+ f"{self.netloc.firstname}.cache-mt.fr",
1112
+ f"{self.netloc.firstname}.stacked-cache-mt.fr",
1113
+ ]
1118
1114
 
1119
1115
 
1120
1116
  class VortexVsopCacheStore(_AbstractVortexCacheMultiStore):
@@ -1219,13 +1215,7 @@ class VortexStackStore(_AbstractVortexStackMultiStore):
1219
1215
 
1220
1216
  def alternates_netloc(self):
1221
1217
  """Go through the various stacked stores."""
1222
- netloc_m = re.match(
1223
- r"(?P<base>vortex.*)\.stack\.(?P<country>\w+)", self.netloc
1224
- )
1225
- s_mt_netloc = "{base:s}.stacked-cache-mt.{country:s}".format(
1226
- **netloc_m.groupdict()
1227
- )
1228
- return [s_mt_netloc]
1218
+ return [f"{self.netloc.firstname}.stacked-cache-mt.fr"]
1229
1219
 
1230
1220
 
1231
1221
  class VortexVsopStackStore(_AbstractVortexStackMultiStore):
@@ -283,21 +283,12 @@ class LAMForecast(Forecast):
283
283
  values=["lamfc", "lamforecast"],
284
284
  remap=dict(lamforecast="lamfc"),
285
285
  ),
286
- synctool=dict(
287
- info="The name of the script called when waiting for coupling files",
288
- optional=True,
289
- default="atcp.alad",
290
- doc_visibility=footprints.doc.visibility.ADVANCED,
291
- ),
292
- synctpl=dict(
293
- info="The template used to generate the *synctool* script",
294
- optional=True,
295
- default="@sync-fetch.tpl",
296
- doc_visibility=footprints.doc.visibility.ADVANCED,
297
- ),
298
286
  ),
299
287
  )
300
288
 
289
+ synctool = "atcp.alad"
290
+ synctpl = "sync-fetch.tpl"
291
+
301
292
  def spawn_command_options(self):
302
293
  """Dictionary provided for command line factory."""
303
294
  return dict(
@@ -341,10 +332,11 @@ class LAMForecast(Forecast):
341
332
  )
342
333
  sh.softlink(thisbound, lbcnc(number=i))
343
334
  if self.mksync:
344
- thistool = self.synctool + ".{:03d}".format(i)
345
- bound.mkgetpr(pr_getter=thistool, tplfetch=self.synctpl)
335
+ bound.mkgetpr(
336
+ pr_getter=self.synctool + ".{:03d}".format(i),
337
+ )
346
338
  if firstsync is None:
347
- firstsync = thistool
339
+ firstsync = self.synctool + ".{:03d}".format(i)
348
340
 
349
341
  # Set up the first synchronization step
350
342
  if firstsync is not None:
@@ -120,6 +120,11 @@ class IFSParallel(
120
120
  """Extend default tag with ``kind`` value."""
121
121
  return super().fstag() + "." + self.kind
122
122
 
123
+ def _mpitool_attributes(self, opts):
124
+ conf_dict = super()._mpitool_attributes(opts)
125
+ conf_dict.update({"mplbased": True})
126
+ return conf_dict
127
+
123
128
  def valid_executable(self, rh):
124
129
  """Be sure that the specifed executable is ifsmodel compatible."""
125
130
  valid = super().valid_executable(rh)
@@ -57,6 +57,11 @@ class OdbMonitoring(
57
57
  )
58
58
  )
59
59
 
60
+ def _mpitool_attributes(self, opts):
61
+ conf_dict = super()._mpitool_attributes(opts)
62
+ conf_dict.update({"mplbased": True})
63
+ return conf_dict
64
+
60
65
  def _fix_nam_macro(self, rh, macro, value):
61
66
  """Set a given namelist macro and issue a log message."""
62
67
  rh.contents.setmacro(macro, value)
@@ -64,18 +64,28 @@ class MpiAuto(mpitools.MpiTool):
64
64
  ),
65
65
  bindingmethod=dict(
66
66
  info="How to bind the MPI processes",
67
- values=["arch", "launcherspecific", "vortex"],
67
+ values=["vortex", "arch", "launcherspecific"],
68
68
  optional=True,
69
69
  doc_visibility=footprints.doc.visibility.ADVANCED,
70
70
  doc_zorder=-90,
71
71
  ),
72
+ mplbased=dict(
73
+ info="Is the executable based on MPL?",
74
+ type=bool,
75
+ optional=True,
76
+ default=False,
77
+ ),
72
78
  )
73
79
  )
74
80
 
75
- _envelope_wrapper_tpl = "@envelope_wrapper_mpiauto.tpl"
81
+ _envelope_wrapper_tpl = "envelope_wrapper_mpiauto.tpl"
76
82
  _envelope_rank_var = "MPIAUTORANK"
77
83
  _needs_mpilib_specific_mpienv = False
78
84
 
85
+ def __init__(self, *args, **kwargs):
86
+ super().__init__(*args, **kwargs)
87
+ self.bindingmethod = "arch" if self.mplbased else "vortex"
88
+
79
89
  def _reshaped_mpiopts(self):
80
90
  """Raw list of mpi tool command line options."""
81
91
  options = super()._reshaped_mpiopts()
@@ -850,6 +850,11 @@ class OdbAverage(Parallel, odb.OdbComponentDecoMixin, drhook.DrHookDecoMixin):
850
850
  )
851
851
  )
852
852
 
853
+ def _mpitool_attributes(self, opts):
854
+ conf_dict = super()._mpitool_attributes(opts)
855
+ conf_dict.update({"mplbased": True})
856
+ return conf_dict
857
+
853
858
  def prepare(self, rh, opts):
854
859
  """Find any ODB candidate in input files."""
855
860
 
@@ -962,6 +967,11 @@ class OdbCompress(Parallel, odb.OdbComponentDecoMixin, drhook.DrHookDecoMixin):
962
967
  )
963
968
  )
964
969
 
970
+ def _mpitool_attributes(self, opts):
971
+ conf_dict = super()._mpitool_attributes(opts)
972
+ conf_dict.update({"mplbased": True})
973
+ return conf_dict
974
+
965
975
  def prepare(self, rh, opts):
966
976
  """Find any ODB candidate in input files and fox ODB env accordingly."""
967
977
 
@@ -1027,6 +1037,11 @@ class OdbMatchup(Parallel, odb.OdbComponentDecoMixin, drhook.DrHookDecoMixin):
1027
1037
  )
1028
1038
  )
1029
1039
 
1040
+ def _mpitool_attributes(self, opts):
1041
+ conf_dict = super()._mpitool_attributes(opts)
1042
+ conf_dict.update({"mplbased": True})
1043
+ return conf_dict
1044
+
1030
1045
  def prepare(self, rh, opts):
1031
1046
  """Find ODB candidates in input files."""
1032
1047
 
@@ -1116,6 +1131,11 @@ class OdbReshuffle(
1116
1131
  _OUT_DIRECTORY = "reshuffled"
1117
1132
  _BARE_OUT_LAYOUT = "ccma"
1118
1133
 
1134
+ def _mpitool_attributes(self, opts):
1135
+ conf_dict = super()._mpitool_attributes(opts)
1136
+ conf_dict.update({"mplbased": True})
1137
+ return conf_dict
1138
+
1119
1139
  def prepare(self, rh, opts):
1120
1140
  """Find ODB candidates in input files."""
1121
1141
 
@@ -619,6 +619,11 @@ class OOPSParallel(
619
619
  logger.error("The binary < %s > has no cycle attribute", repr(rh))
620
620
  return False
621
621
 
622
+ def _mpitool_attributes(self, opts):
623
+ conf_dict = super()._mpitool_attributes(opts)
624
+ conf_dict.update({"mplbased": True})
625
+ return conf_dict
626
+
622
627
  def prepare(self, rh, opts):
623
628
  """Preliminary setups."""
624
629
  super().prepare(rh, opts)