HWRF  trunk@4391
hwrfsystem.py
1 """!Combines multiple tasks together to make the HWRF post-processing system.
2 
3 This is a wrapper around the hwrf.post, hwrf.gribtask, hwrf.tracker,
4 hwrf.nhc_products and hwrf.gsipost that creates customizable
5 post-processing tasks. The main purpose of this module is to simplify
6 the hwrf_expt module."""
7 
8 
9 ##@var __all__
10 # Symbols exported by "from hwrf.hwrfsystem import *"
11 __all__=['HWRFGSIPostProcessing','HWRFForecastPostProcessing']
12 
13 import os,sys
14 
16 
22 
23 from produtil.run import exe,alias
24 from hwrf.wrf import WRFDomain,WRFSimulation,ExternalWRFTask
25 from hwrf.post import PostManyWRF
26 from hwrf.regrib import RegribMany,igrb1,clatlon,GRIB2
27 
28 
29 def add_clatlon_grid(task,r,name,rel):
30  """!Add a domain-centered lat-lon grid to a RegribMany object.
31 
32  Adds to the given hwrf.regrib.RegribMany object a
33  latitude-longitude grid centered on some GRIB product. The grid
34  will be re-centered at every forecast time, so the grid is allowed
35  to move. Centering information comes from the name+"_grid"
36  option in the task's section. The value should be a comma-separated
37  list of seven values:
38  * res1,res2 - grid resolution for GRIB1 grid 255
39  * size1,size2 - size in degrees for GRIB1 grid 255
40  * scan - scanning mode flags for GRIB1 grid 255
41  * n1,n2 - gridpoint count for GRIB1 grid 255
42  @param task the task that provides configuration information
43  @param r the hwrf.regrib.RegribMany object to receive the grid
44  @param name the name of the new grid
45  @param rel the GRIB product in r on which this grid is centered"""
46  contents=task.confstr(name+"_grid")
47  split=contents.rsplit(",")
48  assert(len(split)==7)
49  res1=float(split[0])
50  res2=float(split[1])
51  size1=float(split[2])
52  size2=float(split[3])
53  scan=int(split[4])
54  n1=int(split[5])
55  n2=int(split[6])
56  r.add(name,clatlon(rel,res=[res1,res2],size=[size1,size2],
57  scan=scan,n=[n1,n2]))
58 
59 def add_expandlatlon_grid(task,r,name,rel):
60  """!Adds a grid-centered lat-lon grid to a RegribMany object
61 
62  Adds a new grid to an hwrf.regrib.RegribMany object, centered on a
63  prior existing grid but with a border added around its edges. The
64  grid is recalculated at every forecast time so it works with
65  moving grids as well. Grid expansion information comes from
66  the name+"_expand" option in the given task's section. The value
67  should be a comma-separated list of nine values:
68  * west extension in degrees
69  * east extension in degrees
70  * north extension in degrees
71  * south extension in degrees
72  * n1,n2 - new gridpoint count for GRIB1 grid 255
73  * scan - new scanning mode flags for GRIB1 grid 255
74  * res1,res2 - new resolution for GRB1 grid 255
75  @param task the task that provides configuration information
76  @param r the hwrf.regrib.RegribMany object to receive the grid
77  @param name the name of the new grid
78  @param rel the grid on which this grid is centered."""
79 
80  contents=task.confstr(name+"_expand")
81  split=contents.rsplit(",")
82  assert(len(split)==9)
83  west=float(split[0])
84  east=float(split[1])
85  north=float(split[2])
86  south=float(split[3])
87  n1=int(split[4])
88  n2=int(split[5])
89  scan=int(split[6])
90  res1=float(split[7])
91  res2=float(split[8])
92  r.add(name,hwrf.tracker.expandlatlon \
93  (r.GRIB(rel),west=west,east=east,north=north,south=south,
94  n=[n1,n2],scan=scan,res=[res1,res2]))
95 
96 def to_com_intercom(task,what,r):
97  """!Requests deliver to com and/or intercom of a RegribMany product.
98 
99  Utility function for deliveries. Given what="hwrftrk" this will
100  look for options "hwrftrk%com" and "hwrftrk%intercom" in the given
101  task's config section. If each option is present and non-empty,
102  the corresponding delivery is enabled and the option's value is
103  used as the delivery location.
104  @param task the task that provides configuration information
105  @param what the RegribMany product being delivered
106  @param r the hwrf.regrib.RegribMany whose products are being delivered"""
107  comvar=what+'%com'
108  intercomvar=what+'%intercom'
109  comloc=task.confraw(comvar,'')
110  intercomloc=task.confraw(intercomvar,'')
111  if comloc:
112  sys.stderr.write('to_com(%s,%s) (from %s)\n'%(
113  repr(comloc),repr(what),repr(comvar)))
114  r.to_com(comloc,what)
115  if intercomloc:
116  sys.stderr.write('to_intercom(%s,%s) (from %s)\n'%(
117  repr(intercomloc),repr(what),repr(intercomvar)))
118  r.to_intercom(intercomloc,what)
119 
120 
122  """!Configures the GSI post-processing and regribbing.
123 
124  Constructs tasks that will run the post-processing and
125  regribbing on the inputs and outputs of GSI. Arranges for the
126  standard HWRF GSI diagnostic output grids, and makes them
127  configurable by the HWRF config files.
128 
129  This class uses a config section to define many aspects of the GSI
130  post-processing.
131 
132  @code{.unformatted}
133  [gsi_products]
134  # Settings for GRIB1 grid 255 for each grid:
135  d3_grid=0.02,0.02,12.,12.,136,600,600
136  d2_grid=0.06,0.06,30.,30.,136,500,500
137 
138  # GRIB2 compression method
139  grib2_compression=32 ; complex packing with second-order differences
140  # grib2_compression=40 ; "lossless" jpeg 2000
141 
142  # Delivery settings:
143  hwrforg_n%com={out_prefix}.hwrforg_n.grb2f00
144  hwrforg_i%com={out_prefix}.hwrforg_i.grb2f00
145  hwrfges_n%com={out_prefix}.hwrfges_n.grb2f00
146  hwrfges_i%com={out_prefix}.hwrfges_i.grb2f00
147  hwrfanl_n%com={out_prefix}.hwrfanl_n.grb2f00
148  hwrfanl_i%com={out_prefix}.hwrfanl_i.grb2f00
149  @endcode
150 
151  The d2_grid and d3_grid options configure the intermediate and
152  innermost domain output grids. They are sent into
153  add_clatlon_grid() to generate the GRIB1 grid 255 (user-defined
154  regular latitude-longitude) grid definition for interpolation."""
155  def __init__(self,ds,conf,section,**kwargs):
156  """!HWRFGSIPostProcessing constructor
157  @param ds passed to Datum: the Datastore object for this Task
158  @param conf the conf object for this task (passed to HWRFTask)
159  @param section the conf section for this task (passed to HWRFTask)
160  @param kwargs more keyword arguments passed to superclass"""
161  super(HWRFGSIPostProcessing,self).__init__(
162  ds,conf,section,**kwargs)
163  def make_gsi_post(self,gsi_d02,gsi_d03,storm1ghost,storm1ghost_parent,
164  ceninit,gsid03_flag,gsipost_name='gsipost',
165  gsigribber_name='gsigribber'):
166  """!Creates the gsi post-processor and regribber tasks.
167 
168  Creates the gsipost member variable, an hwrf.gsipost.GSIPost;
169  and the gsigribber member variable, an hwrf.gribtask.GRIBTask.
170  The gsipost converts GSI input and output files (wrfinput,
171  ghost or wrfanl) to native E grid GRIB1 files. The gsigribber
172  converts the E grid GRIB1 files to GRIB2 files on selected
173  output grids.
174  @param gsi_d02 the hwrf.gsi.FGATGSI that runs the intermediate
175  domain data assimilation
176  @param gsi_d03 the hwrf.gsi.FGATGSI that runs the innermost domain
177  data assimilation
178  @param storm1ghost the hwrf.wrf.WRFDomain that represents the
179  innermost ghost domain
180  @param storm1ghost_parent the hwrf.wrf.WRFDomain that represents the
181  intermediate ghost domain
182  @param ceninit the hwrf.init.InitBeforeGSI that runs the
183  analysis time (FGAT 0 hour) initialization off of the GDAS 6hr
184  forecast.
185  @param gsid03_flag True=domain 3 gsi was run, False otherwise
186  @param gsipost_name the section and task name for the gsipost
187  @param gsigribber_name the section and task name for the gsigribber"""
188  ds=self.dstore
189  conf=self.conf
190  # Create the GSI post. It will post-process the ghost
191  # files from the init.wrfghost, relocation and GSI for
192  # each of d02 and d03:
193  gsipost = hwrf.gsipost.GSIPost(ds,conf,gsipost_name)
194  if gsid03_flag:
195  gsipost.add_case(
196  storm1ghost,
197  ceninit.runghost.get_ghout(storm1ghost),
198  org=ceninit.runghost.get_ghost(storm1ghost),
199  ges=ceninit.rstage3.get_ghost(storm1ghost),
200  anl=gsi_d03.get_ghost(storm1ghost) )
201  gsipost.add_case(
202  storm1ghost_parent,
203  ceninit.runghost.get_ghout(storm1ghost_parent),
204  org=ceninit.runghost.get_ghost(storm1ghost_parent),
205  ges=ceninit.rstage3.get_ghost(storm1ghost_parent),
206  anl=gsi_d02.get_ghost(storm1ghost_parent) )
207 
208  g2p='%d'%(self.confint('grib2_compression',32),)
209  g=RegribMany(
210  copygb=alias(exe(conf.getexe('copygb'))),
211  wgrib=alias(exe(conf.getexe('wgrib'))),
212  cnvgrib_g12=alias(exe(conf.getexe('cnvgrib'))
213  ['-g12','-p'+g2p]))
214  g.sync_frequently=conf.getbool('config','sync_frequently',True)
215 
216  storm1ghost_grib=igrb1(
217  gsipost,domain=storm1ghost,which_step=hwrf.gsipost.F_ORG)
218  storm1ghost_parent_grib=igrb1(
219  gsipost,domain=storm1ghost_parent,which_step=hwrf.gsipost.F_ORG)
220  add_clatlon_grid(self,g,'d3',storm1ghost_grib)
221  add_clatlon_grid(self,g,'d2',storm1ghost_parent_grib)
222 
223  g.add('hwrforg_n',igrb1(gsipost,domain=storm1ghost,
224  which_step=hwrf.gsipost.F_ORG)*g.grid('d3')*GRIB2)
225  g.add('hwrforg_i',igrb1(gsipost,domain=storm1ghost_parent,
226  which_step=hwrf.gsipost.F_ORG)*g.grid('d2')*GRIB2)
227 
228  g.add('hwrfges_n',igrb1(gsipost,domain=storm1ghost,
229  which_step=hwrf.gsipost.F_GES)*g.grid('d3')*GRIB2)
230  g.add('hwrfges_i',igrb1(gsipost,domain=storm1ghost_parent,
231  which_step=hwrf.gsipost.F_GES)*g.grid('d2')*GRIB2)
232 
233  g.add('hwrfanl_n',igrb1(gsipost,domain=storm1ghost,
234  which_step=hwrf.gsipost.F_ANL)*g.grid('d3')*GRIB2)
235  g.add('hwrfanl_i',igrb1(gsipost,domain=storm1ghost_parent,
236  which_step=hwrf.gsipost.F_ANL)*g.grid('d2')*GRIB2)
237 
238  for w in ( 'org', 'ges', 'anl' ):
239  for gr in 'in':
240  base='hwrf%s_%s'%(w,gr)
241  to_com_intercom(self,base,g)
242 
243  gsigribber=hwrf.gribtask.GRIBTask(
244  ds,conf,gsigribber_name,g,start=conf.cycle,step=3600,end=0)
245  self.gsipost=gsipost
246  self.gsigribber=gsigribber
247  return (gsipost,gsigribber)
248 
249  ##@var gsipost
250  # The hwrf.gsipost.GSIPost object that will post-process GSI
251  # inputs and outputs, creating native E grid GRIB files.
252 
253  ##@var gsigribber
254  # The hwrf.gribtask.GRIBTask that will regrid the output of the
255  # gsipost, creating lat-lon grib files as defined in the
256  # configuration files.
257 
259  """!Creates the post-processing for the HWRF forecast job.
260 
261  Creates and configures all tasks related to the post-processing
262  system. This includes the post, regribber, trackers, and any
263  NHC-specific product generation, as well as some data delivery
264  settings. Everything is made configurable via the
265  hwrf.config.HWRFConfig system.
266 
267  This class is configurable through config file options:
268  @code[.conf]
269  [forecast_products]
270  # Post-processing start, end and step for various components:
271  tracker_step=1 # hours between tracker inputs
272  nonsatpost_step=1 # hours between non-satellite post inputs
273  satpost_step=6 # hours between satellite post inputs
274  wrfcopier_start=0 # first WRF native output time to copy to COM
275  wrfcopier_end=9 # last native output time to copy to COM
276  wrfcopier_step=3 # hours between WRF native outputs copied to COM
277  combinetrack_fhr=12 # length of cycling track in hours
278 
279  # Settings for GRIB1 grid 255 (native lat-lon) for each grid:
280  d23_grid=0.02,0.02,12.,15.,136,751,601
281  d123low_grid=0.20,0.20,90.,110.,136,551,451
282  d123high_grid=0.06,0.06,90.,110.,136,1834,1500
283  d2_grid=0.06,0.06,12.,14.,136,234,201
284  d3_grid=0.02,0.02,7.5,9.0,136,450,375
285  d2t_grid=0.06,0.06,30.,30.,128,500,500
286  d1t_grid=0.10,0.10,30.,30.,128,301,301
287 
288  # Tracker grid expansion settings:
289  trk_expand=2.5,2.5,4.0,4.0,1000,1000,128,0.02,0.02
290 
291  # GRIB2 compression method:
292  grib2_compression=32 ; complex packing with second-order differences
293  # grib2_compression=40 ; alternative: "lossless" jpeg 2000
294 
295  # Output filenames:
296  hwrftrk%com={out_prefix}.hwrftrk.f{fahr:03d}.grb
297  hwrftrk%intercom={out_prefix}.hwrftrk.grbf{fahr:02d}
298 
299  anl_outer={out_prefix}.wrfanl_d02
300  anl_inner={out_prefix}.wrfanl_d03
301 
302  hwrfprs_m%intercom={out_prefix}.hwrfprs.d23.0p02.f{fahr:03d}.grb
303  hwrfprs_n%intercom={out_prefix}.hwrfprs.d3.0p02.f{fahr:03d}.grb
304  hwrfprs_i%intercom={out_prefix}.hwrfprs.d2.0p06.f{fahr:03d}.grb
305  hwrfprs_p%intercom={out_prefix}.hwrfprs.d1.0p20.f{fahr:03d}.grb
306  hwrfprs_c%intercom={out_prefix}.hwrfprs.d123.0p06.f{fahr:03d}.grb
307  hwrfprs_g%intercom={out_prefix}.hwrfprs.d123.0p25.f{fahr:03d}.grb
308 
309  hwrfsat_m%intercom={out_prefix}.hwrfsat.d23.0p02.f{fahr:03d}.grb
310  hwrfsat_n%intercom={out_prefix}.hwrfsat.d3.0p02.f{fahr:03d}.grb
311  hwrfsat_i%intercom={out_prefix}.hwrfsat.d2.0p06.f{fahr:03d}.grb
312  hwrfsat_p%intercom={out_prefix}.hwrfsat.d1.0p20.f{fahr:03d}.grb
313  hwrfsat_c%intercom={out_prefix}.hwrfsat.d12.0p06.f{fahr:03d}.grb
314  hwrfsat_g%intercom={out_prefix}.hwrfsat.d123.0p25.f{fahr:03d}.grb
315 
316  hwrf2prs_m%com={out_prefix}.hwrfprs.d23.0p02.f{fahr:03d}.grb2
317  hwrf2prs_n%com={out_prefix}.hwrfprs.d3.0p02.f{fahr:03d}.grb2
318  hwrf2prs_i%com={out_prefix}.hwrfprs.d2.0p06.f{fahr:03d}.grb2
319  hwrf2prs_p%com={out_prefix}.hwrfprs.d1.0p20.f{fahr:03d}.grb2
320  hwrf2prs_c%com={out_prefix}.hwrfprs.d123.0p06.f{fahr:03d}.grb2
321  hwrf2prs_g%com={out_prefix}.hwrfprs.d123.0p25.f{fahr:03d}.grb2
322 
323  hwrf2sat_m%com={out_prefix}.hwrfsat.d23.0p02.f{fahr:03d}.grb2
324  hwrf2sat_n%com={out_prefix}.hwrfsat.d3.0p02.f{fahr:03d}.grb2
325  hwrf2sat_i%com={out_prefix}.hwrfsat.d2.0p06.f{fahr:03d}.grb2
326  hwrf2sat_p%com={out_prefix}.hwrfsat.d1.0p20.f{fahr:03d}.grb2
327  hwrf2sat_c%com={out_prefix}.hwrfsat.d12.0p06.f{fahr:03d}.grb2
328  hwrf2sat_g%com={out_prefix}.hwrfsat.d123.0p25.f{fahr:03d}.grb2
329  @endcode
330 
331  Config options have certain formats:
332  * product%com and product%intercom --- delivery location in com
333  and intercom for each regribber output product
334  * *_grid --- GRIB1 grid 255 grid descriptions sent to add_clatlon_grid()
335  * *_expand --- GRIB1 grid 255 grid expansions sent to add_expandlatlon_grid()
336  * *_step and *_fhr --- times or timespans in hours.
337  All delivery filenames are relative to {com} and are subject to
338  string expansion by hwrf.config.HWRFConfig.timestrinterp(). Hence
339  everything in the [config] and [dir] sections are available, as
340  well as standard time values.
341 
342  The product names in product%com and product%intercom follow a
343  certain pattern:
344  @code
345  hwrfprs_m
346  hwrf2sat_g
347  @endcode
348  In the second example, here is what each component means:
349  * hwrf or hwrf2 -- GRIB1 or GRIB2 file? The GRIB1 files are created
350  first, and are later converted to GRIB2
351  * prs or sat -- non-satellite post (prs) or satellite post (sat)
352  * m, n, i, p, c or g -- the grid
353  Here are the grid meanings:
354  * n -- innermost domain only at its resolution
355  * i -- intermediate domain only at its resolution
356  * p -- parent domain only at its resolution
357  * m -- innermost and intermediate domains, at innermost domain resolution
358  * c -- if prs, parent and intermediate domains; if sat, all three
359  domains. This is at the intermediate domain resolution.
360  * g -- global quarter degree grid, GRIB1 grid 193. That is the
361  output grid for the GFS master GRIB files."""
362  def __init__(self,ds,conf,section,runwrf,wrf,postdoms,wrfdoms,
363  moad,storm1inner,storm1outer,**kwargs):
364  """!Constructor for HWRFForecastPostProcessing
365  @param ds the produtil.datastore.Datastore to use
366  @param conf the HWRFConfig to use for configuration options.
367  This conf is passed down to the RegribMany during
368  regribbing operations.
369  @param section the config section to use.
370  @param runwrf the object that runs the forecast, such as an
371  hwrf.fcsttask.WRFAtmos or hwrf.mpipomtc.WRFCoupledPOM
372  @param wrf the hwrf.wrf.WRFSimulation that represents the
373  forecast model.
374  @param postdoms a list of domains to post-process in order
375  of GRID id.
376  @param wrfdoms a list of WRF domains in order of GRID id
377  @param moad the Mother Of All Domains (MOAD), an
378  hwrf.wrf.WRFDomain
379  @param storm1inner the first storm's intermediate domain, an
380  hwrf.wrf.WRFDomain
381  @param storm1outer the first storm's innermost domain, an
382  hwrf.wrf.WRFDomain
383  @param kwargs additional keyword arguments are passed to the
384  superclass constructor"""
385  super(HWRFForecastPostProcessing,self).__init__(
386  ds,conf,section,**kwargs)
387  self.runwrf=runwrf
388  self.wrf=wrf
389  self.postdoms=postdoms
390  self.wrfdoms=wrfdoms
391  self.moad=moad
392  self.storm1inner=storm1inner
393  self.storm1outer=storm1outer
394 
395  ##@var runwrf
396  # The hwrf.fcsttask.WRFAtmos or subclass thereof that runs the WRF.
397 
398  ##@var wrf
399  # The hwrf.wrf.WRFSimulation describing the WRF simulation that was run.
400 
401  ##@var postdoms
402  # The array of WRF domains to post-process (hwrf.wrf.WRFDomain objects)
403 
404  ##@var wrfdoms
405  # The array of WRF domains (hwrf.wrf.WRFDomain objects)
406 
407  ##@var moad
408  # The Mother Of All Domains (MOAD) in the WRF simulation, an
409  # hwrf.wrf.WRFDomain object.
410 
411  ##@var storm1outer
412  # The intermediate domain, an hwrf.wrf.WRFDomain
413 
414  ##@var storm1inner
415  # The innermost domain, an hwrf.wrf.WRFDomain
416 
417  def make_nonsatpost(self,default_step=1.):
418  """!Creates the non-satellite post-processor.
419 
420  Creates the nonsatpost member, which runs the non-satellite
421  post processing. That is the object that runs everything
422  except the synthetic satellite brightness temperatures. This
423  is a hwrf.post.PostManyWRF object.
424  @return the created object
425  @param default_step non-satellite post-processor input step,
426  if none is provided in the config file."""
427  step=self.conffloat('nonsatpost_step',default_step)*3600
429  self.runwrf,self.postdoms,self.conf,'nonsatpost',step,
430  needcrtm=False,streams=['history','auxhist2','auxhist3'])
431  return self.nonsatpost
432 
433  ##@var nonsatpost
434  # The non-satellite post-processor, an hwrf.post.PostManyWRF
435  # object.
436 
437  def make_satpost(self,default_step=6):
438  """!Creates the satellite post-processor
439 
440  Creates the satpost member, an hwrf.post.PostManyWRF object
441  that runs the satellite post-processing.
442  @return the created object
443  @param default_step satellite post-processor input step,
444  if none is provided in the config file."""
445  # Post-processors:
446  step=self.conffloat('satpost_step',default_step)*3600
448  self.runwrf,self.postdoms,self.conf,'satpost',step,
449  needcrtm=True,streams=['history','auxhist2','auxhist3'])
450  return self.satpost
451  ##@var satpost
452  # The satellite post-processor, an hwrf.post.PostManyWRF object.
453 
454  def make_wrfcopier(self,wrfcopier_name='copywrf',multistorm=False):
455  """!Generates the WRF input/output copier task.
456 
457  Creates the wrfcopier member variable which copies inputs and
458  outputs of the forecast job directly to COM. This is an
459  hwrf.copywrf.WRFCopyTask object.
460  @return the created object
461  @param wrfcopier_name the section and task name to use for the
462  hwrf.copywrf.WRFCopyTask that is created."""
463  copystart=self.conffloat('wrfcopier_start',0)
464  copyend=self.conffloat('wrfcopier_end',9)
465  copystep=self.conffloat('wrfcopier_step',3)
466  assert(copystep>0)
467 
468  runwrf=self.runwrf
469  wrf=self.wrf
470  if multistorm:
471  wrfcopier = hwrf.multistorm.WRFCopyTaskMS(
472  self.dstore,self.conf,wrfcopier_name,runwrf,
473  self.conf.getstr('config','out_prefix'))
474  else:
475  wrfcopier = hwrf.copywrf.WRFCopyTask(
476  self.dstore,self.conf,wrfcopier_name,runwrf,
477  self.conf.getstr('config','out_prefix'))
478  wrfcopier.d_initial('namelist.input')
479  wrfcopier.d_initial('wrfinput_d01')
480  wrfcopier.d_initial('wrfbdy_d01')
481  wrfcopier.d_initial('fort.65')
482  wrfcopier.d_initial(wrf.analysis_name(self.storm1outer),
483  destname=self.confraw('anl_outer'))
484  wrfcopier.d_initial(wrf.analysis_name(self.storm1inner),
485  destname=self.confraw('anl_inner'))
486  copied=False
487  fhr=copystart
488  while fhr-0.001<copyend:
489  prodstream='history' if fhr % 3 == 0 else 'auxhist2'
490  for product in runwrf.products(time=3600*fhr,stream=prodstream):
491  wrfcopier.d_wrfprod(product,check=False,
492  destname='{vit[stnum]:02d}{vit[basin1lc]}.'
493  '{inname_colon_s00}')
494  # Added 4 retrospective support - rocoto dependency check has upper
495  # case [basin1] in filename to start relocate tasks for the next cycle.
496  wrfcopier.d_wrfprod(product,check=False,
497  destname='{vit[stnum]:02d}{vit[basin1]}.'
498  '{inname_colon_s00}')
499  copied=True
500  fhr2=fhr+copystep
501  assert(fhr2>fhr)
502  fhr=fhr2
503  assert(copied)
504 
505  # Note: Regarding wrfcopier.d_final('somefile_<domain>')
506  # and run_multistorm=yes.
507  # Any domain specific file also needs to be handled by
508  # the _deliver_to_group method of WRFCopyTaskMS else the
509  # same file is copied to each real storms com dir.
510  wrfcopier.d_final('track_d03.patcf')
511 
512  run_wave=self.confstr('run_wave','no')
513  if run_wave == 'yes':
514  ctime=to_datetime_rel(cycling_interval*3600,self.conf.cycle)
515  for p in runwrf.products(stream='ww3rst'):
516  rstime=p['restarttime']
517  rstime=int(rstime)
518  wrfcopier.d_wrfprod(p,check=True,
519  destname='{vit[stormid3lc]}.restart.f%03d.ww3'%rstime)
520 
521  for p in runwrf.products(stream='ww3out'):
522  wrfcopier.d_final(p)
523 
524  self.wrfcopier=wrfcopier
525  return wrfcopier
526 
527  ##@var wrfcopier
528  # The task that copies WRF input and output files directly to COM.
529  # This is an hwrf.copywrf.WRFCopyTask object.
530 
531  def make_gribber_tracker(self,extra_trackers=False,satpost_flag=True,gofile_flag=False):
532  """!Generate the regribbing objects and the main tracker.
533 
534  Generates the gribber, tracker, track and nhcp member
535  variables and returns them in a tuple:
536  * nhcp --- the hwrf.nhc_products.NHCProducts object that
537  makes NHC-specific output products and validates the
538  wrfdiag files.
539  * track --- the final track file output by the tracker, returned
540  by hwrf.tracker.send_atcfunix() called on the new tracker object
541  * tracker --- the hwrf.tracker.TrackerTask that runs the
542  GFDL vortex tracker
543  * gribber --- the hwrf.gribtask.GRIBTask that runs the
544  regribbing on the post-processors created by make_satpost()
545  and make_nonsatpost()
546 
547  @param extra_trackers logical flag: are the parent and
548  intermediate domain trackers also desired? If so, extra
549  regribbing is arranged, that will be required by
550  make_extra_trackers()
551  @param satpost_flag logical flag: is satellite post-processing
552  desired
553  @pre The make_nonsatpost() must have been called. If the
554  satpost_flag=True, then make_satpost() must also have been
555  called.
556  @returns a tuple (nhcp,track,tracker,gribber) of the objects
557  that were created"""
558  # Aliases to simplify below code:
559  (nonsatpost,satpost)=(self.nonsatpost,self.satpost)
560  (moad,storm1inner,storm1outer) = \
561  (self.moad,self.storm1inner,self.storm1outer)
562  conf=self.conf
563  fcstlen=self.confint('forecast_length',126)
564  combinetrack_fhr=self.conffloat('combinetrack_fhr',12.)
565 
566  # Domain selection. These objects will grab Post output for the
567  # specified domain for any arbitrary time when inserted into a
568  # RegribMany object:
569  grid3=igrb1(nonsatpost,domain=storm1inner) # 3km non-satellite post
570  grid2=igrb1(nonsatpost,domain=storm1outer) # 9km non-satellite post
571  grid1=igrb1(nonsatpost,domain=moad) # 27km non-satellite post
572  satE3=igrb1(satpost,domain=storm1inner) # 3km satellite post
573  satE2=igrb1(satpost,domain=storm1outer) # 9km satellite post
574  satE1=igrb1(satpost,domain=moad) # 27km satellite post
575 
576  # The hwrfsub, when used in a RegribMany, selects the
577  # hwrfprs_c and hwrfsat_c GRIB1/2 subset:
579  'part',hwrf.tracker.hwrf_combine_subset,None)
580 
581  # The ghwrfsub, when used in a RegribMany, selects the
582  # hwrfprs_g and hwrfsat_g GRIB1/2 subset:
583  ghwrfsub=hwrf.regrib.GRIBSubsetter(
584  'part',hwrf.tracker.hwrf_global_subset,None)
585 
586  # In a RegribMany, trksub selects the subset needed by the tracker:
588  'part',hwrf.tracker.tracker_subset,None)
589 
590  # The domloc is the location of the HWRF domain center:
591  domloc=hwrf.regrib.FixedLocation(lat=conf['config','domlat'],
592  lon=conf['config','domlon'])
593  basin=conf.syndat.pubbasin2
594  if ((basin=='AL' or basin=='EP') and domloc.ewcenter<360.0):
595  domloc.ewcenter+=360.0 # to match 2013 HWRF behavior
596 
597  # Create the RegribMany object. This object describes the GRIB
598  # processing to do after the post completes:
599  g2p='%d'%(self.confint('grib2_compression',32),)
600  r=RegribMany(copygb=alias(exe(conf.getexe('copygb'))),
601  wgrib=alias(exe(conf.getexe('wgrib'))),
602  cnvgrib_g12=alias(exe(conf.getexe('cnvgrib'))
603  ['-g12','-p'+g2p]))
604 
605  # Define some grids that we'll reuse later:
606  add_clatlon_grid(self,r,'d23',grid2)
607  add_clatlon_grid(self,r,'d123low',domloc)
608  add_clatlon_grid(self,r,'d123high',domloc)
609  add_clatlon_grid(self,r,'d2',grid2)
610  add_clatlon_grid(self,r,'d3',grid3)
611  qd=hwrf.regrib.quarterDegree # GFS quarter degree grid (grid 193)
612 
613  if extra_trackers:
614  # Grids for extra trackers:
615  add_clatlon_grid(self,r,'d2t',grid2)
616  add_clatlon_grid(self,r,'d1t',grid2)
617 
618  r.add('hwrfprs_m',grid2*r.grid('d23')+grid3*r.grid('d23'))
619  r.add('parenthigh',grid1/hwrfsub*r.grid('d123high'))
620 
621  # Regular three domain tracker input:
622  add_expandlatlon_grid(self,r,'trk','hwrfprs_m')
623  r.add('trkbasic',(r.GRIB('parenthigh')/trksub) \
624  .regridmerge(r.grid('trk'),r.GRIB('hwrfprs_m')/trksub))
625  r.add('hwrftrk',hwrf.tracker.vinttave(r.GRIB('trkbasic')))
626 
627  r.add('hwrfprs_n',grid3*r.grid('d3'))
628  r.add('hwrfprs_i',grid2*r.grid('d2'))
629  r.add('hwrfprs_p',grid1*r.grid('d123low'))
630  r.add('hwrfprs_c',grid1/hwrfsub*r.grid('d123high') +
631  (grid2/hwrfsub*r.grid('d123high') +
632  grid3/hwrfsub*r.grid('d123high')))
633  r.add('hwrfprs_g',grid1/ghwrfsub*qd +
634  (grid2/ghwrfsub*qd + grid3/ghwrfsub*qd))
635 
636  # Extra input for d02 and d01 trackers:
637  if extra_trackers:
638  r.add('hwrftrkd01',((grid1/trksub)*r.grid('d1t')).make_grbindex())
639  r.add('hwrftrkd02',((grid1/trksub)*r.grid('d2t')
640  +(grid2/trksub)*r.grid('d2t')).make_grbindex())
641  #r.add('hwrftrk27km',hwrf.tracker.vinttave(r.GRIB('trk27km')))
642  #r.add('hwrftrk9km',hwrf.tracker.vinttave(r.GRIB('trk9km')))
643 
644  if satpost_flag:
645  r.add('hwrfsat_m',satE2*r.grid('d23')+satE3*r.grid('d23'))
646  r.add('hwrfsat_n',satE3*r.grid('d3'))
647  r.add('hwrfsat_i',satE2*r.grid('d2'))
648  r.add('hwrfsat_p',satE1*r.grid('d123low'))
649  r.add('hwrfsat_c',satE1/hwrfsub*r.grid('d123high') +
650  satE2/hwrfsub*r.grid('d123high')) # sat_c only includes
651  # d01 and d02
652  r.add('hwrfsat_g',satE1/hwrfsub*qd +
653  (satE2/hwrfsub*qd + satE3/hwrfsub*qd))
654 
655  # Add GRIB2 converted versions of all GRIB1 products. GRIB2,
656  # unlike GRIB1, delivers the massive hwrfprs_m file.
657  if satpost_flag:
658  do_me=('prs','sat')
659  else:
660  do_me=('prs',)
661  for T in do_me:
662  for D in 'mnipcg': # iterates over those five letters
663  inx='hwrf%s_%s'%(T,D) # looks like: hwrfprs_m
664  outx='hwrf2%s_%s'%(T,D) # looks like: hwrf2prs_m
665  r.add(outx,r.GRIB(inx)*GRIB2)
666 
667  splist=[ 'prs' ]
668  if satpost_flag: splist.append('sat')
669  for v in ( '', '2' ):
670  for sp in splist:
671  for g in 'gmnipc':
672  base='hwrf'+v+sp+'_'+g # hwrf2prs_g
673  to_com_intercom(self,base,r)
674  to_com_intercom(self,'hwrftrk',r)
675 
676  # Create the GRIBTask which will actually do the re-gribbing:
677  gribber=hwrf.gribtask.GRIBTask(
678  self.dstore,conf,'regribber',r,start=conf.cycle,
679  step=3600,end=fcstlen*3600)
680 
681  # Run the GFDL vortex tracker in multi-file moveable grid
682  # mode off of the hwrftrk files from gribber:
683  tracker=hwrf.tracker.TrackerTask(self.dstore,conf,'tracker',
684  start=conf.cycle, step=self.conffloat('tracker_step',1)*3600,
685  end=fcstlen*3600)
686  tracker.add_moving_grid(conf.syndat,gribber,'hwrftrk')
687  tracker.send_raw_atcfunix('rawatcfunix',
688  conf.strinterp('dir','{com}/{out_prefix}.trak.hwrf.raw'))
689  track=tracker.send_atcfunix('cleanatcfunix',
690  conf.strinterp('dir','{com}/{out_prefix}.trak.hwrf.atcfunix'))
691  tracker.send_atcfunix_subset('atcf3hourly',freq=3,
692  location=conf.strinterp('dir','{com}/{out_prefix}.trak.hwrf.3hourly'))
693  tracker.send_atcfunix_subset('atcfshort6hr',freq=6,cut=112,
694  location=conf.strinterp('dir','{com}/{out_prefix}.trak.hwrf.short6hr'))
695  tracker.send_atcfunix_subset('combinetrack',fhr=12,
696  location=conf.strinterp(
697  'dir','{com}/{vit[stnum]:02d}{basin1lc}.trak.hwrf.'
698  'atcfunix.{YMDH}.combine'))
699 
700  # Added 4 retrospective support - rocoto dependency check looks for
701  # upper case [basin1] in filename to start relocate tasks for the
702  # next cycle. Py scripts
703  # still want lower case.
704  tracker.send_atcfunix_subset('combinetrack_uc',fhr=12,
705  location=conf.strinterp(
706  'dir','{com}/{vit[stnum]:02d}{basin1}.trak.hwrf.'
707  'atcfunix.{YMDH}.combine'))
708 
709  if gofile_flag:
710  tracker.send_atcfunix_subset('combinetrack_00',fhr=12,
711  location=conf.strinterp(
712  'dir','{realstormcom}/relocate.trak.'
713  '{YMDH}.go',realstorm='{fakestormid}'))
714 
715  #location=conf.strinterp(
716  # 'dir','{CDSCRUB}/{RUNhwrf}/com/{YMDH}/{fakestormid}/relocate.trak.'
717  # '{YMDH}.go'))
718 
719 
720 
721 
722  # Run the hwrf_nhc_products program to generate the swath,
723  # afos file and other custom outputs for NHC:
725  self.dstore,conf,'nhc_products',self.runwrf,track,
726  self.wrfdoms,self.conf.syndat)
727 
728  self.nhcp=nhcp
729  self.track=track
730  self.tracker=tracker
731  self.gribber=gribber
732  return (gribber,tracker,track,nhcp)
733 
734  ##@var nhcp
735  # The task that generates custom products for NHC. This is an
736  #hwrf.nhc_products.NHCProducts object.
737 
738  ##@var tracker
739  # Task that runs the GFDL vortex tracker on all three domains
740  #combined. This is an hwrf.tracker.TrackerTask.
741 
742  ##@var track
743  # The main track file from self.tracker.
744 
745  ##@var gribber
746  # The hwrf.gribtask.GRIBTask that does the regribbing.
747 
749  """!Generates intermediate and outermost domain trackers.
750 
751  Generates trackers that use intermediate and outermost domain
752  data to track the storm and analyze its intensity. These are
753  intended for use in analyzing the effects of resolution and
754  upscale feedback on hurricane track, structure and
755  intensity. Creates these member variables and returns them:
756  * trackerd01 --- a tracker that just uses the outermost domain data
757  * trackerd02 --- a tracker that uses the outermost and
758  intermediate domain data
759  @return A tuple (trackerd01,trackerd02) of the new trackers
760  @pre The make_gribber_tracker() must have been called with
761  extra_trackers=True, so it will add the extra GRIB products
762  needed by the new trackers."""
763  ds=self.dstore
764  conf=self.conf
765  gribber=self.gribber
766  fcstlen=conf.getint('config','forecast_length',126)
767  tracker_step=self.conffloat('tracker_step')*3600
768 
769  # d01+d02 tracker:
770  trackerd02=hwrf.tracker.TrackerTask(ds,conf,'trackerd02',
771  start=conf.cycle, step=tracker_step, end=fcstlen*3600)
772  trackerd02.add_moving_grid(conf.syndat,gribber,'hwrftrkd02')
773  trackerd02.send_raw_atcfunix('rawatcfunix',
774  conf.strinterp('dir','{com}/{out_prefix}.trak.hwrfd02.raw'))
775  trackerd02.send_atcfunix('cleanatcfunix',
776  conf.strinterp('dir','{com}/{out_prefix}.trak.hwrfd02.atcfunix'))
777 
778  # d01 tracker:
779  trackerd01=hwrf.tracker.TrackerTask(ds,conf,'trackerd01',
780  start=conf.cycle, step=tracker_step, end=fcstlen*3600)
781  trackerd01.add_moving_grid(conf.syndat,gribber,'hwrftrkd01')
782  trackerd01.send_raw_atcfunix('rawatcfunix',
783  conf.strinterp('dir','{com}/{out_prefix}.trak.hwrfd01.raw'))
784  trackerd01.send_atcfunix('cleanatcfunix',
785  conf.strinterp('dir','{com}/{out_prefix}.trak.hwrfd01.atcfunix'))
786  self.trackerd02=trackerd02
787  self.trackerd01=trackerd01
788  return (trackerd01,trackerd02)
789 
790  ##@var trackerd01
791  # The hwrf.tracker.TrackerTask that runs the GFDL vortex tracker
792  # on the outermost domain vortex only.
793 
794  ##@var trackerd02
795  # The hwrf.tracker.TrackerTask that runs the GFDL vortex tracker
796  # on the combined outermost and intermediate domain vortex,
797  # omitting the innermost domain.
798 
799 class ForecastBase(object):
800  def __init__(self,conf,ds,wrf,pominit,ww3init,hycominit,ocstatus):
801  super(ForecastBase,self).__init__()
802  ( self.conf, self.ds, self.wrf, self.pominit, self.ww3init ) = \
803  ( conf, ds, wrf, pominit, ww3init )
804  ( self.hycominit, self.ocstatus ) = \
805  ( hycominit, ocstatus )
806  self.runwrf=None
807  self.ww3post=None
808  self.hycompost=None
809  self.realwrf=None
810  def make_forecast(self):
811  # Get config information:
812  ocean_flag=self.conf.getbool('config','run_ocean')
813  ocean=self.conf.getstr('config','ocean_model','POM')
814  wave_flag=self.conf.getbool('config','run_wave')
815  wave=self.conf.getstr('config','wave_model','WW3')
816  fcst_sec=self.conf.getstr('config','forecast_section','runwrf')
817  ww3poststep=self.conf.getint('forecast_products','ww3_output_step',10800)
818 
819  # Update return values:
820  if ocean_flag and ocean=='HYCOM':
821  if wave_flag and wave=='WW3':
823  '[config] run_wave=%s for HWRF-HYCOM but should be False'%(
824  wave_flag))
825 # TODO: MUST ADD HYCOM-WW3 CAPABILITIES HERE
826 # runwrf=hwrf.hycom.WRFWW3HYCOM(
827 # ds,conf,fcst_sec,wrf,ocstatus,
828 # taskname='runwrf',hycominit=hycominit,ww3init=ww3init)
829 # hycompost=hwrf.hycom.HYCOMPost(ds,conf,'hycompost',
830 # fcstlen=fcstlen,hycom=runwrf)
831 # ww3post=hwrf.ww3.WW3Post(ds,conf,'ww3post',
832 # fcstlen=fcstlen,ww3=runwrf)
833  else:
835  self.ds,self.conf,fcst_sec,self.wrf,self.ocstatus,
836  taskname='runwrf',hycominit=self.hycominit)
838  self.ds,self.conf,'hycompost',
839  fcstlen=fcstlen,hycom=runwrf)
840  elif ocean_flag and ocean=='POM':
841  if wave_flag and wave=='WW3':
843  self.ds,self.conf,fcst_sec,self.wrf,taskname='runwrf',
844  pominit=self.pominit,ww3init=self.ww3init)
845  self.ww3post=hwrf.ww3.WW3Post(self.ds,self.conf,'ww3post',
846  poststep=ww3poststep,ww3=runwrf)
847  else:
849  self.ds,self.conf,fcst_sec,self.wrf,taskname='runwrf',
850  pominit=self.pominit)
851  else:
853  self.ds,self.conf,fcst_sec,self.wrf,taskname='runwrf')
854  self.realwrf=self.runwrf
855  return self.realwrf
856 
858  def __init__(self,conf,ds,wrf,multistorm_sids,finalmerge,
859  stormNouter,stormNinner):
860  super(FakeStormForecast,self).__init__(
861  conf,ds,wrf,None,None,None,None)
862  self.multistorm_sids=multistorm_sids
863  self.finalmerge=finalmerge
864  self.stormNouter=stormNouter
865  self.stormNinner=stormNinner
866  def make_forecast(self):
867  # Get config information:
868  ocean_flag=self.conf.getbool('config','run_ocean')
869  wave_flag=self.conf.getbool('config','run_wave')
870  fcst_sec=self.conf.getstr('config','forecast_section','runwrf')
871  prioritystorm=self.multistorm_sids[0]
872  num_realstorms=len(self.multistorm_sids)
873 
874  if ocean_flag or wave_flag:
876  'Ocean and wave must be disabled when running in '
877  'multi-storm mode ([config] run_ocean and run_wave '
878  'must = no).')
879  # if fake multistorm runwrf:
881  self.ds,self.conf,fcst_sec,self.wrf,taskname='runwrf')
882 
883  fakeinit=hwrf.multistorm.FakeInit(
884  self.ds,self.conf,'fakeinit',self.wrf,prioritystorm,
885  self.stormNinner,self.stormNouter)
886  runwrf.add_metgrid(fakeinit).add_geogrid(fakeinit) \
887  .add_fort65(fakeinit).add_wrfbdy(fakeinit)
888 
889  # Using fakeinit so gfs_init/realinit wrfinput is delivered
890  # to the finalmerge work directory.
891  self.finalmerge.add_wrfinput(fakeinit,prioritystorm)
892  for i in range(1,num_realstorms + 1):
893  stormid=self.multistorm_sids[i-1]
894  self.finalmerge.add_merge(fakeinit,stormid)
895  runwrf.add_wrfanl(fakeinit,self.stormNouter['storm%souter'%i])
896  runwrf.add_wrfanl(fakeinit,self.stormNinner['storm%sinner'%i])
897  runwrf.add_wrfinput(self.finalmerge)
898  self.runwrf=runwrf
def make_nonsatpost
Creates the non-satellite post-processor.
Definition: hwrfsystem.py:417
Runs the POM initialization and POM-WRF coupled forecast.
Definition: mpipomtc.py:1
Create namelists, monitor wrf simulations, generate filenames.
Definition: wrf.py:1
Runs regrib operations on many input times, sending output to an hwrf.gribtask.GRIBTask.
Definition: regrib.py:311
gsigribber
The hwrf.gribtask.GRIBTask that will regrid the output of the gsipost, creating lat-lon grib files as...
Definition: hwrfsystem.py:246
A wrapper around PostOneWRF that posts many WRF output times.
Definition: post.py:514
def make_satpost
Creates the satellite post-processor.
Definition: hwrfsystem.py:437
The base class of tasks run by the HWRF system.
Definition: hwrftask.py:25
tracker
Task that runs the GFDL vortex tracker on all three domains combined.
Definition: hwrfsystem.py:730
Post-processes GSI inputs and outputs.
Definition: gsipost.py:32
This task runs the GFDL Vortex Tracker on HWRF output.
Definition: tracker.py:649
conf
This HWRFTask's hwrf.config.HWRFConfig object.
Definition: hwrftask.py:415
dstore
Read-only property, an alias for getdatastore(), the Datastore in which this Datum resides...
Definition: datastore.py:557
storm1inner
The innermost domain, an hwrf.wrf.WRFDomain.
Definition: hwrfsystem.py:392
def make_gribber_tracker
Generate the regribbing objects and the main tracker.
Definition: hwrfsystem.py:531
trackerd02
The hwrf.tracker.TrackerTask that runs the GFDL vortex tracker on the combined outermost and intermed...
Definition: hwrfsystem.py:786
def add_clatlon_grid(task, r, name, rel)
Add a domain-centered lat-lon grid to a RegribMany object.
Definition: hwrfsystem.py:29
track
The main track file from self.tracker.
Definition: hwrfsystem.py:729
A GRIBBase that subsets GRIB files, keeping only certain parameters.
Definition: regrib.py:1366
Defines StormInfo and related functions for interacting with vitals ATCF data.
Definition: storminfo.py:1
Base class of tasks run by HWRF.
Definition: hwrftask.py:1
A shell-like syntax for running serial, MPI and OpenMP programs.
Definition: run.py:1
wrfcopier
The task that copies WRF input and output files directly to COM.
Definition: hwrfsystem.py:524
gsipost
The hwrf.gsipost.GSIPost object that will post-process GSI inputs and outputs, creating native E grid...
Definition: hwrfsystem.py:245
def __init__(self, ds, conf, section, runwrf, wrf, postdoms, wrfdoms, moad, storm1inner, storm1outer, kwargs)
Constructor for HWRFForecastPostProcessing.
Definition: hwrfsystem.py:363
def make_wrfcopier
Generates the WRF input/output copier task.
Definition: hwrfsystem.py:454
def to_com_intercom(task, what, r)
Requests deliver to com and/or intercom of a RegribMany product.
Definition: hwrfsystem.py:96
def __init__(self, ds, conf, section, kwargs)
HWRFGSIPostProcessing constructor.
Definition: hwrfsystem.py:155
def confraw
Get a raw configuration value before string expansion.
Definition: hwrftask.py:338
def make_extra_trackers(self)
Generates intermediate and outermost domain trackers.
Definition: hwrfsystem.py:748
Raised when the user requests a configuration that makes sense, but is not supported.
Definition: exceptions.py:91
PrepHybrid runs the prep_hybrid program to transform GFS spectral files to the HWRF grid...
Definition: prep.py:1
Contains the WRFCopyTask, which delivers WRF output and input.
Definition: copywrf.py:1
Utilities for ensemble-based data assimilation.
Definition: ensda.py:1
Runs the real_nmm or wrf executables.
Definition: fcsttask.py:1
def add_expandlatlon_grid(task, r, name, rel)
Adds a grid-centered lat-lon grid to a RegribMany object.
Definition: hwrfsystem.py:59
Stores products and tasks in an sqlite3 database file.
Definition: datastore.py:1
The uncoupled HWRF forecast Task.
Definition: fcsttask.py:1544
Runs the GSI data assimilation on the HWRF system.
Definition: gsi.py:1
Time manipulation and other numerical routines.
Definition: numerics.py:1
wrfdoms
The array of WRF domains (hwrf.wrf.WRFDomain objects)
Definition: hwrfsystem.py:390
Declares GRIBTask, which automates regribbing operations.
Definition: gribtask.py:1
This module contains Tasks to run the WRF Preprocessing System (WPS): Geogrid, Ungrib and Metgrid...
Definition: wps.py:1
runwrf
The hwrf.fcsttask.WRFAtmos or subclass thereof that runs the WRF.
Definition: hwrfsystem.py:387
An hwrf.hwrftask.HWRFTask that performs regribbing operations.
Definition: gribtask.py:46
nhcp
The task that generates custom products for NHC.
Definition: hwrfsystem.py:728
def confint
Alias for self.conf.getint for section self.section.
Definition: hwrftask.py:248
def make_gsi_post
Creates the gsi post-processor and regribber tasks.
Definition: hwrfsystem.py:165
moad
The Mother Of All Domains (MOAD) in the WRF simulation, an hwrf.wrf.WRFDomain object.
Definition: hwrfsystem.py:391
gribber
The hwrf.gribtask.GRIBTask that does the regribbing.
Definition: hwrfsystem.py:731
nonsatpost
The non-satellite post-processor, an hwrf.post.PostManyWRF object.
Definition: hwrfsystem.py:428
def conffloat
Alias for self.conf.getfloat for section self.section.
Definition: hwrftask.py:274
Represents a specific location on the earth as a latitude, longitude pair.
Definition: regrib.py:1300
satpost
The satellite post-processor, an hwrf.post.PostManyWRF object.
Definition: hwrfsystem.py:447
parses UNIX conf files and makes the result readily available
Definition: config.py:1
Combines Tasks from multiple modules into a single initialization object.
Definition: init.py:1
Creates the initial HWRF directory structure, loads information into each job.
Definition: launcher.py:1
Generates NHC-specific products and validates wrfdiag files.
Definition: nhc_products.py:1
wrf
The hwrf.wrf.WRFSimulation describing the WRF simulation that was run.
Definition: hwrfsystem.py:388
Creates the post-processing for the HWRF forecast job.
Definition: hwrfsystem.py:258
storm1outer
The intermediate domain, an hwrf.wrf.WRFDomain.
Definition: hwrfsystem.py:393
This is a wrapper around the hwrf_nhc_products Fortran program.
Definition: nhc_products.py:26
vinttave
An alias for GRIB1VintTave.
Definition: tracker.py:388
wrf file delivery task
Definition: copywrf.py:67
Runs the Unified Post Processor on outputs from the WRF-NMM, producing E grid GRIB files as EGRIB1Pro...
Definition: post.py:1
This module contains tasks to prepare input for the GFDL Vortex Tracker, run the tracker and deliver ...
Definition: tracker.py:1
def confstr
Alias for self.conf.getstr for section self.section.
Definition: hwrftask.py:261
Describes regribbing operations using an algebraic structure.
Definition: regrib.py:1
This module implements Python classes that run the 2014 HWRF Relocation.
Definition: relocate.py:1
trackerd01
The hwrf.tracker.TrackerTask that runs the GFDL vortex tracker on the outermost domain vortex only...
Definition: hwrfsystem.py:787
Contains Bufrprep, which converts data tanks to bufr files, and otherwise preprocesses the prepbufr a...
Definition: bufrprep.py:1
Configures the GSI post-processing and regribbing.
Definition: hwrfsystem.py:121
postdoms
The array of WRF domains to post-process (hwrf.wrf.WRFDomain objects)
Definition: hwrfsystem.py:389
Runs a WRF-POM coupled simulation.
Definition: mpipomtc.py:360