vortex-nwp 2.0.0__py3-none-any.whl

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 (144) hide show
  1. vortex/__init__.py +159 -0
  2. vortex/algo/__init__.py +13 -0
  3. vortex/algo/components.py +2462 -0
  4. vortex/algo/mpitools.py +1953 -0
  5. vortex/algo/mpitools_templates/__init__.py +1 -0
  6. vortex/algo/mpitools_templates/envelope_wrapper_default.tpl +27 -0
  7. vortex/algo/mpitools_templates/envelope_wrapper_mpiauto.tpl +29 -0
  8. vortex/algo/mpitools_templates/wrapstd_wrapper_default.tpl +18 -0
  9. vortex/algo/serversynctools.py +171 -0
  10. vortex/config.py +112 -0
  11. vortex/data/__init__.py +19 -0
  12. vortex/data/abstractstores.py +1510 -0
  13. vortex/data/containers.py +835 -0
  14. vortex/data/contents.py +622 -0
  15. vortex/data/executables.py +275 -0
  16. vortex/data/flow.py +119 -0
  17. vortex/data/geometries.ini +2689 -0
  18. vortex/data/geometries.py +799 -0
  19. vortex/data/handlers.py +1230 -0
  20. vortex/data/outflow.py +67 -0
  21. vortex/data/providers.py +487 -0
  22. vortex/data/resources.py +207 -0
  23. vortex/data/stores.py +1390 -0
  24. vortex/data/sync_templates/__init__.py +0 -0
  25. vortex/gloves.py +309 -0
  26. vortex/layout/__init__.py +20 -0
  27. vortex/layout/contexts.py +577 -0
  28. vortex/layout/dataflow.py +1220 -0
  29. vortex/layout/monitor.py +969 -0
  30. vortex/nwp/__init__.py +14 -0
  31. vortex/nwp/algo/__init__.py +21 -0
  32. vortex/nwp/algo/assim.py +537 -0
  33. vortex/nwp/algo/clim.py +1086 -0
  34. vortex/nwp/algo/coupling.py +831 -0
  35. vortex/nwp/algo/eda.py +840 -0
  36. vortex/nwp/algo/eps.py +785 -0
  37. vortex/nwp/algo/forecasts.py +886 -0
  38. vortex/nwp/algo/fpserver.py +1303 -0
  39. vortex/nwp/algo/ifsnaming.py +463 -0
  40. vortex/nwp/algo/ifsroot.py +404 -0
  41. vortex/nwp/algo/monitoring.py +263 -0
  42. vortex/nwp/algo/mpitools.py +694 -0
  43. vortex/nwp/algo/odbtools.py +1258 -0
  44. vortex/nwp/algo/oopsroot.py +916 -0
  45. vortex/nwp/algo/oopstests.py +220 -0
  46. vortex/nwp/algo/request.py +660 -0
  47. vortex/nwp/algo/stdpost.py +1641 -0
  48. vortex/nwp/data/__init__.py +30 -0
  49. vortex/nwp/data/assim.py +380 -0
  50. vortex/nwp/data/boundaries.py +314 -0
  51. vortex/nwp/data/climfiles.py +521 -0
  52. vortex/nwp/data/configfiles.py +153 -0
  53. vortex/nwp/data/consts.py +954 -0
  54. vortex/nwp/data/ctpini.py +149 -0
  55. vortex/nwp/data/diagnostics.py +209 -0
  56. vortex/nwp/data/eda.py +147 -0
  57. vortex/nwp/data/eps.py +432 -0
  58. vortex/nwp/data/executables.py +1045 -0
  59. vortex/nwp/data/fields.py +111 -0
  60. vortex/nwp/data/gridfiles.py +380 -0
  61. vortex/nwp/data/logs.py +584 -0
  62. vortex/nwp/data/modelstates.py +363 -0
  63. vortex/nwp/data/monitoring.py +193 -0
  64. vortex/nwp/data/namelists.py +696 -0
  65. vortex/nwp/data/obs.py +840 -0
  66. vortex/nwp/data/oopsexec.py +74 -0
  67. vortex/nwp/data/providers.py +207 -0
  68. vortex/nwp/data/query.py +206 -0
  69. vortex/nwp/data/stores.py +160 -0
  70. vortex/nwp/data/surfex.py +337 -0
  71. vortex/nwp/syntax/__init__.py +9 -0
  72. vortex/nwp/syntax/stdattrs.py +437 -0
  73. vortex/nwp/tools/__init__.py +10 -0
  74. vortex/nwp/tools/addons.py +40 -0
  75. vortex/nwp/tools/agt.py +67 -0
  76. vortex/nwp/tools/bdap.py +59 -0
  77. vortex/nwp/tools/bdcp.py +41 -0
  78. vortex/nwp/tools/bdm.py +24 -0
  79. vortex/nwp/tools/bdmp.py +54 -0
  80. vortex/nwp/tools/conftools.py +1661 -0
  81. vortex/nwp/tools/drhook.py +66 -0
  82. vortex/nwp/tools/grib.py +294 -0
  83. vortex/nwp/tools/gribdiff.py +104 -0
  84. vortex/nwp/tools/ifstools.py +203 -0
  85. vortex/nwp/tools/igastuff.py +273 -0
  86. vortex/nwp/tools/mars.py +68 -0
  87. vortex/nwp/tools/odb.py +657 -0
  88. vortex/nwp/tools/partitioning.py +258 -0
  89. vortex/nwp/tools/satrad.py +71 -0
  90. vortex/nwp/util/__init__.py +6 -0
  91. vortex/nwp/util/async.py +212 -0
  92. vortex/nwp/util/beacon.py +40 -0
  93. vortex/nwp/util/diffpygram.py +447 -0
  94. vortex/nwp/util/ens.py +279 -0
  95. vortex/nwp/util/hooks.py +139 -0
  96. vortex/nwp/util/taskdeco.py +85 -0
  97. vortex/nwp/util/usepygram.py +697 -0
  98. vortex/nwp/util/usetnt.py +101 -0
  99. vortex/proxy.py +6 -0
  100. vortex/sessions.py +374 -0
  101. vortex/syntax/__init__.py +9 -0
  102. vortex/syntax/stdattrs.py +867 -0
  103. vortex/syntax/stddeco.py +185 -0
  104. vortex/toolbox.py +1117 -0
  105. vortex/tools/__init__.py +20 -0
  106. vortex/tools/actions.py +523 -0
  107. vortex/tools/addons.py +316 -0
  108. vortex/tools/arm.py +96 -0
  109. vortex/tools/compression.py +325 -0
  110. vortex/tools/date.py +27 -0
  111. vortex/tools/ddhpack.py +10 -0
  112. vortex/tools/delayedactions.py +782 -0
  113. vortex/tools/env.py +541 -0
  114. vortex/tools/folder.py +834 -0
  115. vortex/tools/grib.py +738 -0
  116. vortex/tools/lfi.py +953 -0
  117. vortex/tools/listings.py +423 -0
  118. vortex/tools/names.py +637 -0
  119. vortex/tools/net.py +2124 -0
  120. vortex/tools/odb.py +10 -0
  121. vortex/tools/parallelism.py +368 -0
  122. vortex/tools/prestaging.py +210 -0
  123. vortex/tools/rawfiles.py +10 -0
  124. vortex/tools/schedulers.py +480 -0
  125. vortex/tools/services.py +940 -0
  126. vortex/tools/storage.py +996 -0
  127. vortex/tools/surfex.py +61 -0
  128. vortex/tools/systems.py +3976 -0
  129. vortex/tools/targets.py +440 -0
  130. vortex/util/__init__.py +9 -0
  131. vortex/util/config.py +1122 -0
  132. vortex/util/empty.py +24 -0
  133. vortex/util/helpers.py +216 -0
  134. vortex/util/introspection.py +69 -0
  135. vortex/util/iosponge.py +80 -0
  136. vortex/util/roles.py +49 -0
  137. vortex/util/storefunctions.py +129 -0
  138. vortex/util/structs.py +26 -0
  139. vortex/util/worker.py +162 -0
  140. vortex_nwp-2.0.0.dist-info/METADATA +67 -0
  141. vortex_nwp-2.0.0.dist-info/RECORD +144 -0
  142. vortex_nwp-2.0.0.dist-info/WHEEL +5 -0
  143. vortex_nwp-2.0.0.dist-info/licenses/LICENSE +517 -0
  144. vortex_nwp-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,30 @@
1
+ """
2
+ Data resources (mostly NWP).
3
+ """
4
+
5
+ # Recursive inclusion of packages with potential FootprintBase classes
6
+ from . import boundaries as boundaries
7
+ from . import climfiles as climfiles
8
+ from . import consts as consts
9
+ from . import diagnostics as diagnostics
10
+ from . import executables as executables
11
+ from . import fields as fields
12
+ from . import assim as assim
13
+ from . import gridfiles as gridfiles
14
+ from . import logs as logs
15
+ from . import modelstates as modelstates
16
+ from . import namelists as namelists
17
+ from . import obs as obs
18
+ from . import surfex as surfex
19
+ from . import eps as eps
20
+ from . import eda as eda
21
+ from . import providers as providers
22
+ from . import stores as stores
23
+ from . import query as query
24
+ from . import monitoring as monitoring
25
+ from . import ctpini as ctpini
26
+ from . import oopsexec as oopsexec
27
+ from . import configfiles as configfiles
28
+
29
+ #: No automatic export
30
+ __all__ = []
@@ -0,0 +1,380 @@
1
+ """
2
+ Various resources needed to build ad Data Assimilmation system.
3
+ """
4
+
5
+ from bronx.fancies import loggers
6
+ from bronx.stdtypes.date import Time
7
+
8
+ from vortex.data.flow import FlowResource, GeoFlowResource
9
+ from vortex.data.contents import JsonDictContent
10
+ from vortex.data.executables import Script
11
+ from vortex.syntax.stddeco import namebuilding_append, namebuilding_insert
12
+ from vortex.syntax.stdattrs import FmtInt, term_deco
13
+ from ..syntax.stdattrs import gvar
14
+
15
+ #: Automatic export off
16
+ __all__ = []
17
+
18
+ logger = loggers.getLogger(__name__)
19
+
20
+
21
+ @namebuilding_insert(
22
+ "geo", lambda s: s._geo2basename_info(add_stretching=False)
23
+ )
24
+ class _BackgroundErrorInfo(GeoFlowResource):
25
+ """
26
+ A generic class for data in grib format related to the background error.
27
+ """
28
+
29
+ _abstract = True
30
+ _footprint = [
31
+ term_deco,
32
+ gvar,
33
+ dict(
34
+ info="Background standard deviation",
35
+ attr=dict(
36
+ term=dict(optional=True, default=3),
37
+ nativefmt=dict(
38
+ default="grib",
39
+ ),
40
+ gvar=dict(default="errgrib_t[geometry:truncation]"),
41
+ ),
42
+ ),
43
+ ]
44
+
45
+ @property
46
+ def realkind(self):
47
+ return "bgstdinfo"
48
+
49
+
50
+ class BackgroundStdError(_BackgroundErrorInfo):
51
+ """Background error standard deviation.
52
+
53
+ stage:
54
+ * unbal/vor: unbalanced variables fields
55
+ * scr: obs. related fields
56
+ * profile: full variables global and latitude bands horizontal averages
57
+ * full: full variables fields
58
+
59
+ origin:
60
+ * ens: diagnosed from an ensemble
61
+ * diag: diagnosed from randomized (a priori climatological) covariances
62
+
63
+ """
64
+
65
+ _footprint = dict(
66
+ info="Background error standard deviation",
67
+ attr=dict(
68
+ kind=dict(
69
+ values=["bgstderr", "bg_stderr", "bgerrstd"],
70
+ remap=dict(autoremap="first"),
71
+ ),
72
+ stage=dict(
73
+ optional=True,
74
+ default="unbal",
75
+ values=["scr", "vor", "full", "unbal", "profile"],
76
+ remap=dict(vor="unbal"),
77
+ ),
78
+ origin=dict(
79
+ optional=True,
80
+ values=["ens", "diag"],
81
+ default="ens",
82
+ ),
83
+ gvar=dict(default="errgrib_vor_monthly"),
84
+ nativefmt=dict(
85
+ values=["grib", "ascii"],
86
+ default="grib",
87
+ ),
88
+ ),
89
+ )
90
+
91
+ @property
92
+ def realkind(self):
93
+ return "bgstderr"
94
+
95
+ def namebuilding_info(self):
96
+ """Generic information for names fabric, with radical = ``bcor``."""
97
+ infos = super().namebuilding_info()
98
+ infos["src"].append(self.stage)
99
+ if self.stage != "scr":
100
+ infos["src"].append(self.origin)
101
+ return infos
102
+
103
+ def archive_basename(self):
104
+ """OP ARCHIVE specific naming convention."""
105
+ if self.stage in ("unbal",):
106
+ return "(errgribfix:igakey)"
107
+ else:
108
+ return "errgrib_" + self.stage
109
+
110
+ def olive_basename(self):
111
+ """OLIVE specific naming convention."""
112
+ if self.stage in ("unbal",):
113
+ return "errgribvor"
114
+ else:
115
+ return "sigma_b"
116
+
117
+ def gget_basename(self):
118
+ """GGET specific naming convention."""
119
+ return dict(suffix=".m{:02d}".format(self.date.month))
120
+
121
+
122
+ @namebuilding_append("src", lambda s: s.variable)
123
+ class SplitBackgroundStdError(BackgroundStdError):
124
+ """Background error standard deviation, for a given variable."""
125
+
126
+ _footprint = dict(
127
+ info="Background error standard deviation",
128
+ attr=dict(
129
+ variable=dict(
130
+ info="Variable contained in this resource.",
131
+ ),
132
+ gvar=dict(default="errgrib_vor_[variable]_monthly"),
133
+ ),
134
+ )
135
+
136
+
137
+ class BackgroundErrorNorm(_BackgroundErrorInfo):
138
+ """Background error normalisation data for wavelet covariances."""
139
+
140
+ _footprint = [
141
+ dict(
142
+ info="Background error normalisation data for wavelet covariances",
143
+ attr=dict(
144
+ kind=dict(
145
+ values=["bgstdrenorm", "bgerrnorm"],
146
+ remap=dict(autoremap="first"),
147
+ ),
148
+ gvar=dict(default="srenorm_t[geometry:truncation]"),
149
+ ),
150
+ )
151
+ ]
152
+
153
+ @property
154
+ def realkind(self):
155
+ return "bgstdrenorm"
156
+
157
+ def archive_basename(self):
158
+ """OP ARCHIVE specific naming convention."""
159
+ return "srenorm.{!s}".format(self.geometry.truncation)
160
+
161
+ def olive_basename(self):
162
+ """OLIVE specific naming convention."""
163
+ return "srenorm.t{!s}".format(self.geometry.truncation)
164
+
165
+ def archive_pathinfo(self):
166
+ """Op Archive specific pathname needs."""
167
+ return dict(
168
+ nativefmt=self.nativefmt,
169
+ model=self.model,
170
+ date=self.date,
171
+ cutoff=self.cutoff,
172
+ arpege_aearp_directory="wavelet",
173
+ )
174
+
175
+
176
+ @namebuilding_insert(
177
+ "geo", lambda s: s._geo2basename_info(add_stretching=False)
178
+ )
179
+ class Wavelet(GeoFlowResource):
180
+ """Background error wavelet covariances."""
181
+
182
+ _footprint = [
183
+ term_deco,
184
+ gvar,
185
+ dict(
186
+ info="Background error wavelet covariances",
187
+ attr=dict(
188
+ kind=dict(
189
+ values=["wavelet", "waveletcv"],
190
+ remap=dict(autoremap="first"),
191
+ ),
192
+ gvar=dict(default="wavelet_cv_t[geometry:truncation]"),
193
+ term=dict(optional=True, default=3),
194
+ ),
195
+ ),
196
+ ]
197
+
198
+ @property
199
+ def realkind(self):
200
+ return "wavelet"
201
+
202
+ def archive_basename(self):
203
+ """OP ARCHIVE specific naming convention."""
204
+ return "wavelet.cv.{!s}".format(self.geometry.truncation)
205
+
206
+ def olive_basename(self):
207
+ """OLIVE specific naming convention."""
208
+ return "wavelet.cv.t{!s}".format(self.geometry.truncation)
209
+
210
+ def archive_pathinfo(self):
211
+ """Op Archive specific pathname needs."""
212
+ return dict(
213
+ nativefmt=self.nativefmt,
214
+ model=self.model,
215
+ date=self.date,
216
+ cutoff=self.cutoff,
217
+ arpege_aearp_directory=self.realkind,
218
+ )
219
+
220
+
221
+ @namebuilding_insert(
222
+ "geo", lambda s: s._geo2basename_info(add_stretching=False)
223
+ )
224
+ class RawControlVector(GeoFlowResource):
225
+ """Raw Control Vector as issued by minimisation, playing the role of an Increment."""
226
+
227
+ _footprint = dict(
228
+ info="Raw Control Vector",
229
+ attr=dict(
230
+ kind=dict(
231
+ values=["rawcv", "rcv", "increment", "minimcv"],
232
+ remap=dict(autoremap="first"),
233
+ ),
234
+ ),
235
+ )
236
+
237
+ @property
238
+ def realkind(self):
239
+ return "rawcv"
240
+
241
+ def olive_basename(self):
242
+ """OLIVE specific naming convention."""
243
+ return "MININCR"
244
+
245
+
246
+ @namebuilding_insert(
247
+ "geo", lambda s: s._geo2basename_info(add_stretching=False)
248
+ )
249
+ class InternalMinim(GeoFlowResource):
250
+ """Generic class for resources internal to minimisation."""
251
+
252
+ _abstract = True
253
+ _footprint = dict(
254
+ attr=dict(
255
+ nativefmt=dict(
256
+ values=["fa", "lfi", "grib"],
257
+ default="fa",
258
+ ),
259
+ term=dict(
260
+ type=Time,
261
+ optional=True,
262
+ default=Time(-3),
263
+ ),
264
+ )
265
+ )
266
+
267
+ def olive_suffixtr(self):
268
+ """Return BR or HR specific OLIVE suffix according to geo streching."""
269
+ return "HR" if self.geometry.stretching > 1 else "BR"
270
+
271
+
272
+ class StartingPointMinim(InternalMinim):
273
+ """Guess as reprocessed by the minimisation."""
274
+
275
+ _footprint = dict(
276
+ info="Starting Point Output Minim",
277
+ attr=dict(
278
+ kind=dict(
279
+ values=["stpmin"],
280
+ ),
281
+ ),
282
+ )
283
+
284
+ @property
285
+ def realkind(self):
286
+ return "stpmin"
287
+
288
+ def olive_basename(self):
289
+ """OLIVE specific naming convention."""
290
+ return "STPMIN" + self.olive_suffixtr()
291
+
292
+
293
+ class AnalysedStateMinim(InternalMinim):
294
+ """Analysed state as produced by the minimisation."""
295
+
296
+ _footprint = dict(
297
+ info="Analysed Output Minim",
298
+ attr=dict(
299
+ kind=dict(
300
+ values=["anamin"],
301
+ ),
302
+ ),
303
+ )
304
+
305
+ @property
306
+ def realkind(self):
307
+ return "anamin"
308
+
309
+ def olive_basename(self):
310
+ """OLIVE specific naming convention."""
311
+ return "ANAMIN" + self.olive_suffixtr()
312
+
313
+
314
+ class PrecevMap(FlowResource):
315
+ """Map of the precondionning eigenvectors as produced by minimisation."""
316
+
317
+ _footprint = dict(
318
+ info="Prec EV Map",
319
+ attr=dict(
320
+ kind=dict(
321
+ values=["precevmap"],
322
+ ),
323
+ clscontents=dict(
324
+ default=JsonDictContent,
325
+ ),
326
+ nativefmt=dict(
327
+ values=["json"],
328
+ default="json",
329
+ ),
330
+ ),
331
+ )
332
+
333
+ @property
334
+ def realkind(self):
335
+ return "precevmap"
336
+
337
+
338
+ @namebuilding_append("src", lambda s: str(s.evnum))
339
+ class Precev(FlowResource):
340
+ """Precondionning eigenvectors as produced by minimisation."""
341
+
342
+ _footprint = dict(
343
+ info="Starting Point Output Minim",
344
+ attr=dict(
345
+ kind=dict(
346
+ values=["precev"],
347
+ ),
348
+ evnum=dict(
349
+ type=FmtInt,
350
+ args=dict(fmt="03"),
351
+ ),
352
+ ),
353
+ )
354
+
355
+ @property
356
+ def realkind(self):
357
+ return "precev"
358
+
359
+
360
+ class IOassignScript(Script):
361
+ """Scripts for IOASSIGN."""
362
+
363
+ _footprint = [
364
+ gvar,
365
+ dict(
366
+ info="Script for IOASSIGN",
367
+ attr=dict(
368
+ kind=dict(values=["ioassign_script"]),
369
+ gvar=dict(default="ioassign_script_[purpose]"),
370
+ purpose=dict(
371
+ info="The purpose of the script",
372
+ values=["merge", "create"],
373
+ ),
374
+ ),
375
+ ),
376
+ ]
377
+
378
+ @property
379
+ def realkind(self):
380
+ return "ioassign_script"