%load_ext autoreload
%autoreload 2

Examples of CORDEX-CMIP6 cmorization#

This notebook should show some examples of how a cmorized CORDEX-CMIP6 dataset could look like.

!ls ../Tables
CORDEX-CMIP6_1hr.json	      CORDEX-CMIP6_formula_terms.json
CORDEX-CMIP6_6hr.json	      CORDEX-CMIP6_fx.json
CORDEX-CMIP6_CV.json	      CORDEX-CMIP6_grids.json
CORDEX-CMIP6_coordinate.json  CORDEX-CMIP6_mon.json
CORDEX-CMIP6_day.json	      CORDEX-CMIP6_remo_example.json

Controlled Vocabulary#

The current CORDEX-CMIP6_CV.json file contains the controlled vocabulary used by the CMOR3 library for rewriting the model output. Let’s have a look:

import json
import pprint

from IPython.display import JSON

# Opening JSON file
with open("../Tables/CORDEX-CMIP6_CV.json") as json_file:
    CV = json.load(json_file)["CV"]

# JSON(CV['required_global_attributes'])
pprint.pprint(CV["required_global_attributes"])
['activity_id',
 'contact',
 'Conventions',
 'creation_date',
 'domain_id',
 'domain',
 'driving_experiment_id',
 'driving_experiment',
 'driving_institution_id',
 'driving_source_id',
 'driving_variant_label',
 'frequency',
 'grid',
 'institution',
 'institution_id',
 'license',
 'mip_era',
 'product',
 'project_id',
 'source',
 'source_id',
 'source_type',
 'tracking_id',
 'variable_id',
 'version_realization']

Cmorization example#

We use the cordex.cmor module to create an example of a CORDEX-CMIP6 dataset.

Hide code cell source
import os

import cordex as cx
import xarray as xr
from cordex import cmor as cmor

table_dir = "../Tables"

cmor.set_options(table_prefix="CORDEX-CMIP6")


def test_cmorizer_fx():
    ds = cx.cordex_domain("EUR-11", dummy="topo")
    filename = cmor.cmorize_variable(
        ds,
        "orog",
        mapping_table={"orog": {"varname": "topo"}},
        cmor_table=os.path.join(table_dir, "CORDEX-CMIP6_fx.json"),
        dataset_table=os.path.join(table_dir, "CORDEX-CMIP6_remo_example.json"),
        grids_table=os.path.join(table_dir, "CORDEX-CMIP6_grids.json"),
        CORDEX_domain="EUR-11",
        time_units=None,
        allow_units_convert=True,
    )
    return filename


def test_cmorizer_mon():
    ds = cx.tutorial.open_dataset("remo_EUR-11_TEMP2_mon")
    filename = cmor.cmorize_variable(
        ds,
        "tas",
        mapping_table={"tas": {"varname": "TEMP2"}},
        cmor_table=os.path.join(table_dir, "CORDEX-CMIP6_mon.json"),
        dataset_table=os.path.join(table_dir, "CORDEX-CMIP6_remo_example.json"),
        grids_table=os.path.join(table_dir, "CORDEX-CMIP6_grids.json"),
        CORDEX_domain="EUR-11",
        time_units=None,
        allow_units_convert=True,
    )
    return filename


def test_cmorizer_subdaily(table):
    ds = cx.tutorial.open_dataset("remo_EUR-11_TEMP2_1hr")
    filename = cmor.cmorize_variable(
        ds,
        "tas",
        mapping_table={"tas": {"varname": "TEMP2"}},
        cmor_table=os.path.join(table_dir, f"CORDEX-CMIP6_{table}.json"),
        dataset_table=os.path.join(table_dir, "CORDEX-CMIP6_remo_example.json"),
        grids_table=os.path.join(table_dir, "CORDEX-CMIP6_grids.json"),
        CORDEX_domain="EUR-11",
        time_units=None,
        allow_units_convert=True,
        allow_resample=True,
    )
    return filename

Example from fx table#

f = test_cmorizer_fx()

Let’s have a look at the filename.

f
'CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/fx/orog/v20240620/orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_fx.nc'
!ncdump -h $f
netcdf orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_fx {
dimensions:
	rlat = 412 ;
	rlon = 424 ;
	bnds = 2 ;
	vertices = 4 ;
variables:
	double rlat(rlat) ;
		rlat:units = "degrees" ;
		rlat:axis = "Y" ;
		rlat:long_name = "latitude in rotated pole grid" ;
		rlat:standard_name = "grid_latitude" ;
	double rlon(rlon) ;
		rlon:units = "degrees" ;
		rlon:axis = "X" ;
		rlon:long_name = "longitude in rotated pole grid" ;
		rlon:standard_name = "grid_longitude" ;
	int rotated_latitude_longitude ;
		rotated_latitude_longitude:grid_mapping_name = "rotated_latitude_longitude" ;
		rotated_latitude_longitude:grid_north_pole_latitude = 39.25 ;
		rotated_latitude_longitude:grid_north_pole_longitude = -162. ;
		rotated_latitude_longitude:north_pole_grid_longitude = 0. ;
	double lat(rlat, rlon) ;
		lat:standard_name = "latitude" ;
		lat:long_name = "latitude" ;
		lat:units = "degrees_north" ;
		lat:missing_value = 1.e+20 ;
		lat:_FillValue = 1.e+20 ;
		lat:bounds = "vertices_lat" ;
	double lon(rlat, rlon) ;
		lon:standard_name = "longitude" ;
		lon:long_name = "longitude" ;
		lon:units = "degrees_east" ;
		lon:missing_value = 1.e+20 ;
		lon:_FillValue = 1.e+20 ;
		lon:bounds = "vertices_lon" ;
	double vertices_lat(rlat, rlon, vertices) ;
		vertices_lat:units = "degrees_north" ;
		vertices_lat:missing_value = 1.e+20 ;
		vertices_lat:_FillValue = 1.e+20 ;
	double vertices_lon(rlat, rlon, vertices) ;
		vertices_lon:units = "degrees_east" ;
		vertices_lon:missing_value = 1.e+20 ;
		vertices_lon:_FillValue = 1.e+20 ;
	float orog(rlat, rlon) ;
		orog:standard_name = "surface_altitude" ;
		orog:long_name = "Surface Altitude" ;
		orog:units = "m" ;
		orog:cell_methods = "area: mean" ;
		orog:cell_measures = "area: areacella" ;
		orog:missing_value = 1.e+20f ;
		orog:_FillValue = 1.e+20f ;
		orog:grid_mapping = "rotated_latitude_longitude" ;
		orog:coordinates = "lat lon" ;

// global attributes:
		:Conventions = "CF-1.11" ;
		:activity_id = "DD" ;
		:contact = "gerics-cordex@hereon.de" ;
		:creation_date = "2024-06-20T06:36:23Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source_id = "ERA5" ;
		:driving_variant_label = "r1i1p1f1" ;
		:experiment_id = "evaluation" ;
		:external_variables = "areacella" ;
		:frequency = "fx" ;
		:grid = "Rotated-pole latitude-longitude with 0.11 degree grid spacing" ;
		:history = "2024-06-20T06:36:23Z ;rewrote data to be consistent with CORDEX for variable orog found in table fx." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX" ;
		:realm = "REALM" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "REMO regional model (2022)" ;
		:source_id = "REMO2020" ;
		:source_type = "ARCM" ;
		:table_id = "fx" ;
		:table_info = "Creation Date:(05 April 2024) MD5:48d6a0d158eeac713bdad57279c1277d" ;
		:title = "REMO2020 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/f22c8d79-55ed-42d3-9f44-1d0ca1be7148" ;
		:variable_id = "orog" ;
		:version_realization = "v1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.8.0" ;
}

The xarray dataset representation allows to explore the dataset interactively.

ds = xr.open_dataset(f)
ds
<xarray.Dataset> Size: 15MB
Dimensions:                     (rlat: 412, rlon: 424, vertices: 4)
Coordinates:
  * rlat                        (rlat) float64 3kB -23.38 -23.27 ... 21.73 21.84
  * rlon                        (rlon) float64 3kB -28.38 -28.27 ... 18.05 18.16
    lat                         (rlat, rlon) float64 1MB ...
    lon                         (rlat, rlon) float64 1MB ...
Dimensions without coordinates: vertices
Data variables:
    rotated_latitude_longitude  int32 4B ...
    vertices_lat                (rlat, rlon, vertices) float64 6MB ...
    vertices_lon                (rlat, rlon, vertices) float64 6MB ...
    orog                        (rlat, rlon) float32 699kB ...
Attributes: (12/36)
    Conventions:             CF-1.11
    activity_id:             DD
    contact:                 gerics-cordex@hereon.de
    creation_date:           2024-06-20T06:36:23Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020 output prepared for CMIP6
    tracking_id:             hdl:21.14103/f22c8d79-55ed-42d3-9f44-1d0ca1be7148
    variable_id:             orog
    version_realization:     v1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.8.0
ds.orog.plot()
<matplotlib.collections.QuadMesh at 0x7f1bdfd6e3a0>
_images/0e43d6b9edafd4f6b7702836157d6878133c0c5487b1d80e75145d5111ea1081.png
!cdo verifygrid $f
cdo    verifygrid: Grid consists of 174688 (424x412) cells (type: curvilinear), of which
cdo    verifygrid:    174688 cells have 4 vertices
cdo    verifygrid:        lon : -44.59386 to 64.96438 degrees
cdo    verifygrid:        lat : 21.98783 to 72.585 degrees
cdo    verifygrid: Processed 1 variable [0.12s 90MB]
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/fx/orog/v20240620/orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_fx.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 85 (2024-05-21T15:55:10Z)
Using Area Type Table Version 11 (06 July 2023)
Using Standardized Region Name Table Version 4 (18 December 2018)

ERROR: (2.6.1): This netCDF file does not appear to contain CF Convention data.
WARN: (7.1): Boundary var vertices_lat should not have attribute units
WARN: (7.1): Boundary var vertices_lon should not have attribute units

------------------
Checking variable: rlat
------------------

------------------
Checking variable: rlon
------------------

------------------
Checking variable: rotated_latitude_longitude
------------------

------------------
Checking variable: lat
------------------

------------------
Checking variable: lon
------------------

------------------
Checking variable: vertices_lat
------------------
WARN: (7.1): Boundary Variable vertices_lat should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lat should not have missing_value attribute

------------------
Checking variable: vertices_lon
------------------
WARN: (7.1): Boundary Variable vertices_lon should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lon should not have missing_value attribute

------------------
Checking variable: orog
------------------

ERRORS detected: 1
WARNINGS given: 6
INFORMATION messages: 0
!compliance-checker --test=cf:1.7 $f
Running Compliance Checker on the datasets from: ['CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/fx/orog/v20240620/orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_fx.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 5.1.1                                  
                     Report generated 2024-06-20T06:36:29Z                      
                                     cf:1.7                                     
http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html
--------------------------------------------------------------------------------
                               Corrective Actions                               
orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_fx.nc has 2 potential issues


                                    Warnings                                    
--------------------------------------------------------------------------------
§2.6 Attributes
* §2.6.1 Conventions global attribute does not contain "CF-1.7"

§7.1 Cell Boundaries
* The Boundary variables 'vertices_lat' should not have the attributes: '['units', 'missing_value', '_FillValue']'
* The Boundary variables 'vertices_lon' should not have the attributes: '['units', 'missing_value', '_FillValue']'
WARNING: The following exceptions occurred during the cf:1.7 checker (possibly indicate compliance checker issues):
cf:1.7.check_cell_boundaries_interval: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Example from mon table#

f = test_cmorizer_mon()
f
Downloading data from 'https://github.com/euro-cordex/py-cordex-data/raw/main/remo_EUR-11_TEMP2_mon.nc' to file '/home/runner/.cache/py-cordex_tutorial_data/6d6ccde2e368653ce62a71c80e75f890-remo_EUR-11_TEMP2_mon.nc'.
SHA256 hash of downloaded file: a585a11475492241a7a52963bbdf323af185163166e52924f1a04b4ff91b3ae6
Use this value as the 'known_hash' argument of 'pooch.retrieve' to ensure that the file hasn't changed if it is downloaded again in the future.
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/cmor.py:522: UserWarning: adding time bounds
  warn("adding time bounds")
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/cmor.py:324: UserWarning: time units are set to default: days since 1950-01-01T00:00:00
  warn(f"time units are set to default: {u}")
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/utils.py:335: UserWarning: writing temporary table to /tmp/tmpo0mcwi1s
  warn(f"writing temporary table to {filename}")
'CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/mon/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_mon_200001-200012.nc'
ds = xr.open_dataset(f)
ds
<xarray.Dataset> Size: 22MB
Dimensions:                     (time: 12, bnds: 2, rlat: 412, rlon: 424,
                                 vertices: 4)
Coordinates:
  * time                        (time) datetime64[ns] 96B 2000-01-16T12:00:00...
  * rlat                        (rlat) float64 3kB -23.38 -23.27 ... 21.72 21.83
  * rlon                        (rlon) float64 3kB -28.38 -28.27 ... 18.04 18.15
    lat                         (rlat, rlon) float64 1MB ...
    lon                         (rlat, rlon) float64 1MB ...
    height                      float64 8B ...
Dimensions without coordinates: bnds, vertices
Data variables:
    time_bnds                   (time, bnds) datetime64[ns] 192B ...
    rotated_latitude_longitude  int32 4B ...
    vertices_lat                (rlat, rlon, vertices) float64 6MB ...
    vertices_lon                (rlat, rlon, vertices) float64 6MB ...
    tas                         (time, rlat, rlon) float32 8MB ...
Attributes: (12/36)
    Conventions:             CF-1.11
    activity_id:             DD
    contact:                 gerics-cordex@hereon.de
    creation_date:           2024-06-20T06:36:31Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020 output prepared for CMIP6
    tracking_id:             hdl:21.14103/6aa75286-7b0d-449a-b7b5-3aa087595aec
    variable_id:             tas
    version_realization:     v1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.8.0
ds.cf
Coordinates:
             CF Axes: * X: ['rlon']
                      * Y: ['rlat']
                        Z: ['height']
                      * T: ['time']

      CF Coordinates:   longitude: ['lon']
                        latitude: ['lat']
                        vertical: ['height']
                      * time: ['time']

       Cell Measures:   area, volume: n/a

      Standard Names: * grid_latitude: ['rlat']
                      * grid_longitude: ['rlon']
                        height: ['height']
                        latitude: ['lat']
                        longitude: ['lon']
                      * time: ['time']

              Bounds:   n/a

       Grid Mappings:   n/a

Data Variables:
       Cell Measures:   area, volume: n/a

      Standard Names:   air_temperature: ['tas']

              Bounds:   T: ['time_bnds']
                        lat: ['vertices_lat']
                        latitude: ['vertices_lat']
                        lon: ['vertices_lon']
                        longitude: ['vertices_lon']
                        time: ['time_bnds']

       Grid Mappings:   rotated_latitude_longitude: ['rotated_latitude_longitude']
ds.tas.plot(col="time", col_wrap=4)
<xarray.plot.facetgrid.FacetGrid at 0x7f1bdebd2760>
_images/a60c913f1b84ffce80a7959ff53f989175ba15a7a692d34a0947f1e15028ef07.png
!ncdump -h $f
netcdf tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_mon_200001-200012 {
dimensions:
	time = UNLIMITED ; // (12 currently)
	rlat = 412 ;
	rlon = 424 ;
	bnds = 2 ;
	vertices = 4 ;
variables:
	double time(time) ;
		time:bounds = "time_bnds" ;
		time:units = "days since 1950-01-01T00:00:00" ;
		time:calendar = "proleptic_gregorian" ;
		time:axis = "T" ;
		time:long_name = "time" ;
		time:standard_name = "time" ;
	double time_bnds(time, bnds) ;
	double rlat(rlat) ;
		rlat:units = "degrees" ;
		rlat:axis = "Y" ;
		rlat:long_name = "latitude in rotated pole grid" ;
		rlat:standard_name = "grid_latitude" ;
	double rlon(rlon) ;
		rlon:units = "degrees" ;
		rlon:axis = "X" ;
		rlon:long_name = "longitude in rotated pole grid" ;
		rlon:standard_name = "grid_longitude" ;
	int rotated_latitude_longitude ;
		rotated_latitude_longitude:grid_mapping_name = "rotated_latitude_longitude" ;
		rotated_latitude_longitude:grid_north_pole_latitude = 39.25 ;
		rotated_latitude_longitude:grid_north_pole_longitude = -162. ;
		rotated_latitude_longitude:north_pole_grid_longitude = 0. ;
	double lat(rlat, rlon) ;
		lat:standard_name = "latitude" ;
		lat:long_name = "latitude" ;
		lat:units = "degrees_north" ;
		lat:missing_value = 1.e+20 ;
		lat:_FillValue = 1.e+20 ;
		lat:bounds = "vertices_lat" ;
	double lon(rlat, rlon) ;
		lon:standard_name = "longitude" ;
		lon:long_name = "longitude" ;
		lon:units = "degrees_east" ;
		lon:missing_value = 1.e+20 ;
		lon:_FillValue = 1.e+20 ;
		lon:bounds = "vertices_lon" ;
	double vertices_lat(rlat, rlon, vertices) ;
		vertices_lat:units = "degrees_north" ;
		vertices_lat:missing_value = 1.e+20 ;
		vertices_lat:_FillValue = 1.e+20 ;
	double vertices_lon(rlat, rlon, vertices) ;
		vertices_lon:units = "degrees_east" ;
		vertices_lon:missing_value = 1.e+20 ;
		vertices_lon:_FillValue = 1.e+20 ;
	double height ;
		height:units = "m" ;
		height:axis = "Z" ;
		height:positive = "up" ;
		height:long_name = "height" ;
		height:standard_name = "height" ;
	float tas(time, rlat, rlon) ;
		tas:standard_name = "air_temperature" ;
		tas:long_name = "Near-Surface Air Temperature" ;
		tas:units = "K" ;
		tas:cell_methods = "area: time: mean" ;
		tas:cell_measures = "area: areacella" ;
		tas:history = "2024-06-20T06:36:31Z altered by CMOR: Treated scalar dimension: \'height\'." ;
		tas:coordinates = "height lat lon" ;
		tas:missing_value = 1.e+20f ;
		tas:_FillValue = 1.e+20f ;
		tas:grid_mapping = "rotated_latitude_longitude" ;

// global attributes:
		:Conventions = "CF-1.11" ;
		:activity_id = "DD" ;
		:contact = "gerics-cordex@hereon.de" ;
		:creation_date = "2024-06-20T06:36:31Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source_id = "ERA5" ;
		:driving_variant_label = "r1i1p1f1" ;
		:experiment_id = "evaluation" ;
		:external_variables = "areacella" ;
		:frequency = "mon" ;
		:grid = "Rotated-pole latitude-longitude with 0.11 degree grid spacing" ;
		:history = "2024-06-20T06:36:31Z ;rewrote data to be consistent with CORDEX for variable tas found in table mon." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX" ;
		:realm = "REALM" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "REMO regional model (2022)" ;
		:source_id = "REMO2020" ;
		:source_type = "ARCM" ;
		:table_id = "mon" ;
		:table_info = "Creation Date:(05 April 2024) MD5:48d6a0d158eeac713bdad57279c1277d" ;
		:title = "REMO2020 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/6aa75286-7b0d-449a-b7b5-3aa087595aec" ;
		:variable_id = "tas" ;
		:version_realization = "v1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.8.0" ;
}
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/mon/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_mon_200001-200012.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 85 (2024-05-21T15:55:10Z)
Using Area Type Table Version 11 (06 July 2023)
Using Standardized Region Name Table Version 4 (18 December 2018)

ERROR: (2.6.1): This netCDF file does not appear to contain CF Convention data.
WARN: (7.1): Boundary var vertices_lat should not have attribute units
WARN: (7.1): Boundary var vertices_lon should not have attribute units

------------------
Checking variable: time
------------------

------------------
Checking variable: time_bnds
------------------

------------------
Checking variable: rlat
------------------

------------------
Checking variable: rlon
------------------

------------------
Checking variable: rotated_latitude_longitude
------------------

------------------
Checking variable: lat
------------------

------------------
Checking variable: lon
------------------

------------------
Checking variable: vertices_lat
------------------
WARN: (7.1): Boundary Variable vertices_lat should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lat should not have missing_value attribute

------------------
Checking variable: vertices_lon
------------------
WARN: (7.1): Boundary Variable vertices_lon should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lon should not have missing_value attribute

------------------
Checking variable: height
------------------

------------------
Checking variable: tas
------------------
INFO: attribute history is being used in a non-standard way

ERRORS detected: 1
WARNINGS given: 6
INFORMATION messages: 1
!compliance-checker --test=cf:1.7 $f
Running Compliance Checker on the datasets from: ['CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/mon/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_mon_200001-200012.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 5.1.1                                  
                     Report generated 2024-06-20T06:36:38Z                      
                                     cf:1.7                                     
http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html
--------------------------------------------------------------------------------
                               Corrective Actions                               
tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_mon_200001-200012.nc has 2 potential issues


                                    Warnings                                    
--------------------------------------------------------------------------------
§2.6 Attributes
* §2.6.1 Conventions global attribute does not contain "CF-1.7"

§7.1 Cell Boundaries
* The Boundary variables 'vertices_lat' should not have the attributes: '['units', 'missing_value', '_FillValue']'
* The Boundary variables 'vertices_lon' should not have the attributes: '['units', 'missing_value', '_FillValue']'

Example from daily and subdaily tables#

f = test_cmorizer_subdaily("1hr")
f
Downloading data from 'https://github.com/euro-cordex/py-cordex-data/raw/main/remo_EUR-11_TEMP2_1hr.nc' to file '/home/runner/.cache/py-cordex_tutorial_data/df1ad3551d1e9e1f102d1a1536d5212c-remo_EUR-11_TEMP2_1hr.nc'.
SHA256 hash of downloaded file: 0ddd4c71be010a5656ed624aa6bfd3c3fa6238d8c61c9f39b1494c4188f060a8
Use this value as the 'known_hash' argument of 'pooch.retrieve' to ensure that the file hasn't changed if it is downloaded again in the future.
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/cmor.py:324: UserWarning: time units are set to default: days since 1950-01-01T00:00:00
  warn(f"time units are set to default: {u}")
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/utils.py:335: UserWarning: writing temporary table to /tmp/tmp21_620u7
  warn(f"writing temporary table to {filename}")
'CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/1hr/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_1hr_200001010000-200001030000.nc'
ds = xr.open_dataset(f)
ds
<xarray.Dataset> Size: 48MB
Dimensions:                     (time: 49, rlat: 412, rlon: 424, vertices: 4)
Coordinates:
  * time                        (time) datetime64[ns] 392B 2000-01-01 ... 200...
  * rlat                        (rlat) float64 3kB -23.38 -23.27 ... 21.72 21.83
  * rlon                        (rlon) float64 3kB -28.38 -28.27 ... 18.04 18.15
    lat                         (rlat, rlon) float64 1MB ...
    lon                         (rlat, rlon) float64 1MB ...
    height                      float64 8B ...
Dimensions without coordinates: vertices
Data variables:
    rotated_latitude_longitude  int32 4B ...
    vertices_lat                (rlat, rlon, vertices) float64 6MB ...
    vertices_lon                (rlat, rlon, vertices) float64 6MB ...
    tas                         (time, rlat, rlon) float32 34MB ...
Attributes: (12/36)
    Conventions:             CF-1.11
    activity_id:             DD
    contact:                 gerics-cordex@hereon.de
    creation_date:           2024-06-20T06:36:41Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020 output prepared for CMIP6
    tracking_id:             hdl:21.14103/c2e05863-b886-43b9-976e-150e55c5f122
    variable_id:             tas
    version_realization:     v1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.8.0
!ncdump -h $f
netcdf tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_1hr_200001010000-200001030000 {
dimensions:
	time = UNLIMITED ; // (49 currently)
	rlat = 412 ;
	rlon = 424 ;
	bnds = 2 ;
	vertices = 4 ;
variables:
	double time(time) ;
		time:units = "days since 1950-01-01T00:00:00" ;
		time:calendar = "proleptic_gregorian" ;
		time:axis = "T" ;
		time:long_name = "time" ;
		time:standard_name = "time" ;
	double rlat(rlat) ;
		rlat:units = "degrees" ;
		rlat:axis = "Y" ;
		rlat:long_name = "latitude in rotated pole grid" ;
		rlat:standard_name = "grid_latitude" ;
	double rlon(rlon) ;
		rlon:units = "degrees" ;
		rlon:axis = "X" ;
		rlon:long_name = "longitude in rotated pole grid" ;
		rlon:standard_name = "grid_longitude" ;
	int rotated_latitude_longitude ;
		rotated_latitude_longitude:grid_mapping_name = "rotated_latitude_longitude" ;
		rotated_latitude_longitude:grid_north_pole_latitude = 39.25 ;
		rotated_latitude_longitude:grid_north_pole_longitude = -162. ;
		rotated_latitude_longitude:north_pole_grid_longitude = 0. ;
	double lat(rlat, rlon) ;
		lat:standard_name = "latitude" ;
		lat:long_name = "latitude" ;
		lat:units = "degrees_north" ;
		lat:missing_value = 1.e+20 ;
		lat:_FillValue = 1.e+20 ;
		lat:bounds = "vertices_lat" ;
	double lon(rlat, rlon) ;
		lon:standard_name = "longitude" ;
		lon:long_name = "longitude" ;
		lon:units = "degrees_east" ;
		lon:missing_value = 1.e+20 ;
		lon:_FillValue = 1.e+20 ;
		lon:bounds = "vertices_lon" ;
	double vertices_lat(rlat, rlon, vertices) ;
		vertices_lat:units = "degrees_north" ;
		vertices_lat:missing_value = 1.e+20 ;
		vertices_lat:_FillValue = 1.e+20 ;
	double vertices_lon(rlat, rlon, vertices) ;
		vertices_lon:units = "degrees_east" ;
		vertices_lon:missing_value = 1.e+20 ;
		vertices_lon:_FillValue = 1.e+20 ;
	double height ;
		height:units = "m" ;
		height:axis = "Z" ;
		height:positive = "up" ;
		height:long_name = "height" ;
		height:standard_name = "height" ;
	float tas(time, rlat, rlon) ;
		tas:standard_name = "air_temperature" ;
		tas:long_name = "Near-Surface Air Temperature" ;
		tas:units = "K" ;
		tas:cell_methods = "area: mean time: point" ;
		tas:cell_measures = "area: areacella" ;
		tas:history = "2024-06-20T06:36:41Z altered by CMOR: Treated scalar dimension: \'height\'." ;
		tas:coordinates = "height lat lon" ;
		tas:missing_value = 1.e+20f ;
		tas:_FillValue = 1.e+20f ;
		tas:grid_mapping = "rotated_latitude_longitude" ;

// global attributes:
		:Conventions = "CF-1.11" ;
		:activity_id = "DD" ;
		:contact = "gerics-cordex@hereon.de" ;
		:creation_date = "2024-06-20T06:36:41Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source_id = "ERA5" ;
		:driving_variant_label = "r1i1p1f1" ;
		:experiment_id = "evaluation" ;
		:external_variables = "areacella" ;
		:frequency = "1hr" ;
		:grid = "Rotated-pole latitude-longitude with 0.11 degree grid spacing" ;
		:history = "2024-06-20T06:36:41Z ;rewrote data to be consistent with CORDEX for variable tas found in table 1hr." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX" ;
		:realm = "REALM" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "REMO regional model (2022)" ;
		:source_id = "REMO2020" ;
		:source_type = "ARCM" ;
		:table_id = "1hr" ;
		:table_info = "Creation Date:(05 April 2024) MD5:48d6a0d158eeac713bdad57279c1277d" ;
		:title = "REMO2020 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/c2e05863-b886-43b9-976e-150e55c5f122" ;
		:variable_id = "tas" ;
		:version_realization = "v1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.8.0" ;
}
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/1hr/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_1hr_200001010000-200001030000.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 85 (2024-05-21T15:55:10Z)
Using Area Type Table Version 11 (06 July 2023)
Using Standardized Region Name Table Version 4 (18 December 2018)

ERROR: (2.6.1): This netCDF file does not appear to contain CF Convention data.
WARN: (7.1): Boundary var vertices_lat should not have attribute units
WARN: (7.1): Boundary var vertices_lon should not have attribute units

------------------
Checking variable: time
------------------

------------------
Checking variable: rlat
------------------

------------------
Checking variable: rlon
------------------

------------------
Checking variable: rotated_latitude_longitude
------------------

------------------
Checking variable: lat
------------------

------------------
Checking variable: lon
------------------

------------------
Checking variable: vertices_lat
------------------
WARN: (7.1): Boundary Variable vertices_lat should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lat should not have missing_value attribute

------------------
Checking variable: vertices_lon
------------------
WARN: (7.1): Boundary Variable vertices_lon should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lon should not have missing_value attribute

------------------
Checking variable: height
------------------

------------------
Checking variable: tas
------------------
INFO: attribute history is being used in a non-standard way

ERRORS detected: 1
WARNINGS given: 6
INFORMATION messages: 1
!compliance-checker --test=cf:1.7 $f
Running Compliance Checker on the datasets from: ['CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/1hr/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_1hr_200001010000-200001030000.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 5.1.1                                  
                     Report generated 2024-06-20T06:36:44Z                      
                                     cf:1.7                                     
http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html
--------------------------------------------------------------------------------
                               Corrective Actions                               
tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_1hr_200001010000-200001030000.nc has 2 potential issues


                                    Warnings                                    
--------------------------------------------------------------------------------
§2.6 Attributes
* §2.6.1 Conventions global attribute does not contain "CF-1.7"

§7.1 Cell Boundaries
* The Boundary variables 'vertices_lat' should not have the attributes: '['units', 'missing_value', '_FillValue']'
* The Boundary variables 'vertices_lon' should not have the attributes: '['units', 'missing_value', '_FillValue']'
WARNING: The following exceptions occurred during the cf:1.7 checker (possibly indicate compliance checker issues):
cf:1.7.check_cell_boundaries_interval: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# cordex.cmor will automatically resample hourly to other frequencies
# depending on the frequency in the cmor table and the frequency in the
# input dataset
f = test_cmorizer_subdaily("day")
f
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/cmor.py:413: UserWarning: resampling input data from H to D
  warn(f"resampling input data from {input_freq} to {pd_freq}")
<string>:10: FutureWarning: Following pandas, the `loffset` parameter to resample is deprecated.  Switch to updating the resampled dataset time coordinate using time offset arithmetic.  For example:
    >>> offset = pd.tseries.frequencies.to_offset(freq) / 2
    >>> resampled_ds["time"] = resampled_ds.get_index("time") + offset
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/cmor.py:522: UserWarning: adding time bounds
  warn("adding time bounds")
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/cmor.py:324: UserWarning: time units are set to default: days since 1950-01-01T00:00:00
  warn(f"time units are set to default: {u}")
/home/runner/micromamba/envs/cordex-examples/lib/python3.9/site-packages/cordex/cmor/utils.py:335: UserWarning: writing temporary table to /tmp/tmp6xs_kg1m
  warn(f"writing temporary table to {filename}")
'CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/day/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_day_20000101-20000103.nc'
ds = xr.open_dataset(f)
ds
<xarray.Dataset> Size: 16MB
Dimensions:                     (time: 3, bnds: 2, rlat: 412, rlon: 424,
                                 vertices: 4)
Coordinates:
  * time                        (time) datetime64[ns] 24B 2000-01-01T12:00:00...
  * rlat                        (rlat) float64 3kB -23.38 -23.27 ... 21.72 21.83
  * rlon                        (rlon) float64 3kB -28.38 -28.27 ... 18.04 18.15
    lat                         (rlat, rlon) float64 1MB ...
    lon                         (rlat, rlon) float64 1MB ...
    height                      float64 8B ...
Dimensions without coordinates: bnds, vertices
Data variables:
    time_bnds                   (time, bnds) datetime64[ns] 48B ...
    rotated_latitude_longitude  int32 4B ...
    vertices_lat                (rlat, rlon, vertices) float64 6MB ...
    vertices_lon                (rlat, rlon, vertices) float64 6MB ...
    tas                         (time, rlat, rlon) float32 2MB ...
Attributes: (12/36)
    Conventions:             CF-1.11
    activity_id:             DD
    contact:                 gerics-cordex@hereon.de
    creation_date:           2024-06-20T06:36:44Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020 output prepared for CMIP6
    tracking_id:             hdl:21.14103/551317c5-aa22-4a21-affc-735349393877
    variable_id:             tas
    version_realization:     v1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.8.0
ds.tas.plot(col="time")
<xarray.plot.facetgrid.FacetGrid at 0x7f1c9064fc10>
_images/17ef9b0b96963994560d579f36b0cbd1755b3b6989bafce1af646e9e0cc886a4.png
!ncdump -h $f
netcdf tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_day_20000101-20000103 {
dimensions:
	time = UNLIMITED ; // (3 currently)
	rlat = 412 ;
	rlon = 424 ;
	bnds = 2 ;
	vertices = 4 ;
variables:
	double time(time) ;
		time:bounds = "time_bnds" ;
		time:units = "days since 1950-01-01T00:00:00" ;
		time:calendar = "proleptic_gregorian" ;
		time:axis = "T" ;
		time:long_name = "time" ;
		time:standard_name = "time" ;
	double time_bnds(time, bnds) ;
	double rlat(rlat) ;
		rlat:units = "degrees" ;
		rlat:axis = "Y" ;
		rlat:long_name = "latitude in rotated pole grid" ;
		rlat:standard_name = "grid_latitude" ;
	double rlon(rlon) ;
		rlon:units = "degrees" ;
		rlon:axis = "X" ;
		rlon:long_name = "longitude in rotated pole grid" ;
		rlon:standard_name = "grid_longitude" ;
	int rotated_latitude_longitude ;
		rotated_latitude_longitude:grid_mapping_name = "rotated_latitude_longitude" ;
		rotated_latitude_longitude:grid_north_pole_latitude = 39.25 ;
		rotated_latitude_longitude:grid_north_pole_longitude = -162. ;
		rotated_latitude_longitude:north_pole_grid_longitude = 0. ;
	double lat(rlat, rlon) ;
		lat:standard_name = "latitude" ;
		lat:long_name = "latitude" ;
		lat:units = "degrees_north" ;
		lat:missing_value = 1.e+20 ;
		lat:_FillValue = 1.e+20 ;
		lat:bounds = "vertices_lat" ;
	double lon(rlat, rlon) ;
		lon:standard_name = "longitude" ;
		lon:long_name = "longitude" ;
		lon:units = "degrees_east" ;
		lon:missing_value = 1.e+20 ;
		lon:_FillValue = 1.e+20 ;
		lon:bounds = "vertices_lon" ;
	double vertices_lat(rlat, rlon, vertices) ;
		vertices_lat:units = "degrees_north" ;
		vertices_lat:missing_value = 1.e+20 ;
		vertices_lat:_FillValue = 1.e+20 ;
	double vertices_lon(rlat, rlon, vertices) ;
		vertices_lon:units = "degrees_east" ;
		vertices_lon:missing_value = 1.e+20 ;
		vertices_lon:_FillValue = 1.e+20 ;
	double height ;
		height:units = "m" ;
		height:axis = "Z" ;
		height:positive = "up" ;
		height:long_name = "height" ;
		height:standard_name = "height" ;
	float tas(time, rlat, rlon) ;
		tas:standard_name = "air_temperature" ;
		tas:long_name = "Near-Surface Air Temperature" ;
		tas:units = "K" ;
		tas:cell_methods = "area: time: mean" ;
		tas:cell_measures = "area: areacella" ;
		tas:history = "2024-06-20T06:36:44Z altered by CMOR: Treated scalar dimension: \'height\'." ;
		tas:coordinates = "height lat lon" ;
		tas:missing_value = 1.e+20f ;
		tas:_FillValue = 1.e+20f ;
		tas:grid_mapping = "rotated_latitude_longitude" ;

// global attributes:
		:Conventions = "CF-1.11" ;
		:activity_id = "DD" ;
		:contact = "gerics-cordex@hereon.de" ;
		:creation_date = "2024-06-20T06:36:44Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source_id = "ERA5" ;
		:driving_variant_label = "r1i1p1f1" ;
		:experiment_id = "evaluation" ;
		:external_variables = "areacella" ;
		:frequency = "day" ;
		:grid = "Rotated-pole latitude-longitude with 0.11 degree grid spacing" ;
		:history = "2024-06-20T06:36:44Z ;rewrote data to be consistent with CORDEX for variable tas found in table day." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX" ;
		:realm = "REALM" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "REMO regional model (2022)" ;
		:source_id = "REMO2020" ;
		:source_type = "ARCM" ;
		:table_id = "day" ;
		:table_info = "Creation Date:(05 April 2024) MD5:48d6a0d158eeac713bdad57279c1277d" ;
		:title = "REMO2020 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/551317c5-aa22-4a21-affc-735349393877" ;
		:variable_id = "tas" ;
		:version_realization = "v1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.8.0" ;
}
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/day/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_day_20000101-20000103.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 85 (2024-05-21T15:55:10Z)
Using Area Type Table Version 11 (06 July 2023)
Using Standardized Region Name Table Version 4 (18 December 2018)

ERROR: (2.6.1): This netCDF file does not appear to contain CF Convention data.
WARN: (7.1): Boundary var vertices_lat should not have attribute units
WARN: (7.1): Boundary var vertices_lon should not have attribute units

------------------
Checking variable: time
------------------

------------------
Checking variable: time_bnds
------------------

------------------
Checking variable: rlat
------------------

------------------
Checking variable: rlon
------------------

------------------
Checking variable: rotated_latitude_longitude
------------------

------------------
Checking variable: lat
------------------

------------------
Checking variable: lon
------------------

------------------
Checking variable: vertices_lat
------------------
WARN: (7.1): Boundary Variable vertices_lat should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lat should not have missing_value attribute

------------------
Checking variable: vertices_lon
------------------
WARN: (7.1): Boundary Variable vertices_lon should not have _FillValue attribute
WARN: (7.1): Boundary Variable vertices_lon should not have missing_value attribute

------------------
Checking variable: height
------------------

------------------
Checking variable: tas
------------------
INFO: attribute history is being used in a non-standard way

ERRORS detected: 1
WARNINGS given: 6
INFORMATION messages: 1
!compliance-checker --test=cf:1.7 $f
Running Compliance Checker on the datasets from: ['CORDEX/CORDEX/CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020/v1/day/tas/v20240620/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_day_20000101-20000103.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 5.1.1                                  
                     Report generated 2024-06-20T06:36:47Z                      
                                     cf:1.7                                     
http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html
--------------------------------------------------------------------------------
                               Corrective Actions                               
tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020_v1_day_20000101-20000103.nc has 2 potential issues


                                    Warnings                                    
--------------------------------------------------------------------------------
§2.6 Attributes
* §2.6.1 Conventions global attribute does not contain "CF-1.7"

§7.1 Cell Boundaries
* The Boundary variables 'vertices_lat' should not have the attributes: '['units', 'missing_value', '_FillValue']'
* The Boundary variables 'vertices_lon' should not have the attributes: '['units', 'missing_value', '_FillValue']'