vortex-nwp 2.0.0b1__py3-none-any.whl → 2.0.0b2__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 (139) hide show
  1. vortex/__init__.py +59 -45
  2. vortex/algo/__init__.py +3 -2
  3. vortex/algo/components.py +940 -614
  4. vortex/algo/mpitools.py +802 -497
  5. vortex/algo/serversynctools.py +34 -33
  6. vortex/config.py +19 -22
  7. vortex/data/__init__.py +9 -3
  8. vortex/data/abstractstores.py +593 -655
  9. vortex/data/containers.py +217 -162
  10. vortex/data/contents.py +65 -39
  11. vortex/data/executables.py +93 -102
  12. vortex/data/flow.py +40 -34
  13. vortex/data/geometries.py +228 -132
  14. vortex/data/handlers.py +428 -225
  15. vortex/data/outflow.py +15 -15
  16. vortex/data/providers.py +185 -163
  17. vortex/data/resources.py +48 -42
  18. vortex/data/stores.py +544 -413
  19. vortex/gloves.py +114 -87
  20. vortex/layout/__init__.py +1 -8
  21. vortex/layout/contexts.py +150 -84
  22. vortex/layout/dataflow.py +353 -202
  23. vortex/layout/monitor.py +264 -128
  24. vortex/nwp/__init__.py +5 -2
  25. vortex/nwp/algo/__init__.py +14 -5
  26. vortex/nwp/algo/assim.py +205 -151
  27. vortex/nwp/algo/clim.py +683 -517
  28. vortex/nwp/algo/coupling.py +447 -225
  29. vortex/nwp/algo/eda.py +437 -229
  30. vortex/nwp/algo/eps.py +403 -231
  31. vortex/nwp/algo/forecasts.py +420 -271
  32. vortex/nwp/algo/fpserver.py +683 -307
  33. vortex/nwp/algo/ifsnaming.py +205 -145
  34. vortex/nwp/algo/ifsroot.py +210 -122
  35. vortex/nwp/algo/monitoring.py +132 -76
  36. vortex/nwp/algo/mpitools.py +321 -191
  37. vortex/nwp/algo/odbtools.py +617 -353
  38. vortex/nwp/algo/oopsroot.py +449 -273
  39. vortex/nwp/algo/oopstests.py +90 -56
  40. vortex/nwp/algo/request.py +287 -206
  41. vortex/nwp/algo/stdpost.py +878 -522
  42. vortex/nwp/data/__init__.py +22 -4
  43. vortex/nwp/data/assim.py +125 -137
  44. vortex/nwp/data/boundaries.py +121 -68
  45. vortex/nwp/data/climfiles.py +193 -211
  46. vortex/nwp/data/configfiles.py +73 -69
  47. vortex/nwp/data/consts.py +426 -401
  48. vortex/nwp/data/ctpini.py +59 -43
  49. vortex/nwp/data/diagnostics.py +94 -66
  50. vortex/nwp/data/eda.py +50 -51
  51. vortex/nwp/data/eps.py +195 -146
  52. vortex/nwp/data/executables.py +440 -434
  53. vortex/nwp/data/fields.py +63 -48
  54. vortex/nwp/data/gridfiles.py +183 -111
  55. vortex/nwp/data/logs.py +250 -217
  56. vortex/nwp/data/modelstates.py +180 -151
  57. vortex/nwp/data/monitoring.py +72 -99
  58. vortex/nwp/data/namelists.py +254 -202
  59. vortex/nwp/data/obs.py +400 -308
  60. vortex/nwp/data/oopsexec.py +22 -20
  61. vortex/nwp/data/providers.py +90 -65
  62. vortex/nwp/data/query.py +71 -82
  63. vortex/nwp/data/stores.py +49 -36
  64. vortex/nwp/data/surfex.py +136 -137
  65. vortex/nwp/syntax/__init__.py +1 -1
  66. vortex/nwp/syntax/stdattrs.py +173 -111
  67. vortex/nwp/tools/__init__.py +2 -2
  68. vortex/nwp/tools/addons.py +22 -17
  69. vortex/nwp/tools/agt.py +24 -12
  70. vortex/nwp/tools/bdap.py +16 -5
  71. vortex/nwp/tools/bdcp.py +4 -1
  72. vortex/nwp/tools/bdm.py +3 -0
  73. vortex/nwp/tools/bdmp.py +14 -9
  74. vortex/nwp/tools/conftools.py +728 -378
  75. vortex/nwp/tools/drhook.py +12 -8
  76. vortex/nwp/tools/grib.py +65 -39
  77. vortex/nwp/tools/gribdiff.py +22 -17
  78. vortex/nwp/tools/ifstools.py +82 -42
  79. vortex/nwp/tools/igastuff.py +167 -143
  80. vortex/nwp/tools/mars.py +14 -2
  81. vortex/nwp/tools/odb.py +234 -125
  82. vortex/nwp/tools/partitioning.py +61 -37
  83. vortex/nwp/tools/satrad.py +27 -12
  84. vortex/nwp/util/async.py +83 -55
  85. vortex/nwp/util/beacon.py +10 -10
  86. vortex/nwp/util/diffpygram.py +174 -86
  87. vortex/nwp/util/ens.py +144 -63
  88. vortex/nwp/util/hooks.py +30 -19
  89. vortex/nwp/util/taskdeco.py +28 -24
  90. vortex/nwp/util/usepygram.py +278 -172
  91. vortex/nwp/util/usetnt.py +31 -17
  92. vortex/sessions.py +72 -39
  93. vortex/syntax/__init__.py +1 -1
  94. vortex/syntax/stdattrs.py +410 -171
  95. vortex/syntax/stddeco.py +31 -22
  96. vortex/toolbox.py +327 -192
  97. vortex/tools/__init__.py +11 -2
  98. vortex/tools/actions.py +125 -59
  99. vortex/tools/addons.py +111 -92
  100. vortex/tools/arm.py +42 -22
  101. vortex/tools/compression.py +72 -69
  102. vortex/tools/date.py +11 -4
  103. vortex/tools/delayedactions.py +242 -132
  104. vortex/tools/env.py +75 -47
  105. vortex/tools/folder.py +342 -171
  106. vortex/tools/grib.py +311 -149
  107. vortex/tools/lfi.py +423 -216
  108. vortex/tools/listings.py +109 -40
  109. vortex/tools/names.py +218 -156
  110. vortex/tools/net.py +632 -298
  111. vortex/tools/parallelism.py +93 -61
  112. vortex/tools/prestaging.py +55 -31
  113. vortex/tools/schedulers.py +172 -105
  114. vortex/tools/services.py +402 -333
  115. vortex/tools/storage.py +293 -358
  116. vortex/tools/surfex.py +24 -24
  117. vortex/tools/systems.py +1211 -631
  118. vortex/tools/targets.py +156 -100
  119. vortex/util/__init__.py +1 -1
  120. vortex/util/config.py +377 -327
  121. vortex/util/empty.py +2 -2
  122. vortex/util/helpers.py +56 -24
  123. vortex/util/introspection.py +18 -12
  124. vortex/util/iosponge.py +8 -4
  125. vortex/util/roles.py +4 -6
  126. vortex/util/storefunctions.py +39 -13
  127. vortex/util/structs.py +3 -3
  128. vortex/util/worker.py +29 -17
  129. vortex_nwp-2.0.0b2.dist-info/METADATA +66 -0
  130. vortex_nwp-2.0.0b2.dist-info/RECORD +142 -0
  131. {vortex_nwp-2.0.0b1.dist-info → vortex_nwp-2.0.0b2.dist-info}/WHEEL +1 -1
  132. vortex/layout/appconf.py +0 -109
  133. vortex/layout/jobs.py +0 -1276
  134. vortex/layout/nodes.py +0 -1424
  135. vortex/layout/subjobs.py +0 -464
  136. vortex_nwp-2.0.0b1.dist-info/METADATA +0 -50
  137. vortex_nwp-2.0.0b1.dist-info/RECORD +0 -146
  138. {vortex_nwp-2.0.0b1.dist-info → vortex_nwp-2.0.0b2.dist-info}/LICENSE +0 -0
  139. {vortex_nwp-2.0.0b1.dist-info → vortex_nwp-2.0.0b2.dist-info}/top_level.txt +0 -0
@@ -23,7 +23,7 @@ logger = loggers.getLogger(__name__)
23
23
  class CompressionPipeline:
24
24
  """Main interface to data compression algorithms."""
25
25
 
26
- def __init__(self, system, compression=''):
26
+ def __init__(self, system, compression=""):
27
27
  """
28
28
  :param System system: The system object that will be used to carry out
29
29
  the task.
@@ -40,10 +40,10 @@ class CompressionPipeline:
40
40
  self._units = list()
41
41
  self._sh = system
42
42
  self.description_string = compression
43
- for c in [c for c in compression.split('|') if c]:
44
- c_raw = c.split('&')
43
+ for c in [c for c in compression.split("|") if c]:
44
+ c_raw = c.split("&")
45
45
  ckind = c_raw.pop(0)
46
- cargs = dict([arg.split('=', 1) for arg in c_raw])
46
+ cargs = dict([arg.split("=", 1) for arg in c_raw])
47
47
  self.add_compression_unit(ckind, **cargs)
48
48
 
49
49
  def add_compression_unit(self, unit, **kwargs):
@@ -56,8 +56,9 @@ class CompressionPipeline:
56
56
  """
57
57
  c_unit = footprints.proxy.compression_unit(kind=unit, **kwargs)
58
58
  if c_unit is None:
59
- raise ValueError("The {:s} compression unit could not be found.".
60
- format(unit))
59
+ raise ValueError(
60
+ "The {:s} compression unit could not be found.".format(unit)
61
+ )
61
62
  self._units.append(c_unit)
62
63
 
63
64
  @property
@@ -76,13 +77,15 @@ class CompressionPipeline:
76
77
  @property
77
78
  def suffix(self):
78
79
  """The suffix usualy associated with this compression pipeline."""
79
- s = '.'.join([s.suffix for s in self.units])
80
- return '.' + s if s else ''
80
+ s = ".".join([s.suffix for s in self.units])
81
+ return "." + s if s else ""
81
82
 
82
83
  @property
83
84
  def compression_factor(self):
84
85
  """The minimal compression factor expected with such a compression pipeline."""
85
- return functools.reduce(operator.mul, [s.cfactor for s in self.units], 1.)
86
+ return functools.reduce(
87
+ operator.mul, [s.cfactor for s in self.units], 1.0
88
+ )
86
89
 
87
90
  @staticmethod
88
91
  def _inputstream_size(stream):
@@ -93,13 +96,13 @@ class CompressionPipeline:
93
96
  estimated_size = stream.tell()
94
97
  stream.seek(0)
95
98
  except AttributeError:
96
- logger.warning('Could not rewind <source:%s>', str(stream))
99
+ logger.warning("Could not rewind <source:%s>", str(stream))
97
100
  except OSError:
98
- logger.debug('Seek trouble <source:%s>', str(stream))
101
+ logger.debug("Seek trouble <source:%s>", str(stream))
99
102
  return estimated_size
100
103
 
101
104
  @contextmanager
102
- def _openstream(self, local, mode='rb'):
105
+ def _openstream(self, local, mode="rb"):
103
106
  """If *local* is not an opened file, open it..."""
104
107
  if isinstance(local, str):
105
108
  localfh = open(local, mode)
@@ -114,7 +117,9 @@ class CompressionPipeline:
114
117
  """Close a list of Popen objects (and look for the returncode)."""
115
118
  for i, p in enumerate(processes):
116
119
  if not self._sh.pclose(p):
117
- logger.error("Abnormal return code for one of the processes (#%d)", i)
120
+ logger.error(
121
+ "Abnormal return code for one of the processes (#%d)", i
122
+ )
118
123
 
119
124
  @contextmanager
120
125
  def compress2stream(self, local, iosponge=False):
@@ -134,7 +139,9 @@ class CompressionPipeline:
134
139
  be properly closed
135
140
  """
136
141
  with self._openstream(local) as stream:
137
- estimated_size = self._inputstream_size(stream) * self.compression_factor
142
+ estimated_size = (
143
+ self._inputstream_size(stream) * self.compression_factor
144
+ )
138
145
  processes = list()
139
146
  lstream = stream
140
147
  for unit in self.units:
@@ -161,7 +168,7 @@ class CompressionPipeline:
161
168
  *local* can be an opened file-like object or a filename.
162
169
  *destination* is a filename.
163
170
  """
164
- with open(destination, 'wb') as fhout:
171
+ with open(destination, "wb") as fhout:
165
172
  with self.compress2stream(local) as fhcompressed:
166
173
  return self._xcopyfileobj(fhcompressed, fhout)
167
174
 
@@ -189,7 +196,7 @@ class CompressionPipeline:
189
196
  When leaving the context, the gunzip process that uncompresses the data
190
197
  will be properly closed.
191
198
  """
192
- with self._openstream(destination, 'wb') as dstream:
199
+ with self._openstream(destination, "wb") as dstream:
193
200
  processes = list()
194
201
  instream = True
195
202
  nunits = len(self.units)
@@ -208,7 +215,7 @@ class CompressionPipeline:
208
215
  *destination* can be an opened file-like object or a filename.
209
216
  """
210
217
  with self.stream2uncompress(destination) as fhuncompressed:
211
- with open(local, 'rb') as fhcompressed:
218
+ with open(local, "rb") as fhcompressed:
212
219
  return self._xcopyfileobj(fhcompressed, fhuncompressed)
213
220
 
214
221
 
@@ -216,22 +223,22 @@ class CompressionUnit(footprints.FootprintBase):
216
223
  """Defines compress/uncompress methods for a given compression tool."""
217
224
 
218
225
  _abstract = True
219
- _collector = ('compression_unit',)
226
+ _collector = ("compression_unit",)
220
227
  _footprint = dict(
221
- info = 'Abstract Compression Unit',
222
- attr = dict(
223
- kind = dict(
224
- info = "The name of the compression tool.",
228
+ info="Abstract Compression Unit",
229
+ attr=dict(
230
+ kind=dict(
231
+ info="The name of the compression tool.",
225
232
  ),
226
- suffix = dict(
227
- info = "The usual file extension for this compression tool.",
228
- optional = True,
233
+ suffix=dict(
234
+ info="The usual file extension for this compression tool.",
235
+ optional=True,
229
236
  ),
230
- cfactor = dict(
231
- info = "The usual compression factor for this compression tool.",
232
- type = float,
233
- default = 1.,
234
- optional =True,
237
+ cfactor=dict(
238
+ info="The usual compression factor for this compression tool.",
239
+ type=float,
240
+ default=1.0,
241
+ optional=True,
235
242
  ),
236
243
  ),
237
244
  )
@@ -255,68 +262,64 @@ class CompressionUnit(footprints.FootprintBase):
255
262
 
256
263
 
257
264
  class GzipCompressionUnit(CompressionUnit):
258
-
259
265
  _footprint = dict(
260
- info = 'Compress/Uncompress a stream using gzip',
261
- attr = dict(
262
- kind = dict(
263
- values = ['gzip', 'gz']
264
- ),
265
- suffix = dict(
266
- default = 'gz',
267
- ),
268
- complevel = dict(
269
- info = "The gzip algorithm compression level (see 'man gzip')",
270
- type = int,
271
- values = range(1, 10),
272
- default = 6,
273
- optional = True
266
+ info="Compress/Uncompress a stream using gzip",
267
+ attr=dict(
268
+ kind=dict(values=["gzip", "gz"]),
269
+ suffix=dict(
270
+ default="gz",
274
271
  ),
275
- cfactor = dict(
276
- default = 0.9
272
+ complevel=dict(
273
+ info="The gzip algorithm compression level (see 'man gzip')",
274
+ type=int,
275
+ values=range(1, 10),
276
+ default=6,
277
+ optional=True,
277
278
  ),
279
+ cfactor=dict(default=0.9),
278
280
  ),
279
281
  )
280
282
 
281
283
  def compress(self, sh, stream):
282
284
  """Compress the input *stream*. Returns a Popen object."""
283
- return self._run_in_pipe(sh, ['gzip', '--stdout', '-{!s}'.format(self.complevel)],
284
- stream)
285
+ return self._run_in_pipe(
286
+ sh, ["gzip", "--stdout", "-{!s}".format(self.complevel)], stream
287
+ )
285
288
 
286
289
  def uncompress(self, sh, stream, outstream=True):
287
290
  """Uncompress the input *stream*. Returns a Popen object."""
288
- return self._run_in_pipe(sh, ['gunzip', '--stdout'], stream, outstream)
291
+ return self._run_in_pipe(sh, ["gunzip", "--stdout"], stream, outstream)
289
292
 
290
293
 
291
294
  class Bzip2CompressionUnit(CompressionUnit):
292
-
293
295
  _footprint = dict(
294
- info = 'Compress/Uncompress a stream using bzip2',
295
- attr = dict(
296
- kind = dict(
297
- values = ['bzip2', 'bz2']
298
- ),
299
- suffix = dict(
300
- default = 'bz2',
296
+ info="Compress/Uncompress a stream using bzip2",
297
+ attr=dict(
298
+ kind=dict(values=["bzip2", "bz2"]),
299
+ suffix=dict(
300
+ default="bz2",
301
301
  ),
302
- complevel = dict(
303
- info = "The bzip2 algorithm compression level (see 'man bzip2')",
304
- type = int,
305
- values = range(1, 10),
306
- default = 9,
307
- optional = True
302
+ complevel=dict(
303
+ info="The bzip2 algorithm compression level (see 'man bzip2')",
304
+ type=int,
305
+ values=range(1, 10),
306
+ default=9,
307
+ optional=True,
308
308
  ),
309
- cfactor = dict(
310
- default = 0.85,
309
+ cfactor=dict(
310
+ default=0.85,
311
311
  ),
312
312
  ),
313
313
  )
314
314
 
315
315
  def compress(self, sh, stream):
316
316
  """Compress the input *stream*. Returns a Popen object."""
317
- return self._run_in_pipe(sh, ['bzip2', '--stdout', '-{!s}'.format(self.complevel)],
318
- stream)
317
+ return self._run_in_pipe(
318
+ sh, ["bzip2", "--stdout", "-{!s}".format(self.complevel)], stream
319
+ )
319
320
 
320
321
  def uncompress(self, sh, stream, outstream=True):
321
322
  """Uncompress the input *stream*. Returns a Popen object."""
322
- return self._run_in_pipe(sh, ['bunzip2', '--stdout'], stream, outstream)
323
+ return self._run_in_pipe(
324
+ sh, ["bunzip2", "--stdout"], stream, outstream
325
+ )
vortex/tools/date.py CHANGED
@@ -11,10 +11,17 @@ import sys
11
11
  from bronx.stdtypes import date as _b_date
12
12
 
13
13
  _ALIASES = _b_date.local_date_functions.copy()
14
- _ALIASES.update(dict(guess=_b_date.guess, daterange=_b_date.daterange,
15
- stamp=_b_date.stamp,
16
- Period=_b_date.Period,
17
- Date=_b_date.Date, Time=_b_date.Time, Month=_b_date.Month))
14
+ _ALIASES.update(
15
+ dict(
16
+ guess=_b_date.guess,
17
+ daterange=_b_date.daterange,
18
+ stamp=_b_date.stamp,
19
+ Period=_b_date.Period,
20
+ Date=_b_date.Date,
21
+ Time=_b_date.Time,
22
+ Month=_b_date.Month,
23
+ )
24
+ )
18
25
 
19
26
  for n, obj in _ALIASES.items():
20
27
  sys.modules[__name__].__dict__.update(_ALIASES)