Skip to content
26 changes: 18 additions & 8 deletions src/DataWrangling/ECCO/ECCO.jl
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ using ...NumericalEarth: NumericalEarth
using ..DataWrangling: DataWrangling, binary_data_grid, binary_data_size, default_mask_value,
dataset_variable_name, default_download_directory, longitude_interfaces,
latitude_interfaces, netrc_downloader, NearestNeighborInpainting, metadata_path,
GramPerKilogramMinus35, MicromolePerLiter, Metadata, Metadatum, DownloadProgress,
GramPerKilogramMinus35, Metadata, Metadatum, DownloadProgress,
metadata_url, first_date, last_date, all_dates

download_ECCO_cache::String = ""
Expand Down Expand Up @@ -205,10 +205,6 @@ const ECCOMetadatum = Metadatum{<:ECCODataset}
# sea surface pressure can exceed 1e5 (the default higher bound for datasets data)
DataWrangling.higher_bound(::ECCOMetadata, ::Val{:sea_level_pressure}) = 1f10

# Note: ECCO downwelling radiation variables (oceQsw, EXFlwdn) are already
# in positive-downwelling convention, so no sign conversion is needed.
DataWrangling.conversion_units(metadatum::ECCOMetadatum) = nothing

"""
ECCOMetadatum(name;
date = first_date(ECCO4Monthly(), name),
Expand Down Expand Up @@ -254,11 +250,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 ||
Expand Down Expand Up @@ -343,7 +340,20 @@ function DataWrangling.default_inpainting(metadata::ECCOMetadata)
end
end

DataWrangling.inpainted_metadata_path(metadata::ECCOMetadatum) = joinpath(metadata.dir, inpainted_metadata_filename(metadata))
DataWrangling.inpainted_metadata_path(metadata::ECCOMetadatum) =
joinpath(metadata.dir, inpainted_metadata_filename(metadata))

function DataWrangling.read_file_coords(metadata::ECCOMetadatum)
Nx, Ny, _, _ = size(metadata)
resolution_X = 360/Nx
resolution_Y = 180/Ny
longitudes = longitude_interfaces(metadata.dataset)
latitudes = latitude_interfaces(metadata.dataset)
lon = [i for i = longitudes[1]+resolution_X/2:resolution_X:longitudes[2]-resolution_X/2]
lat = [j for j = latitudes[1]+resolution_Y/2:resolution_Y:latitudes[2]-resolution_Y/2]

return lon, lat
end

include("ECCO_atmosphere.jl")
include("ECCO_radiation.jl")
Expand Down
18 changes: 11 additions & 7 deletions src/DataWrangling/ECCO/ECCO_darwin.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ using MeshArrays: MeshArrays, GridSpec, GridLoad, GridLoadVar, interpolation_set
struct ECCO2DarwinMonthly <:ECCODataset end
struct ECCO4DarwinMonthly <:ECCODataset end

const ECCODarwin = Union{ECCO2DarwinMonthly, ECCO4DarwinMonthly}
const ECCODarwinMetadata = Metadata{<:Union{ECCO2DarwinMonthly, ECCO4DarwinMonthly}}
const ECCODarwinMetadatum = Metadatum{<:Union{ECCO2DarwinMonthly, ECCO4DarwinMonthly}}

# URLs for the ECCO datasets specific to each version
const ECCO4Darwin_url = "https://ecco.jpl.nasa.gov/drive/files/ECCO2/LLC90/ECCO-Darwin/"
const ECCO2Darwin_url = "https://ecco.jpl.nasa.gov/drive/files/ECCO2/LLC270/ECCO-Darwin_extension/"
Expand Down Expand Up @@ -31,7 +35,7 @@ Generate the filename for a given ECCO Darwin dataset and date.
The filename is constructed using the dataset variable name, and the iteration number is calculated
from the date and epoch.
"""
function DataWrangling.metadata_filename(dataset::Union{ECCO2DarwinMonthly, ECCO4DarwinMonthly}, name, date, region)
function DataWrangling.metadata_filename(dataset::ECCODarwin, name, date, region)
shortname = ECCO_darwin_dataset_variable_names[name]

reference_date = metadata_epoch(dataset)
Expand All @@ -48,9 +52,9 @@ end
DataWrangling.default_mask_value(::ECCO4DarwinMonthly) = 0
DataWrangling.default_mask_value(::ECCO2DarwinMonthly) = 0

DataWrangling.dataset_variable_name(data::Metadata{<:Union{ECCO2DarwinMonthly,ECCO4DarwinMonthly}}) = ECCO_darwin_dataset_variable_names[data.name]
DataWrangling.dataset_variable_name(data::ECCODarwinMetadata) = ECCO_darwin_dataset_variable_names[data.name]

variable_is_three_dimensional(::Metadata{<:Union{ECCO2DarwinMonthly, ECCO4DarwinMonthly}}) = true
variable_is_three_dimensional(::ECCODarwinMetadata) = true

ECCO_darwin_dataset_variable_names = Dict(
:temperature => "THETA",
Expand All @@ -66,18 +70,18 @@ ECCO_darwin_dataset_variable_names = Dict(
:dissolved_oxygen => "O2",
)

DataWrangling.is_three_dimensional(data::ECCODarwinMetadata) = true

"""
conversion_units(metadatum::Metadatum{<:Union{ECCO2DarwinMonthly, ECCO4DarwinMonthly}})
conversion_units(metadatum::Metadatum{<:ECCODarwin})
Set up conversion from the ECCODarwin output data to standard units
- salinity = SALTanom + 35
- biogeochemical tracer concentrations are in uL => umol/L in the output files from Darwin
"""
function DataWrangling.conversion_units(metadatum::Metadatum{<:Union{ECCO2DarwinMonthly, ECCO4DarwinMonthly}})
function DataWrangling.conversion_units(metadatum::Union{ECCODarwinMetadata, ECCODarwinMetadatum})
if dataset_variable_name(metadatum) == "SALTanom"
return GramPerKilogramMinus35()
elseif dataset_variable_name(metadatum) != "THETA"
return MicromolePerLiter()
else
return nothing
end
Expand Down
7 changes: 2 additions & 5 deletions src/DataWrangling/restoring.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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
Expand Down
Loading