From 1d38e1d0535a1a5fc927d3edd74dd28f8a860736 Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Thu, 30 Apr 2026 14:10:43 +0100 Subject: [PATCH 1/5] Allows `DatasetRestoring` to act on fields by different name --- src/DataWrangling/restoring.jl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/DataWrangling/restoring.jl b/src/DataWrangling/restoring.jl index 69e3cf18f..998dfedaf 100644 --- a/src/DataWrangling/restoring.jl +++ b/src/DataWrangling/restoring.jl @@ -197,7 +197,9 @@ function DatasetRestoring(metadata::Metadata, time_indices_in_memory = default_time_indices_in_memory(metadata), time_indexing = Cyclical(), inpainting = NearestNeighborInpainting(Inf), - cache_inpainted_data = true) + cache_inpainted_data = true, + variable_name = metadata.name, + field_name = oceananigans_fieldnames[variable_name]) download_dataset(metadata) @@ -210,10 +212,6 @@ function DatasetRestoring(metadata::Metadata, arch = architecture(fts) mask = on_architecture(arch, mask) - # Grab the correct Oceananigans field to restore - variable_name = metadata.name - field_name = oceananigans_fieldnames[variable_name] - # If we pass the grid we do not need to interpolate # so we can save parameter space by setting the native grid to nothing on_native_grid = arch_or_grid isa AbstractArchitecture From 6797f94e0c6d2098e7aadd8165c66b8856a44875 Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Fri, 1 May 2026 11:46:43 +0100 Subject: [PATCH 2/5] Update src/DataWrangling/restoring.jl Co-authored-by: Simone Silvestri --- src/DataWrangling/restoring.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/DataWrangling/restoring.jl b/src/DataWrangling/restoring.jl index 998dfedaf..ceb8be818 100644 --- a/src/DataWrangling/restoring.jl +++ b/src/DataWrangling/restoring.jl @@ -198,8 +198,7 @@ function DatasetRestoring(metadata::Metadata, time_indexing = Cyclical(), inpainting = NearestNeighborInpainting(Inf), cache_inpainted_data = true, - variable_name = metadata.name, - field_name = oceananigans_fieldnames[variable_name]) + field_name = oceananigans_fieldnames[metadata.name]) download_dataset(metadata) From d3dcbc356993382e96a631d5438abd4073b290f1 Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Sat, 2 May 2026 15:05:02 +0100 Subject: [PATCH 3/5] Adds fallback for ECCO locaitons Since 0.3.0 can't build FTS of ECCO Darwin variables as their location isn't in the ECCO_location dictionary --- src/DataWrangling/ECCO/ECCO.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DataWrangling/ECCO/ECCO.jl b/src/DataWrangling/ECCO/ECCO.jl index 576e81014..f41d811bc 100644 --- a/src/DataWrangling/ECCO/ECCO.jl +++ b/src/DataWrangling/ECCO/ECCO.jl @@ -284,7 +284,7 @@ end dataset_variable_name(data::Metadata{<:ECCO2Daily}) = ECCO2_dataset_variable_names[data.name] dataset_variable_name(data::Metadata{<:ECCO2Monthly}) = ECCO2_dataset_variable_names[data.name] dataset_variable_name(data::Metadata{<:ECCO4Monthly}) = ECCO4_dataset_variable_names[data.name] -dataset_location(::ECCODataset, name) = ECCO_location[name] +dataset_location(::ECCODataset, name) = name in keys(ECCO_location) ? ECCO_location[name] : (Center, Center, Center) is_three_dimensional(data::ECCOMetadata) = data.name == :temperature || From 487f13dba0c011b8c3dd6f633f5adfb0b82698ff Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Thu, 11 Jun 2026 19:58:20 +0100 Subject: [PATCH 4/5] Update ECCO_darwin.jl --- src/DataWrangling/ECCO/ECCO_darwin.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DataWrangling/ECCO/ECCO_darwin.jl b/src/DataWrangling/ECCO/ECCO_darwin.jl index 0521f322c..d5e6f29cb 100644 --- a/src/DataWrangling/ECCO/ECCO_darwin.jl +++ b/src/DataWrangling/ECCO/ECCO_darwin.jl @@ -79,7 +79,7 @@ function DataWrangling.conversion_units(metadatum::Metadatum{<:Union{ECCO2Darwin elseif dataset_variable_name(metadatum) != "THETA" return MicromolePerLiter() else - return nothing + return MolePerLiter() end end From 1cb23520677b847607beccef8a20ba81073080db Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Sun, 14 Jun 2026 18:02:57 +0200 Subject: [PATCH 5/5] added GLORYS bgc variables --- ext/NumericalEarthCopernicusMarineExt.jl | 2 +- src/DataWrangling/GLORYS/GLORYS.jl | 2 + src/DataWrangling/GLORYS/GLORYS_bgc.jl | 69 ++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/DataWrangling/GLORYS/GLORYS_bgc.jl diff --git a/ext/NumericalEarthCopernicusMarineExt.jl b/ext/NumericalEarthCopernicusMarineExt.jl index a78f43fe4..f81fd4407 100644 --- a/ext/NumericalEarthCopernicusMarineExt.jl +++ b/ext/NumericalEarthCopernicusMarineExt.jl @@ -30,7 +30,7 @@ function Downloads.download(meta::GLORYSMetadatum; toolbox = CopernicusMarine.copernicusmarine - variable_name = GLORYS.GLORYS_dataset_variable_names[meta.name] + variable_name = GLORYS.dataset_variable_name(meta) variables = CopernicusMarine.pylist([variable_name]) dataset_id = GLORYS.copernicusmarine_dataset_id(meta.dataset) diff --git a/src/DataWrangling/GLORYS/GLORYS.jl b/src/DataWrangling/GLORYS/GLORYS.jl index 30177671c..066382c2f 100644 --- a/src/DataWrangling/GLORYS/GLORYS.jl +++ b/src/DataWrangling/GLORYS/GLORYS.jl @@ -154,5 +154,7 @@ function z_interfaces(metadata::GLORYSMetadata) return zf end +include("GLORYS_bgc.jl") + end # module GLORYS diff --git a/src/DataWrangling/GLORYS/GLORYS_bgc.jl b/src/DataWrangling/GLORYS/GLORYS_bgc.jl new file mode 100644 index 000000000..a58b08bac --- /dev/null +++ b/src/DataWrangling/GLORYS/GLORYS_bgc.jl @@ -0,0 +1,69 @@ +struct GLORYSBGCDaily <: GLORYSDataset end +struct GLORYSBGCMonthly <: GLORYSDataset end + +dataset_name(::GLORYSBGCDaily) = "GLORYSBGCDaily" +dataset_name(::GLORYSBGCMonthly) = "GLORYSBGCMonthly" + +const GLORYSBGC = Union{GLORYSBGCDaily, GLORYSBGCMonthly} + +const GLORYSBGCMetadatum = + Union{Metadatum{<:GLORYSBGCDaily}, Metadatum{<:GLORYSBGCMonthly}} + +Base.size(::GLORYSBGC, variable) = (1140, 680, 75) +Base.size(::GLORYSBGCMetadatum) = (1140, 680, 75, 1) + +all_dates(::GLORYSBGCDaily, var) = range(DateTime("1993-01-01"), stop=DateTime("2026-03-31"), step=Day(1)) +all_dates(::GLORYSBGCMonthly, var) = range(DateTime("1993-01-01"), stop=DateTime("2026-03-31"), step=Month(1)) + +copernicusmarine_dataset_id(::GLORYSBGCDaily) = "cmems_mod_glo_bgc_my_0.25deg_P1D-m" +copernicusmarine_dataset_id(::GLORYSBGCMonthly) = "cmems_mod_glo_bgc_my_0.25deg_P1M-m" + +available_variables(::GLORYSBGCDaily) = + Dict(:chlorophyll => "chl", + :nitrate => "no3", + :primary_production => "nppv", + :oxygen => "o2", + :phosphate => "po4", + :silicate => "si") + +available_variables(::GLORYSBGCMonthly) = + Dict(:chlorophyll => "chl", + :iron => "fe", + :nitrate => "no3", + :primary_production => "nppv", + :oxygen => "o2", + :pH => "ph", + :phytoplankton => "phyc", + :phosphate => "po4", + :silicate => "si", + :pCO₂ => "spco2") + +dataset_variable_name(metadata::GLORYSBGCMetadatum) = available_variables(metadata.dataset)[metadata.name] + +function metadata_prefix(dataset::GLORYSBGC, name, date, region) + var = available_variables(dataset)[name] + ds = dataset_name(dataset) + start_date = start_date_str(date) + end_date = end_date_str(date) + suffix = region_suffix(region) + return string(var, "_", + ds, "_", + start_date, "_", + end_date, suffix) |> colon2dash +end + +is_three_dimensional(metadata::GLORYSBGCMetadatum) = metadata.name != :pCO₂ + +function z_interfaces(metadata::GLORYSBGCMetadatum) + metadata.name == :pCO₂ && return (-1.0, 0.0) + paths = metadata_path(metadata) + path = paths isa AbstractVector ? first(paths) : paths + ds = Dataset(path) + zc = - reverse(ds["depth"][:]) + close(ds) + dz = zc[2] - zc[1] + zf = (zc[1:end-1] .+ zc[2:end]) / 2 + push!(zf, 0) + pushfirst!(zf, zf[1] - dz) + return zf +end