%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_3hr.json	      CORDEX-CMIP6_fx.json
CORDEX-CMIP6_6hr.json	      CORDEX-CMIP6_grids.json
CORDEX-CMIP6_CV.json	      CORDEX-CMIP6_mon.json
CORDEX-CMIP6_coordinate.json  CORDEX-CMIP6_remo_example.json
CORDEX-CMIP6_day.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-2-2/v1-r1/fx/orog/v20260807/orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_fx.nc'
!ncdump -h $f
netcdf orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_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. ;
		rotated_latitude_longitude:earth_radius = 6371229. ;
	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:comment = "The surface called \'surface\' means the lower boundary of the atmosphere. Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level." ;
		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 = "2026-08-07T07:41:27Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source = "ECMWF Reanalysis v5" ;
		: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 = "2026-08-07T07:41:27Z ;rewrote data to be consistent with CORDEX-CMIP6 for variable orog found in table fx." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020 v2.2" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX-CMIP6" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "Regional Climate Model REMO, version 2.2, hydrostatic configuration with MACv2 aerosol forcing and Fresh-water Lake model (FLake) (2023)" ;
		:source_id = "REMO2020-2-2" ;
		:source_type = "ARCM" ;
		:table_id = "fx" ;
		:table_info = "Name: CORDEX-CMIP6_fx.json; Creation Date:(07 August 2026) MD5:06a4760b75edbe3073a863c9240ab115" ;
		:title = "REMO2020-2-2 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/51a0461e-ce33-482c-a6a3-e6936e20497f" ;
		:variable_id = "orog" ;
		:version_realization = "v1-r1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.15.2" ;
}

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:           2026-08-07T07:41:27Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020-2-2 output prepared for CMIP6
    tracking_id:             hdl:21.14103/51a0461e-ce33-482c-a6a3-e6936e20497f
    variable_id:             orog
    version_realization:     v1-r1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.15.2
ds.orog.plot()
<matplotlib.collections.QuadMesh at 0x7f44b0fe8f50>
_images/f35937eb62282a132e18fba565f950e88f12151add294d11fc2c8cd08edbba0e.png
!cdo verifygrid $f
cdi  cdf_inq_dimlen    : ncid=65536  dimid=-1  length=0

cdi  error (cdf_inq_dimlen): NetCDF: Invalid dimension ID or name
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX-CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020-2-2/v1-r1/fx/orog/v20260807/orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_fx.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 94 (2026-06-09T17:23:36Z)
Using Area Type Table Version 13 (20 March 2025)
Using Standardized Region Name Table Version 5 (12 November 2024)

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-2-2/v1-r1/fx/orog/v20260807/orog_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_fx.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 6.1.0                                  
                     Report generated 2026-08-07T07:41:33Z                      
                                     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-2-2_v1-r1_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']'

Example from mon table#

f = test_cmorizer_mon()
f
/tmp/ipykernel_4165/3805428128.py:30: DeprecationWarning: 'CORDEX_domain' keyword is deprecated, please use the 'domain_id' keyword instead
  filename = cmor.cmorize_variable(
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1035: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  unused_keys = set(attribute.keys()) - set(inverted)
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1036: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  for key, value in attribute.items():
<frozen _collections_abc>:894: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1044: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  newmap.update({key: attribute[key] for key in unused_keys})
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cordex/cmor/cmor.py:635: UserWarning: adding time bounds
  warn("adding time bounds")
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cordex/cmor/cmor.py:426: 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.12/site-packages/cordex/cmor/utils.py:339: UserWarning: writing temporary table to /tmp/tmpmhkz55o5
  warn(f"writing temporary table to {filename}")
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1035: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  unused_keys = set(attribute.keys()) - set(inverted)

C Traceback:
In function: cmor_values_from_bounds
! called from: cmor_axis
! 

!!!!!!!!!!!!!!!!!!!!!!!!!
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1036: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  for key, value in attribute.items():
<frozen _collections_abc>:894: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1044: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  newmap.update({key: attribute[key] for key in unused_keys})
!
! Warning: The values you provided for axis time are different from those computed from the bounds, which are used for the axis values instead of the user-provided values.
!
! The first value found is at index 0: 18276.000000 will be replaced with 18277.500000 between bounds 18262.000000 and 18293.000000
!
!!!!!!!!!!!!!!!!!!!!!!!!!
'CORDEX/CORDEX-CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020-2-2/v1-r1/mon/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_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.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 ...
    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:           2026-08-07T07:41:35Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020-2-2 output prepared for CMIP6
    tracking_id:             hdl:21.14103/b570df58-e857-4612-a6ec-b9f31c782175
    variable_id:             tas
    version_realization:     v1-r1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.15.2
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 0x7f44b0badc70>
_images/c2fc8d3583da60db304ece1c6a1093c2a5265b0cd560ae5ca0139c7e05c0a2c9.png
!ncdump -h $f
netcdf tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_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. ;
		rotated_latitude_longitude:earth_radius = 6371229. ;
	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:comment = "near-surface (usually, 2 meter) air temperature" ;
		tas:units = "K" ;
		tas:cell_methods = "area: time: mean" ;
		tas:cell_measures = "area: areacella" ;
		tas:history = "2026-08-07T07:41:35Z 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 = "2026-08-07T07:41:35Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source = "ECMWF Reanalysis v5" ;
		: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 = "2026-08-07T07:41:35Z ;rewrote data to be consistent with CORDEX-CMIP6 for variable tas found in table mon." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020 v2.2" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX-CMIP6" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "Regional Climate Model REMO, version 2.2, hydrostatic configuration with MACv2 aerosol forcing and Fresh-water Lake model (FLake) (2023)" ;
		:source_id = "REMO2020-2-2" ;
		:source_type = "ARCM" ;
		:table_id = "mon" ;
		:table_info = "Name: CORDEX-CMIP6_mon.json; Creation Date:(07 August 2026) MD5:6a29c4abde3ab61b475caf99b86a14e8" ;
		:title = "REMO2020-2-2 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/b570df58-e857-4612-a6ec-b9f31c782175" ;
		:variable_id = "tas" ;
		:version_realization = "v1-r1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.15.2" ;
}
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX-CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020-2-2/v1-r1/mon/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_mon_200001-200012.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 94 (2026-06-09T17:23:36Z)
Using Area Type Table Version 13 (20 March 2025)
Using Standardized Region Name Table Version 5 (12 November 2024)

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-2-2/v1-r1/mon/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_mon_200001-200012.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 6.1.0                                  
                     Report generated 2026-08-07T07:41:41Z                      
                                     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-2-2_v1-r1_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
/tmp/ipykernel_4165/3805428128.py:46: DeprecationWarning: 'CORDEX_domain' keyword is deprecated, please use the 'domain_id' keyword instead
  filename = cmor.cmorize_variable(
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1035: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  unused_keys = set(attribute.keys()) - set(inverted)
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1036: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  for key, value in attribute.items():
<frozen _collections_abc>:894: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1044: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  newmap.update({key: attribute[key] for key in unused_keys})
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cordex/cmor/cmor.py:517: UserWarning: resampling input data from H to h
  warn(f"resampling input data from {input_freq} to {pd_freq}")
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cordex/cmor/cmor.py:426: 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.12/site-packages/cordex/cmor/utils.py:339: UserWarning: writing temporary table to /tmp/tmpzeskj48m
  warn(f"writing temporary table to {filename}")
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1035: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  unused_keys = set(attribute.keys()) - set(inverted)
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1036: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  for key, value in attribute.items():
<frozen _collections_abc>:894: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1044: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  newmap.update({key: attribute[key] for key in unused_keys})
'CORDEX/CORDEX-CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020-2-2/v1-r1/1hr/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_1hr_200001010000-200001030000.nc'
ds = xr.open_dataset(f)
ds
<xarray.Dataset> Size: 48MB
Dimensions:                     (rlat: 412, rlon: 424, vertices: 4, time: 49)
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 ...
  * time                        (time) datetime64[ns] 392B 2000-01-01 ... 200...
    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:           2026-08-07T07:41:43Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020-2-2 output prepared for CMIP6
    tracking_id:             hdl:21.14103/25dccab0-51b2-4414-8509-7f41efc2e897
    variable_id:             tas
    version_realization:     v1-r1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.15.2
!ncdump -h $f
netcdf tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_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. ;
		rotated_latitude_longitude:earth_radius = 6371229. ;
	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:comment = "near-surface (usually, 2 meter) air temperature" ;
		tas:units = "K" ;
		tas:cell_methods = "area: mean time: point" ;
		tas:cell_measures = "area: areacella" ;
		tas:history = "2026-08-07T07:41:43Z 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 = "2026-08-07T07:41:43Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source = "ECMWF Reanalysis v5" ;
		: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 = "2026-08-07T07:41:43Z ;rewrote data to be consistent with CORDEX-CMIP6 for variable tas found in table 1hr." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020 v2.2" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX-CMIP6" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "Regional Climate Model REMO, version 2.2, hydrostatic configuration with MACv2 aerosol forcing and Fresh-water Lake model (FLake) (2023)" ;
		:source_id = "REMO2020-2-2" ;
		:source_type = "ARCM" ;
		:table_id = "1hr" ;
		:table_info = "Name: CORDEX-CMIP6_1hr.json; Creation Date:(07 August 2026) MD5:65bdede2464ccb1cf59173718af2f1bf" ;
		:title = "REMO2020-2-2 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/25dccab0-51b2-4414-8509-7f41efc2e897" ;
		:variable_id = "tas" ;
		:version_realization = "v1-r1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.15.2" ;
}
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX-CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020-2-2/v1-r1/1hr/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_1hr_200001010000-200001030000.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 94 (2026-06-09T17:23:36Z)
Using Area Type Table Version 13 (20 March 2025)
Using Standardized Region Name Table Version 5 (12 November 2024)

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-2-2/v1-r1/1hr/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_1hr_200001010000-200001030000.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 6.1.0                                  
                     Report generated 2026-08-07T07:41: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-2-2_v1-r1_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']'
# 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
/tmp/ipykernel_4165/3805428128.py:46: DeprecationWarning: 'CORDEX_domain' keyword is deprecated, please use the 'domain_id' keyword instead
  filename = cmor.cmorize_variable(
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1035: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  unused_keys = set(attribute.keys()) - set(inverted)
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1036: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  for key, value in attribute.items():
<frozen _collections_abc>:894: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1044: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  newmap.update({key: attribute[key] for key in unused_keys})
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cordex/cmor/cmor.py:517: UserWarning: resampling input data from H to D
  warn(f"resampling input data from {input_freq} to {pd_freq}")
<string>:7: RuntimeWarning: The 'offset' keyword does not take effect when resampling with a 'freq' that is not Tick-like (h, m, s, ms, us)
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cordex/cmor/cmor.py:635: UserWarning: adding time bounds
  warn("adding time bounds")
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cordex/cmor/cmor.py:426: 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.12/site-packages/cordex/cmor/utils.py:339: UserWarning: writing temporary table to /tmp/tmpbqm2o3t1
  warn(f"writing temporary table to {filename}")
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1035: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  unused_keys = set(attribute.keys()) - set(inverted)
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1036: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  for key, value in attribute.items():
<frozen _collections_abc>:894: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
/home/runner/micromamba/envs/cordex-examples/lib/python3.12/site-packages/cf_xarray/accessor.py:1044: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  newmap.update({key: attribute[key] for key in unused_keys})
'CORDEX/CORDEX-CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020-2-2/v1-r1/day/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_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-01 ... 2000...
  * 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 ...
    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:           2026-08-07T07:41:47Z
    domain:                  Europe
    domain_id:               EUR-12
    ...                      ...
    title:                   REMO2020-2-2 output prepared for CMIP6
    tracking_id:             hdl:21.14103/e94feaad-95fc-47d4-a235-0f5197edf30c
    variable_id:             tas
    version_realization:     v1-r1
    license:                 https://cordex.org/data-access/cordex-cmip6-data...
    cmor_version:            3.15.2
ds.tas.plot(col="time")
<xarray.plot.facetgrid.FacetGrid at 0x7f44b0bbf200>
_images/fb719751d5feaefb5b7ce20734d01ca7244529c5706e84dfeb5887697f228b43.png
!ncdump -h $f
netcdf tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_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. ;
		rotated_latitude_longitude:earth_radius = 6371229. ;
	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:comment = "near-surface (usually, 2 meter) air temperature" ;
		tas:units = "K" ;
		tas:cell_methods = "area: time: mean" ;
		tas:cell_measures = "area: areacella" ;
		tas:history = "2026-08-07T07:41:47Z 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 = "2026-08-07T07:41:47Z" ;
		:domain = "Europe" ;
		:domain_id = "EUR-12" ;
		:driving_experiment = "reanalysis simulation of the recent past" ;
		:driving_experiment_id = "evaluation" ;
		:driving_institution_id = "ECMWF" ;
		:driving_source = "ECMWF Reanalysis v5" ;
		: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 = "2026-08-07T07:41:47Z ;rewrote data to be consistent with CORDEX-CMIP6 for variable tas found in table day." ;
		:institution = "Climate Service Center Germany, Helmholtz Centre hereon GmbH, Hamburg, Germany" ;
		:institution_id = "GERICS" ;
		:label = "REMO2020 v2.2" ;
		:mip_era = "CMIP6" ;
		:product = "model-output" ;
		:project_id = "CORDEX-CMIP6" ;
		:references = "https://www.remo-rcm.de" ;
		:run_variant = "1st realization" ;
		:source = "Regional Climate Model REMO, version 2.2, hydrostatic configuration with MACv2 aerosol forcing and Fresh-water Lake model (FLake) (2023)" ;
		:source_id = "REMO2020-2-2" ;
		:source_type = "ARCM" ;
		:table_id = "day" ;
		:table_info = "Name: CORDEX-CMIP6_day.json; Creation Date:(07 August 2026) MD5:9299a59c32d29b34c093357640f40896" ;
		:title = "REMO2020-2-2 output prepared for CMIP6" ;
		:tracking_id = "hdl:21.14103/e94feaad-95fc-47d4-a235-0f5197edf30c" ;
		:variable_id = "tas" ;
		:version_realization = "v1-r1" ;
		:license = "https://cordex.org/data-access/cordex-cmip6-data/cordex-cmip6-terms-of-use" ;
		:cmor_version = "3.15.2" ;
}
!cfchecks $f
CHECKING NetCDF FILE: CORDEX/CORDEX-CMIP6/DD/EUR-12/GERICS/ERA5/evaluation/r1i1p1f1/REMO2020-2-2/v1-r1/day/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_day_20000101-20000103.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 94 (2026-06-09T17:23:36Z)
Using Area Type Table Version 13 (20 March 2025)
Using Standardized Region Name Table Version 5 (12 November 2024)

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-2-2/v1-r1/day/tas/v20260807/tas_EUR-12_ERA5_evaluation_r1i1p1f1_GERICS_REMO2020-2-2_v1-r1_day_20000101-20000103.nc']
--------------------------------------------------------------------------------
                         IOOS Compliance Checker Report                         
                                 Version 6.1.0                                  
                     Report generated 2026-08-07T07:41:50Z                      
                                     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-2-2_v1-r1_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']'