Esempio n. 1
0
def _extract_variable(short_name, var, cfg, file_path, out_dir):
    """Extract variable."""

    raw_var = var.get('raw', short_name)
    cube = iris.load_cube(file_path, utils.var_name_constraint(raw_var))

    # Fix units
    cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name)
    if 'raw_units' in var:
        cube.units = var['raw_units']
    cube.convert_units(cmor_info.units)

    # Fix calendar type
    cal_time = var.get('calendar', short_name)
    origin_time = cube.coord('time').units.origin
    cube.coord('time').units = cf_units.Unit(origin_time, calendar=cal_time)
    utils.convert_timeunits(cube, 1950)

    # Fix coordinates
    utils.fix_coords(cube)

    # Fix metadata
    attrs = cfg['attributes']
    attrs['mip'] = var['mip']
    utils.fix_var_metadata(cube, cmor_info)
    utils.set_global_atts(cube, attrs)

    # Save variable
    utils.save_variable(cube,
                        short_name,
                        out_dir,
                        attrs,
                        unlimited_dimensions=['time'])

    if 'add_mon' in var.keys():
        if var['add_mon']:
            logger.info("Building monthly means")

            # Calc monthly
            cube = monthly_statistics(cube)
            cube.remove_coord('month_number')
            cube.remove_coord('year')

            # Fix metadata
            attrs['mip'] = 'Amon'

            # Fix coordinates
            utils.fix_coords(cube)

            # Save variable
            utils.save_variable(cube,
                                short_name,
                                out_dir,
                                attrs,
                                unlimited_dimensions=['time'])
Esempio n. 2
0
def _compute_monthly(cube):
    """Convert various frequencies to daily frequency.

    ERA-Interim-Land is in 6hr freq need to convert to monthly

    """
    cube = monthly_statistics(cube, operator='mean')
    # Remove monthly statistics aux coordinates
    cube.remove_coord(cube.coord('month_number'))
    cube.remove_coord(cube.coord('year'))
    return cube
def _extract_variable(short_name, var, res, cfg, filepath, out_dir):
    """Extract variable."""
    raw_var = var.get('raw', short_name)
    cube = iris.load_cube(filepath, utils.var_name_constraint(raw_var))

    # Fix units
    cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name)
    cube.units = var.get('raw_units', short_name)
    cube.convert_units(cmor_info.units)
    utils.convert_timeunits(cube, 1950)

    # Fix coordinates
    fix_coords_non_symetric_lon(cube)
    if 'height2m' in cmor_info.dimensions:
        utils.add_height2m(cube)

    # Fix metadata
    utils.fix_var_metadata(cube, cmor_info)
    attrs = cfg['attributes'].copy()
    attrs['version'] = 'v' + attrs['version'] + '-' + str(res)
    attrs.pop('resolution')
    attrs['mip'] = var['mip']
    utils.set_global_atts(cube, attrs)

    # Save variable
    utils.save_variable(cube,
                        short_name,
                        out_dir,
                        attrs,
                        unlimited_dimensions=['time'])

    #####
    # also derive monthly data
    if 'add_mon' in var:
        if var['add_mon']:
            logger.info("Building monthly means")

            # Calc monthly
            cube = monthly_statistics(cube)
            cube.remove_coord('month_number')
            cube.remove_coord('year')

            # Fix metadata
            attrs['mip'] = 'Amon'

            # Fix coordinates
            fix_coords_non_symetric_lon(cube)

            # Save variable
            utils.save_variable(cube,
                                short_name,
                                out_dir,
                                attrs,
                                unlimited_dimensions=['time'])
 def _extract_variable(self, var_infos, raw_info, year, mips):
     """Extract to all vars."""
     cubes = iris.load(
         raw_info['file'],
         iris.Constraint(
             cube_func=lambda c: c.var_name == raw_info['name']))
     tracking_ids = self._unify_attributes(cubes)
     cube = cubes.concatenate_cube()
     del cubes
     if tracking_ids:
         cube.attributes['tracking_ids'] = tracking_ids
     cube.coord('projection_x_coordinate').var_name = 'x'
     cube.coord('projection_y_coordinate').var_name = 'y'
     lon_coord = cube.coord('longitude')
     lon_coord.points[lon_coord.points < 0] += 360
     source_cube = cube
     attrs = self.cfg['attributes']
     for mip in mips:
         var_info = var_infos[mip]
         attrs['mip'] = mip
         if var_info.frequency == 'mon':
             cube = monthly_statistics(source_cube)
             cube = self._fill_months(cube)
         elif var_info.frequency == 'day':
             cube = self._fill_days(source_cube, year)
         if not cube:
             continue
         logger.debug(cube)
         fix_var_metadata(cube, var_info)
         convert_timeunits(cube, year)
         set_global_atts(cube, attrs)
         self._try_remove_coord(cube, 'year')
         self._try_remove_coord(cube, 'day_of_year')
         self._try_remove_coord(cube, 'month_number')
         self._try_remove_coord(cube, 'day_of_month')
         save_variable(cube, var_info.short_name, self.out_dir, attrs)
     return cube
Esempio n. 5
0
def _extract_variable(short_name, var, cfg, filepath, out_dir, version):
    """Extract variable."""
    logger.info("CMORizing variable '%s' from input file '%s'", short_name,
                filepath)

    with catch_warnings():
        filterwarnings(
            action='ignore',
            message="Skipping global attribute 'calendar': 'calendar' is .*",
            category=UserWarning,
            module='iris',
        )
        try:
            cube = iris.load_cube(
                str(filepath),
                constraint=utils.var_name_constraint(var['raw']),
            )
        except iris.exceptions.ConstraintMismatchError:
            cube = iris.load_cube(
                str(filepath),
                constraint=utils.var_name_constraint(var['raw_fallback']),
            )

    # Fix var units
    cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name)
    cube.units = var.get('raw_units', short_name)
    cube.convert_units(cmor_info.units)
    utils.fix_var_metadata(cube, cmor_info)

    # fix coordinates
    if 'height2m' in cmor_info.dimensions:
        utils.add_height2m(cube)
    utils.fix_coords(cube)

    # Fix metadata
    attrs = cfg['attributes'].copy()
    attrs['mip'] = var['mip']
    attrs['version'] = version.replace('_', '-')
    attrs['reference'] = var['reference']
    attrs['source'] = attrs['source']
    utils.set_global_atts(cube, attrs)

    # Save variable
    utils.save_variable(cube,
                        short_name,
                        out_dir,
                        attrs,
                        unlimited_dimensions=['time'])

    if 'add_mon' in var.keys():
        if var['add_mon']:
            logger.info("Building monthly means")

            # Calc monthly
            cube = monthly_statistics(cube)
            cube.remove_coord('month_number')
            cube.remove_coord('year')

            # Fix metadata
            attrs['mip'] = 'Amon'

            # Fix coordinates
            utils.fix_coords(cube)

            # Save variable
            utils.save_variable(cube,
                                short_name,
                                out_dir,
                                attrs,
                                unlimited_dimensions=['time'])