Changeset 45b99e6 in flex_extract.git


Ignore:
Timestamp:
Feb 15, 2019, 3:48:31 PM (5 years ago)
Author:
Anne Philipp <anne.philipp@…>
Branches:
master, ctbto, dev
Children:
b9f1214
Parents:
ae2756e
Message:

added possibility to extract ensemble members with ELDA stream (and ENFO)

Location:
source/python
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • source/python/classes/EcFlexpart.py

    rd4696e0 r45b99e6  
    6767                     codes_get_values, codes_set_values, codes_set,
    6868                     codes_write, codes_release, codes_new_from_index,
    69                      codes_index_release, codes_index_get)
     69                     codes_index_release, codes_index_get, codes_get_array,
     70                     codes_set_array, codes_grib_new_from_file)
    7071
    7172# software specific classes and modules from flex_extract
     
    7778                        execute_subprocess)
    7879from MarsRetrieval import MarsRetrieval
     80from UioFiles import UioFiles
    7981import mods.disaggregation as disaggregation
    8082
     
    663665
    664666        for ftype in self.types:
    665             # fk contains field types such as
     667            # ftype contains field types such as
    666668            #     [AN, FC, PF, CV]
    667             # fv contains all of the items of the belonging key
    668             #     [times, steps]
    669669            for pk, pv in self.params.iteritems():
    670670                # pk contains one of these keys of params
     
    707707                    retr_param_dict['area'] = ""
    708708                    retr_param_dict['gaussian'] = 'reduced'
     709                if ftype.upper() == 'FC' and \
     710                    'acc' not in retr_param_dict['target']:
     711                    if (int(retr_param_dict['time'][0]) +
     712                        int(retr_param_dict['step'][0])) > 23:
     713                        dates = retr_param_dict['date'].split('/')
     714                        sdate = datetime.strptime(dates[0], '%Y%m%d%H')
     715                        sdate = sdate - timedelta(days=1)
     716                        retr_param_dict['date'] = '/'.join(
     717                            [sdate.strftime("%Y%m%d")] +
     718                            retr_param_dict['date'][1:])
     719
     720                        print('CHANGED FC start date to ' +
     721                              sdate.strftime("%Y%m%d") +
     722                              ' to accomodate TIME=' +
     723                              retr_param_dict['time'][0] +
     724                              ', STEP=' +
     725                              retr_param_dict['time'][0])
    709726
    710727    # ------  on demand path  --------------------------------------------------
     
    760777                            times = retr_param_dict['time'].split('/')
    761778                            steps = retr_param_dict['step'].split('/')
    762                             print 'times', times, int(times[0]), times[1:]
    763                             print 'steps', steps, int(steps[0])
     779
    764780                            while int(times[0]) + int(steps[0]) <= 12:
    765                                 print 'HELLO'
    766781                                times = times[1:]
    767                                 print 'in while 1 ', times
    768 
    769782                                if len(times) > 1:
    770783                                    retr_param_dict['time'] = '/'.join(times)
    771784                                else:
    772785                                    retr_param_dict['time'] = times[0]
    773 
    774                                 print 'in while 2 ', times
    775                                 print retr_param_dict['time']
    776786
    777787                        if (pk != 'OG_OROLSM__SL' and
     
    916926        # get the values of the keys which are used for distinct access
    917927        # of grib messages via product
    918         index_keys = ["date", "time", "step"]
     928        if '/' in self.number:
     929            # more than one ensemble member is selected
     930            index_keys = ["number", "date", "time", "step"]
     931        else:
     932            index_keys = ["date", "time", "step"]
    919933        iid, index_vals = self._mk_index_values(c.inputdir,
    920934                                                inputfiles,
     
    9911005                t_enddate = t_date + timedelta(2*int(c.dtime))
    9921006
     1007            # if necessary, add ensemble member number to filename suffix
     1008            # otherwise, add empty string
     1009            if 'number' in index_keys:
     1010                index_number = index_keys.index('number')
     1011                if len(index_vals[index_number]) > 1:
     1012                    numbersuffix = '.N{:0>3}'.format(int(prod[index_number]))
     1013            else:
     1014                numbersuffix = ''
     1015
    9931016            if c.purefc:
    9941017                fnout = os.path.join(c.inputdir, 'flux' +
    9951018                                     t_date.strftime('%Y%m%d.%H') +
    996                                      '.{:0>3}'.format(step-2*int(c.dtime)))
     1019                                     '.{:0>3}'.format(step-2*int(c.dtime)) +
     1020                                     numbersuffix)
    9971021                gnout = os.path.join(c.inputdir, 'flux' +
    9981022                                     t_date.strftime('%Y%m%d.%H') +
    999                                      '.{:0>3}'.format(step-int(c.dtime)))
     1023                                     '.{:0>3}'.format(step-int(c.dtime)) +
     1024                                     numbersuffix)
    10001025                hnout = os.path.join(c.inputdir, 'flux' +
    10011026                                     t_date.strftime('%Y%m%d.%H') +
    1002                                      '.{:0>3}'.format(step))
     1027                                     '.{:0>3}'.format(step) +
     1028                                     numbersuffix)
    10031029            else:
    10041030                fnout = os.path.join(c.inputdir, 'flux' +
    1005                                      t_m2dt.strftime('%Y%m%d%H'))
     1031                                     t_m2dt.strftime('%Y%m%d%H') + numbersuffix)
    10061032                gnout = os.path.join(c.inputdir, 'flux' +
    1007                                      t_m1dt.strftime('%Y%m%d%H'))
     1033                                     t_m1dt.strftime('%Y%m%d%H') + numbersuffix)
    10081034                hnout = os.path.join(c.inputdir, 'flux' +
    1009                                      t_dt.strftime('%Y%m%d%H'))
     1035                                     t_dt.strftime('%Y%m%d%H') + numbersuffix)
    10101036
    10111037            print("outputfile = " + fnout)
     
    13701396        # get the values of the keys which are used for distinct access
    13711397        # of grib messages via product
    1372         index_keys = ["date", "time", "step"]
     1398        if '/' in self.number:
     1399            # more than one ensemble member is selected
     1400            index_keys = ["number", "date", "time", "step"]
     1401        else:
     1402            index_keys = ["date", "time", "step"]
    13731403        iid, index_vals = self._mk_index_values(c.inputdir,
    13741404                                                inputfiles,
     
    15241554            else:
    15251555                suffix = cdate_hour[2:10]
     1556
     1557            # if necessary, add ensemble member number to filename suffix
     1558            if 'number' in index_keys:
     1559                index_number = index_keys.index('number')
     1560                if len(index_vals[index_number]) > 1:
     1561                    suffix = suffix + '.N{:0>3}'.format(int(prod[index_number]))
     1562
    15261563            fnout = os.path.join(c.inputdir, c.prefix + suffix)
    15271564            print("outputfile = " + fnout)
     
    15531590
    15541591        codes_index_release(iid)
     1592
     1593        return
     1594
     1595
     1596    def calc_extra_elda(self, path, prefix):
     1597        ''' Calculates extra ensemble members for ELDA - Stream.
     1598
     1599        Parameters
     1600        ----------
     1601        path : str
     1602            Path to the output files.
     1603
     1604        prefix : str
     1605            The prefix of the output filenames as defined in Control file.
     1606
     1607        Return
     1608        ------
     1609
     1610        '''
     1611        # max number
     1612        maxnum = int(self.number.split('/')[-1])
     1613
     1614        # get a list of all prepared output files with control forecast (CF)
     1615        CF_filelist = UioFiles(path, prefix + '*.N000')
     1616
     1617        for cffile in CF_filelist.files:
     1618            with open(cffile, 'rb') as f:
     1619                cfvalues=[]
     1620                while True:
     1621                    fid = codes_grib_new_from_file(f)
     1622                    if fid is None:
     1623                        break
     1624                    cfvalues.append(codes_get_array(fid, 'values'))
     1625                    codes_release(fid)
     1626
     1627            filename = cffile.split('N000')[0]
     1628            for i in range(1, maxnum+1): # max number nehmen
     1629
     1630                # read an ensemble member
     1631                g = open(filename + 'N{:0>3}'.format(i), 'rb')
     1632                # create file for newly calculated ensemble member
     1633                h = open(filename + 'N{:0>3}'.format(i+maxnum), 'wb')
     1634                # number of message in grib file
     1635                j = 0
     1636                while True:
     1637                    gid = codes_grib_new_from_file(g)
     1638                    if gid is None:
     1639                        break
     1640                    values = codes_get_array(gid, 'values')
     1641                    codes_set_array(gid, 'values',
     1642                                    values-2*(values-cfvalues[j]))
     1643                    codes_set(gid, 'number', i+maxnum)
     1644                    codes_write(gid, h)
     1645                    codes_release(gid)
     1646                    j += 1
     1647
     1648                g.close()
     1649                h.close()
     1650                print('wrote ' + filename + 'N{:0>3}'.format(i+maxnum))
     1651                self.outputfilelist.append(
     1652                    os.path.basename(filename + 'N{:0>3}'.format(i+maxnum)))
    15551653
    15561654        return
  • source/python/mods/get_mars_data.py

    rd4696e0 r45b99e6  
    209209
    210210
     211def check_dates_for_nonflux_fc_times(types, times):
     212    '''
     213    '''
     214    for ty, ti in zip(types,times):
     215        if ty.upper() == 'FC' and int(ti) == 18:
     216            return True
     217    return False
     218
     219
    211220def mk_dates(c, fluxes):
    212221    '''Prepares start and end date depending on flux or non flux data.
     
    258267        start = start - timedelta(days=1)
    259268        end = end + timedelta(days=1)
     269
     270    # if we have non-flux forecast data starting at 18 UTC
     271    # we need to start retrieving data one day in advance
     272    if not fluxes and check_dates_for_nonflux_fc_times(c.type, c.time):
     273        start = start - timedelta(days=1)
    260274
    261275    return start, end, chunk
  • source/python/mods/prepare_flexpart.py

    rd4696e0 r45b99e6  
    177177    flexpart = EcFlexpart(c, fluxes=False)
    178178    flexpart.create(inputfiles, c)
     179    if c.stream.lower() == 'elda':
     180        flexpart.calc_extra_elda(os.path.join(c.inputdir, c.prefix))
    179181    flexpart.process_output(c)
    180182
Note: See TracChangeset for help on using the changeset viewer.
hosted by ZAMG