| Name | Last modified | Size | Description | |
|---|---|---|---|---|
| Parent Directory | - | |||
| README.html | 2026-01-08 10:01 | 22K | ||
| TUD-L2B-EWH_UNC-GRACE_DDK2_0.5x0.5.nc | 2025-11-17 10:12 | 1.7G | ||
| TUD-L2B-EWH_UNC-GRACE_DDK3_0.5x0.5.nc | 2025-11-17 10:27 | 1.7G | ||
| TUD-L2B-EWH_UNC-GRACE_DDK4_0.5x0.5.nc | 2025-11-17 10:44 | 1.7G | ||
| TUD-L2B-EWH_UNC-GRACE_DDK5_0.5x0.5.nc | 2025-11-17 10:58 | 1.7G | ||
| TUD-L2B-EWH_UNC-GRACE_DDK6_0.5x0.5.nc | 2025-11-17 11:15 | 1.7G | ||
| TUD-L2B-EWH_UNC-GRACE_DDK7_0.5x0.5.nc | 2025-11-17 09:53 | 1.7G | ||
This dataset provides gridded Equivalent Water Height (EWH) which are equivalent on land to Terrestrial Water Storage Anomalies (TWSA) from GRACE and GRACE-FO generated at TU Delft (“TUD”), 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. All weighted mean and uncertainty components include gravity signal content from degree 2 to 60. Weights are computed as the normalised square inverses of open ocean RMS using COST-G RL02.1 (Meyer, U., et al. 2025) monthly solutions as a benchmark. Coefficients C20 and C30 are already replaced using TN-14v3 (https://doi.org/10.1029/2019GL085488). The user can add separately the geocenter motion (TN-13) contribution (degree-1), as well remove prominent tidal components (S2, P1, S1, K1, and unmodelled R3).
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 into their data assimilation strategies or other applications.
ewh_mean).ewh_degree1).ewh_unc_sols → data center solution uncertainty (inter-solution spread)ewh_unc_aod1b → background AOD1B model uncertainty (AOD1B/AOe07)ewh_unc_leakage → filtering-induced leakage uncertaintyewh_gia_unc → GIA uncertainty on trendewh_unc_degree1 → Propagated C10, C11 and S11 formal error provided in TN-13Additionally:
ewh_gia_mean provides the ensemble GIA trend to correct the trend of ewh_mean.TUD-L2B-EWH_UNC-GRACE_DDK{i}_0.5x0.5.nc
i = 2, 3, 4, 5, 6, or 7 (Gaussian DDK filter level applied)
Ancillary post-processing climatological and aliasing tidal fit:
TUD-L2B-EWH_CLIM-GRACE_DDK{i}_0.5x0.5.nc
i = 2, 3, 4, 5, 6, or 7 (Gaussian DDK filter level applied)
04/2002 - 12/2020
(time, lat, lon)
ewh_mean [cm]ewh_degree1 [cm]ewh_unc_sols [cm]ewh_unc_degree1 [cm]ewh_unc_aod1b [cm]ewh_unc_leakage [cm]ewh_gia_mean [cm/yr]ewh_gia_unc [cm/yr]i DDK7 DDK6 DDK5 DDK4 DDK3 DDK2
Scale factor 4.4 4.5 4.0 4.5 3.9 2.9
ewh_unc_GRACE2(t) =
ewh_unc_sols2(t) +
ewh_unc_aod1b2(t) +
ewh_unc_leakage2(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_unc_gia * 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-GRACE_DDK{i}_0.5x0.5.nc,
which contains the cosine and sine coefficients C_k and S_k of the kth tide. For further details see Sect. "Additional Post-processing Features".To further facilitate the user, we provide a full climatological fit which most importantly includes aliasing tidal coefficients C_k and S_k is provided in
TUD-L2B-EWH_CLIM-GRACE_DDK{i}_0.5x0.5.nc,
as:ewh_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 as usual 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 (2pi*f_k) of the kth 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}.
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!
# 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_DDK{i_level}_0.5x0.5.nc")
varname = "ewh_mean_beta"
# 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_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]
A = ds_beta[varname].sel(coeff="bias")
B = ds_beta[varname].sel(coeff="trend")
C = ds_beta[varname].sel(coeff="acc")
D = ds_beta[varname].sel(coeff="annual_cos")
E = ds_beta[varname].sel(coeff="annual_sin")
F = ds_beta[varname].sel(coeff="semiannual_cos")
G = ds_beta[varname].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
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 Encarnacao, J. (2025).
TUD-L2B-EWH_UNC_GRACE: Global 0.5°x0.5° monthly equivalent water height user-friendly dataset
with comprehensive uncertainty decomposition (Solution disparity, AOD1B uncertainty,
DDK leakage error, and GIA ensemble error).
DOI: http://doi.org/10.4121/4fc748e8-01c7-4f06-87da-653937b078f7