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,463 @@
1
+ """
2
+ Ensemble of classes that deal with input/output filenames for IFS/Arpege related
3
+ binaries (those that inherits from :class:`IFSParallel`).
4
+
5
+ Since input/output names may vary depending on the code's cycle, the configuration
6
+ number, or basically anything that might emerge from the mind of a twisted
7
+ developer... :mod:`footprints` is used to find out the most appropriate name
8
+ depending on various things:
9
+
10
+ * The model name (e.g. Arpege, Arome, Surfex)
11
+ * The file format (e.g. FA, GRIB)
12
+ * The binary cycle number (e.g. cy42_op2)
13
+ * The configuration number (e.g. 1, 701)
14
+ * The experiment name (e.g; FCST, CANS)
15
+
16
+ An additional attribute *kind* is mandatory, it helps to describe which type of
17
+ input/output file is targeted. The developer can also add customised attributes as
18
+ she/he may see fit.
19
+
20
+ The base class for any object dealing with IFS/Arpege file names is
21
+ :class:`IFSNamingConvention`. The "ifsnamingconv" footprints' collector is used.
22
+
23
+ Do not create :class:`IFSNamingConvention` objects directly. Instead, use the
24
+ :meth:`IFSParallel.naming_convention` method.
25
+ """
26
+
27
+ import math
28
+
29
+ import footprints
30
+
31
+ from vortex.syntax.stdattrs import model, actualfmt
32
+ from ..syntax.stdattrs import arpifs_cycle
33
+
34
+ #: No automatic export
35
+ __all__ = []
36
+
37
+
38
+ # Base & Generic classes
39
+ # ##############################################################################
40
+
41
+
42
+ class IFSNamingConvention(footprints.FootprintBase):
43
+ """Abstract class for any object representing an IFS/Arpege naming scheme."""
44
+
45
+ _abstract = True
46
+ _collector = ("ifsnamingconv",)
47
+ _footprint = [
48
+ model,
49
+ actualfmt,
50
+ arpifs_cycle,
51
+ dict(
52
+ attr=dict(
53
+ kind=dict(info="The type of targeted input/output file"),
54
+ conf=dict(
55
+ info="IFS/Arpege configuration number",
56
+ type=int,
57
+ ),
58
+ xpname=dict(
59
+ info="IFS/Arpege experiment name",
60
+ ),
61
+ actualfmt=dict(
62
+ info="The target file format",
63
+ optional=True,
64
+ ),
65
+ )
66
+ ),
67
+ ]
68
+
69
+ def _naming_format_string(self, **kwargs):
70
+ """Return the format string that will be used to generate the filename."""
71
+ raise NotImplementedError()
72
+
73
+ def __call__(self, **kwargs):
74
+ return self._naming_format_string(**kwargs).format(
75
+ xpname=self.xpname,
76
+ conf=self.conf,
77
+ fmt=self.actualfmt,
78
+ model=self.model,
79
+ **kwargs,
80
+ )
81
+
82
+
83
+ # Activate the footprint's fasttrack on the ifsnamingconv collector
84
+ ncollect = footprints.collectors.get(tag="ifsnamingconv")
85
+ ncollect.fasttrack = ("kind",)
86
+ del ncollect
87
+
88
+
89
+ class IFSHardWiredNamingConvention(IFSNamingConvention):
90
+ """
91
+ A very basic object where the user can provide the format string on its own
92
+ using the *namingformat*. For debugging only...
93
+ """
94
+
95
+ _footprint = dict(
96
+ attr=dict(namingformat=dict()),
97
+ priority=dict(
98
+ level=footprints.priorities.top.TOOLBOX # @UndefinedVariable
99
+ ),
100
+ )
101
+
102
+ def _naming_format_string(self, **kwargs):
103
+ return self.namingformat
104
+
105
+
106
+ # Climatology files names
107
+ # ##############################################################################
108
+
109
+
110
+ class ModelClimName(IFSNamingConvention):
111
+ """An IFS/Arpege model clim."""
112
+
113
+ _footprint = dict(
114
+ attr=dict(
115
+ kind=dict(
116
+ values=[
117
+ "modelclim",
118
+ ],
119
+ ),
120
+ conf=dict(
121
+ outcast=[
122
+ 701,
123
+ ],
124
+ ),
125
+ model=dict(
126
+ outcast=[
127
+ "surfex",
128
+ ]
129
+ ),
130
+ )
131
+ )
132
+
133
+ def _naming_format_string(self, **kwargs):
134
+ return "Const.Clim"
135
+
136
+
137
+ class SurfexClimName(IFSNamingConvention):
138
+ """A Surfex model clim."""
139
+
140
+ _footprint = dict(
141
+ attr=dict(
142
+ kind=dict(
143
+ values=[
144
+ "modelclim",
145
+ ],
146
+ ),
147
+ model=dict(
148
+ values=[
149
+ "surfex",
150
+ ]
151
+ ),
152
+ )
153
+ )
154
+
155
+ def _naming_format_string(self, **kwargs):
156
+ return "Const.Clim.sfx"
157
+
158
+
159
+ class TargetClimName(IFSNamingConvention):
160
+ """A BDAP clim file or a target domain IFS/Arpege clim file."""
161
+
162
+ _footprint = dict(
163
+ attr=dict(
164
+ kind=dict(
165
+ values=[
166
+ "targetclim",
167
+ ],
168
+ ),
169
+ model=dict(
170
+ outcast=[
171
+ "surfex",
172
+ ]
173
+ ),
174
+ )
175
+ )
176
+
177
+ def _naming_format_string(self, **kwargs):
178
+ return "const.clim.{area:s}"
179
+
180
+
181
+ class SurfexTargetClimName(IFSNamingConvention):
182
+ """A target domain Surfex clim file."""
183
+
184
+ _footprint = dict(
185
+ attr=dict(
186
+ kind=dict(
187
+ values=[
188
+ "targetclim",
189
+ ],
190
+ ),
191
+ model=dict(
192
+ values=[
193
+ "surfex",
194
+ ]
195
+ ),
196
+ )
197
+ )
198
+
199
+ def _naming_format_string(self, **kwargs):
200
+ return "const.clim.sfx.{area:s}"
201
+
202
+
203
+ class CanariModelClimName(IFSNamingConvention):
204
+ """An IFS/Arpege model clim (specific naming for Canari)."""
205
+
206
+ _footprint = dict(
207
+ attr=dict(
208
+ kind=dict(
209
+ values=[
210
+ "modelclim",
211
+ ],
212
+ ),
213
+ conf=dict(
214
+ values=[
215
+ 701,
216
+ ],
217
+ ),
218
+ model=dict(
219
+ outcast=[
220
+ "surfex",
221
+ ]
222
+ ),
223
+ )
224
+ )
225
+
226
+ def _naming_format_string(self, **kwargs):
227
+ return "ICMSH{xpname:s}CLIM"
228
+
229
+
230
+ class CanariClosestModelClimName(CanariModelClimName):
231
+ """An IFS/Arpege model clim for the closest month (specific naming for Canari)."""
232
+
233
+ _footprint = dict(
234
+ attr=dict(
235
+ kind=dict(
236
+ values=[
237
+ "closest_modelclim",
238
+ ],
239
+ ),
240
+ )
241
+ )
242
+
243
+ def _naming_format_string(self, **kwargs):
244
+ return "ICMSH{xpname:s}CLI2"
245
+
246
+
247
+ # Initial conditions file names
248
+ # ##############################################################################
249
+
250
+
251
+ class InitialContionsName(IFSNamingConvention):
252
+ _footprint = dict(
253
+ attr=dict(
254
+ kind=dict(
255
+ values=[
256
+ "ic",
257
+ ],
258
+ ),
259
+ model=dict(
260
+ outcast=[
261
+ "surfex",
262
+ ]
263
+ ),
264
+ )
265
+ )
266
+
267
+ def _naming_format_string(self, **kwargs):
268
+ return "ICMSH{xpname:s}INIT"
269
+
270
+
271
+ class SurfexInitialContionsName(IFSNamingConvention):
272
+ _footprint = dict(
273
+ attr=dict(
274
+ kind=dict(
275
+ values=[
276
+ "ic",
277
+ ],
278
+ ),
279
+ model=dict(
280
+ values=[
281
+ "surfex",
282
+ ]
283
+ ),
284
+ )
285
+ )
286
+
287
+ def _naming_format_string(self, **kwargs):
288
+ return "ICMSH{xpname:s}INIT.sfx"
289
+
290
+
291
+ class IauAnalysisName(IFSNamingConvention):
292
+ _footprint = dict(
293
+ attr=dict(
294
+ kind=dict(
295
+ values=[
296
+ "iau_analysis",
297
+ ],
298
+ ),
299
+ model=dict(
300
+ outcast=[
301
+ "surfex",
302
+ ]
303
+ ),
304
+ )
305
+ )
306
+
307
+ def _naming_format_string(self, **kwargs):
308
+ return "ICIAU{xpname:s}IN{number:02d}"
309
+
310
+
311
+ class IauBackgroundName(IFSNamingConvention):
312
+ _footprint = dict(
313
+ attr=dict(
314
+ kind=dict(
315
+ values=[
316
+ "iau_background",
317
+ ],
318
+ ),
319
+ model=dict(
320
+ outcast=[
321
+ "surfex",
322
+ ]
323
+ ),
324
+ )
325
+ )
326
+
327
+ def _naming_format_string(self, **kwargs):
328
+ return "ICIAU{xpname:s}BK{number:02d}"
329
+
330
+
331
+ # Lateral Boundary Conditions Files
332
+ # ##############################################################################
333
+
334
+
335
+ class LAMBoundaryConditionsName(IFSNamingConvention):
336
+ _footprint = dict(
337
+ attr=dict(
338
+ kind=dict(
339
+ values=[
340
+ "lbc",
341
+ ],
342
+ ),
343
+ )
344
+ )
345
+
346
+ def _naming_format_string(self, **kwargs):
347
+ return "ELSCF{xpname:s}ALBC{number:03d}"
348
+
349
+
350
+ # Strange files used in the EDA
351
+ # ##############################################################################
352
+
353
+
354
+ class IfsEdaInputName(IFSNamingConvention):
355
+ _abstract = True
356
+ _footprint = dict(
357
+ attr=dict(
358
+ kind=dict(
359
+ values=[
360
+ "edainput",
361
+ ],
362
+ ),
363
+ variant=dict(
364
+ values=[
365
+ "infl",
366
+ "infl_factor",
367
+ "mean",
368
+ "covb",
369
+ ],
370
+ ),
371
+ totalnumber=dict(
372
+ info="The total number of input files",
373
+ type=int,
374
+ optional=True,
375
+ ),
376
+ )
377
+ )
378
+
379
+ @property
380
+ def _number_fmt(self):
381
+ if self.totalnumber:
382
+ ndigits = max(int(math.floor(math.log10(self.totalnumber))) + 1, 3)
383
+ else:
384
+ ndigits = 3
385
+ return "{number:0" + str(ndigits) + "d}"
386
+
387
+
388
+ class IfsEdaArpegeFaInputName(IfsEdaInputName):
389
+ _footprint = dict(
390
+ attr=dict(
391
+ model=dict(
392
+ values=[
393
+ "arpege",
394
+ ]
395
+ ),
396
+ actualfmt=dict(
397
+ values=[
398
+ "fa",
399
+ ]
400
+ ),
401
+ )
402
+ )
403
+
404
+ def _naming_format_string(self, **kwargs):
405
+ return "FAMEMBER_" + self._number_fmt
406
+
407
+
408
+ class IfsEdaArpegeGribInputName(IfsEdaInputName):
409
+ _footprint = dict(
410
+ attr=dict(
411
+ model=dict(
412
+ values=[
413
+ "arpege",
414
+ ]
415
+ ),
416
+ actualfmt=dict(
417
+ values=[
418
+ "grib",
419
+ ]
420
+ ),
421
+ )
422
+ )
423
+
424
+ def _naming_format_string(self, **kwargs):
425
+ return "GRIBERm" + self._number_fmt
426
+
427
+
428
+ class IfsEdaAromeInputName(IfsEdaInputName):
429
+ _footprint = dict(
430
+ attr=dict(
431
+ model=dict(
432
+ values=[
433
+ "arome",
434
+ ]
435
+ ),
436
+ )
437
+ )
438
+
439
+ def _naming_format_string(self, **kwargs):
440
+ return "ELSCF{xpname:s}ALBC" + self._number_fmt
441
+
442
+
443
+ class IfsEdaOutputName(IFSNamingConvention):
444
+ _footprint = dict(
445
+ attr=dict(
446
+ kind=dict(
447
+ values=[
448
+ "edaoutput",
449
+ ],
450
+ ),
451
+ variant=dict(
452
+ values=[
453
+ "infl",
454
+ "infl_factor",
455
+ "mean",
456
+ "covb",
457
+ ],
458
+ ),
459
+ )
460
+ )
461
+
462
+ def _naming_format_string(self, **kwargs):
463
+ return "ICMSH{xpname:s}+{term.fmth}_m{number:03d}"