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/ECCO/ECCO.jl b/src/DataWrangling/ECCO/ECCO.jl index f6aee7974..c13e2a512 100644 --- a/src/DataWrangling/ECCO/ECCO.jl +++ b/src/DataWrangling/ECCO/ECCO.jl @@ -254,11 +254,12 @@ function DataWrangling.metadata_filename(dataset::Union{ECCO2Daily, ECCO2Monthly end # Convenience functions + DataWrangling.dataset_variable_name(data::Metadata{<:ECCO2Daily}) = ECCO2_dataset_variable_names[data.name] DataWrangling.dataset_variable_name(data::Metadata{<:ECCO2Monthly}) = ECCO2_dataset_variable_names[data.name] DataWrangling.dataset_variable_name(data::Metadata{<:ECCO4Monthly}) = ECCO4_dataset_variable_names[data.name] -DataWrangling.dataset_location(::ECCODataset, name) = ECCO_location[name] - +DataWrangling.dataset_location(::ECCODataset, name) = name in keys(ECCO_location) ? ECCO_location[name] : (Center, Center, Center) + DataWrangling.is_three_dimensional(data::ECCOMetadata) = data.name == :temperature || data.name == :salinity || 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 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 diff --git a/src/DataWrangling/restoring.jl b/src/DataWrangling/restoring.jl index c97f9e5aa..e7b162b4c 100644 --- a/src/DataWrangling/restoring.jl +++ b/src/DataWrangling/restoring.jl @@ -192,7 +192,8 @@ 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, + field_name = oceananigans_fieldnames[metadata.name]) Downloads.download(metadata) @@ -205,10 +206,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