diff --git a/src/DataWrangling/Copernicus/Copernicus.jl b/src/DataWrangling/Copernicus/Copernicus.jl index c33d35893..bf88e482c 100644 --- a/src/DataWrangling/Copernicus/Copernicus.jl +++ b/src/DataWrangling/Copernicus/Copernicus.jl @@ -1,6 +1,6 @@ module Copernicus -export GLORYSStatic, GLORYSDaily, GLORYSMonthly +export GLORYSStatic, GLORYSDaily, GLORYSMonthly, GLORYSBGCDaily, GLORYSBGCMonthly using NCDatasets using Printf @@ -33,26 +33,35 @@ end # Datasets abstract type CopernicusDataset end +abstract type GLORYSDataset <: CopernicusDataset end default_download_directory(::CopernicusDataset) = download_Copernicus_cache +struct GLORYSDaily <: GLORYSDataset end +struct GLORYSMonthly <: GLORYSDataset end +struct GLORYSBGCDaily <: GLORYSDataset end +struct GLORYSBGCMonthly <: GLORYSDataset end + # This contains "static" variables -- eg the grid -struct GLORYSStatic <: CopernicusDataset end -struct GLORYSDaily <: CopernicusDataset end -struct GLORYSMonthly <: CopernicusDataset end +struct GLORYSStatic <: GLORYSDataset end dataset_name(::GLORYSStatic) = "GLORYSStatic" dataset_name(::GLORYSDaily) = "GLORYSDaily" dataset_name(::GLORYSMonthly) = "GLORYSMonthly" +dataset_name(::GLORYSBGCDaily) = "GLORYSBGCDaily" +dataset_name(::GLORYSBGCMonthly) = "GLORYSBGCMonthly" all_dates(::GLORYSStatic, var) = [nothing] -all_dates(::GLORYSDaily, var) = range(DateTime("1993-01-01"), stop=DateTime("2021-06-30"), step=Day(1)) -all_dates(::GLORYSMonthly, var) = range(DateTime("1993-01-01"), stop=DateTime("2024-12-01"), step=Month(1)) +all_dates(::GLORYSDaily, var) = range(DateTime("1993-01-01"), stop=DateTime("2021-06-30"), step=Day(1)) +all_dates(::GLORYSMonthly, var) = range(DateTime("1993-01-01"), stop=DateTime("2024-12-01"), step=Month(1)) +all_dates(::GLORYSBGCDaily, var) = range(DateTime("1993-01-01"), stop=DateTime("2022-12-30"), step=Day(1)) +all_dates(::GLORYSBGCMonthly, var) = range(DateTime("1993-01-01"), stop=DateTime("2022-11-30"), step=Month(1)) copernicusmarine_dataset_id(::GLORYSStatic) = "cmems_mod_glo_phy_my_0.083deg_static" copernicusmarine_dataset_id(::GLORYSDaily) = "cmems_mod_glo_phy_my_0.083deg_P1D-m" copernicusmarine_dataset_id(::GLORYSMonthly) = "cmems_mod_glo_phy_my_0.083deg_P1M-m" -# :static => "cmems_mod_glo_phy_my_0.083deg_static", +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" struct CMEMSHourlyAnalysis <: CopernicusDataset end copernicusmarine_dataset_id(::CMEMSHourlyAnalysis) = "cmems_mod_glo_phy_anfc_0.083deg_PT1H-m" @@ -60,10 +69,43 @@ copernicusmarine_dataset_id(::CMEMSHourlyAnalysis) = "cmems_mod_glo_phy_anfc_0.0 CopernicusMetadata{D} = Metadata{<:CopernicusDataset, D} CopernicusMetadatum = Metadatum{<:CopernicusDataset} -Base.size(::CopernicusMetadatum) = (4320, 2040, 50, 1) +Base.size(::GLORYSStatic) = (4320, 2040, 50, 1) +Base.size(::GLORYSDaily) = (4320, 2040, 50, 1) +Base.size(::GLORYSMonthly) = (4320, 2040, 50, 1) +Base.size(::GLORYSBGCDaily) = (1440, 680, 75, 1) +Base.size(::GLORYSBGCMonthly) = (1440, 680, 75, 1) + reversed_vertical_axis(::CopernicusDataset) = true -available_variables(::CopernicusDataset) = copernicus_dataset_variable_names +available_variables(::GLORYSDataset) = ( + :temperature, + :depth, + :salinity, + :sea_ice_concentration, + :sea_ice_thickness, + :u_velocity, + :v_velocity, + :sea_ice_u_velocity, + :sea_ice_v_velocity, + :free_surface, +) + +available_variables(::GLORYSBGCDaily) = ( + :total_chlorophyll, + :primary_production, + :nitrate, + :phosphate, + :dissolved_silicate, + :dissolved_oxygen, +) + +available_variables(::GLORYSBGCMonthly) = tuple( + available_variables(GLORYSBGCDaily())..., + :dissolved_iron, + :ph, + :surface_co2, + :total_phytoplankton, +) copernicus_dataset_variable_names = Dict( :temperature => "thetao", @@ -76,6 +118,16 @@ copernicus_dataset_variable_names = Dict( :sea_ice_u_velocity => "usi", :sea_ice_v_velocity => "vsi", :free_surface => "zos", + :total_chlorophyll => "chl", + :primary_production => "nppv", + :nitrate => "no3", + :phosphate => "po4", + :dissolved_silicate => "si", + :dissolved_oxygen => "o2", + :dissolved_iron => "fe", + :ph => "ph", + :surface_co2 => "spCO2", + :total_phytoplankton => "phyc", ) start_date_str(date) = string(date) diff --git a/test/test_copernicus_downloading.jl b/test/test_copernicus_downloading.jl index 94bc9248c..a46eaf7a5 100644 --- a/test/test_copernicus_downloading.jl +++ b/test/test_copernicus_downloading.jl @@ -4,8 +4,10 @@ using PythonCall using CondaPkg @testset "Downloading Copernicus data" begin - variables = (:temperature, :salinity, :u_velocity, :v_velocity) bounding_box = ClimaOcean.DataWrangling.BoundingBox(longitude=(200, 202), latitude=(35, 37)) + + # Physics datasets + variables = (:temperature, :salinity, :u_velocity, :v_velocity) dataset = ClimaOcean.DataWrangling.Copernicus.GLORYSDaily() for variable in variables metadatum = Metadatum(variable; dataset, bounding_box) @@ -13,4 +15,14 @@ using CondaPkg isfile(filepath) && rm(filepath; force=true) ClimaOcean.DataWrangling.download_dataset(metadatum) end + + # Biogeochemistry datasets + variables = (:nitrate, :phosphate, :dissolved_silicate) + dataset = ClimaOcean.DataWrangling.Copernicus.GLORYSBGCDaily() + for variable in variables + metadatum = Metadatum(variable; dataset, bounding_box) + filepath = ClimaOcean.DataWrangling.metadata_path(metadatum) + isfile(filepath) && rm(filepath; force=true) + ClimaOcean.DataWrangling.download_dataset(metadatum) + end end