gpuwm-global 0.1.0__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 (502) hide show
  1. gpuwm_global-0.1.0/.github/workflows/bridges.yml +311 -0
  2. gpuwm_global-0.1.0/.github/workflows/build.yml +122 -0
  3. gpuwm_global-0.1.0/.github/workflows/publish.yml +305 -0
  4. gpuwm_global-0.1.0/.github/workflows/test.yml +177 -0
  5. gpuwm_global-0.1.0/CHANGELOG.md +346 -0
  6. gpuwm_global-0.1.0/LICENSE +202 -0
  7. gpuwm_global-0.1.0/MANIFEST.in +66 -0
  8. gpuwm_global-0.1.0/NOTICE +98 -0
  9. gpuwm_global-0.1.0/PKG-INFO +476 -0
  10. gpuwm_global-0.1.0/README.md +438 -0
  11. gpuwm_global-0.1.0/RELEASE-NOTES-0.1.0.md +176 -0
  12. gpuwm_global-0.1.0/SOURCE.md +61 -0
  13. gpuwm_global-0.1.0/docs/ARWEN_GLOBAL.md +1202 -0
  14. gpuwm_global-0.1.0/docs/ARWEN_GLOBAL_CLIENT.md +398 -0
  15. gpuwm_global-0.1.0/docs/ARWEN_GLOBAL_DA.md +748 -0
  16. gpuwm_global-0.1.0/docs/ARWEN_GLOBAL_FULL.md +1049 -0
  17. gpuwm_global-0.1.0/docs/ARWEN_GLOBAL_LEVEL5.md +904 -0
  18. gpuwm_global-0.1.0/docs/ARWEN_GLOBAL_QUICKSTART.md +221 -0
  19. gpuwm_global-0.1.0/docs/CLI-REFERENCE.md +682 -0
  20. gpuwm_global-0.1.0/docs/LEVEL3_GLOBAL_SPECTRAL_DYCORE.md +346 -0
  21. gpuwm_global-0.1.0/docs/arwen-global-abi-operator.md +473 -0
  22. gpuwm_global-0.1.0/docs/arwen-global-effective-resolution.md +1041 -0
  23. gpuwm_global-0.1.0/docs/arwen-global-ensemble-da.md +692 -0
  24. gpuwm_global-0.1.0/docs/arwen-global-microwave-operator.md +481 -0
  25. gpuwm_global-0.1.0/docs/arwen-global-observations.md +296 -0
  26. gpuwm_global-0.1.0/docs/demo/CAPTIONS.md +198 -0
  27. gpuwm_global-0.1.0/docs/demo/analysis-t2m-f003.png +0 -0
  28. gpuwm_global-0.1.0/docs/demo/mslp-f000.png +0 -0
  29. gpuwm_global-0.1.0/docs/demo/mslp-f024.png +0 -0
  30. gpuwm_global-0.1.0/docs/demo/pwat-f024.png +0 -0
  31. gpuwm_global-0.1.0/docs/demo/t2m-f024.png +0 -0
  32. gpuwm_global-0.1.0/docs/demo/t850-f024.png +0 -0
  33. gpuwm_global-0.1.0/docs/demo/z500-f024.png +0 -0
  34. gpuwm_global-0.1.0/pyproject.toml +203 -0
  35. gpuwm_global-0.1.0/setup.cfg +4 -0
  36. gpuwm_global-0.1.0/src/arwen_global/__init__.py +61 -0
  37. gpuwm_global-0.1.0/src/arwen_global/__main__.py +4 -0
  38. gpuwm_global-0.1.0/src/arwen_global/_version.py +35 -0
  39. gpuwm_global-0.1.0/src/arwen_global/abi_fast_model.py +456 -0
  40. gpuwm_global-0.1.0/src/arwen_global/abi_operator.py +1214 -0
  41. gpuwm_global-0.1.0/src/arwen_global/abi_radiance_operator.py +714 -0
  42. gpuwm_global-0.1.0/src/arwen_global/abi_reference.py +722 -0
  43. gpuwm_global-0.1.0/src/arwen_global/analysis_fetch.py +188 -0
  44. gpuwm_global-0.1.0/src/arwen_global/analysis_initial.py +1127 -0
  45. gpuwm_global-0.1.0/src/arwen_global/assimilate.py +2107 -0
  46. gpuwm_global-0.1.0/src/arwen_global/bands.py +1035 -0
  47. gpuwm_global-0.1.0/src/arwen_global/cards.py +1606 -0
  48. gpuwm_global-0.1.0/src/arwen_global/checkpoint.py +651 -0
  49. gpuwm_global-0.1.0/src/arwen_global/cli.py +2930 -0
  50. gpuwm_global-0.1.0/src/arwen_global/column_sounding.py +488 -0
  51. gpuwm_global-0.1.0/src/arwen_global/config.py +1535 -0
  52. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_imex_dry.toml +61 -0
  53. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_imex_dry_dt40.toml +61 -0
  54. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_jet48_24h.toml +133 -0
  55. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_24h.toml +135 -0
  56. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_24h_bare.toml +89 -0
  57. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_closure_24h.toml +144 -0
  58. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_imex_24h.toml +129 -0
  59. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_imex_24h_dt120.toml +119 -0
  60. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_imex_24h_dt135.toml +120 -0
  61. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_imex_wall.toml +113 -0
  62. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h.toml +138 -0
  63. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_alpha050.toml +133 -0
  64. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_alpha053.toml +133 -0
  65. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_alpha060.toml +133 -0
  66. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_dt100.toml +130 -0
  67. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_dt200.toml +130 -0
  68. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_dt450.toml +130 -0
  69. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_dt600.toml +130 -0
  70. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_24h_fluxform.toml +147 -0
  71. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_6h.toml +135 -0
  72. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_6h_unclipped.toml +140 -0
  73. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_native_sl_si_wall.toml +122 -0
  74. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t255_sl_si_dry.toml +66 -0
  75. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t383_native_24h.toml +90 -0
  76. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t383_native_imex_24h.toml +99 -0
  77. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t383_native_imex_24h_dt80.toml +114 -0
  78. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t383_native_sl_si_24h.toml +114 -0
  79. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t383_native_sl_si_wall.toml +122 -0
  80. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t533_24h.toml +61 -0
  81. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t533_native_24h.toml +90 -0
  82. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t533_native_imex_24h.toml +131 -0
  83. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t533_native_sl_si_24h.toml +114 -0
  84. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t533_native_sl_si_wall.toml +122 -0
  85. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t63_48h.toml +60 -0
  86. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_gdas_t799_native_sl_si_wall.toml +122 -0
  87. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_held_suarez_t42_imex.toml +75 -0
  88. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_held_suarez_t42_sl_si.toml +79 -0
  89. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_hybrid_6h_reference.toml +69 -0
  90. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t255_imex.toml +71 -0
  91. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t255_imex_steady.toml +71 -0
  92. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t255_sl_si.toml +76 -0
  93. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t255_sl_si_steady.toml +76 -0
  94. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t85_imex.toml +63 -0
  95. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t85_imex_steady.toml +63 -0
  96. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t85_sl_si.toml +68 -0
  97. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_jw06_t85_sl_si_steady.toml +68 -0
  98. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_level5_native_smoke.toml +73 -0
  99. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_moist_smoke.toml +84 -0
  100. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_native_physics_bridge_example.toml +63 -0
  101. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_t21_baroclinic_ten_day.toml +68 -0
  102. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_t255_quickstart.toml +137 -0
  103. gpuwm_global-0.1.0/src/arwen_global/configs/arwen_global_t85_vertical_modes_ab.toml +87 -0
  104. gpuwm_global-0.1.0/src/arwen_global/configs/global_spectral_held_suarez_smoke.toml +42 -0
  105. gpuwm_global-0.1.0/src/arwen_global/configs/global_spectral_primitive_smoke.toml +42 -0
  106. gpuwm_global-0.1.0/src/arwen_global/configs/global_spectral_williamson2.toml +36 -0
  107. gpuwm_global-0.1.0/src/arwen_global/configs_dir.py +110 -0
  108. gpuwm_global-0.1.0/src/arwen_global/constants.py +99 -0
  109. gpuwm_global-0.1.0/src/arwen_global/core/__init__.py +46 -0
  110. gpuwm_global-0.1.0/src/arwen_global/core/gf.py +527 -0
  111. gpuwm_global-0.1.0/src/arwen_global/core/kernels/__init__.py +170 -0
  112. gpuwm_global-0.1.0/src/arwen_global/core/kernels/common.cuh +7 -0
  113. gpuwm_global-0.1.0/src/arwen_global/core/kernels/gf.cu +4325 -0
  114. gpuwm_global-0.1.0/src/arwen_global/core/kernels/glibc_flt32.cuh +649 -0
  115. gpuwm_global-0.1.0/src/arwen_global/core/kernels/morrison.cu +1207 -0
  116. gpuwm_global-0.1.0/src/arwen_global/core/kernels/noah.cu +1526 -0
  117. gpuwm_global-0.1.0/src/arwen_global/core/kernels/ntiedtke.cu +3840 -0
  118. gpuwm_global-0.1.0/src/arwen_global/core/kernels/rrtmgp_cloud.cu +131 -0
  119. gpuwm_global-0.1.0/src/arwen_global/core/kernels/rrtmgp_gas.cu +411 -0
  120. gpuwm_global-0.1.0/src/arwen_global/core/kernels/rrtmgp_mcica.cu +159 -0
  121. gpuwm_global-0.1.0/src/arwen_global/core/kernels/rrtmgp_planck_common.cuh +94 -0
  122. gpuwm_global-0.1.0/src/arwen_global/core/kernels/rrtmgp_rte.cu +574 -0
  123. gpuwm_global-0.1.0/src/arwen_global/core/kernels/rrtmgp_validation.cu +119 -0
  124. gpuwm_global-0.1.0/src/arwen_global/core/kernels/sfclay.cu +554 -0
  125. gpuwm_global-0.1.0/src/arwen_global/core/kernels/ysu.cu +728 -0
  126. gpuwm_global-0.1.0/src/arwen_global/core/kernels/ysu_validation.cu +34 -0
  127. gpuwm_global-0.1.0/src/arwen_global/core/landuse.py +468 -0
  128. gpuwm_global-0.1.0/src/arwen_global/core/morrison.py +244 -0
  129. gpuwm_global-0.1.0/src/arwen_global/core/noah.py +513 -0
  130. gpuwm_global-0.1.0/src/arwen_global/core/npref.py +11296 -0
  131. gpuwm_global-0.1.0/src/arwen_global/core/ntiedtke.py +1590 -0
  132. gpuwm_global-0.1.0/src/arwen_global/core/physics.py +5486 -0
  133. gpuwm_global-0.1.0/src/arwen_global/core/physics_inventory.py +370 -0
  134. gpuwm_global-0.1.0/src/arwen_global/core/rrtmgp.py +5125 -0
  135. gpuwm_global-0.1.0/src/arwen_global/core/sfclay.py +181 -0
  136. gpuwm_global-0.1.0/src/arwen_global/core/ysu.py +264 -0
  137. gpuwm_global-0.1.0/src/arwen_global/core/ysu_contract.py +57 -0
  138. gpuwm_global-0.1.0/src/arwen_global/cycle.py +1233 -0
  139. gpuwm_global-0.1.0/src/arwen_global/da/__init__.py +106 -0
  140. gpuwm_global-0.1.0/src/arwen_global/da/analysis.py +1993 -0
  141. gpuwm_global-0.1.0/src/arwen_global/da/ensemble.py +767 -0
  142. gpuwm_global-0.1.0/src/arwen_global/da/letkf_point.py +1310 -0
  143. gpuwm_global-0.1.0/src/arwen_global/da/localisation.py +518 -0
  144. gpuwm_global-0.1.0/src/arwen_global/da/measure.py +166 -0
  145. gpuwm_global-0.1.0/src/arwen_global/da/observation_errors.py +131 -0
  146. gpuwm_global-0.1.0/src/arwen_global/da/observations.py +326 -0
  147. gpuwm_global-0.1.0/src/arwen_global/da/operators.py +685 -0
  148. gpuwm_global-0.1.0/src/arwen_global/da/options.py +819 -0
  149. gpuwm_global-0.1.0/src/arwen_global/da/osse.py +1189 -0
  150. gpuwm_global-0.1.0/src/arwen_global/da/perturbations.py +661 -0
  151. gpuwm_global-0.1.0/src/arwen_global/da/static_covariance.py +724 -0
  152. gpuwm_global-0.1.0/src/arwen_global/da/window.py +234 -0
  153. gpuwm_global-0.1.0/src/arwen_global/da_anchor.py +312 -0
  154. gpuwm_global-0.1.0/src/arwen_global/da_control.py +243 -0
  155. gpuwm_global-0.1.0/src/arwen_global/da_door.py +1105 -0
  156. gpuwm_global-0.1.0/src/arwen_global/da_filter.py +1597 -0
  157. gpuwm_global-0.1.0/src/arwen_global/da_scorecard.py +967 -0
  158. gpuwm_global-0.1.0/src/arwen_global/da_static.py +247 -0
  159. gpuwm_global-0.1.0/src/arwen_global/da_streams.py +697 -0
  160. gpuwm_global-0.1.0/src/arwen_global/da_twin.py +533 -0
  161. gpuwm_global-0.1.0/src/arwen_global/da_window.py +75 -0
  162. gpuwm_global-0.1.0/src/arwen_global/data/authorities/rw-wps-ecmwf-open-data-global-forecast-grib2.mapping.json +174 -0
  163. gpuwm_global-0.1.0/src/arwen_global/data/authorities/rw-wps-gdas-global-analysis-grib2.mapping.json +932 -0
  164. gpuwm_global-0.1.0/src/arwen_global/data/authorities/rw-wps-gdas-pgrb2-0p25-microwave-columns.mapping.json +1026 -0
  165. gpuwm_global-0.1.0/src/arwen_global/data/authorities/rw-wps-gfs-pgrb2-0p25-cloud-cover.mapping.json +1084 -0
  166. gpuwm_global-0.1.0/src/arwen_global/data/authorities/rw-wps-gfs-surface-flux-grib2.mapping.json +1090 -0
  167. gpuwm_global-0.1.0/src/arwen_global/data/authorities/rw-wps-gfs-surface-state-grib2.mapping.json +1046 -0
  168. gpuwm_global-0.1.0/src/arwen_global/data/door-pins.json +125 -0
  169. gpuwm_global-0.1.0/src/arwen_global/data/engine-seam.json +285 -0
  170. gpuwm_global-0.1.0/src/arwen_global/data/noah_tables/GENPARM.TBL +36 -0
  171. gpuwm_global-0.1.0/src/arwen_global/data/noah_tables/LANDUSE.TBL +586 -0
  172. gpuwm_global-0.1.0/src/arwen_global/data/noah_tables/PROVENANCE.md +28 -0
  173. gpuwm_global-0.1.0/src/arwen_global/data/noah_tables/SOILPARM.TBL +45 -0
  174. gpuwm_global-0.1.0/src/arwen_global/data/noah_tables/VEGPARM.TBL +291 -0
  175. gpuwm_global-0.1.0/src/arwen_global/data/render-catalog-global.json +3247 -0
  176. gpuwm_global-0.1.0/src/arwen_global/data/static-covariance-v1-receipt.json +503 -0
  177. gpuwm_global-0.1.0/src/arwen_global/data/static-covariance-v1.npz +0 -0
  178. gpuwm_global-0.1.0/src/arwen_global/device_memory.py +463 -0
  179. gpuwm_global-0.1.0/src/arwen_global/diurnal_phase.py +1099 -0
  180. gpuwm_global-0.1.0/src/arwen_global/doctor.py +686 -0
  181. gpuwm_global-0.1.0/src/arwen_global/doors.py +793 -0
  182. gpuwm_global-0.1.0/src/arwen_global/dynamics.py +3646 -0
  183. gpuwm_global-0.1.0/src/arwen_global/engine_compat.py +331 -0
  184. gpuwm_global-0.1.0/src/arwen_global/engine_seam.py +149 -0
  185. gpuwm_global-0.1.0/src/arwen_global/export.py +317 -0
  186. gpuwm_global-0.1.0/src/arwen_global/fetch_doors.py +281 -0
  187. gpuwm_global-0.1.0/src/arwen_global/go_door.py +192 -0
  188. gpuwm_global-0.1.0/src/arwen_global/imex.py +410 -0
  189. gpuwm_global-0.1.0/src/arwen_global/initial_conditions.py +161 -0
  190. gpuwm_global-0.1.0/src/arwen_global/insitu/__init__.py +39 -0
  191. gpuwm_global-0.1.0/src/arwen_global/insitu/budgets.py +285 -0
  192. gpuwm_global-0.1.0/src/arwen_global/insitu/capture.py +221 -0
  193. gpuwm_global-0.1.0/src/arwen_global/insitu/energy.py +425 -0
  194. gpuwm_global-0.1.0/src/arwen_global/insitu/ledger.py +567 -0
  195. gpuwm_global-0.1.0/src/arwen_global/insitu/options.py +91 -0
  196. gpuwm_global-0.1.0/src/arwen_global/insitu/spectra.py +95 -0
  197. gpuwm_global-0.1.0/src/arwen_global/insitu/tripwires.py +465 -0
  198. gpuwm_global-0.1.0/src/arwen_global/mapped_source_compat.py +503 -0
  199. gpuwm_global-0.1.0/src/arwen_global/massflux_diagnostic.py +731 -0
  200. gpuwm_global-0.1.0/src/arwen_global/microwave/__init__.py +88 -0
  201. gpuwm_global-0.1.0/src/arwen_global/microwave/__main__.py +266 -0
  202. gpuwm_global-0.1.0/src/arwen_global/microwave/absorption.py +211 -0
  203. gpuwm_global-0.1.0/src/arwen_global/microwave/atms_bridge.py +253 -0
  204. gpuwm_global-0.1.0/src/arwen_global/microwave/atms_fetch.py +568 -0
  205. gpuwm_global-0.1.0/src/arwen_global/microwave/calibrate.py +350 -0
  206. gpuwm_global-0.1.0/src/arwen_global/microwave/channels.py +101 -0
  207. gpuwm_global-0.1.0/src/arwen_global/microwave/columns.py +282 -0
  208. gpuwm_global-0.1.0/src/arwen_global/microwave/emissivity.py +105 -0
  209. gpuwm_global-0.1.0/src/arwen_global/microwave/entry.py +763 -0
  210. gpuwm_global-0.1.0/src/arwen_global/microwave/rte.py +447 -0
  211. gpuwm_global-0.1.0/src/arwen_global/microwave/score.py +568 -0
  212. gpuwm_global-0.1.0/src/arwen_global/migration.py +407 -0
  213. gpuwm_global-0.1.0/src/arwen_global/native_qualification.py +376 -0
  214. gpuwm_global-0.1.0/src/arwen_global/obs_doors.py +201 -0
  215. gpuwm_global-0.1.0/src/arwen_global/obs_operators.py +618 -0
  216. gpuwm_global-0.1.0/src/arwen_global/obs_pack.py +152 -0
  217. gpuwm_global-0.1.0/src/arwen_global/obs_scorecard.py +1637 -0
  218. gpuwm_global-0.1.0/src/arwen_global/obs_streams.py +1360 -0
  219. gpuwm_global-0.1.0/src/arwen_global/obs_table.py +854 -0
  220. gpuwm_global-0.1.0/src/arwen_global/pbl_free_atmosphere.py +1001 -0
  221. gpuwm_global-0.1.0/src/arwen_global/physics/__init__.py +18 -0
  222. gpuwm_global-0.1.0/src/arwen_global/physics/arwen_bridge.py +196 -0
  223. gpuwm_global-0.1.0/src/arwen_global/physics/arwen_massflux.py +844 -0
  224. gpuwm_global-0.1.0/src/arwen_global/physics/banding.py +201 -0
  225. gpuwm_global-0.1.0/src/arwen_global/physics/builtin_adapters.py +186 -0
  226. gpuwm_global-0.1.0/src/arwen_global/physics/exchange.py +203 -0
  227. gpuwm_global-0.1.0/src/arwen_global/physics/frozen_surface.py +464 -0
  228. gpuwm_global-0.1.0/src/arwen_global/physics/native_batch.py +384 -0
  229. gpuwm_global-0.1.0/src/arwen_global/physics/native_options.py +410 -0
  230. gpuwm_global-0.1.0/src/arwen_global/physics/native_runtime.py +1788 -0
  231. gpuwm_global-0.1.0/src/arwen_global/physics/native_state.py +297 -0
  232. gpuwm_global-0.1.0/src/arwen_global/physics/native_suite.py +634 -0
  233. gpuwm_global-0.1.0/src/arwen_global/physics/provenance.py +126 -0
  234. gpuwm_global-0.1.0/src/arwen_global/physics/reference.py +1596 -0
  235. gpuwm_global-0.1.0/src/arwen_global/physics/registry.py +224 -0
  236. gpuwm_global-0.1.0/src/arwen_global/physics/surface_diagnostics.py +217 -0
  237. gpuwm_global-0.1.0/src/arwen_global/pins.py +425 -0
  238. gpuwm_global-0.1.0/src/arwen_global/profile.py +552 -0
  239. gpuwm_global-0.1.0/src/arwen_global/radiance_streams.py +1013 -0
  240. gpuwm_global-0.1.0/src/arwen_global/radiance_tables/abi-fast-model.json +5321 -0
  241. gpuwm_global-0.1.0/src/arwen_global/radiance_tables/abi-operator-entries.json +351 -0
  242. gpuwm_global-0.1.0/src/arwen_global/radiance_tables/atms-noaa-20-2026-09-01.entry.json +325 -0
  243. gpuwm_global-0.1.0/src/arwen_global/radiance_tables/atms-noaa-21-2026-09-01.entry.json +325 -0
  244. gpuwm_global-0.1.0/src/arwen_global/radiation_scorecard.py +1392 -0
  245. gpuwm_global-0.1.0/src/arwen_global/receipt.py +174 -0
  246. gpuwm_global-0.1.0/src/arwen_global/regional/__init__.py +30 -0
  247. gpuwm_global-0.1.0/src/arwen_global/regional/artifact.py +379 -0
  248. gpuwm_global-0.1.0/src/arwen_global/regional/interpolation.py +234 -0
  249. gpuwm_global-0.1.0/src/arwen_global/regional/runtime.py +405 -0
  250. gpuwm_global-0.1.0/src/arwen_global/regional/translate.py +301 -0
  251. gpuwm_global-0.1.0/src/arwen_global/render_door.py +285 -0
  252. gpuwm_global-0.1.0/src/arwen_global/runner.py +1673 -0
  253. gpuwm_global-0.1.0/src/arwen_global/runplan.py +3005 -0
  254. gpuwm_global-0.1.0/src/arwen_global/semi_implicit.py +986 -0
  255. gpuwm_global-0.1.0/src/arwen_global/semilag/__init__.py +115 -0
  256. gpuwm_global-0.1.0/src/arwen_global/semilag/_cuda.py +60 -0
  257. gpuwm_global-0.1.0/src/arwen_global/semilag/cases.py +700 -0
  258. gpuwm_global-0.1.0/src/arwen_global/semilag/interpolate.py +479 -0
  259. gpuwm_global-0.1.0/src/arwen_global/semilag/kernels.cu +596 -0
  260. gpuwm_global-0.1.0/src/arwen_global/semilag/options.py +229 -0
  261. gpuwm_global-0.1.0/src/arwen_global/semilag/pins.py +64 -0
  262. gpuwm_global-0.1.0/src/arwen_global/semilag/rhs.py +220 -0
  263. gpuwm_global-0.1.0/src/arwen_global/semilag/state.py +102 -0
  264. gpuwm_global-0.1.0/src/arwen_global/semilag/step.py +592 -0
  265. gpuwm_global-0.1.0/src/arwen_global/semilag/tables.py +270 -0
  266. gpuwm_global-0.1.0/src/arwen_global/semilag/tracers.py +303 -0
  267. gpuwm_global-0.1.0/src/arwen_global/semilag/trajectory.py +963 -0
  268. gpuwm_global-0.1.0/src/arwen_global/semilag/vectors.py +147 -0
  269. gpuwm_global-0.1.0/src/arwen_global/sizing.py +3879 -0
  270. gpuwm_global-0.1.0/src/arwen_global/sources.py +565 -0
  271. gpuwm_global-0.1.0/src/arwen_global/spectral/__init__.py +55 -0
  272. gpuwm_global-0.1.0/src/arwen_global/spectral/__main__.py +4 -0
  273. gpuwm_global-0.1.0/src/arwen_global/spectral/backend.py +100 -0
  274. gpuwm_global-0.1.0/src/arwen_global/spectral/checkpoint.py +237 -0
  275. gpuwm_global-0.1.0/src/arwen_global/spectral/cli.py +420 -0
  276. gpuwm_global-0.1.0/src/arwen_global/spectral/compression.py +612 -0
  277. gpuwm_global-0.1.0/src/arwen_global/spectral/config.py +507 -0
  278. gpuwm_global-0.1.0/src/arwen_global/spectral/constants.py +16 -0
  279. gpuwm_global-0.1.0/src/arwen_global/spectral/diffusion.py +40 -0
  280. gpuwm_global-0.1.0/src/arwen_global/spectral/eddy_viscosity.py +193 -0
  281. gpuwm_global-0.1.0/src/arwen_global/spectral/export.py +211 -0
  282. gpuwm_global-0.1.0/src/arwen_global/spectral/fused.py +216 -0
  283. gpuwm_global-0.1.0/src/arwen_global/spectral/grid.py +231 -0
  284. gpuwm_global-0.1.0/src/arwen_global/spectral/initial_conditions.py +97 -0
  285. gpuwm_global-0.1.0/src/arwen_global/spectral/legendre.py +190 -0
  286. gpuwm_global-0.1.0/src/arwen_global/spectral/pins.py +72 -0
  287. gpuwm_global-0.1.0/src/arwen_global/spectral/primitive.py +437 -0
  288. gpuwm_global-0.1.0/src/arwen_global/spectral/receipt.py +47 -0
  289. gpuwm_global-0.1.0/src/arwen_global/spectral/runner.py +614 -0
  290. gpuwm_global-0.1.0/src/arwen_global/spectral/sampling.py +571 -0
  291. gpuwm_global-0.1.0/src/arwen_global/spectral/shallow_water.py +147 -0
  292. gpuwm_global-0.1.0/src/arwen_global/spectral/state.py +74 -0
  293. gpuwm_global-0.1.0/src/arwen_global/spectral/timestep.py +59 -0
  294. gpuwm_global-0.1.0/src/arwen_global/spectral/transform.py +1694 -0
  295. gpuwm_global-0.1.0/src/arwen_global/spectral/vector.py +137 -0
  296. gpuwm_global-0.1.0/src/arwen_global/spill.py +781 -0
  297. gpuwm_global-0.1.0/src/arwen_global/state.py +357 -0
  298. gpuwm_global-0.1.0/src/arwen_global/statics.py +972 -0
  299. gpuwm_global-0.1.0/src/arwen_global/statics_rows.py +172 -0
  300. gpuwm_global-0.1.0/src/arwen_global/status.py +162 -0
  301. gpuwm_global-0.1.0/src/arwen_global/storm_reader.py +845 -0
  302. gpuwm_global-0.1.0/src/arwen_global/surface_energy.py +1122 -0
  303. gpuwm_global-0.1.0/src/arwen_global/surface_seeding.py +694 -0
  304. gpuwm_global-0.1.0/src/arwen_global/testcases.py +373 -0
  305. gpuwm_global-0.1.0/src/arwen_global/transport.py +1191 -0
  306. gpuwm_global-0.1.0/src/arwen_global/trigger_diagnostic.py +717 -0
  307. gpuwm_global-0.1.0/src/arwen_global/tui_worker.py +153 -0
  308. gpuwm_global-0.1.0/src/arwen_global/upper_air_scorecard.py +2048 -0
  309. gpuwm_global-0.1.0/src/arwen_global/vertical.py +624 -0
  310. gpuwm_global-0.1.0/src/arwen_global/water.py +221 -0
  311. gpuwm_global-0.1.0/src/arwen_global/water_budget.py +1393 -0
  312. gpuwm_global-0.1.0/src/arwen_global/wrfout_export.py +515 -0
  313. gpuwm_global-0.1.0/src/gpuwm_global.egg-info/PKG-INFO +476 -0
  314. gpuwm_global-0.1.0/src/gpuwm_global.egg-info/SOURCES.txt +500 -0
  315. gpuwm_global-0.1.0/src/gpuwm_global.egg-info/dependency_links.txt +1 -0
  316. gpuwm_global-0.1.0/src/gpuwm_global.egg-info/entry_points.txt +2 -0
  317. gpuwm_global-0.1.0/src/gpuwm_global.egg-info/requires.txt +17 -0
  318. gpuwm_global-0.1.0/src/gpuwm_global.egg-info/top_level.txt +1 -0
  319. gpuwm_global-0.1.0/tests/conftest.py +445 -0
  320. gpuwm_global-0.1.0/tests/data/sph_harm_reference_scipy115.json +91 -0
  321. gpuwm_global-0.1.0/tests/doc_command_parity.py +129 -0
  322. gpuwm_global-0.1.0/tests/global_spectral_dense_reference.py +594 -0
  323. gpuwm_global-0.1.0/tests/goes_pack_fixtures.py +365 -0
  324. gpuwm_global-0.1.0/tests/test_arwen_global_abi_entries.py +505 -0
  325. gpuwm_global-0.1.0/tests/test_arwen_global_abi_fast_model.py +224 -0
  326. gpuwm_global-0.1.0/tests/test_arwen_global_abi_operator.py +326 -0
  327. gpuwm_global-0.1.0/tests/test_arwen_global_abi_reference.py +189 -0
  328. gpuwm_global-0.1.0/tests/test_arwen_global_analysis_fill.py +417 -0
  329. gpuwm_global-0.1.0/tests/test_arwen_global_analysis_initial.py +464 -0
  330. gpuwm_global-0.1.0/tests/test_arwen_global_assimilate.py +1269 -0
  331. gpuwm_global-0.1.0/tests/test_arwen_global_assimilate_mass.py +235 -0
  332. gpuwm_global-0.1.0/tests/test_arwen_global_assimilate_moisture.py +460 -0
  333. gpuwm_global-0.1.0/tests/test_arwen_global_band_pipeline.py +665 -0
  334. gpuwm_global-0.1.0/tests/test_arwen_global_bands.py +608 -0
  335. gpuwm_global-0.1.0/tests/test_arwen_global_bias_vs_gfs_tool.py +129 -0
  336. gpuwm_global-0.1.0/tests/test_arwen_global_cards.py +907 -0
  337. gpuwm_global-0.1.0/tests/test_arwen_global_carried_core.py +283 -0
  338. gpuwm_global-0.1.0/tests/test_arwen_global_checkpoint_runner.py +375 -0
  339. gpuwm_global-0.1.0/tests/test_arwen_global_completed_plans.py +140 -0
  340. gpuwm_global-0.1.0/tests/test_arwen_global_config_resolution.py +223 -0
  341. gpuwm_global-0.1.0/tests/test_arwen_global_config_vertical.py +581 -0
  342. gpuwm_global-0.1.0/tests/test_arwen_global_convection_timing.py +270 -0
  343. gpuwm_global-0.1.0/tests/test_arwen_global_cycle.py +427 -0
  344. gpuwm_global-0.1.0/tests/test_arwen_global_da_amendments.py +777 -0
  345. gpuwm_global-0.1.0/tests/test_arwen_global_da_balance.py +428 -0
  346. gpuwm_global-0.1.0/tests/test_arwen_global_da_control.py +487 -0
  347. gpuwm_global-0.1.0/tests/test_arwen_global_da_door.py +817 -0
  348. gpuwm_global-0.1.0/tests/test_arwen_global_da_ensemble.py +430 -0
  349. gpuwm_global-0.1.0/tests/test_arwen_global_da_hybrid.py +556 -0
  350. gpuwm_global-0.1.0/tests/test_arwen_global_da_letkf_point.py +535 -0
  351. gpuwm_global-0.1.0/tests/test_arwen_global_da_operators_device.py +270 -0
  352. gpuwm_global-0.1.0/tests/test_arwen_global_da_radiances.py +506 -0
  353. gpuwm_global-0.1.0/tests/test_arwen_global_da_refutation.py +420 -0
  354. gpuwm_global-0.1.0/tests/test_arwen_global_da_scorecard.py +168 -0
  355. gpuwm_global-0.1.0/tests/test_arwen_global_da_streams_complete.py +503 -0
  356. gpuwm_global-0.1.0/tests/test_arwen_global_da_twin.py +131 -0
  357. gpuwm_global-0.1.0/tests/test_arwen_global_decode_receipts.py +343 -0
  358. gpuwm_global-0.1.0/tests/test_arwen_global_default_core.py +182 -0
  359. gpuwm_global-0.1.0/tests/test_arwen_global_device_memory.py +173 -0
  360. gpuwm_global-0.1.0/tests/test_arwen_global_diffusion_default.py +137 -0
  361. gpuwm_global-0.1.0/tests/test_arwen_global_door.py +484 -0
  362. gpuwm_global-0.1.0/tests/test_arwen_global_engine_seam.py +290 -0
  363. gpuwm_global-0.1.0/tests/test_arwen_global_eulerian_step_rule.py +258 -0
  364. gpuwm_global-0.1.0/tests/test_arwen_global_export_registry_cli.py +244 -0
  365. gpuwm_global-0.1.0/tests/test_arwen_global_gf_massflux.py +253 -0
  366. gpuwm_global-0.1.0/tests/test_arwen_global_gf_massflux_cuda.py +316 -0
  367. gpuwm_global-0.1.0/tests/test_arwen_global_grid_tracers.py +594 -0
  368. gpuwm_global-0.1.0/tests/test_arwen_global_host_spill.py +642 -0
  369. gpuwm_global-0.1.0/tests/test_arwen_global_igra2_levels.py +148 -0
  370. gpuwm_global-0.1.0/tests/test_arwen_global_imex.py +768 -0
  371. gpuwm_global-0.1.0/tests/test_arwen_global_insitu_energy.py +282 -0
  372. gpuwm_global-0.1.0/tests/test_arwen_global_insitu_energy_bands.py +501 -0
  373. gpuwm_global-0.1.0/tests/test_arwen_global_insitu_energy_rossby_haurwitz.py +152 -0
  374. gpuwm_global-0.1.0/tests/test_arwen_global_insitu_instruments.py +313 -0
  375. gpuwm_global-0.1.0/tests/test_arwen_global_insitu_runtime.py +241 -0
  376. gpuwm_global-0.1.0/tests/test_arwen_global_level5_migration.py +213 -0
  377. gpuwm_global-0.1.0/tests/test_arwen_global_level5_native.py +2826 -0
  378. gpuwm_global-0.1.0/tests/test_arwen_global_level5_qualification_cli.py +279 -0
  379. gpuwm_global-0.1.0/tests/test_arwen_global_level5_regional.py +429 -0
  380. gpuwm_global-0.1.0/tests/test_arwen_global_level5_water_sustainability.py +613 -0
  381. gpuwm_global-0.1.0/tests/test_arwen_global_massflux.py +429 -0
  382. gpuwm_global-0.1.0/tests/test_arwen_global_memory_levers.py +411 -0
  383. gpuwm_global-0.1.0/tests/test_arwen_global_microwave.py +379 -0
  384. gpuwm_global-0.1.0/tests/test_arwen_global_microwave_entry.py +442 -0
  385. gpuwm_global-0.1.0/tests/test_arwen_global_native_fused.py +71 -0
  386. gpuwm_global-0.1.0/tests/test_arwen_global_native_ntiedtke.py +547 -0
  387. gpuwm_global-0.1.0/tests/test_arwen_global_obs_operators.py +121 -0
  388. gpuwm_global-0.1.0/tests/test_arwen_global_obs_pack.py +188 -0
  389. gpuwm_global-0.1.0/tests/test_arwen_global_obs_scorecard.py +437 -0
  390. gpuwm_global-0.1.0/tests/test_arwen_global_obs_streams.py +247 -0
  391. gpuwm_global-0.1.0/tests/test_arwen_global_obs_table_v2.py +135 -0
  392. gpuwm_global-0.1.0/tests/test_arwen_global_pbl_free_atmosphere.py +409 -0
  393. gpuwm_global-0.1.0/tests/test_arwen_global_physics_bands.py +320 -0
  394. gpuwm_global-0.1.0/tests/test_arwen_global_physics_split.py +92 -0
  395. gpuwm_global-0.1.0/tests/test_arwen_global_pins.py +219 -0
  396. gpuwm_global-0.1.0/tests/test_arwen_global_profile.py +282 -0
  397. gpuwm_global-0.1.0/tests/test_arwen_global_quickstart.py +409 -0
  398. gpuwm_global-0.1.0/tests/test_arwen_global_radiation_carriers.py +68 -0
  399. gpuwm_global-0.1.0/tests/test_arwen_global_radiation_scorecard.py +372 -0
  400. gpuwm_global-0.1.0/tests/test_arwen_global_reference_physics.py +710 -0
  401. gpuwm_global-0.1.0/tests/test_arwen_global_render_door_contract.py +67 -0
  402. gpuwm_global-0.1.0/tests/test_arwen_global_run_plan.py +1752 -0
  403. gpuwm_global-0.1.0/tests/test_arwen_global_screen_level_diagnostics.py +189 -0
  404. gpuwm_global-0.1.0/tests/test_arwen_global_semi_implicit.py +268 -0
  405. gpuwm_global-0.1.0/tests/test_arwen_global_semilag_cuda.py +438 -0
  406. gpuwm_global-0.1.0/tests/test_arwen_global_semilag_interpolate.py +328 -0
  407. gpuwm_global-0.1.0/tests/test_arwen_global_semilag_quintic.py +342 -0
  408. gpuwm_global-0.1.0/tests/test_arwen_global_semilag_spill.py +272 -0
  409. gpuwm_global-0.1.0/tests/test_arwen_global_semilag_step.py +835 -0
  410. gpuwm_global-0.1.0/tests/test_arwen_global_semilag_tracers.py +800 -0
  411. gpuwm_global-0.1.0/tests/test_arwen_global_semilag_trajectory.py +367 -0
  412. gpuwm_global-0.1.0/tests/test_arwen_global_shipped_reductions.py +138 -0
  413. gpuwm_global-0.1.0/tests/test_arwen_global_sizer_doors.py +587 -0
  414. gpuwm_global-0.1.0/tests/test_arwen_global_sizing.py +1113 -0
  415. gpuwm_global-0.1.0/tests/test_arwen_global_source_mappings.py +403 -0
  416. gpuwm_global-0.1.0/tests/test_arwen_global_spectral_eddy_viscosity.py +356 -0
  417. gpuwm_global-0.1.0/tests/test_arwen_global_spectrum_bands_levels.py +85 -0
  418. gpuwm_global-0.1.0/tests/test_arwen_global_statics.py +739 -0
  419. gpuwm_global-0.1.0/tests/test_arwen_global_surface_energy.py +848 -0
  420. gpuwm_global-0.1.0/tests/test_arwen_global_surface_seeding.py +916 -0
  421. gpuwm_global-0.1.0/tests/test_arwen_global_transport_fused.py +108 -0
  422. gpuwm_global-0.1.0/tests/test_arwen_global_transport_stacked.py +227 -0
  423. gpuwm_global-0.1.0/tests/test_arwen_global_tui_worker.py +192 -0
  424. gpuwm_global-0.1.0/tests/test_arwen_global_upper_air_scorecard.py +702 -0
  425. gpuwm_global-0.1.0/tests/test_arwen_global_vertical_jet_refined.py +332 -0
  426. gpuwm_global-0.1.0/tests/test_arwen_global_vertical_modes.py +722 -0
  427. gpuwm_global-0.1.0/tests/test_arwen_global_vertical_numerics.py +328 -0
  428. gpuwm_global-0.1.0/tests/test_arwen_global_vertical_surface_stretched.py +263 -0
  429. gpuwm_global-0.1.0/tests/test_arwen_global_water_budget.py +329 -0
  430. gpuwm_global-0.1.0/tests/test_ci_workflows.py +417 -0
  431. gpuwm_global-0.1.0/tests/test_cli_doors.py +530 -0
  432. gpuwm_global-0.1.0/tests/test_doors_bundle.py +391 -0
  433. gpuwm_global-0.1.0/tests/test_engine_compat.py +120 -0
  434. gpuwm_global-0.1.0/tests/test_engine_signature_gaps.py +277 -0
  435. gpuwm_global-0.1.0/tests/test_global_spectral_bit_identity.py +213 -0
  436. gpuwm_global-0.1.0/tests/test_global_spectral_checkpoint.py +182 -0
  437. gpuwm_global-0.1.0/tests/test_global_spectral_cli_artifacts.py +212 -0
  438. gpuwm_global-0.1.0/tests/test_global_spectral_compression.py +193 -0
  439. gpuwm_global-0.1.0/tests/test_global_spectral_config_cli.py +151 -0
  440. gpuwm_global-0.1.0/tests/test_global_spectral_export.py +37 -0
  441. gpuwm_global-0.1.0/tests/test_global_spectral_fourier_waist.py +420 -0
  442. gpuwm_global-0.1.0/tests/test_global_spectral_fused_kernels_cpu.py +363 -0
  443. gpuwm_global-0.1.0/tests/test_global_spectral_primitive.py +177 -0
  444. gpuwm_global-0.1.0/tests/test_global_spectral_sampling.py +101 -0
  445. gpuwm_global-0.1.0/tests/test_global_spectral_sampling_device.py +147 -0
  446. gpuwm_global-0.1.0/tests/test_global_spectral_shallow_water.py +48 -0
  447. gpuwm_global-0.1.0/tests/test_global_spectral_streaming.py +228 -0
  448. gpuwm_global-0.1.0/tests/test_global_spectral_transform.py +344 -0
  449. gpuwm_global-0.1.0/tests/test_global_spectral_vector.py +59 -0
  450. gpuwm_global-0.1.0/tests/test_line_endings.py +191 -0
  451. gpuwm_global-0.1.0/tests/test_mapped_source_compat.py +643 -0
  452. gpuwm_global-0.1.0/tests/test_no_provenance.py +1010 -0
  453. gpuwm_global-0.1.0/tests/test_obs_doors_fallback.py +118 -0
  454. gpuwm_global-0.1.0/tests/test_obs_stream_doors.py +152 -0
  455. gpuwm_global-0.1.0/tests/test_package_data_coverage.py +126 -0
  456. gpuwm_global-0.1.0/tests/test_packaging_declaration.py +598 -0
  457. gpuwm_global-0.1.0/tests/test_python_floor.py +113 -0
  458. gpuwm_global-0.1.0/tests/test_resync_core_carve.py +363 -0
  459. gpuwm_global-0.1.0/tests/test_suite_device_and_gap_marks.py +365 -0
  460. gpuwm_global-0.1.0/tools/__init__.py +11 -0
  461. gpuwm_global-0.1.0/tools/arwen_global_band_probe.py +302 -0
  462. gpuwm_global-0.1.0/tools/arwen_global_bias_vs_gfs.py +368 -0
  463. gpuwm_global-0.1.0/tools/arwen_global_cfl_sweep.py +289 -0
  464. gpuwm_global-0.1.0/tools/arwen_global_checkpoint_diff.py +119 -0
  465. gpuwm_global-0.1.0/tools/arwen_global_checkpoint_identity.py +92 -0
  466. gpuwm_global-0.1.0/tools/arwen_global_control_twin_chart.py +99 -0
  467. gpuwm_global-0.1.0/tools/arwen_global_energy_bands.py +484 -0
  468. gpuwm_global-0.1.0/tools/arwen_global_ensemble_osse_chart.py +211 -0
  469. gpuwm_global-0.1.0/tools/arwen_global_fft_band_probe.py +225 -0
  470. gpuwm_global-0.1.0/tools/arwen_global_igra2_levels_csv.py +208 -0
  471. gpuwm_global-0.1.0/tools/arwen_global_ke_stick.py +114 -0
  472. gpuwm_global-0.1.0/tools/arwen_global_level_set_evidence.py +167 -0
  473. gpuwm_global-0.1.0/tools/arwen_global_microwave_evidence.py +294 -0
  474. gpuwm_global-0.1.0/tools/arwen_global_pack_probe.py +157 -0
  475. gpuwm_global-0.1.0/tools/arwen_global_precip_trace.py +558 -0
  476. gpuwm_global-0.1.0/tools/arwen_global_profile_report.py +276 -0
  477. gpuwm_global-0.1.0/tools/arwen_global_reduction_probe.py +431 -0
  478. gpuwm_global-0.1.0/tools/arwen_global_render_catalog.py +148 -0
  479. gpuwm_global-0.1.0/tools/arwen_global_resident_floor_probe.py +236 -0
  480. gpuwm_global-0.1.0/tools/arwen_global_ringing_fraction.py +118 -0
  481. gpuwm_global-0.1.0/tools/arwen_global_score_compare.py +210 -0
  482. gpuwm_global-0.1.0/tools/arwen_global_score_upper_air.sh +86 -0
  483. gpuwm_global-0.1.0/tools/arwen_global_semilag_cases.py +272 -0
  484. gpuwm_global-0.1.0/tools/arwen_global_spectrum_bands.py +198 -0
  485. gpuwm_global-0.1.0/tools/arwen_global_waist_probe.py +502 -0
  486. gpuwm_global-0.1.0/tools/arwen_global_waist_step_probe.py +180 -0
  487. gpuwm_global-0.1.0/tools/arwen_global_ysu_lane_charts.py +341 -0
  488. gpuwm_global-0.1.0/tools/build_cli_reference.py +186 -0
  489. gpuwm_global-0.1.0/tools/build_door_bundle.py +298 -0
  490. gpuwm_global-0.1.0/tools/check_case_token_leakage.py +972 -0
  491. gpuwm_global-0.1.0/tools/check_doc_examples.py +315 -0
  492. gpuwm_global-0.1.0/tools/check_line_endings.py +246 -0
  493. gpuwm_global-0.1.0/tools/ci_test_replay.py +339 -0
  494. gpuwm_global-0.1.0/tools/gf_wrf461_oracle/gf_field_lists.py +176 -0
  495. gpuwm_global-0.1.0/tools/global_spectral_dycore.py +5 -0
  496. gpuwm_global-0.1.0/tools/global_spectral_streaming_probe.py +141 -0
  497. gpuwm_global-0.1.0/tools/gpu_selftest_rhs.py +724 -0
  498. gpuwm_global-0.1.0/tools/measure_boundary.py +222 -0
  499. gpuwm_global-0.1.0/tools/measure_engine_signatures.py +160 -0
  500. gpuwm_global-0.1.0/tools/pin_engine_seam.py +353 -0
  501. gpuwm_global-0.1.0/tools/provenance_sweep.py +91 -0
  502. gpuwm_global-0.1.0/tools/resync_from_owner.py +1051 -0
@@ -0,0 +1,311 @@
1
+ # Build the Rust doors this package publishes, on both platforms, and pin
2
+ # them.
3
+ #
4
+ # THIS WORKFLOW PUBLISHES NOTHING. It has `contents: read` and no other
5
+ # permission, no `environment`, and no `id-token`, so it holds no PyPI
6
+ # identity and no authority to write to a release. What it produces is two
7
+ # build artifacts and a pins document; publish.yml is the only file that can
8
+ # attach them to anything, and every job in that file is gated on a
9
+ # repository variable that does not exist.
10
+ #
11
+ # WHY THIS FILE EXISTS AT ALL. The wheel carries no Rust. Eight of the
12
+ # fourteen binaries the model runs on are published by this package rather
13
+ # than by the engine: six have no binary in any published bundle, and two
14
+ # (rw_asos, rw_goes) exist in the engine's bundle under the same filename in
15
+ # an older build with none of the subcommands this package calls. Without a
16
+ # bundle, obtaining those eight means a Rust toolchain, a source checkout and
17
+ # a few minutes of compiling, which by the rule that a capability a user
18
+ # cannot reach does not exist means eight doors were never shipped.
19
+ #
20
+ # WHERE THE CRATES COME FROM. Not from this repository. They live in the
21
+ # engine's `tools/rustwx` workspace and stay there: two copies of a decoder
22
+ # is how the two drift. This workflow checks the engine's public repository
23
+ # out at the revision `src/arwen_global/data/door-pins.json` names and builds
24
+ # only the targets the engine's own bundle does not carry.
25
+ #
26
+ # WHAT IS KNOWN NOT TO WORK YET, STATED HERE RATHER THAN DISCOVERED IN A RUN.
27
+ # As of 2026-09-07 the engine's public repository does not carry the crates
28
+ # this builds. `FahrenheitResearch/arwen` at the 2.7.0 snapshot has a
29
+ # `rw-obs` with four binaries (mrms, stage4, asos, opera) and no `rw-atms`
30
+ # crate at all; the five observation binaries and the ATMS door exist only on
31
+ # the branch this package was carved from, and the `asos.rs` and `rw-goes`
32
+ # there are ahead of the public ones by the subcommands named above. So the
33
+ # `preflight` job below asks the checkout for every crate and binary it is
34
+ # about to build and FAILS NAMING THE MISSING ONES rather than producing a
35
+ # bundle with holes in it. The breakage that prevents: a release page
36
+ # carrying an eight-door bundle that holds four doors, whose users get a
37
+ # missing-subcommand error deep inside a DA cycle.
38
+ #
39
+ # The day the engine takes those crates onto its own line, this workflow
40
+ # starts passing with a revision bump and nothing else, and the bundle it
41
+ # builds shrinks to nothing. That is the better end state.
42
+
43
+ name: bridges
44
+
45
+ on:
46
+ workflow_call:
47
+ inputs:
48
+ engine_ref:
49
+ description: >-
50
+ The engine revision to build the doors from. Defaults to the
51
+ `engine_source_rev` in the packaged pins, which is the one number
52
+ that says which source the shipped binaries came from.
53
+ type: string
54
+ required: false
55
+ default: ""
56
+ outputs:
57
+ bundle_artifact_prefix:
58
+ description: The artifact name prefix each platform's bundle is uploaded under.
59
+ value: ${{ jobs.declare.outputs.bundle_artifact_prefix }}
60
+ platforms:
61
+ description: Space-separated platform keys this run built bundles for.
62
+ value: ${{ jobs.declare.outputs.platforms }}
63
+ engine_ref:
64
+ description: The engine revision the doors were actually built from.
65
+ value: ${{ jobs.declare.outputs.engine_ref }}
66
+ workflow_dispatch:
67
+ inputs:
68
+ engine_ref:
69
+ description: Engine revision to build from (blank = the packaged pin)
70
+ type: string
71
+ required: false
72
+ default: ""
73
+
74
+ permissions:
75
+ contents: read
76
+
77
+ concurrency:
78
+ group: bridges-${{ github.repository }}-${{ github.ref }}
79
+ cancel-in-progress: true
80
+
81
+ defaults:
82
+ run:
83
+ shell: bash
84
+
85
+ env:
86
+ # The engine's public repository. The crates are read from it and never
87
+ # copied into this one.
88
+ ENGINE_REPOSITORY: FahrenheitResearch/arwen
89
+ ARTIFACT_PREFIX: arwen-global-doors
90
+
91
+ jobs:
92
+ # ---------------------------------------------------------------------
93
+ # 1. What this run is going to build, decided once and read by the rest.
94
+ # The release string and the engine revision both come out of the
95
+ # packaged pins so there is no second place to state either.
96
+ # ---------------------------------------------------------------------
97
+ declare:
98
+ runs-on: ubuntu-latest
99
+ outputs:
100
+ bundle_artifact_prefix: ${{ env.ARTIFACT_PREFIX }}
101
+ platforms: ${{ steps.read.outputs.platforms }}
102
+ engine_ref: ${{ steps.read.outputs.engine_ref }}
103
+ release: ${{ steps.read.outputs.release }}
104
+ doors: ${{ steps.read.outputs.doors }}
105
+ steps:
106
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
107
+ with:
108
+ persist-credentials: false
109
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
110
+ with:
111
+ python-version: "3.11"
112
+ - id: read
113
+ env:
114
+ REQUESTED_REF: ${{ inputs.engine_ref }}
115
+ run: |
116
+ python - <<'PY' >> "$GITHUB_OUTPUT"
117
+ import json, os, sys
118
+ sys.path.insert(0, "tools")
119
+ from pathlib import Path
120
+ import importlib.util
121
+ spec = importlib.util.spec_from_file_location(
122
+ "doors", "src/arwen_global/doors.py")
123
+ doors = importlib.util.module_from_spec(spec)
124
+ # Registered before it executes: doors.py declares dataclasses,
125
+ # and dataclasses resolve a field's annotation through
126
+ # sys.modules[cls.__module__]; a module executed from a spec and
127
+ # never registered is None there, and the first public run of this
128
+ # job died on that AttributeError before it read the pins.
129
+ sys.modules[spec.name] = doors
130
+ spec.loader.exec_module(doors)
131
+ pins = json.loads(
132
+ Path("src/arwen_global/data/door-pins.json").read_text("utf-8"))
133
+ requested = os.environ.get("REQUESTED_REF", "").strip()
134
+ engine = requested or pins.get("engine_source_rev") or ""
135
+ if not engine:
136
+ raise SystemExit(
137
+ "bridges: no engine revision to build from. The packaged "
138
+ "pins carry no engine_source_rev and none was passed in, "
139
+ "so there is nothing that says which source these binaries "
140
+ "would come from.")
141
+ names = [d.name for d in doors.doors_from_bundle(doors.COMPANION_BUNDLE)]
142
+ print(f"engine_ref={engine}")
143
+ print(f"release={pins.get('release') or 'v0.0.0-dev'}")
144
+ print("platforms=" + " ".join(doors.SUPPORTED_PLATFORMS))
145
+ print("doors=" + " ".join(names))
146
+ PY
147
+ - run: |
148
+ echo "engine ${{ steps.read.outputs.engine_ref }}"
149
+ echo "release ${{ steps.read.outputs.release }}"
150
+ echo "doors ${{ steps.read.outputs.doors }}"
151
+
152
+ # ---------------------------------------------------------------------
153
+ # 2. Does the engine checkout actually carry what this builds?
154
+ #
155
+ # THE BREAKAGE THIS PREVENTS: a bundle that packs whatever targets
156
+ # happened to build, published as the eight doors, whose missing
157
+ # members surface as an unknown-subcommand error in the middle of a
158
+ # user's DA cycle rather than at the door. Asked once, before any
159
+ # compiling, so a run that cannot succeed says why in its first
160
+ # minute.
161
+ # ---------------------------------------------------------------------
162
+ preflight:
163
+ needs: declare
164
+ runs-on: ubuntu-latest
165
+ steps:
166
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
167
+ with:
168
+ persist-credentials: false
169
+ path: package
170
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
171
+ with:
172
+ repository: ${{ env.ENGINE_REPOSITORY }}
173
+ ref: ${{ needs.declare.outputs.engine_ref }}
174
+ persist-credentials: false
175
+ path: engine
176
+ - name: every crate and binary target this run needs is present
177
+ env:
178
+ DOORS: ${{ needs.declare.outputs.doors }}
179
+ run: |
180
+ set -uo pipefail
181
+ missing=()
182
+ for door in $DOORS; do
183
+ hits=$(grep -rl "name = \"${door}\"" engine/tools/rustwx/crates/*/Cargo.toml 2>/dev/null || true)
184
+ if [ -z "$hits" ]; then
185
+ missing+=("$door")
186
+ else
187
+ echo "ok ${door} <- ${hits}"
188
+ fi
189
+ done
190
+ if [ ${#missing[@]} -ne 0 ]; then
191
+ echo >&2
192
+ echo "bridges: the engine checkout at ${{ needs.declare.outputs.engine_ref }} of ${ENGINE_REPOSITORY} declares no binary target for: ${missing[*]}" >&2
193
+ echo "bridges: those crates live only on the branch this package was carved from. Until the engine's line carries them, this workflow cannot build the bundle, and a partial bundle is worse than none: its members would fail as an unknown subcommand inside a run rather than at the door." >&2
194
+ echo "bridges: the remedy is the patch series delivered with this package, which lands crates/rw-atms and the five rw-obs binaries (plus the asos.rs and rw-goes subcommands) on the engine. Then bump engine_source_rev in src/arwen_global/data/door-pins.json." >&2
195
+ exit 1
196
+ fi
197
+
198
+ # ---------------------------------------------------------------------
199
+ # 3. Build and pack, one job per platform. `--locked --offline` against
200
+ # the workspace's own vendored closure, so the bytes do not depend on
201
+ # what crates.io served that morning, and GPUWM_BRIDGE_SOURCE_REV is
202
+ # set explicitly because a CI checkout's HEAD is the package's, not
203
+ # the engine's.
204
+ # ---------------------------------------------------------------------
205
+ build:
206
+ needs: [declare, preflight]
207
+ strategy:
208
+ fail-fast: false
209
+ matrix:
210
+ include:
211
+ - platform: linux-x86_64
212
+ runs-on: ubuntu-latest
213
+ - platform: win-x86_64
214
+ runs-on: windows-latest
215
+ runs-on: ${{ matrix.runs-on }}
216
+ steps:
217
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
218
+ with:
219
+ persist-credentials: false
220
+ path: package
221
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
222
+ with:
223
+ repository: ${{ env.ENGINE_REPOSITORY }}
224
+ ref: ${{ needs.declare.outputs.engine_ref }}
225
+ persist-credentials: false
226
+ path: engine
227
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
228
+ with:
229
+ python-version: "3.11"
230
+ - name: rust toolchain
231
+ run: |
232
+ rustup toolchain install stable --profile minimal
233
+ rustup default stable
234
+ rustc --version
235
+ cargo --version
236
+ - name: build the door targets
237
+ working-directory: engine/tools/rustwx
238
+ env:
239
+ GPUWM_BRIDGE_SOURCE_REV: ${{ needs.declare.outputs.engine_ref }}
240
+ DOORS: ${{ needs.declare.outputs.doors }}
241
+ run: |
242
+ set -euo pipefail
243
+ args=()
244
+ for door in $DOORS; do args+=(--bin "$door"); done
245
+ # One cargo invocation so the workspace resolves once and every
246
+ # door is built against the same dependency graph.
247
+ cargo build --release --locked --offline \
248
+ -p rw-obs -p rw-goes -p rw-atms "${args[@]}"
249
+ - name: pack the bundle
250
+ working-directory: package
251
+ env:
252
+ RELEASE: ${{ needs.declare.outputs.release }}
253
+ run: |
254
+ python tools/build_door_bundle.py pack \
255
+ --release "$RELEASE" \
256
+ --platform ${{ matrix.platform }} \
257
+ --search ../engine/tools/rustwx/target/release \
258
+ --out dist-doors
259
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
260
+ with:
261
+ name: ${{ env.ARTIFACT_PREFIX }}-${{ matrix.platform }}
262
+ path: package/dist-doors/*.zip
263
+ if-no-files-found: error
264
+
265
+ # ---------------------------------------------------------------------
266
+ # 4. Pin, on one machine, from the bundles the build jobs produced.
267
+ # Every number written is a hash of bytes that exist here now. The
268
+ # source-revision stamp is checked out of each member without running
269
+ # it, so a bundle predating the declared engine revision is refused
270
+ # before it can become a perfectly-pinned release asset.
271
+ # ---------------------------------------------------------------------
272
+ pin:
273
+ needs: [declare, build]
274
+ runs-on: ubuntu-latest
275
+ steps:
276
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
277
+ with:
278
+ persist-credentials: false
279
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
280
+ with:
281
+ python-version: "3.11"
282
+ - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
283
+ with:
284
+ pattern: ${{ env.ARTIFACT_PREFIX }}-*
285
+ path: bundles
286
+ merge-multiple: true
287
+ - name: pin the bundles into the packaged pins document
288
+ env:
289
+ RELEASE: ${{ needs.declare.outputs.release }}
290
+ ENGINE_REF: ${{ needs.declare.outputs.engine_ref }}
291
+ run: |
292
+ set -euo pipefail
293
+ ls -l bundles/
294
+ # rw_atms is named here, and only rw_atms, because its crate
295
+ # declares the source-revision stamp as a `pub static` nothing
296
+ # reads, so the linker drops it and the binary carries none. The
297
+ # exemption is on the command line of every cut precisely so it
298
+ # cannot be mistaken for a door that was checked; the one-line fix
299
+ # is in this release's patch series and deletes this flag.
300
+ python tools/build_door_bundle.py pin \
301
+ --release "$RELEASE" \
302
+ --source-rev "$ENGINE_REF" \
303
+ --engine-rev "$ENGINE_REF" \
304
+ --allow-unstamped rw_atms \
305
+ bundles/*.zip
306
+ git --no-pager diff --stat -- src/arwen_global/data/door-pins.json
307
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
308
+ with:
309
+ name: door-pins
310
+ path: src/arwen_global/data/door-pins.json
311
+ if-no-files-found: error
@@ -0,0 +1,122 @@
1
+ # The distribution itself: an sdist, a wheel, well-formed metadata, and one
2
+ # number that agrees with itself everywhere it is stated.
3
+ #
4
+ # Separate from test.yml because the two ask different questions. test.yml
5
+ # asks whether the installed package works; this asks whether the thing that
6
+ # would be uploaded is the thing the repository says it is. A cut that fails
7
+ # only here has working code and an artefact nobody should publish.
8
+ name: build
9
+
10
+ on:
11
+ push:
12
+ pull_request:
13
+ workflow_dispatch:
14
+ # A bare `push:` fires on branch pushes AND on tag pushes, which is what
15
+ # gives the version-against-tag gate below something to compare. Building
16
+ # on a tag PUBLISHES NOTHING: this workflow has no PyPI identity, no
17
+ # `environment`, and no `id-token` permission, so it could not upload if it
18
+ # tried.
19
+
20
+ permissions:
21
+ contents: read
22
+
23
+ concurrency:
24
+ group: build-${{ github.repository }}-${{ github.ref }}
25
+ cancel-in-progress: true
26
+
27
+ defaults:
28
+ run:
29
+ shell: bash
30
+
31
+ jobs:
32
+ build:
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
36
+ with:
37
+ persist-credentials: false
38
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
39
+ with:
40
+ python-version: "3.11"
41
+
42
+ - name: build the sdist and the wheel
43
+ run: |
44
+ python -m pip install --upgrade pip
45
+ python -m pip install build twine "setuptools>=77" wheel
46
+ python -m build
47
+ ls -l dist/
48
+
49
+ # THE BREAKAGE THIS PREVENTS: a wheel and an sdist whose metadata
50
+ # differ, or whose long description PyPI refuses to render. Both land
51
+ # after the upload, where nothing can be taken back.
52
+ - name: the metadata is well formed
53
+ run: python -m twine check --strict dist/*
54
+
55
+ - name: exactly one wheel and exactly one sdist, and nothing else
56
+ run: |
57
+ set -euo pipefail
58
+ shopt -s nullglob
59
+ wheels=(dist/gpuwm_global-*.whl)
60
+ sdists=(dist/gpuwm_global-*.tar.gz)
61
+ everything=(dist/*)
62
+ if [ "${#wheels[@]}" -ne 1 ] || [ "${#sdists[@]}" -ne 1 ] || [ "${#everything[@]}" -ne 2 ]; then
63
+ echo "dist/ must hold exactly one wheel and one sdist for gpuwm-global" >&2
64
+ ls -l dist/ >&2
65
+ exit 1
66
+ fi
67
+
68
+ # The version is READ BACK from the installed distribution's metadata,
69
+ # not from pyproject.toml. Reading it from the source would compare
70
+ # the declaration against itself and pass on a wheel built from
71
+ # something else. THE BREAKAGE: the engine shipped a runtime constant
72
+ # that disagreed with its own wheel for four releases, because two
73
+ # files stated one number.
74
+ #
75
+ # The wheel is installed WITH its dependencies. `arwen_global` imports
76
+ # the model at package level, and the model imports numpy and the
77
+ # engine, so a --no-deps install cannot be imported at all: the first
78
+ # public run of this job (2026-09-10) died on ModuleNotFoundError for
79
+ # numpy before it read a version. Resolving the engine from PyPI here
80
+ # is also the first proof that the wheel's dependency table resolves.
81
+ - name: the version the wheel carries is the version the package reports
82
+ run: |
83
+ set -euo pipefail
84
+ python -m venv "$RUNNER_TEMP/metadata-venv"
85
+ "$RUNNER_TEMP/metadata-venv/bin/python" -m pip install --quiet --upgrade pip
86
+ "$RUNNER_TEMP/metadata-venv/bin/python" -m pip install --quiet dist/gpuwm_global-*.whl
87
+ metadata=$("$RUNNER_TEMP/metadata-venv/bin/python" -c "from importlib.metadata import version; print(version('gpuwm-global'))")
88
+ runtime=$("$RUNNER_TEMP/metadata-venv/bin/python" -c "import arwen_global; print(arwen_global.__version__)")
89
+ echo "wheel metadata: $metadata"
90
+ echo "package reports: $runtime"
91
+ test "$metadata" = "$runtime" || {
92
+ echo "the wheel's metadata says $metadata and the installed package says $runtime" >&2
93
+ exit 1
94
+ }
95
+ echo "GPUWM_GLOBAL_VERSION=$metadata" >> "$GITHUB_ENV"
96
+
97
+ # Only meaningful on a tag, and it is the gate that stops a vX.Y.Z tag
98
+ # from carrying a wheel of some other version. A tag is spent once it
99
+ # exists (forward commits only), so a mismatch discovered after the
100
+ # upload costs a version number.
101
+ - name: on a tag, the version equals the tag
102
+ if: startsWith(github.ref, 'refs/tags/v')
103
+ run: |
104
+ set -euo pipefail
105
+ tag="${GITHUB_REF_NAME}"
106
+ expected="${tag#v}"
107
+ test "$GPUWM_GLOBAL_VERSION" = "$expected" || {
108
+ echo "tag ${tag} expects version ${expected}; the built distribution carries ${GPUWM_GLOBAL_VERSION}" >&2
109
+ exit 1
110
+ }
111
+ echo "tag ${tag} and distribution ${GPUWM_GLOBAL_VERSION} agree"
112
+
113
+ - name: record the digests of what was built
114
+ run: |
115
+ cd dist
116
+ sha256sum -- * | tee SHA256SUMS
117
+
118
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
119
+ with:
120
+ name: python-dists
121
+ path: dist/*
122
+ if-no-files-found: error