| Name | Last modified | Size | Description | |
|---|---|---|---|---|
| Parent Directory | - | |||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK{i}_0.5x0.5.zip | 2026-01-27 10:46 | 9.4G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK8_0.5x0.5.nc | 2026-01-24 23:21 | 2.2G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK7_0.5x0.5.nc | 2026-01-24 23:21 | 2.6G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK6_0.5x0.5.nc | 2026-01-26 16:55 | 2.6G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK5_0.5x0.5.nc | 2026-01-26 16:46 | 2.6G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK4_0.5x0.5.nc | 2026-01-26 16:38 | 2.6G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK3_0.5x0.5.nc | 2026-01-26 16:29 | 2.6G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK2_0.5x0.5.nc | 2026-01-26 16:19 | 2.6G | ||
| TUD-L2B-EWH_UNC-GRACEv2.0_DDK1_0.5x0.5.nc | 2026-01-26 16:11 | 2.2G | ||
| README.html | 2026-01-27 15:06 | 25K | ||
| CLIM_LEAKAGE/ | 2026-01-27 11:21 | - | ||
| CLIM/ | 2026-01-27 11:18 | - | ||
This dataset provides gridded Equivalent Water Height (EWH), which are equivalent to Terrestrial Water Storage Anomalies (TWSA) on land. These quantities have been derived from data collected by GRACE and GRACE-FO. The underlying Spherical Harmonic (SH) gravity field models were filtered using the DDK{i} (i=2,...,7) decorrelation filter (Kusche et al., 2009) on a 0.5° × 0.5° global grid. Each file contains monthly fields from 2002–2020, corresponding directly to the unconstrained SH gravity field models. All weighted mean and uncertainty components include gravity signal from degree 2 to 60. Weights are assigned to each GRACE solution based on the inverse square of its root-mean-square (RMS) error over the open ocean, normalized so that the sum of weights equals one. The RMS values are calculated relative to the COST-G RL02.1 monthly solutions (Meyer, U., et al. 2025), which serve as a benchmark. Coefficients \(C_{2,0}\) and \(C_{3,0}\) are replaced using TN-14v3 (https://doi.org/10.1029/2019GL085488). This dataset includes the geocenter motion (TN-13, degree-1) as a separate variable layer integrated directly into the data product, whereas prominent tidal components (S2, P1, S1, K1, and unmodelled R3) are provided in the ancillary TUD-L2B-CLIM dataset.
The novelty in this product is the consolidation of multiple official GRACE Level-2 spherical harmonic solutions and their uncertainty propagation into a single multi-component uncertainty budget, which includes:
This layered GRACE(-FO) Level-2B data product allows the user to have a complete and transparent overview of all uncertainty components and directly apply those to their data assimilation strategies or other applications.
TUD-L2B-EWH_UNC-GRACEv2.0_DDK{i}_0.5x0.5.nc
i = 2, 3, 4, 5, 6, or 7 (DDK filter level applied)
Ancillary post-processing climatological and aliasing tidal fits:
TUD-L2B-EWH_CLIM-GRACEv2.0_DDK{i}_0.5x0.5.nc
i = 2, 3, 4, 5, 6, or 7 (DDK filter level applied)
And for leakage:
TUD-L2B-EWH_CLIM_LEAKAGE-GRACEv2.0_DDK{i}_0.5x0.5.nc
i = 2, 3, 4, 5, 6, or 7 (DDK filter level applied)
04/2002 - 12/2020
(time, lat, lon)
i DDK7 DDK6 DDK5 DDK4 DDK3 DDK2
Scale factor 4.4 4.5 4.0 4.5 3.9 2.9
ewh_mean_leakage = scale factor × fractional leakage.ewh_mean [cm]ewh_mean_leakage [cm]ewh_degree1 [cm]ewh_unc_sols [cm]ewh_unc_degree1 [cm]ewh_unc_degree20 [cm]ewh_unc_degree30 [cm]ewh_unc_aod1b [cm]ewh_unc_leakage [cm]ewh_gia_mean [cm/yr]ewh_gia_unc [cm/yr]ewh_unc_GRACE2(t) = ewh_unc_sols2(t) + ewh_unc_aod1b2(t) + ewh_unc_degree12(t) + ewh_unc_degree202(t) + ewh_unc_degree302(t)
If the user wishes to correct for GIA, the effect on the monthly uncertainty can be computed as:
ewh_unc_corrGIA(t) [cm] = ewh_gia_unc * abs(t-t0) t0 = reference epoch (e.g., 01/01/2008, GGM05C)
ewh_corr(t) = ewh_mean(t) - ewh_gia_mean*(t-t0) - ewh_AliasingTides(t),
where t is in years, and one can compute ewh_AliasingTides(t) using the ancillary data product:
TUD-L2B-EWH_CLIM-GRACEv2.0_DDK{i}_0.5x0.5.nc,
which contains the cosine and sine coefficients \(C_k\) and \(S_k\) of the \(k^{th}\) tide. For further details, see Section "Additional Post-processing Features".To further facilitate the user, we provide a full climatological fit, which most importantly includes the aliasing tidal coefficients \(C_k\) and \(S_k\), provided in
TUD-L2B-EWH_CLIM-GRACEv2.0_DDK{i}_0.5x0.5.nc,
asewh_clim(t) = A + B*(t-t0) + 0.5*C*(t-t0)^2 + D*cos(2pi*(t-t0)) + E*sin(2pi*(t-t0)) + F*cos(4pi*(t-t0)) + G*sin(4pi*(t-t0)) + ewh_AliasingTides(t).
where t0=2008.0, and
ewh_AliasingTides(t) = Σk C_k*cos(omega_k*(t-t0)) + S_k*sin(omega_k*(t-t0)),
with omega_k being the angular aliasing frequency \(2\pi f_k\) of the \(k^{th}\) tide.
All coefficients are provided in units of equivalent water height (EWH) (variable name: ewh_mean_beta),
with dimensions (coeff: 17, lat: 360, lon: 720).
The coeff dimension corresponds to the following parameters:
bias – constant offset (A) [cm]trend – linear trend (B) [cm/yr]acc – quadratic acceleration term (C) [cm/yr2]annual_cos – annual cosine term (D) [cm]annual_sin – annual sine term (E) [cm]semiannual_cos – semi-annual cosine term (F) [cm]semiannual_sin – semi-annual sine term (G) [cm]{tide_k}_cos – cosine tidal term (Ck) [cm]{tide_k}_sin – sine tidal term (Sk) [cm]
Here, tide_k ∈ {S2, S1, P1, K1, R3}.
For user convenience, the variable t_clim may be used, which denotes the centred time array,
defined as t_clim = (t - t0) with t0 = 2008.0.
This formulation is directly compatible with the provided coefficients.
Please note that the coeff-dimension name convention is the same for the
TUD-L2B-EWH_CLIM_LEAKAGE-GRACEv2.0_DDK{i}_0.5x0.5.nc ancillary data product (variable name: ewh_mean_leakage_beta).
import numpy as np
import xarray as xr
import pandas as pd
# function
def fractional_year(time):
"""Convert datetime array to absolute fractional years."""
t = pd.DatetimeIndex(time)
year = t.year
doy = t.dayofyear
days_y = np.where(t.is_leap_year, 366, 365)
return year + (doy - 1) / days_y
# path to files
path_ = "Path/to/your/files" # <== change your path here!
# version string
version_str = "v2.0"
# Open coefficient dataset (no time dimension)
i_level = 4 # <== choose here your desired filtering strength
ds_beta = xr.open_dataset(path_ + f"TUD-L2B-EWH_CLIM-GRACE{version_str}_DDK{i_level}_0.5x0.5.nc")
varname_clim = "ewh_mean_beta" # <- variable name for climatology
# Open main EWH dataset to obtain time axis (and or correct later results)
ds_ewh = xr.open_dataset(path_ + f"TUD-L2B-EWH_UNC-GRACE{version_str}_DDK{i_level}_0.5x0.5.nc")
ewh_tot = ds_ewh["ewh_mean"]
# Construct time array in decimal years
time = ds_ewh.time
t_years = fractional_year(time)
print(t_years)
# Time relative to reference epoch
# Reference epoch (decimal years)
tref = 2008.0
dt = t_years - tref
# Extract coefficients (lat, lon)
beta = ds_beta[varname_clim]
A = ds_beta[varname_clim].sel(coeff="bias")
B = ds_beta[varname_clim].sel(coeff="trend")
C = ds_beta[varname_clim].sel(coeff="acc")
D = ds_beta[varname_clim].sel(coeff="annual_cos")
E = ds_beta[varname_clim].sel(coeff="annual_sin")
F = ds_beta[varname_clim].sel(coeff="semiannual_cos")
G = ds_beta[varname_clim].sel(coeff="semiannual_sin")
# Reconstruct climatological EWH (time, lat, lon)
ones_ = xr.DataArray(
np.ones_like(dt),
dims=("time",),
coords={"time": ds_ewh.time},
)
t_year_centered = xr.DataArray(
dt,
dims=("time",),
coords={"time": ds_ewh.time},
)
# Expand bias explicitly to time dimension
signal = beta.sel(coeff="bias").expand_dims(time=t_year_centered.time)
# Polynomial terms
# if "bias" in beta.coeff:
# signal = signal + beta.sel(coeff="bias")*ones_
if "trend" in beta.coeff:
signal = signal + beta.sel(coeff="trend") * t_year_centered
if "acc" in beta.coeff:
signal = signal + 0.5 * beta.sel(coeff="acc") * (t_year_centered ** 2)
# Annual & semiannual
omega_ann = 2 * np.pi
omega_semi = 2 * np.pi * 2
if "annual_cos" in beta.coeff:
signal = signal + beta.sel(coeff="annual_cos") * np.cos(omega_ann * t_year_centered)
signal = signal + beta.sel(coeff="annual_sin") * np.sin(omega_ann * t_year_centered)
if "semiannual_cos" in beta.coeff:
signal = signal + beta.sel(coeff="semiannual_cos") * np.cos(omega_semi * t_year_centered)
signal = signal + beta.sel(coeff="semiannual_sin") * np.sin(omega_semi * t_year_centered)
# Optional: remove selected tidal aliasing terms
remove_tides = ["S2", "S1", "P1", "R3", "K1"]
tides_aliasing_periods = [160.6, 319.1, 170.8, 150.6, 2630]
remove_tides = ["S2", "P1"]
tides_aliasing_periods = [160.6, 170.8]
# initialise
ewh_aliasing = 0.0
for tide, tide_period in zip(remove_tides, tides_aliasing_periods):
# Retrieve coefficients [cm]
Ck_cos = beta.sel(coeff=f"{tide}_cos")
Sk_sin = beta.sel(coeff=f"{tide}_sin")
# Convert period to years
T_k = tide_period / 365.25
omega_k = 2 * np.pi / T_k
# Reconstruct tidal aliasing contribution
ewh_tide_k = (
Ck_cos * np.cos(omega_k * t_year_centered)
+ Sk_sin * np.sin(omega_k * t_year_centered)
)
ewh_aliasing += ewh_tide_k
# corrected signal from tidal components
ewh_corr = ewh_tot - ewh_aliasing
Update: 27 January 2026
Version: v2.0
ewh_unc_degXX ("1", "20", and "30") to the main product.
residuals and t_clim to the climatological product.
Lead developer: Michal Cuadrat-Grzybowski
Email: M.Cuadrat-Grzybowski-1@tudelft.nl
If you use this dataset, please cite:
Cuadrat-Grzybowski, M., and De Teixeira da Encarnação, J. (2026).
TUD-L2B-EWH_UNC-GRACEv2.0: Global 0.5°x0.5° monthly equivalent water height user-friendly dataset with comprehensive uncertainty decomposition (solution disparity, AOD1B uncertainty, DDK leakage error, low-degree coefficient treatment, and GIA ensemble error)
4TU.ResearchData.
DOI: http://doi.org/10.4121/4fc748e8-01c7-4f06-87da-653937b078f7