From bf0941ba80121f31ac6f71aee5f0fe69c1389164 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Mon, 5 Dec 2016 16:48:36 +0100 Subject: [PATCH 01/22] Generalized some more specs conventions --- earthdiagnostics/cmorizer.py | 5 +++-- earthdiagnostics/variable.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index 39d0b820..cfc6b5ce 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -531,12 +531,13 @@ class Cmorizer(object): handler.physics_description = cmor.physics_description handler.model_id = experiment.model handler.associated_model = cmor.associated_model - handler.project_id = 'SPECS' + handler.project_id = self.config.data_convention.upper() handler.realization = str(self.member + 1) handler.source = cmor.source handler.startdate = 'S{0}'.format(self.startdate) handler.tracking_id = str(uuid.uuid1()) - handler.title = "{0} model output prepared for SPECS {1}".format(experiment.model, experiment.experiment_name) + handler.title = "{0} model output prepared for {2} {1}".format(experiment.model, experiment.experiment_name, + self.config.data_convention.upper()) handler.close() def gribfiles_available(self): diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 2a1fb8b1..300b2a61 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -10,7 +10,7 @@ from earthdiagnostics.constants import Basins class Variable(object): """ Class to characterize a CMOR variable. It also contains the static method to make the match between thje original - name and the standard name. Requires specs.csv to work. + name and the standard name. Requires data _convetion to be available in cmor_tables to work. """ _dict_variables = None -- GitLab From ca2a0a1d84963a3f1d9452e283a098da479d19dd Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Mon, 5 Dec 2016 17:55:25 +0100 Subject: [PATCH 02/22] Changed filenames to support PRIMAVERA conventions --- earthdiagnostics/cmormanager.py | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index 4c2de9dd..ad5d2f8f 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -93,12 +93,12 @@ class CMORManager(DataManager): var = self._get_final_var_name(box, var) folder_path = self._get_full_cmor_folder_path(startdate, member, domain, var, frequency, grid) - file_name = self._get_cmor_file_name(startdate, member, domain, var, frequency, chunk, year, date_str) + file_name = self._get_cmor_file_name(startdate, member, domain, var, frequency, chunk, year, date_str, grid) filepath = os.path.join(folder_path, file_name) return filepath - def _get_cmor_file_name(self, startdate, member, domain, var, frequency, chunk, year, date_str): + def _get_cmor_file_name(self, startdate, member, domain, var, frequency, chunk, year, date_str, grid): domain_abreviattion = domain.get_table_name(frequency, self.config.data_convention) if chunk is not None: time_bound = self._get_chunk_time_bounds(startdate, chunk) @@ -110,10 +110,32 @@ class CMORManager(DataManager): time_bound = date_str else: raise ValueError('Chunk, year and date_str can not be None at the same time') - file_name = '{0}_{1}_{2}_{3}_S{4}_r{5}i1p1_{6}.nc'.format(var, domain_abreviattion, self.experiment.model, - self.experiment.experiment_name, startdate, + + if time_bound: + time_bound = '_{0}.nc'.format(time_bound) + else: + time_bound = '.nc' + + if self.config.data_convention == 'specs': + + file_name = '{0}_{1}_{2}_{3}_S{4}_r{5}i1p1{6}'.format(var, + domain_abreviattion, + self.experiment.model, + self.experiment.experiment_name, + startdate, member + 1, time_bound) + elif self.config.data_convention == 'primavera': + file_name = '{0}_{1}_{2}_{3}_S{4}-r{5}i1p1_{6}{7}'.format(var, + domain_abreviattion, + self.experiment.experiment_name, + self.experiment.model, + startdate, + member + 1, + grid, + time_bound) + else: + raise Exception('Data convention {0} not supported'.format(self.config.data_convention)) return file_name def _get_full_cmor_folder_path(self, startdate, member, domain, var, frequency, grid): -- GitLab From e1133bc7a58c347b1a56bb15f51bd3c942be5d1b Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Wed, 7 Dec 2016 12:34:09 +0100 Subject: [PATCH 03/22] Added CMIP6 json tables and code to parse them --- .gitmodules | 3 + MANIFEST.in | 3 +- diags.conf | 2 +- earthdiagnostics/cmor_tables/cmip6 | 1 + earthdiagnostics/cmor_tables/default.csv | 302 +++++++++++++++++++++ earthdiagnostics/cmor_tables/primavera.csv | 288 -------------------- earthdiagnostics/cmor_tables/specs.csv | 301 -------------------- earthdiagnostics/variable.py | 127 ++++++++- 8 files changed, 420 insertions(+), 607 deletions(-) create mode 100644 .gitmodules create mode 160000 earthdiagnostics/cmor_tables/cmip6 create mode 100644 earthdiagnostics/cmor_tables/default.csv diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..ee454f26 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "earthdiagnostics/cmor_tables/cmip6"] + path = earthdiagnostics/cmor_tables/cmip6 + url = https://github.com/jvegasbsc/cmip6-cmor-tables.git diff --git a/MANIFEST.in b/MANIFEST.in index 09da207c..b4ddfecf 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,4 @@ -include earthdiagnostics/cmor_tables/*.csv -include earthdiagnostics/*.so +recursive-include earthdiagnostics *.so *.csv *.json *.pdf *.md include diags.conf include README include VERSION diff --git a/diags.conf b/diags.conf index c07c3225..ec6d5ab6 100644 --- a/diags.conf +++ b/diags.conf @@ -9,7 +9,7 @@ DATA_DIR = /esnas:/esarchive DATA_TYPE = exp # CMORization type to use. Important also for THREDDS as it affects variable name conventions. # Options: SPECS (default), PRIMAVERA -DATA_CONVENTION = PRIMAVERA +DATA_CONVENTION = CMIP6 # Path to NEMO's mask and grid files needed for CDFTools CON_FILES = /esnas/autosubmit/con_files/ diff --git a/earthdiagnostics/cmor_tables/cmip6 b/earthdiagnostics/cmor_tables/cmip6 new file mode 160000 index 00000000..8bae68e8 --- /dev/null +++ b/earthdiagnostics/cmor_tables/cmip6 @@ -0,0 +1 @@ +Subproject commit 8bae68e85e2dfa6ecd71bccb94479344d3acf75c diff --git a/earthdiagnostics/cmor_tables/default.csv b/earthdiagnostics/cmor_tables/default.csv new file mode 100644 index 00000000..5c403f0d --- /dev/null +++ b/earthdiagnostics/cmor_tables/default.csv @@ -0,0 +1,302 @@ +Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid +iiceages:siage:iice_otd,ageice,age_of_sea_ice,Age of sea ice,seaIce,,,,, +al,al,surface_albedo,Albedo,atmos,,,,, +bgfrcsal,bgfrcsal,change_over_time_in_heat_content_from_forcing,Change over time in salt content from forcing,ocean,,,,, +bgfrctem,bgfrctem,change_over_time_in_heat_content_from_forcing,Change over time in heat content from forcing,ocean,,,,, +bgfrcvol,bgfrcvol,change_over_time_in_volume_from_forcing,Change over time in volume from forcing,ocean,,,,, +bgheatco,bgheatco,change_over_time_in_heat_content,Change over time in sea water heat content,ocean,,,,, +bgsaline,bgsaline,change_over_time_in_sea_water_practical_salinity,Change over time in sea water salinity,ocean,,,,, +bgsaltco,bgsaltco,change_over_time_in_salt_content,Change over time in sea water salt content,ocean,,,,, +bgtemper,bgtemper,change_over_time_in_sea_water_potential_temperature,Change over time in sea water potential temperature,ocean,,,,, +bgvole3t,bgvole3t,change_over_time_in_volume_variation,Change over time in volume variation (e3t),ocean,,,,, +bgvolssh,bgvolssh,change_over_time_in_sea_surface_height,Change over time in sea surface height,ocean,,,,, +bld,bld,boundary_layer_dissipation,Boundary layer dissipation,atmos,,,,, +iicebome:iocewflx,bmelt,tendency_of_sea_ice_amount_due_to_basal_melting,Rate of melt at sea ice base,seaIce,,,,, +sobowlin,bowlin,bowl_index,Bowl index,ocean,,,,, +cc,cl,cloud_area_fraction_in_atmosphere_layer,Cloud area fraction,atmos,,,,, +hcc,clh,high_cloud_area_fraction,High cloud fraction,atmos,,,,, +lcc,cll,low_cloud_area_fraction,Low cloud fraction,atmos,,,,, +mcc,clm,medium_cloud_area_fraction,Medium cloud fraction,atmos,,,,, +ciwc,cli,mass_fraction_of_cloud_ice_in_air,Mass fraction of cloud ice,atmos,,,,, +tcc,clt,cloud_area_fraction,Total cloud fraction,atmos,,,,, +clwc,clw,mass_fraction_of_cloud_liquid_water_in_air,Mass fraction of cloud liquid water,atmos,,,,, +tcw,clwvi,atmosphere_cloud_condensed_water_content,Condensed water path,atmos,,,,, +iicedive:sidive,divice,Strain Rate Divergence of Sea Ice,Divergence_of_sea_ice_velocity,seaIce,,,,, +e,evspsbl,water_evaporation_flux,Evaporation,atmos,,,,, +fal,fal,forecast_albedo,Forecast albedo,atmos,,,,, +sowaflep,fatmosocean,atmosphere_ocean_water_flux,Atmos=>ocean net freshwater,ocean,,,,, +sowaflcd,fdilution,dilution_water_flux,Concentration/dilution water flux,ocean,,,,, +sophtldf,fhbasindif,northward_ocean_heat_transport_due_to_diffusion,Northward ocean heat transport due to diffusion,ocean,,,,, +iowaflup,ficeocean,ice_ocean_water_flux,Ice=>ocean net freshwater,ocean,,,,, +sorunoff,friver,water_flux_into_sea_water_from_rivers,Water flux into sea water from rivers ,ocean,,,,, +sowaflup,fupward,upward_water_flux,Net upward water flux,ocean,,,,, +gwd,gwd,gravity_wave_dissipation,Gravity wave dissipation,atmos,,,,, +ibgheatco,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,, +sbgheatco,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,, +heatc,heatc,integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content,Heat content vertically integrated,ocean,,,,, +sohtatl,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Atl,,,, +sohtind,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Ind,,,, +sohtipc,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,IndPac,,,, +sohtpac,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Pac,,,, +sophtadv,hfbasinadv,northward_ocean_heat_transport_due_to_advection,Northward ocean heat transport due to advection ,ocean,,,,, +sophteiv,hfbasinba,northward_ocean_heat_transport_due_to_bolus_advection,Northward ocean heat transport due to bolus advection ,ocean,,,,, +qt_oce:sohefldo:qt,hfds,surface_downward_heat_flux_in_sea_water,Downward heat flux at sea water surface,ocean,,,,, +slhf,hfls,surface_upward_latent_heat_flux,Surface upward latent heat flux,atmos,,,,, +sshf,hfss,surface_upward_sensible_heat_flux,Surface upward sensible heat flux,atmos,,,,, +sophtove,htovovrt,northward_ocean_heat_transport_due_to_overturning,Northward ocean heat transport due to overturning ,ocean,,,,, +q,hus,specific_humidity,Specific humidity,atmos,,,,, +soicealb,ialb,sea_ice_albedo,Sea ice albedo,seaIce,,,,, +ibgfrcsfx,ibgfrcsfx,global_mean_forcing_salt,Global mean forcing salt (sfx),seaIce,,,,, +ibgfrcvol,ibgfrcvol,globa_mean_forcing_volume,Global mean forcing volume (emp),seaIce,,,,, +ibghfxbog,ibghfxbog,heat_fluxes_causing_bottom_ice_growth,Heat fluxes causing bottom ice growth,seaIce,,,,, +ibghfxbom,ibghfxbom,heat_fluxes_causing_bottom_ice_melt,Heat fluxes causing bottom ice melt,seaIce,,,,, +ibghfxdhc,ibghfxdhc,Heat_content_variation_in_snow_and_ice,Heat content variation in snow and ice,seaIce,,,,, +ibghfxdif,ibghfxdif,heat_fluxes_causing_ice temperature_change,Heat fluxes causing ice temperature change,seaIce,,,,, +ibghfxdyn,ibghfxdyn,heat_fluxes_from_ice-ocean_exchange_during_dynamic,Heat fluxes from ice-ocean exchange during dynamic,seaIce,,,,, +ibghfxin,ibghfxin,total_heat_fluxes_at_the_ice_surface,Total heat fluxes at the ice surface,seaIce,,,,, +ibghfxopw,ibghfxopw,heat_fluxes_causing_open_water_ice_formation,Heat fluxes causing open water ice formation,seaIce,,,,, +ibghfxout,ibghfxout,non_solar_heat_fluxes_received_by_the_ocean,Non solar heat fluxes received by the ocean,seaIce,,,,, +ibghfxres,ibghfxres,heat_fluxes_from_ice-ocean_exchange_during_resultant,Heat fluxes from ice-ocean exchange during resultant,seaIce,,,,, +ibghfxsnw,ibghfxsnw,heat_fluxes_from_snow-ocean_exchange,Heat fluxes from snow-ocean exchange,seaIce,,,,, +ibghfxspr,ibghfxspr,Heat_content_of_snow_precip,Heat content of snow precip,seaIce,,,,, +ibghfxsub,ibghfxsub,heat_fluxes_from_sublimation,Heat fluxes from sublimation,seaIce,,,,, +ibghfxsum,ibghfxsum,heat_fluxes_causing_surface_ice_melt,Heat fluxes causing surface ice melt,seaIce,,,,, +ibghfxthd,ibghfxthd,heat_fluxes_from_ice-ocean_exchange_during_thermo,Heat fluxes from ice-ocean exchange during thermo,seaIce,,,,, +ibgsfxbog,ibgsfxbogga,salt_flux_thermo,Global mean salt flux (thermo),seaIce,,,,, +ibgsfxbom,ibgsfxbomga,salt_flux_bottom_melt,Global mean salt flux (bottom melt),seaIce,,,,, +ibgsfxbri,ibgsfxbriga,salt_flux_brines,Global mean salt flux (brines),seaIce,,,,, +ibgsfxdyn,ibgsfxdynga,salt_flux_dynamic,Global mean salt flux (dynamic),seaIce,,,,, +ibgsfx,ibgsfxga,salt_flux,Global mean salt flux (total),seaIce,,,,, +ibgsfxopw,ibgsfxopwga,salt_flux_open_waters,Global mean salt flux (open water),seaIce,,,,, +ibgsfxres,ibgsfxresga,salt_flux_resultant,Global mean salt flux (resultant),seaIce,,,,, +ibgsfxsni,ibgsfxsniga,salt_flux_snow_ice_growth,Global mean salt flux (snow-ice growth),seaIce,,,,, +ibgsfxsum,ibgsfxsumga,salt_flux_surface_melt,Global mean salt flux (surface melt),seaIce,,,,, +ibgvfxbog,ibgvfxbogga,volume_flux_bottom_growth,Global mean volume flux (bottom growth),seaIce,,,,, +ibgvfxbom,ibgvfxbomga,volume_flux_bottom_melt,Global mean volume flux (bottom melt),seaIce,,,,, +ibgvfxdyn,ibgvfxdynga,volume_flux_dynamic_growth,Global mean volume flux (dynamic growth),seaIce,,,,, +ibgvfx,ibgvfxga,volume_flux_emp,Global mean volume flux (emp),seaIce,,,,, +ibgvfxopw,ibgvfxopwga,volume_flux_open_water_growth,Global mean volume flux (open water growth),seaIce,,,,, +ibgvfxres,ibgvfxresga,volume_flux_resultant,Global mean volume flux (resultant),seaIce,,,,, +ibgvfxsni,ibgvfxsniga,volume_flux_snow_ice_growth,Global mean volume flux (snow-ice growth),seaIce,,,,, +ibgvfxsnw,ibgvfxsnwga,volume_flux_snow_melt,Global mean volume flux (snow melt),seaIce,,,,, +ibgvfxspr,ibgvfxsprga,snheco,Global mean volume flux (snow precip),seaIce,,,,, +ibgvfxsub,ibgvfxsubga,volume_flux_snow_sublimation,Global mean volume flux (snow sublimation),seaIce,,,,, +ibgvfxsum,ibgvfxsumga,volume_flux_surface_melt,Global mean volume flux (surface melt),seaIce,,,,, +ibgvolgrm,ibgvolgrm,global_mean_ice_growth+melt_volume,Global mean ice growth+melt volume,seaIce,,,,, +ibrinvol,ibrinvol,brine_volume,Brine volume,seaIce,,,,, +sibricat,ibrinvolcat,brine_volume_in_categories,Brine volume for categories,seaIce,,,,, +iicebopr,iicebopr,daily_bottom_thermo_ice_production,Daily bottom thermo ice production,seaIce,,,,, +iicecolf,iicecolf,frazil_ice_collection_thickness,Frazil ice collection thickness,seaIce,,,,, +iicedypr,iicedypr,daily_dynamic_ice_production,Daily dynamic ice production,seaIce,,,,, +iice_etd,iiceetd,brine_volume_distribution,Brine volume distribution,seaIce,,,,, +iicelapr,iicelapr,daily_lateral_thermo_ice_production,Daily lateral thermo ice prod.,seaIce,,,,, +iicenflx,iicenflx,nonsolar_flux_ice_ocean_surface,Non-solar flux at ice/ocean surface,seaIce,,,,, +iicesflx,iicesflx,solar_flux_ice_ocean_surface,Solar flux at ice/ocean surface,seaIce,,,,, +iiceshea,iiceshea,shear,Shear,seaIce,,,,, +iicesipr,iicesipr,daily_snowice_ice_production,Daily snowice ice production,seaIce,,,,, +iicfsbri,iicfsbri,brine_salt_flux,Fsbri - brine salt flux,seaIce,,,,, +iicfseqv,iicfseqv,equivalent_FW_salt_flux,Fseqv - equivalent fw salt flux,seaIce,,,,, +ioceflxb,ioceflxb,oceanic_flux_ar_ice_base,Oceanic flux at the ice base,seaIce,,,,, +iocehebr,iocehebr,heat_flux_due_to_brine_release,Heat flux due to brine release,seaIce,,,,, +iocesafl,iocesafl,salt_flux_ocean_surface,Salt flux at ocean surface,seaIce,,,,, +iocesflx,iocesflx,solar_fux_ocean_surface,Solar flux at ocean surface,seaIce,,,,, +iocetflx,iocetflx,total_flux_ocean_surface,Total flux at ocean surface,seaIce,,,,, +iocwnsfl,iocwnsfl,nonsolar_flux_ocean_surface,Non-solar flux at ocean surface,seaIce,,,,, +isstempe,isstempe,sea_surface_temperature,Sea surface temperature,seaIce,,K,,, +scmastot,masso,sea_water_mass,Sea water mass ,ocean,,,,, +mldkz5,mldkz5,ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity,Turbocline depth (kz = 5e-4),ocean,,,,, +somxl010:mldr10_1,mlotst,ocean_mixed_layer_thickness_defined_by_sigma_t,Ocean mixed layer thickness defined by sigma T ,ocean,,,,, +swvl1,mrlsl1,moisture_content_of_soil_layer_1, Water content of soil layer 1,land,,,,, +swvl2,mrlsl2,moisture_content_of_soil_layer_2, Water content of soil layer 2,land,,,,, +swvl3,mrlsl3,moisture_content_of_soil_layer_3, Water content of soil layer 3,land,,,,, +swvl4,mrlsl4,moisture_content_of_soil_layer_4, Water content of soil layer 4,land,,,,, +ro,mrro,runoff_flux,Total runoff,atmos,,,,, +tp:precip,pr,precipitation_flux,Precipitation,atmos,,,,, +cp,prc,convective_precipitation_flux,Convective precipitation,atmos,,,,, +lsp,prs,stratiform_precipitation_flux,Stratiform precipitation,atmos,,,,, +isnowpre,prsn,snowfall_flux,Surface snowfall rate into the sea ice portion of the grid cell,seaIce,,,,, +sf:snowpre,prsn,snowfall_flux,Snowfall flux,atmos,,,,, +tcwv,prw,atmosphere_water_vapor_content,Water vapor path,atmos,,,,, +msl,psl,air_pressure_at_sea_level,Sea level pressure,atmos,,,,, +qns_ice,qnsice,non_solar_heat_flux_at_ice_surface,Non-solar heat flux at ice surface: sum over categories,seaIce,,,,, +qt_ice,qtice,surface_downward_heat_flux_in_air,Surface downward heat flux in air,seaIce,,,,, +strd,rlds,surface_downwelling_longwave_flux_in_air,Surface downwelling longwave radiation,atmos,,,,, +strc:str,rls,surface_longwave_flux_in_air,Surface longwave radiation,atmos,,,,, +ttr,rlut,toa_outgoing_longwave_flux,Toa outgoing longwave radiation,atmos,,,,, +ttrc,rlutcs,toa_outgoing_longwave_flux_assuming_clear_sky,"Top net thermal radiation, clear sky",atmos,,,,, +ssrd,rsds,surface_downwelling_shortwave_flux_in_air,Surface downwelling shortwave radiation,atmos,,,,, +tsr,rsdt,toa_incoming_shortwave_flux,Toa incident shortwave radiation,atmos,,,,, +soshfldo,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net downward shortwave radiation at sea water surface ,ocean,,,,, +ssr,rss,surface_shortwave_flux_in_air,Surface shortwave radiation,atmos,,,,, +ssrc,rsscs,surface_shortwave_flux_in_air_assuming_clear_sky,Surface clear-sky shortwave radiation,atmos,,,,, +tsrc,rsut,toa_outgoing_shortwave_flux,Toa outgoing shortwave radiation,atmos,,,,, +saltc,saltc,salt_content_vertically_integrated,Salt content vertically integrated,ocean,,,,, +es,sbl,surface_snow_and_ice_sublimation_flux,Surface snow and ice sublimation flux,landIce,,,,, +sosalflx,sfs,salt_flux_surface,Surface salt flux,ocean,,,,, +si,si,solar_insolation,Solar insolation,atmos,,,,, +NArea,siarean,sea_ice_area,Total area of sea ice in the northern hemisphere,seaIce,,10^6 km2,,, +SArea,siareas,sea_ice_area,Total area of sea ice in the southern hemisphere,seaIce,,10^6 km2,,, +iiceconc:siconc:soicecov:ileadfra:ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,, +ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,,ifs +iice_itd:siconc_cat:siconcat,siccat,ice_area_in_categories,Ice area in categories,seaIce,,,,, +ibgarea,sicga,sea_ice_content,Global mean sea ice content,seaIce,,,,, +NExnsidc,siextentn,sea_ice_extent,Total area of all northern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, +SExnsidc,siextents,sea_ice_extent,Total area of all southern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, +iiceprod,sigr,ice_production,Ice production,seaIce,,,,, +iiceheco,siheco,integral_of_sea_ice_temperature_wrt_depth_expressed_as_heat_content,Sea ice heat content,seaIce,,,,, +ibgsaltco,sisaltcga,global mean ice salt content,Global mean ice salt content,seaIce,,,,, +iicethic:sithic,sit,sea_ice_thickness,Sea Ice Thickness,seaIce,,m,,, +iice_hid:sithic_cat:sithicat,sitcat,ice_thicknesss_in_categories,Ice thickness in categories,seaIce,,,,, +iicetemp,sitemp,ice_temperature,Mean ice temperature,seaIce,,K,,, +ibgtemper,sitempga,sea_ice_temperature,Global mean sea ice temperature,seaIce,,K,,, +iicevelo:sivelo,sivelo,ice_velocity,Ice velocity,seaIce,,,,, +iicevelu:sivelu,sivelu,ice_velocity_u,Ice velocity u,seaIce,,,,, +iicevelv:sivelv,sivelv,ice_velocity_v,Ice velocity v,seaIce,,,,, +ibgvoltot,sivolga,sea_ice_volume,Global mean sea ice volume,seaIce,,,,, +sivoln:NVolume,sivoln,sea_ice_volume,Total volume of sea ice in the northern hemisphere,seaIce,,10^3 km3,,, +sivols:SVolume,sivols,sea_ice_volume,Total volume of sea ice in the southern hemisphere,seaIce,,10^3 km3,,, +sivolu,sivolu,sea_ice_volume_per_unit_gridcell_area,Sea ice volume per gridcell area unit,seaIce,,,,, +sostatl,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, +sostind,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, +sostipc,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, +sostpac,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, +sopstadv,sltbasinadv,northward_ocean_salt_transport_due_to_advection,Northward ocean salt transport due to advection ,ocean,,,,, +sopsteiv,sltbasinba,northward_ocean_salt_transport_due_to_bolus_advection,Northward ocean salt transport due to bolus advection ,ocean,,,,, +sopstldf,sltbasindif,northward_ocean_salt_transport_due_to_diffusion,Northward ocean salt transport due to diffusion,ocean,,,,, +sltnortha,sltnortha,northward_ocean_salt_transport,Atlantic northward ocean salt transport,ocean,,,,, +sopstove,sltovovrt,northward_ocean_salt_transport_due_to_overturning,Northward ocean salt transport due to overturning ,ocean,,,,, +zosalatl,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Atl,psu,,, +zosalglo,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Glob,psu,,, +zosalind,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Ind,psu,,, +zosalipc,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,IndPac,psu,,, +zosalpac,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Pac,psu,,, +asn,snal,snow_albedo,Snow albedo,landIce,,,,, +iice_hsd:snthicat,sndcat,snow_thickness_in_categories,Snow thickness in in categories,seaIce,,,,, +isnoheco,snheco,snow_heat_content,Snow total heat content,seaIce,,,,, +sd,snld,lwe_thickness_of_surface_snow_amount,Snow depth,atmos,,,,, +smlt,snm,surface_snow_melt_flux,Surface snow melt,landIce,,,,, +isnowthi,snthic,surface_snow_thickness,Surface snow thickness,seaIce,,,,, +sbgvoltot,snvolga,snow_volume,Global mean snow volume,seaIce,,,,, +snvolu,snvolu,snow_volume_per_unit_gridcell_area,Snow volume per gridcell area unit,seaIce,,,,, +vosaline:mean_3Dsosaline,so,sea_water_salinity,Sea water salinity,ocean,,psu,,, +scsaltot,soga,sea_water_salinity,Global mean sea water salinity ,ocean,,psu,,, +hfnortha,sohtatl,northward_ocean_heat_transport,Atlantic northward ocean heat transport,ocean,,,,, +soleaeiw,soleaeiw,eddy_induced_velocity_coefficient,Eddy induced vel. coeff. at w-point,ocean,,,,, +soleahtw,soleahtw,lateral_eddy_diffusivity,Lateral eddy diffusivity,ocean,,,,, +somixhgt,somixhgt,mixing_layer_depth_turbocline,Mixing layer depth (turbocline),ocean,,,,, +sosaline:isssalin:mean_sosaline,sos,sea_surface_salinity,Sea surface salinity ,ocean,,psu,,, +sothedep,sothedep,thermocline_depth,Thermocline depth (max dt/dz),ocean,,,,, +src,src,skin_reservoir_content,Skin reservoir content,land,,,,, +zosrfatl,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Atl,,,, +zosrfglo,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Glob,,,, +zosrfind,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Ind,,,, +zosrfipc,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,IndPac,,,, +zosrfpac,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Pac,,,, +rsn,srho,snow_density,Snow density,landIce,,,,, +iicesali:iice_std,ssi,sea_ice_salinity,Sea ice salinity,seaIce,,psu,,, +salincat,ssicat,sea_ice_salinity_in_categories,Sea-ice bulk salinity for categories,seaIce,,psu,,, +ibgsaline,ssiga,sea_ice_salinity,Global mean sea ice salinity ,seaIce,,psu,,, +iicestre,streng,compressive_strength_of_sea_ice,Compressive sea ice strength,seaIce,,,,, +so20chgt,t20d,depth_of_isosurface_of_sea_water_potential_temperature,,ocean,,,,, +t,ta,air_temperature,Air temperature,atmos,,K,,, +t2m,tas,air_temperature,Near-surface air temperature,atmos,,K,170,370, +mx2t,tasmax,air_temperature,Daily maximum near-surface air temperature,atmos,,K,,, +mn2t,tasmin,air_temperature,Daily minimum near-surface air temperature,atmos,,K,,, +ewss,tauu,surface_downward_eastward_stress,Surface downward eastward wind stress,atmos,,,,, +utau_ice:iocestru:iicestru,strairx,surface_downward_x_stress,X-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, +sozotaux,tauuo,surface_downward_x_stress,Surface downward x stress ,ocean,,,,, +nsss,tauv,surface_downward_northward_stress,Surface downward northward wind stress,atmos,,,,, +vtau_ice:iocestrv:iicestrv,strairy,surface_downward_y_stress,Y-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, +sozotauy:sometauy,tauvo,surface_downward_y_stress,Surface downward y stress ,ocean,,,,, +d2m,tdps,dew_point_temperature,2m dewpoint temperature,atmos,,K,,, +votemper:mean_3Dsosstsst,thetao,sea_water_potential_temperature,Sea water potential temperature,ocean,,K,,, +sctemtot,thetaoga,sea_water_potential_temperature,Global average sea water potential temperature ,ocean,,K,,, +iicesume,tmelt,tendency_of_sea_ice_amount_due_to_surface_melting,Rate of melt at upper surface of sea ice,seaIce,,,,, +sosstsst:mean_sosstsst,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370, +sstk,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370,ifs +tossq,tossq,square_of_sea_surface_temperature,Square of sea surface temperature ,ocean,,K2,,, +zotematl,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Atl,K,,, +zotemglo,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Glob,K,,, +zotemind,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Ind,K,,, +zotemipc,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,IndPac,K,,, +zotempac,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Pac,K,,, +skt,ts,surface_temperature,Surface temperature,atmos,,K,,, +iicesurt:soicetem:sistem,tsice,surface_temperature,Surface temperature of sea ice,seaIce,,K,,, +istl1,tsice,surface_temperature,Surface temperature of ice,landIce,,K,,, +stl1,tsl1,soil_temperature_level_1,Temperature of soil level 1,land,,,,, +stl2,tsl2,soil_temperature_level_2,Temperature of soil level 2,land,,,,, +stl3,tsl3,soil_temperature_level_3,Temperature of soil level 3,land,,,,, +stl4,tsl4,soil_temperature_level_4,Temperature of soil level 4,land,,,,, +tsn,tsn,temperature_in_surface_snow,Snow internal temperature,landIce,,,,, +u,ua,eastward_wind,U velocity,atmos,,,,, +u10m,uas,eastward_wind,Eastward near-surface wind,atmos,,,,, +vozocrtx,uo,sea_water_x_velocity,Sea water x velocity,ocean,,,,, +uos,uos,sea_surface_x_velocity,Sea surface x velocity,ocean,,,,, +v,va,northward_wind,V velocity,atmos,,,,, +v10m,vas,northward_wind,Northward near-surface wind,atmos,,,,, +vomecrty,vo,sea_water_y_velocity,Sea water y velocity,ocean,,,,, +vos,vos,sea_surface_y_velocity,Sea surface y velocity,ocean,,,,, +voddmavs,voddmavs,salt_vertical_eddy_diffusivity,Salt vertical eddy diffusivity,ocean,,,,, +vozoeivu,voeivu,sea_water_x_EIV_current,Zonal eiv current,ocean,,,,, +vomeeivv,voeivv,sea_water_y_EIV_current,Meridional eiv current,ocean,,,,, +voveeivw,voeivz,sea_water_z_EIV_current,Vertical eiv current,ocean,,,,, +scvoltot,volo,sea_water_volume,Sea water volume ,ocean,,,,, +votkeavm,votkeavm,vertical_eddy_viscosity,Vertical eddy viscosity,ocean,,,,, +votkeavt,votkeavt,vertical_eddy_diffusivity,Vertical eddy diffusivity,ocean,,,,, +votkeevd,votkeevd,enhanced_vertical_diffusivity,Enhanced vertical diffusivity,ocean,,,,, +votkeevm,votkeevm,enhanced_vertical_viscosity,Enhanced vertical viscosity,ocean,,,,, +sobarstf,vsftbarot,ocean_barotropic_volume_streamfunction,Ocean barotropic volume streamfunction ,ocean,,,,, +zomsfatl,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Atl,,,, +zomsfglo,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Glob,,,, +zomsfind,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Ind,,,, +zomsfipc:zomsfinp,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,IndPac,,,, +zomsfpac,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Pac,,,, +zomsfeiv,vsftmyzba,ocean_meridional_overturning_mass_streamfunction_due_to_bolus_advection,Ocean meridional overturning volume streamfunction due to bolus advection ,ocean,,,,, +w,wa,vertical_velocity,Vertical velocity,atmos,,,,, +z,zg,geopotential_height,Geopotential height,atmos,,,,, +vovecrtz,zo,sea_water_z_velocity,Sea water z velocity,ocean,,,,, +sossheigh:sossheig:mean_sossheig,zos,sea_surface_height_above_geoid,Sea surface height above geoid ,ocean,,,,, +scsshtot,zosga,global_average_sea_level_change,Global average sea level change ,ocean,,,,, +scsshste,zossga,global_average_steric_sea_level_change,Global average steric sea level change ,ocean,,,,, +zossq,zossq,square_of_sea_surface_height_above_geoid,Square of sea surface height above geoid ,ocean,,,,, +scsshtst,zostoga,snthic,Global average thermosteric sea level change ,ocean,,,,, +heatc,ohc,ocean_heat_content,Ocean heat content,ocean,,J,,, +ohcsum,ohcsum,total_ocean_heat_content,Total Ocean heat content,ocean,,J,,, +ohcvmean,ohcvmean,average_ocean_heat_content,Average Ocean heat content,ocean,,J m-3,,, +ohc,ohc,ocean_heat_content,Ocean heat content,ocean,,J m-2,,, +transix,transix,sea_ice_x_transport,X-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, +transiy,transiy,sea_ice_y_transport,Y-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, +windsp,sfcWind,wind_speed,Near-Surface Wind Speed,atmos,,,,, +vsfsit,vsfsit,virtual_salt_flux_into_sea_water_due_to_sea_ice_thermodynamics,Virtual Salt Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, +sfdsi,sfdsi,downward_sea_ice_basal_salt_flux,Downward Sea Ice Basal Salt Flux,ocean,,,,, +hfsithermds,hfsithermds,heat_flux_into_sea_water_due_to_sea_ice_thermodynamics,Heat Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, +u2o,uosq,square_of_sea_water_x_velocity,Square of Sea Water X Velocity ,ocean,,,,, +v2o,vosq,square_of_sea_water_y_velocity,Square of Sea Water Y Velocity ,ocean,,,,, +vozomatr,umo,ocean_mass_x_transport,Ocean Mass X Transport ,ocean,,,,, +vomematr,vmo,ocean_mass_y_transport,Ocean Mass Y Transport ,ocean,,,,, +sozohetr,hfx,ocean_heat_x_transport,Ocean Heat X Transport ,ocean,,,,, +somehetr,hfy,ocean_heat_y_transport,Ocean Heat Y Transport ,ocean,,,,, +uto,uothetao,product_of_xward_sea_water_velocity_and_temperature,Product of X-ward Sea Water Velocity and Temperature,ocean,,,,, +vto,vothetao,product_of_yward_sea_water_velocity_and_temperature,Product of Y-ward Sea Water Velocity and Temperature,ocean,,,,, +uso,uoso,product_of_xward_sea_water_velocity_and_salinity,Product of X-ward Sea Water Velocity and Salinity,ocean,,,,, +vso,voso,product_of_yward_sea_water_velocity_and_salinity,Product of Y-ward Sea Water Velocity and Salinity,ocean,,,,, +wfo,wfo,water_flux_into_sea_water,Water Flux into Sea Water ,ocean,,,,, +emp_oce,evsmpr,evap_minus_precip_over_sea_water,Evap minus Precip over ocean,ocean,,,,, +emp_ice,evsmpr,evap_minus_precip_over_sea_ice,Evap minus Precip over ice,seaIce,,,,, +qsr_oce,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net Downward Shortwave Radiation at Sea Water Surface ,ocean,,,,, +qns_oce,rlds,surface_net_downward_longwave_flux,Surface Net Downward Longwave Radiation,ocean,,,,, +qsr_ice,rsdssi,surface_downwelling_shortwave_flux_in_air,Downwelling Shortwave over Sea Ice,seaIce,,,,, +qns_ice,rldssi,surface_downwelling_longwave_flux_in_air,Downwelling Long Wave over Sea Ice,seaIce,,,,, +sfx,sfx,downward_salt_flux,Downward Salt Flux,ocean,,,,, +taum,taum,surface_downward_stress_module,Surface Downward Stress Module,ocean,,,,, +zfull,zfull,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, +zhalf,zhalf,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, +pbo,pbo,sea_water_pressure_at_sea_floor,Sea Water Pressure at Sea Floor,ocean,,,,, +thkcello,thkcello,cell_thickness,Cell Thickness,ocean,,,,, +ficeberg,ficeberg,water_flux_into_sea_water_from_icebergs,Water Flux into Sea Water From Icebergs ,ocean,,,,, +rsdo,rsds,downwelling_shortwave_flux_in_sea_water,Downwelling Shortwave Radiation in Sea Water ,ocean,,,,, +wo,wo,sea_water_upward_velocity,Sea Water Upward Velocity ,ocean,,,,, +w2o,wosq,square_of_sea_water_upward_velocity,Square of Sea Water Upward Velocity ,ocean,,,,, +difvho,difvho,ocean_vertical_heat_diffusivity,Ocean Vertical Heat Diffusivity,ocean,,,,, +vovematr,wmo,upward_ocean_mass_transport,Upward Ocean Mass Transport ,ocean,,,,, +qtr_ice,qtr,shortwave_flux_transmitted_through_ice,Shortwave Flux Transmitted Through The Ice,seaIce,,,,, diff --git a/earthdiagnostics/cmor_tables/primavera.csv b/earthdiagnostics/cmor_tables/primavera.csv index 49489e78..f999c361 100644 --- a/earthdiagnostics/cmor_tables/primavera.csv +++ b/earthdiagnostics/cmor_tables/primavera.csv @@ -1,303 +1,15 @@ Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid -iiceages:siage:iice_otd,ageice,age_of_sea_ice,Age of sea ice,seaIce,,,,, -al,al,surface_albedo,Albedo,atmos,,,,, -bgfrcsal,bgfrcsal,change_over_time_in_heat_content_from_forcing,Change over time in salt content from forcing,ocean,,,,, -bgfrctem,bgfrctem,change_over_time_in_heat_content_from_forcing,Change over time in heat content from forcing,ocean,,,,, -bgfrcvol,bgfrcvol,change_over_time_in_volume_from_forcing,Change over time in volume from forcing,ocean,,,,, -bgheatco,bgheatco,change_over_time_in_heat_content,Change over time in sea water heat content,ocean,,,,, -bgsaline,bgsaline,change_over_time_in_sea_water_practical_salinity,Change over time in sea water salinity,ocean,,,,, -bgsaltco,bgsaltco,change_over_time_in_salt_content,Change over time in sea water salt content,ocean,,,,, -bgtemper,bgtemper,change_over_time_in_sea_water_potential_temperature,Change over time in sea water potential temperature,ocean,,,,, -bgvole3t,bgvole3t,change_over_time_in_volume_variation,Change over time in volume variation (e3t),ocean,,,,, -bgvolssh,bgvolssh,change_over_time_in_sea_surface_height,Change over time in sea surface height,ocean,,,,, -bld,bld,boundary_layer_dissipation,Boundary layer dissipation,atmos,,,,, -iicebome:iocewflx,bmelt,tendency_of_sea_ice_amount_due_to_basal_melting,Rate of melt at sea ice base,seaIce,,,,, -sobowlin,bowlin,bowl_index,Bowl index,ocean,,,,, -cc,cl,cloud_area_fraction_in_atmosphere_layer,Cloud area fraction,atmos,,,,, -hcc,clh,high_cloud_area_fraction,High cloud fraction,atmos,,,,, -lcc,cll,low_cloud_area_fraction,Low cloud fraction,atmos,,,,, -mcc,clm,medium_cloud_area_fraction,Medium cloud fraction,atmos,,,,, -ciwc,cli,mass_fraction_of_cloud_ice_in_air,Mass fraction of cloud ice,atmos,,,,, -tcc,clt,cloud_area_fraction,Total cloud fraction,atmos,,,,, -clwc,clw,mass_fraction_of_cloud_liquid_water_in_air,Mass fraction of cloud liquid water,atmos,,,,, -tcw,clwvi,atmosphere_cloud_condensed_water_content,Condensed water path,atmos,,,,, -iicedive:sidive,divice,Strain Rate Divergence of Sea Ice,Divergence_of_sea_ice_velocity,seaIce,,,,, -e,evspsbl,water_evaporation_flux,Evaporation,atmos,,,,, -fal,fal,forecast_albedo,Forecast albedo,atmos,,,,, -sowaflep,fatmosocean,atmosphere_ocean_water_flux,Atmos=>ocean net freshwater,ocean,,,,, -sowaflcd,fdilution,dilution_water_flux,Concentration/dilution water flux,ocean,,,,, -sophtldf,fhbasindif,northward_ocean_heat_transport_due_to_diffusion,Northward ocean heat transport due to diffusion,ocean,,,,, -iowaflup,ficeocean,ice_ocean_water_flux,Ice=>ocean net freshwater,ocean,,,,, -sorunoff,friver,water_flux_into_sea_water_from_rivers,Water flux into sea water from rivers ,ocean,,,,, -sowaflup,fupward,upward_water_flux,Net upward water flux,ocean,,,,, -gwd,gwd,gravity_wave_dissipation,Gravity wave dissipation,atmos,,,,, ibgheatco:sihc,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,, sbgheatco:sisnhc,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,, -heatc,heatc,integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content,Heat content vertically integrated,ocean,,,,, -sohtatl,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Atl,,,, -sohtind,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Ind,,,, -sohtipc,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,IndPac,,,, -sohtpac,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Pac,,,, -sophtadv,hfbasinadv,northward_ocean_heat_transport_due_to_advection,Northward ocean heat transport due to advection ,ocean,,,,, -sophteiv,hfbasinba,northward_ocean_heat_transport_due_to_bolus_advection,Northward ocean heat transport due to bolus advection ,ocean,,,,, -qt_oce:sohefldo:qt,hfds,surface_downward_heat_flux_in_sea_water,Downward heat flux at sea water surface,ocean,,,,, -slhf,hfls,surface_upward_latent_heat_flux,Surface upward latent heat flux,atmos,,,,, -sshf,hfss,surface_upward_sensible_heat_flux,Surface upward sensible heat flux,atmos,,,,, -sophtove,htovovrt,northward_ocean_heat_transport_due_to_overturning,Northward ocean heat transport due to overturning ,ocean,,,,, -q,hus,specific_humidity,Specific humidity,atmos,,,,, -soicealb,ialb,sea_ice_albedo,Sea ice albedo,seaIce,,,,, -ibgfrcsfx,ibgfrcsfx,global_mean_forcing_salt,Global mean forcing salt (sfx),seaIce,,,,, -ibgfrcvol,ibgfrcvol,globa_mean_forcing_volume,Global mean forcing volume (emp),seaIce,,,,, -ibghfxbog,ibghfxbog,heat_fluxes_causing_bottom_ice_growth,Heat fluxes causing bottom ice growth,seaIce,,,,, -ibghfxbom,ibghfxbom,heat_fluxes_causing_bottom_ice_melt,Heat fluxes causing bottom ice melt,seaIce,,,,, -ibghfxdhc,ibghfxdhc,Heat_content_variation_in_snow_and_ice,Heat content variation in snow and ice,seaIce,,,,, -ibghfxdif,ibghfxdif,heat_fluxes_causing_ice temperature_change,Heat fluxes causing ice temperature change,seaIce,,,,, -ibghfxdyn,ibghfxdyn,heat_fluxes_from_ice-ocean_exchange_during_dynamic,Heat fluxes from ice-ocean exchange during dynamic,seaIce,,,,, -ibghfxin,ibghfxin,total_heat_fluxes_at_the_ice_surface,Total heat fluxes at the ice surface,seaIce,,,,, -ibghfxopw,ibghfxopw,heat_fluxes_causing_open_water_ice_formation,Heat fluxes causing open water ice formation,seaIce,,,,, -ibghfxout,ibghfxout,non_solar_heat_fluxes_received_by_the_ocean,Non solar heat fluxes received by the ocean,seaIce,,,,, -ibghfxres,ibghfxres,heat_fluxes_from_ice-ocean_exchange_during_resultant,Heat fluxes from ice-ocean exchange during resultant,seaIce,,,,, -ibghfxsnw,ibghfxsnw,heat_fluxes_from_snow-ocean_exchange,Heat fluxes from snow-ocean exchange,seaIce,,,,, -ibghfxspr,ibghfxspr,Heat_content_of_snow_precip,Heat content of snow precip,seaIce,,,,, -ibghfxsub,ibghfxsub,heat_fluxes_from_sublimation,Heat fluxes from sublimation,seaIce,,,,, -ibghfxsum,ibghfxsum,heat_fluxes_causing_surface_ice_melt,Heat fluxes causing surface ice melt,seaIce,,,,, -ibghfxthd,ibghfxthd,heat_fluxes_from_ice-ocean_exchange_during_thermo,Heat fluxes from ice-ocean exchange during thermo,seaIce,,,,, -ibgsfxbog,ibgsfxbogga,salt_flux_thermo,Global mean salt flux (thermo),seaIce,,,,, -ibgsfxbom,ibgsfxbomga,salt_flux_bottom_melt,Global mean salt flux (bottom melt),seaIce,,,,, -ibgsfxbri,ibgsfxbriga,salt_flux_brines,Global mean salt flux (brines),seaIce,,,,, -ibgsfxdyn,ibgsfxdynga,salt_flux_dynamic,Global mean salt flux (dynamic),seaIce,,,,, -ibgsfx,ibgsfxga,salt_flux,Global mean salt flux (total),seaIce,,,,, -ibgsfxopw,ibgsfxopwga,salt_flux_open_waters,Global mean salt flux (open water),seaIce,,,,, -ibgsfxres,ibgsfxresga,salt_flux_resultant,Global mean salt flux (resultant),seaIce,,,,, -ibgsfxsni,ibgsfxsniga,salt_flux_snow_ice_growth,Global mean salt flux (snow-ice growth),seaIce,,,,, -ibgsfxsum,ibgsfxsumga,salt_flux_surface_melt,Global mean salt flux (surface melt),seaIce,,,,, -ibgvfxbog,ibgvfxbogga,volume_flux_bottom_growth,Global mean volume flux (bottom growth),seaIce,,,,, -ibgvfxbom,ibgvfxbomga,volume_flux_bottom_melt,Global mean volume flux (bottom melt),seaIce,,,,, -ibgvfxdyn,ibgvfxdynga,volume_flux_dynamic_growth,Global mean volume flux (dynamic growth),seaIce,,,,, -ibgvfx,ibgvfxga,volume_flux_emp,Global mean volume flux (emp),seaIce,,,,, -ibgvfxopw,ibgvfxopwga,volume_flux_open_water_growth,Global mean volume flux (open water growth),seaIce,,,,, -ibgvfxres,ibgvfxresga,volume_flux_resultant,Global mean volume flux (resultant),seaIce,,,,, -ibgvfxsni,ibgvfxsniga,volume_flux_snow_ice_growth,Global mean volume flux (snow-ice growth),seaIce,,,,, -ibgvfxsnw,ibgvfxsnwga,volume_flux_snow_melt,Global mean volume flux (snow melt),seaIce,,,,, -ibgvfxspr,ibgvfxsprga,snheco,Global mean volume flux (snow precip),seaIce,,,,, -ibgvfxsub,ibgvfxsubga,volume_flux_snow_sublimation,Global mean volume flux (snow sublimation),seaIce,,,,, -ibgvfxsum,ibgvfxsumga,volume_flux_surface_melt,Global mean volume flux (surface melt),seaIce,,,,, -ibgvolgrm,ibgvolgrm,global_mean_ice_growth+melt_volume,Global mean ice growth+melt volume,seaIce,,,,, -ibrinvol,ibrinvol,brine_volume,Brine volume,seaIce,,,,, -sibricat,ibrinvolcat,brine_volume_in_categories,Brine volume for categories,seaIce,,,,, -iicebopr,iicebopr,daily_bottom_thermo_ice_production,Daily bottom thermo ice production,seaIce,,,,, -iicecolf,iicecolf,frazil_ice_collection_thickness,Frazil ice collection thickness,seaIce,,,,, -iicedypr,iicedypr,daily_dynamic_ice_production,Daily dynamic ice production,seaIce,,,,, -iice_etd,iiceetd,brine_volume_distribution,Brine volume distribution,seaIce,,,,, -iicelapr,iicelapr,daily_lateral_thermo_ice_production,Daily lateral thermo ice prod.,seaIce,,,,, -iicenflx,iicenflx,nonsolar_flux_ice_ocean_surface,Non-solar flux at ice/ocean surface,seaIce,,,,, -iicesflx,iicesflx,solar_flux_ice_ocean_surface,Solar flux at ice/ocean surface,seaIce,,,,, -iiceshea,iiceshea,shear,Shear,seaIce,,,,, -iicesipr,iicesipr,daily_snowice_ice_production,Daily snowice ice production,seaIce,,,,, -iicfsbri,iicfsbri,brine_salt_flux,Fsbri - brine salt flux,seaIce,,,,, -iicfseqv,iicfseqv,equivalent_FW_salt_flux,Fseqv - equivalent fw salt flux,seaIce,,,,, -ioceflxb,ioceflxb,oceanic_flux_ar_ice_base,Oceanic flux at the ice base,seaIce,,,,, -iocehebr,iocehebr,heat_flux_due_to_brine_release,Heat flux due to brine release,seaIce,,,,, -iocesafl,iocesafl,salt_flux_ocean_surface,Salt flux at ocean surface,seaIce,,,,, -iocesflx,iocesflx,solar_fux_ocean_surface,Solar flux at ocean surface,seaIce,,,,, -iocetflx,iocetflx,total_flux_ocean_surface,Total flux at ocean surface,seaIce,,,,, -iocwnsfl,iocwnsfl,nonsolar_flux_ocean_surface,Non-solar flux at ocean surface,seaIce,,,,, -isstempe,isstempe,sea_surface_temperature,Sea surface temperature,seaIce,,K,,, -scmastot,masso,sea_water_mass,Sea water mass ,ocean,,,,, -mldkz5,mldkz5,ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity,Turbocline depth (kz = 5e-4),ocean,,,,, -somxl010:mldr10_1,mlotst,ocean_mixed_layer_thickness_defined_by_sigma_t,Ocean mixed layer thickness defined by sigma T ,ocean,,,,, -swvl1,mrlsl1,moisture_content_of_soil_layer_1, Water content of soil layer 1,land,,,,, -swvl2,mrlsl2,moisture_content_of_soil_layer_2, Water content of soil layer 2,land,,,,, -swvl3,mrlsl3,moisture_content_of_soil_layer_3, Water content of soil layer 3,land,,,,, -swvl4,mrlsl4,moisture_content_of_soil_layer_4, Water content of soil layer 4,land,,,,, -ro,mrro,runoff_flux,Total runoff,atmos,,,,, -tp:precip,pr,precipitation_flux,Precipitation,atmos,,,,, -cp,prc,convective_precipitation_flux,Convective precipitation,atmos,,,,, -lsp,prs,stratiform_precipitation_flux,Stratiform precipitation,atmos,,,,, -isnowpre,prsn,snowfall_flux,Surface snowfall rate into the sea ice portion of the grid cell,seaIce,,,,, -sf:snowpre,prsn,snowfall_flux,Snowfall flux,atmos,,,,, -tcwv,prw,atmosphere_water_vapor_content,Water vapor path,atmos,,,,, -msl,psl,air_pressure_at_sea_level,Sea level pressure,atmos,,,,, -qns_ice,qnsice,non_solar_heat_flux_at_ice_surface,Non-solar heat flux at ice surface: sum over categories,seaIce,,,,, -qt_ice,qtice,surface_downward_heat_flux_in_air,Surface downward heat flux in air,seaIce,,,,, -strd,rlds,surface_downwelling_longwave_flux_in_air,Surface downwelling longwave radiation,atmos,,,,, -strc:str,rls,surface_longwave_flux_in_air,Surface longwave radiation,atmos,,,,, -ttr,rlut,toa_outgoing_longwave_flux,Toa outgoing longwave radiation,atmos,,,,, -ttrc,rlutcs,toa_outgoing_longwave_flux_assuming_clear_sky,"Top net thermal radiation, clear sky",atmos,,,,, -ssrd,rsds,surface_downwelling_shortwave_flux_in_air,Surface downwelling shortwave radiation,atmos,,,,, -tsr,rsdt,toa_incoming_shortwave_flux,Toa incident shortwave radiation,atmos,,,,, -soshfldo,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net downward shortwave radiation at sea water surface ,ocean,,,,, -ssr,rss,surface_shortwave_flux_in_air,Surface shortwave radiation,atmos,,,,, -ssrc,rsscs,surface_shortwave_flux_in_air_assuming_clear_sky,Surface clear-sky shortwave radiation,atmos,,,,, -tsrc,rsut,toa_outgoing_shortwave_flux,Toa outgoing shortwave radiation,atmos,,,,, -saltc,saltc,salt_content_vertically_integrated,Salt content vertically integrated,ocean,,,,, -es,sbl,surface_snow_and_ice_sublimation_flux,Surface snow and ice sublimation flux,landIce,,,,, -sosalflx,sfs,salt_flux_surface,Surface salt flux,ocean,,,,, -si,si,solar_insolation,Solar insolation,atmos,,,,, -NArea,siarean,sea_ice_area,Total area of sea ice in the northern hemisphere,seaIce,,10^6 km2,,, -SArea,siareas,sea_ice_area,Total area of sea ice in the southern hemisphere,seaIce,,10^6 km2,,, -iiceconc:siconc:soicecov:ileadfra:ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,, -ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,,ifs iice_itd:siconc_cat:siitdconc:siconcat,siccat,ice_area_in_categories,Ice area in categories,seaIce,,,,, -ibgarea,sicga,sea_ice_content,Global mean sea ice content,seaIce,,,,, -NExnsidc,siextentn,sea_ice_extent,Total area of all northern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, -SExnsidc,siextents,sea_ice_extent,Total area of all southern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, -iiceprod,sigr,ice_production,Ice production,seaIce,,,,, -iiceheco,siheco,integral_of_sea_ice_temperature_wrt_depth_expressed_as_heat_content,Sea ice heat content,seaIce,,,,, -ibgsaltco,sisaltcga,global mean ice salt content,Global mean ice salt content,seaIce,,,,, iicethic:sithic:sithick,sit,sea_ice_thickness,Sea Ice Thickness,seaIce,,m,,, iice_hid:sithic_cat:sithicat:siitdthick,sitcat,ice_thicknesss_in_categories,Ice thickness in categories,seaIce,,,,, -iicetemp,sitemp,ice_temperature,Mean ice temperature,seaIce,,K,,, -ibgtemper,sitempga,sea_ice_temperature,Global mean sea ice temperature,seaIce,,K,,, iicevelo:sivelo:sispeed,sivelo,ice_velocity,Ice velocity,seaIce,,,,, iicevelu:sivelu:siu,sivelu,ice_velocity_u,Ice velocity u,seaIce,,,,, iicevelv:sivelv:siv,sivelv,ice_velocity_v,Ice velocity v,seaIce,,,,, sidivvel,siddivvel,divergence_of_sea_ice_velocity,Divergence of sea ice velocity,seaIce,,1e-8s^-1,,, -ibgvoltot,sivolga,sea_ice_volume,Global mean sea ice volume,seaIce,,,,, -sivoln:NVolume,sivoln,sea_ice_volume,Total volume of sea ice in the northern hemisphere,seaIce,,10^3 km3,,, -sivols:SVolume,sivols,sea_ice_volume,Total volume of sea ice in the southern hemisphere,seaIce,,10^3 km3,,, sivolu:sivol,sivolu,sea_ice_volume_per_unit_gridcell_area,Sea ice volume per gridcell area unit,seaIce,,,,, -sostatl,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostind,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostipc,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostpac,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sopstadv,sltbasinadv,northward_ocean_salt_transport_due_to_advection,Northward ocean salt transport due to advection ,ocean,,,,, -sopsteiv,sltbasinba,northward_ocean_salt_transport_due_to_bolus_advection,Northward ocean salt transport due to bolus advection ,ocean,,,,, -sopstldf,sltbasindif,northward_ocean_salt_transport_due_to_diffusion,Northward ocean salt transport due to diffusion,ocean,,,,, -sltnortha,sltnortha,northward_ocean_salt_transport,Atlantic northward ocean salt transport,ocean,,,,, -sopstove,sltovovrt,northward_ocean_salt_transport_due_to_overturning,Northward ocean salt transport due to overturning ,ocean,,,,, -zosalatl,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Atl,psu,,, -zosalglo,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Glob,psu,,, -zosalind,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Ind,psu,,, -zosalipc,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,IndPac,psu,,, -zosalpac,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Pac,psu,,, -asn,snal,snow_albedo,Snow albedo,landIce,,,,, iice_hsd:snthicats:siitdsnthick,sndcat,snow_thickness_in_categories,Snow thickness in in categories,seaIce,,,,, -isnoheco,snheco,snow_heat_content,Snow total heat content,seaIce,,,,, -sd,snld,lwe_thickness_of_surface_snow_amount,Snow depth,atmos,,,,, -smlt,snm,surface_snow_melt_flux,Surface snow melt,landIce,,,,, isnowthi:sisnthick,snthic,surface_snow_thickness,Surface snow thickness,seaIce,,,,, -sbgvoltot,snvolga,snow_volume,Global mean snow volume,seaIce,,,,, -snvolu,snvolu,snow_volume_per_unit_gridcell_area,Snow volume per gridcell area unit,seaIce,,,,, -vosaline:mean_3Dsosaline,so,sea_water_salinity,Sea water salinity,ocean,,psu,,, -scsaltot,soga,sea_water_salinity,Global mean sea water salinity ,ocean,,psu,,, -hfnortha,sohtatl,northward_ocean_heat_transport,Atlantic northward ocean heat transport,ocean,,,,, -soleaeiw,soleaeiw,eddy_induced_velocity_coefficient,Eddy induced vel. coeff. at w-point,ocean,,,,, -soleahtw,soleahtw,lateral_eddy_diffusivity,Lateral eddy diffusivity,ocean,,,,, -somixhgt,somixhgt,mixing_layer_depth_turbocline,Mixing layer depth (turbocline),ocean,,,,, -sosaline:isssalin:mean_sosaline,sos,sea_surface_salinity,Sea surface salinity ,ocean,,psu,,, -sothedep,sothedep,thermocline_depth,Thermocline depth (max dt/dz),ocean,,,,, -src,src,skin_reservoir_content,Skin reservoir content,land,,,,, -zosrfatl,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Atl,,,, -zosrfglo,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Glob,,,, -zosrfind,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Ind,,,, -zosrfipc,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,IndPac,,,, -zosrfpac,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Pac,,,, -rsn,srho,snow_density,Snow density,landIce,,,,, iicesali:iice_std:sisali,ssi,sea_ice_salinity,Sea ice salinity,seaIce,,psu,,, -salincat,ssicat,sea_ice_salinity_in_categories,Sea-ice bulk salinity for categories,seaIce,,psu,,, -ibgsaline,ssiga,sea_ice_salinity,Global mean sea ice salinity ,seaIce,,psu,,, -iicestre,streng,compressive_strength_of_sea_ice,Compressive sea ice strength,seaIce,,,,, -so20chgt,t20d,depth_of_isosurface_of_sea_water_potential_temperature,,ocean,,,,, -t,ta,air_temperature,Air temperature,atmos,,K,,, -t2m,tas,air_temperature,Near-surface air temperature,atmos,,K,170,370, -mx2t,tasmax,air_temperature,Daily maximum near-surface air temperature,atmos,,K,,, -mn2t,tasmin,air_temperature,Daily minimum near-surface air temperature,atmos,,K,,, -ewss,tauu,surface_downward_eastward_stress,Surface downward eastward wind stress,atmos,,,,, -utau_ice:iocestru:iicestru,strairx,surface_downward_x_stress,X-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, -sozotaux,tauuo,surface_downward_x_stress,Surface downward x stress ,ocean,,,,, -nsss,tauv,surface_downward_northward_stress,Surface downward northward wind stress,atmos,,,,, -vtau_ice:iocestrv:iicestrv,strairy,surface_downward_y_stress,Y-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, -sozotauy:sometauy,tauvo,surface_downward_y_stress,Surface downward y stress ,ocean,,,,, -d2m,tdps,dew_point_temperature,2m dewpoint temperature,atmos,,K,,, -votemper:mean_3Dsosstsst,thetao,sea_water_potential_temperature,Sea water potential temperature,ocean,,K,,, -sctemtot,thetaoga,sea_water_potential_temperature,Global average sea water potential temperature ,ocean,,K,,, -iicesume,tmelt,tendency_of_sea_ice_amount_due_to_surface_melting,Rate of melt at upper surface of sea ice,seaIce,,,,, -sosstsst:mean_sosstsst,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370, -sstk,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370,ifs -tossq,tossq,square_of_sea_surface_temperature,Square of sea surface temperature ,ocean,,K2,,, -zotematl,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Atl,K,,, -zotemglo,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Glob,K,,, -zotemind,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Ind,K,,, -zotemipc,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,IndPac,K,,, -zotempac,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Pac,K,,, -skt,ts,surface_temperature,Surface temperature,atmos,,K,,, iicesurt:soicetem:sistem:sitemptop,tsice,surface_temperature,Surface temperature of sea ice,seaIce,,K,,, -istl1,tsice,surface_temperature,Surface temperature of ice,landIce,,K,,, -stl1,tsl1,soil_temperature_level_1,Temperature of soil level 1,land,,,,, -stl2,tsl2,soil_temperature_level_2,Temperature of soil level 2,land,,,,, -stl3,tsl3,soil_temperature_level_3,Temperature of soil level 3,land,,,,, -stl4,tsl4,soil_temperature_level_4,Temperature of soil level 4,land,,,,, -tsn,tsn,temperature_in_surface_snow,Snow internal temperature,landIce,,,,, -u,ua,eastward_wind,U velocity,atmos,,,,, -u10m,uas,eastward_wind,Eastward near-surface wind,atmos,,,,, -vozocrtx,uo,sea_water_x_velocity,Sea water x velocity,ocean,,,,, -uos,uos,sea_surface_x_velocity,Sea surface x velocity,ocean,,,,, -v,va,northward_wind,V velocity,atmos,,,,, -v10m,vas,northward_wind,Northward near-surface wind,atmos,,,,, -vomecrty,vo,sea_water_y_velocity,Sea water y velocity,ocean,,,,, -vos,vos,sea_surface_y_velocity,Sea surface y velocity,ocean,,,,, -voddmavs,voddmavs,salt_vertical_eddy_diffusivity,Salt vertical eddy diffusivity,ocean,,,,, -vozoeivu,voeivu,sea_water_x_EIV_current,Zonal eiv current,ocean,,,,, -vomeeivv,voeivv,sea_water_y_EIV_current,Meridional eiv current,ocean,,,,, -voveeivw,voeivz,sea_water_z_EIV_current,Vertical eiv current,ocean,,,,, -scvoltot,volo,sea_water_volume,Sea water volume ,ocean,,,,, -votkeavm,votkeavm,vertical_eddy_viscosity,Vertical eddy viscosity,ocean,,,,, -votkeavt,votkeavt,vertical_eddy_diffusivity,Vertical eddy diffusivity,ocean,,,,, -votkeevd,votkeevd,enhanced_vertical_diffusivity,Enhanced vertical diffusivity,ocean,,,,, -votkeevm,votkeevm,enhanced_vertical_viscosity,Enhanced vertical viscosity,ocean,,,,, -sobarstf,vsftbarot,ocean_barotropic_volume_streamfunction,Ocean barotropic volume streamfunction ,ocean,,,,, -zomsfatl,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Atl,,,, -zomsfglo,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Glob,,,, -zomsfind,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Ind,,,, -zomsfipc:zomsfinp,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,IndPac,,,, -zomsfpac,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Pac,,,, -zomsfeiv,vsftmyzba,ocean_meridional_overturning_mass_streamfunction_due_to_bolus_advection,Ocean meridional overturning volume streamfunction due to bolus advection ,ocean,,,,, -w,wa,vertical_velocity,Vertical velocity,atmos,,,,, -z,zg,geopotential_height,Geopotential height,atmos,,,,, -vovecrtz,zo,sea_water_z_velocity,Sea water z velocity,ocean,,,,, -sossheigh:sossheig:mean_sossheig,zos,sea_surface_height_above_geoid,Sea surface height above geoid ,ocean,,,,, -scsshtot,zosga,global_average_sea_level_change,Global average sea level change ,ocean,,,,, -scsshste,zossga,global_average_steric_sea_level_change,Global average steric sea level change ,ocean,,,,, -zossq,zossq,square_of_sea_surface_height_above_geoid,Square of sea surface height above geoid ,ocean,,,,, -scsshtst,zostoga,snthic,Global average thermosteric sea level change ,ocean,,,,, -heatc,ohc,ocean_heat_content,Ocean heat content,ocean,,J,,, -ohcsum,ohcsum,total_ocean_heat_content,Total Ocean heat content,ocean,,J,,, -ohcvmean,ohcvmean,average_ocean_heat_content,Average Ocean heat content,ocean,,J m-3,,, -ohc,ohc,ocean_heat_content,Ocean heat content,ocean,,J m-2,,, -transix,transix,sea_ice_x_transport,X-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, -transiy,transiy,sea_ice_y_transport,Y-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, -windsp,sfcWind,wind_speed,Near-Surface Wind Speed,atmos,,,,, -vsfsit,vsfsit,virtual_salt_flux_into_sea_water_due_to_sea_ice_thermodynamics,Virtual Salt Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, -sfdsi,sfdsi,downward_sea_ice_basal_salt_flux,Downward Sea Ice Basal Salt Flux,ocean,,,,, -hfsithermds,hfsithermds,heat_flux_into_sea_water_due_to_sea_ice_thermodynamics,Heat Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, -u2o,uosq,square_of_sea_water_x_velocity,Square of Sea Water X Velocity ,ocean,,,,, -v2o,vosq,square_of_sea_water_y_velocity,Square of Sea Water Y Velocity ,ocean,,,,, -vozomatr,umo,ocean_mass_x_transport,Ocean Mass X Transport ,ocean,,,,, -vomematr,vmo,ocean_mass_y_transport,Ocean Mass Y Transport ,ocean,,,,, -sozohetr,hfx,ocean_heat_x_transport,Ocean Heat X Transport ,ocean,,,,, -somehetr,hfy,ocean_heat_y_transport,Ocean Heat Y Transport ,ocean,,,,, -uto,uothetao,product_of_xward_sea_water_velocity_and_temperature,Product of X-ward Sea Water Velocity and Temperature,ocean,,,,, -vto,vothetao,product_of_yward_sea_water_velocity_and_temperature,Product of Y-ward Sea Water Velocity and Temperature,ocean,,,,, -uso,uoso,product_of_xward_sea_water_velocity_and_salinity,Product of X-ward Sea Water Velocity and Salinity,ocean,,,,, -vso,voso,product_of_yward_sea_water_velocity_and_salinity,Product of Y-ward Sea Water Velocity and Salinity,ocean,,,,, -wfo,wfo,water_flux_into_sea_water,Water Flux into Sea Water ,ocean,,,,, -emp_oce,evsmpr,evap_minus_precip_over_sea_water,Evap minus Precip over ocean,ocean,,,,, -emp_ice,evsmpr,evap_minus_precip_over_sea_ice,Evap minus Precip over ice,seaIce,,,,, -qsr_oce,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net Downward Shortwave Radiation at Sea Water Surface ,ocean,,,,, -qns_oce,rlds,surface_net_downward_longwave_flux,Surface Net Downward Longwave Radiation,ocean,,,,, -qsr_ice,rsdssi,surface_downwelling_shortwave_flux_in_air,Downwelling Shortwave over Sea Ice,seaIce,,,,, -qns_ice,rldssi,surface_downwelling_longwave_flux_in_air,Downwelling Long Wave over Sea Ice,seaIce,,,,, -sfx,sfx,downward_salt_flux,Downward Salt Flux,ocean,,,,, -taum,taum,surface_downward_stress_module,Surface Downward Stress Module,ocean,,,,, -zfull,zfull,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, -zhalf,zhalf,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, -pbo,pbo,sea_water_pressure_at_sea_floor,Sea Water Pressure at Sea Floor,ocean,,,,, -thkcello,thkcello,cell_thickness,Cell Thickness,ocean,,,,, -ficeberg,ficeberg,water_flux_into_sea_water_from_icebergs,Water Flux into Sea Water From Icebergs ,ocean,,,,, -rsdo,rsds,downwelling_shortwave_flux_in_sea_water,Downwelling Shortwave Radiation in Sea Water ,ocean,,,,, -wo,wo,sea_water_upward_velocity,Sea Water Upward Velocity ,ocean,,,,, -w2o,wosq,square_of_sea_water_upward_velocity,Square of Sea Water Upward Velocity ,ocean,,,,, -difvho,difvho,ocean_vertical_heat_diffusivity,Ocean Vertical Heat Diffusivity,ocean,,,,, -vovematr,wmo,upward_ocean_mass_transport,Upward Ocean Mass Transport ,ocean,,,,, -qtr_ice,qtr,shortwave_flux_transmitted_through_ice,Shortwave Flux Transmitted Through The Ice,seaIce,,,,, \ No newline at end of file diff --git a/earthdiagnostics/cmor_tables/specs.csv b/earthdiagnostics/cmor_tables/specs.csv index 5c403f0d..ddfcc15b 100644 --- a/earthdiagnostics/cmor_tables/specs.csv +++ b/earthdiagnostics/cmor_tables/specs.csv @@ -1,302 +1 @@ Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid -iiceages:siage:iice_otd,ageice,age_of_sea_ice,Age of sea ice,seaIce,,,,, -al,al,surface_albedo,Albedo,atmos,,,,, -bgfrcsal,bgfrcsal,change_over_time_in_heat_content_from_forcing,Change over time in salt content from forcing,ocean,,,,, -bgfrctem,bgfrctem,change_over_time_in_heat_content_from_forcing,Change over time in heat content from forcing,ocean,,,,, -bgfrcvol,bgfrcvol,change_over_time_in_volume_from_forcing,Change over time in volume from forcing,ocean,,,,, -bgheatco,bgheatco,change_over_time_in_heat_content,Change over time in sea water heat content,ocean,,,,, -bgsaline,bgsaline,change_over_time_in_sea_water_practical_salinity,Change over time in sea water salinity,ocean,,,,, -bgsaltco,bgsaltco,change_over_time_in_salt_content,Change over time in sea water salt content,ocean,,,,, -bgtemper,bgtemper,change_over_time_in_sea_water_potential_temperature,Change over time in sea water potential temperature,ocean,,,,, -bgvole3t,bgvole3t,change_over_time_in_volume_variation,Change over time in volume variation (e3t),ocean,,,,, -bgvolssh,bgvolssh,change_over_time_in_sea_surface_height,Change over time in sea surface height,ocean,,,,, -bld,bld,boundary_layer_dissipation,Boundary layer dissipation,atmos,,,,, -iicebome:iocewflx,bmelt,tendency_of_sea_ice_amount_due_to_basal_melting,Rate of melt at sea ice base,seaIce,,,,, -sobowlin,bowlin,bowl_index,Bowl index,ocean,,,,, -cc,cl,cloud_area_fraction_in_atmosphere_layer,Cloud area fraction,atmos,,,,, -hcc,clh,high_cloud_area_fraction,High cloud fraction,atmos,,,,, -lcc,cll,low_cloud_area_fraction,Low cloud fraction,atmos,,,,, -mcc,clm,medium_cloud_area_fraction,Medium cloud fraction,atmos,,,,, -ciwc,cli,mass_fraction_of_cloud_ice_in_air,Mass fraction of cloud ice,atmos,,,,, -tcc,clt,cloud_area_fraction,Total cloud fraction,atmos,,,,, -clwc,clw,mass_fraction_of_cloud_liquid_water_in_air,Mass fraction of cloud liquid water,atmos,,,,, -tcw,clwvi,atmosphere_cloud_condensed_water_content,Condensed water path,atmos,,,,, -iicedive:sidive,divice,Strain Rate Divergence of Sea Ice,Divergence_of_sea_ice_velocity,seaIce,,,,, -e,evspsbl,water_evaporation_flux,Evaporation,atmos,,,,, -fal,fal,forecast_albedo,Forecast albedo,atmos,,,,, -sowaflep,fatmosocean,atmosphere_ocean_water_flux,Atmos=>ocean net freshwater,ocean,,,,, -sowaflcd,fdilution,dilution_water_flux,Concentration/dilution water flux,ocean,,,,, -sophtldf,fhbasindif,northward_ocean_heat_transport_due_to_diffusion,Northward ocean heat transport due to diffusion,ocean,,,,, -iowaflup,ficeocean,ice_ocean_water_flux,Ice=>ocean net freshwater,ocean,,,,, -sorunoff,friver,water_flux_into_sea_water_from_rivers,Water flux into sea water from rivers ,ocean,,,,, -sowaflup,fupward,upward_water_flux,Net upward water flux,ocean,,,,, -gwd,gwd,gravity_wave_dissipation,Gravity wave dissipation,atmos,,,,, -ibgheatco,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,, -sbgheatco,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,, -heatc,heatc,integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content,Heat content vertically integrated,ocean,,,,, -sohtatl,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Atl,,,, -sohtind,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Ind,,,, -sohtipc,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,IndPac,,,, -sohtpac,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Pac,,,, -sophtadv,hfbasinadv,northward_ocean_heat_transport_due_to_advection,Northward ocean heat transport due to advection ,ocean,,,,, -sophteiv,hfbasinba,northward_ocean_heat_transport_due_to_bolus_advection,Northward ocean heat transport due to bolus advection ,ocean,,,,, -qt_oce:sohefldo:qt,hfds,surface_downward_heat_flux_in_sea_water,Downward heat flux at sea water surface,ocean,,,,, -slhf,hfls,surface_upward_latent_heat_flux,Surface upward latent heat flux,atmos,,,,, -sshf,hfss,surface_upward_sensible_heat_flux,Surface upward sensible heat flux,atmos,,,,, -sophtove,htovovrt,northward_ocean_heat_transport_due_to_overturning,Northward ocean heat transport due to overturning ,ocean,,,,, -q,hus,specific_humidity,Specific humidity,atmos,,,,, -soicealb,ialb,sea_ice_albedo,Sea ice albedo,seaIce,,,,, -ibgfrcsfx,ibgfrcsfx,global_mean_forcing_salt,Global mean forcing salt (sfx),seaIce,,,,, -ibgfrcvol,ibgfrcvol,globa_mean_forcing_volume,Global mean forcing volume (emp),seaIce,,,,, -ibghfxbog,ibghfxbog,heat_fluxes_causing_bottom_ice_growth,Heat fluxes causing bottom ice growth,seaIce,,,,, -ibghfxbom,ibghfxbom,heat_fluxes_causing_bottom_ice_melt,Heat fluxes causing bottom ice melt,seaIce,,,,, -ibghfxdhc,ibghfxdhc,Heat_content_variation_in_snow_and_ice,Heat content variation in snow and ice,seaIce,,,,, -ibghfxdif,ibghfxdif,heat_fluxes_causing_ice temperature_change,Heat fluxes causing ice temperature change,seaIce,,,,, -ibghfxdyn,ibghfxdyn,heat_fluxes_from_ice-ocean_exchange_during_dynamic,Heat fluxes from ice-ocean exchange during dynamic,seaIce,,,,, -ibghfxin,ibghfxin,total_heat_fluxes_at_the_ice_surface,Total heat fluxes at the ice surface,seaIce,,,,, -ibghfxopw,ibghfxopw,heat_fluxes_causing_open_water_ice_formation,Heat fluxes causing open water ice formation,seaIce,,,,, -ibghfxout,ibghfxout,non_solar_heat_fluxes_received_by_the_ocean,Non solar heat fluxes received by the ocean,seaIce,,,,, -ibghfxres,ibghfxres,heat_fluxes_from_ice-ocean_exchange_during_resultant,Heat fluxes from ice-ocean exchange during resultant,seaIce,,,,, -ibghfxsnw,ibghfxsnw,heat_fluxes_from_snow-ocean_exchange,Heat fluxes from snow-ocean exchange,seaIce,,,,, -ibghfxspr,ibghfxspr,Heat_content_of_snow_precip,Heat content of snow precip,seaIce,,,,, -ibghfxsub,ibghfxsub,heat_fluxes_from_sublimation,Heat fluxes from sublimation,seaIce,,,,, -ibghfxsum,ibghfxsum,heat_fluxes_causing_surface_ice_melt,Heat fluxes causing surface ice melt,seaIce,,,,, -ibghfxthd,ibghfxthd,heat_fluxes_from_ice-ocean_exchange_during_thermo,Heat fluxes from ice-ocean exchange during thermo,seaIce,,,,, -ibgsfxbog,ibgsfxbogga,salt_flux_thermo,Global mean salt flux (thermo),seaIce,,,,, -ibgsfxbom,ibgsfxbomga,salt_flux_bottom_melt,Global mean salt flux (bottom melt),seaIce,,,,, -ibgsfxbri,ibgsfxbriga,salt_flux_brines,Global mean salt flux (brines),seaIce,,,,, -ibgsfxdyn,ibgsfxdynga,salt_flux_dynamic,Global mean salt flux (dynamic),seaIce,,,,, -ibgsfx,ibgsfxga,salt_flux,Global mean salt flux (total),seaIce,,,,, -ibgsfxopw,ibgsfxopwga,salt_flux_open_waters,Global mean salt flux (open water),seaIce,,,,, -ibgsfxres,ibgsfxresga,salt_flux_resultant,Global mean salt flux (resultant),seaIce,,,,, -ibgsfxsni,ibgsfxsniga,salt_flux_snow_ice_growth,Global mean salt flux (snow-ice growth),seaIce,,,,, -ibgsfxsum,ibgsfxsumga,salt_flux_surface_melt,Global mean salt flux (surface melt),seaIce,,,,, -ibgvfxbog,ibgvfxbogga,volume_flux_bottom_growth,Global mean volume flux (bottom growth),seaIce,,,,, -ibgvfxbom,ibgvfxbomga,volume_flux_bottom_melt,Global mean volume flux (bottom melt),seaIce,,,,, -ibgvfxdyn,ibgvfxdynga,volume_flux_dynamic_growth,Global mean volume flux (dynamic growth),seaIce,,,,, -ibgvfx,ibgvfxga,volume_flux_emp,Global mean volume flux (emp),seaIce,,,,, -ibgvfxopw,ibgvfxopwga,volume_flux_open_water_growth,Global mean volume flux (open water growth),seaIce,,,,, -ibgvfxres,ibgvfxresga,volume_flux_resultant,Global mean volume flux (resultant),seaIce,,,,, -ibgvfxsni,ibgvfxsniga,volume_flux_snow_ice_growth,Global mean volume flux (snow-ice growth),seaIce,,,,, -ibgvfxsnw,ibgvfxsnwga,volume_flux_snow_melt,Global mean volume flux (snow melt),seaIce,,,,, -ibgvfxspr,ibgvfxsprga,snheco,Global mean volume flux (snow precip),seaIce,,,,, -ibgvfxsub,ibgvfxsubga,volume_flux_snow_sublimation,Global mean volume flux (snow sublimation),seaIce,,,,, -ibgvfxsum,ibgvfxsumga,volume_flux_surface_melt,Global mean volume flux (surface melt),seaIce,,,,, -ibgvolgrm,ibgvolgrm,global_mean_ice_growth+melt_volume,Global mean ice growth+melt volume,seaIce,,,,, -ibrinvol,ibrinvol,brine_volume,Brine volume,seaIce,,,,, -sibricat,ibrinvolcat,brine_volume_in_categories,Brine volume for categories,seaIce,,,,, -iicebopr,iicebopr,daily_bottom_thermo_ice_production,Daily bottom thermo ice production,seaIce,,,,, -iicecolf,iicecolf,frazil_ice_collection_thickness,Frazil ice collection thickness,seaIce,,,,, -iicedypr,iicedypr,daily_dynamic_ice_production,Daily dynamic ice production,seaIce,,,,, -iice_etd,iiceetd,brine_volume_distribution,Brine volume distribution,seaIce,,,,, -iicelapr,iicelapr,daily_lateral_thermo_ice_production,Daily lateral thermo ice prod.,seaIce,,,,, -iicenflx,iicenflx,nonsolar_flux_ice_ocean_surface,Non-solar flux at ice/ocean surface,seaIce,,,,, -iicesflx,iicesflx,solar_flux_ice_ocean_surface,Solar flux at ice/ocean surface,seaIce,,,,, -iiceshea,iiceshea,shear,Shear,seaIce,,,,, -iicesipr,iicesipr,daily_snowice_ice_production,Daily snowice ice production,seaIce,,,,, -iicfsbri,iicfsbri,brine_salt_flux,Fsbri - brine salt flux,seaIce,,,,, -iicfseqv,iicfseqv,equivalent_FW_salt_flux,Fseqv - equivalent fw salt flux,seaIce,,,,, -ioceflxb,ioceflxb,oceanic_flux_ar_ice_base,Oceanic flux at the ice base,seaIce,,,,, -iocehebr,iocehebr,heat_flux_due_to_brine_release,Heat flux due to brine release,seaIce,,,,, -iocesafl,iocesafl,salt_flux_ocean_surface,Salt flux at ocean surface,seaIce,,,,, -iocesflx,iocesflx,solar_fux_ocean_surface,Solar flux at ocean surface,seaIce,,,,, -iocetflx,iocetflx,total_flux_ocean_surface,Total flux at ocean surface,seaIce,,,,, -iocwnsfl,iocwnsfl,nonsolar_flux_ocean_surface,Non-solar flux at ocean surface,seaIce,,,,, -isstempe,isstempe,sea_surface_temperature,Sea surface temperature,seaIce,,K,,, -scmastot,masso,sea_water_mass,Sea water mass ,ocean,,,,, -mldkz5,mldkz5,ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity,Turbocline depth (kz = 5e-4),ocean,,,,, -somxl010:mldr10_1,mlotst,ocean_mixed_layer_thickness_defined_by_sigma_t,Ocean mixed layer thickness defined by sigma T ,ocean,,,,, -swvl1,mrlsl1,moisture_content_of_soil_layer_1, Water content of soil layer 1,land,,,,, -swvl2,mrlsl2,moisture_content_of_soil_layer_2, Water content of soil layer 2,land,,,,, -swvl3,mrlsl3,moisture_content_of_soil_layer_3, Water content of soil layer 3,land,,,,, -swvl4,mrlsl4,moisture_content_of_soil_layer_4, Water content of soil layer 4,land,,,,, -ro,mrro,runoff_flux,Total runoff,atmos,,,,, -tp:precip,pr,precipitation_flux,Precipitation,atmos,,,,, -cp,prc,convective_precipitation_flux,Convective precipitation,atmos,,,,, -lsp,prs,stratiform_precipitation_flux,Stratiform precipitation,atmos,,,,, -isnowpre,prsn,snowfall_flux,Surface snowfall rate into the sea ice portion of the grid cell,seaIce,,,,, -sf:snowpre,prsn,snowfall_flux,Snowfall flux,atmos,,,,, -tcwv,prw,atmosphere_water_vapor_content,Water vapor path,atmos,,,,, -msl,psl,air_pressure_at_sea_level,Sea level pressure,atmos,,,,, -qns_ice,qnsice,non_solar_heat_flux_at_ice_surface,Non-solar heat flux at ice surface: sum over categories,seaIce,,,,, -qt_ice,qtice,surface_downward_heat_flux_in_air,Surface downward heat flux in air,seaIce,,,,, -strd,rlds,surface_downwelling_longwave_flux_in_air,Surface downwelling longwave radiation,atmos,,,,, -strc:str,rls,surface_longwave_flux_in_air,Surface longwave radiation,atmos,,,,, -ttr,rlut,toa_outgoing_longwave_flux,Toa outgoing longwave radiation,atmos,,,,, -ttrc,rlutcs,toa_outgoing_longwave_flux_assuming_clear_sky,"Top net thermal radiation, clear sky",atmos,,,,, -ssrd,rsds,surface_downwelling_shortwave_flux_in_air,Surface downwelling shortwave radiation,atmos,,,,, -tsr,rsdt,toa_incoming_shortwave_flux,Toa incident shortwave radiation,atmos,,,,, -soshfldo,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net downward shortwave radiation at sea water surface ,ocean,,,,, -ssr,rss,surface_shortwave_flux_in_air,Surface shortwave radiation,atmos,,,,, -ssrc,rsscs,surface_shortwave_flux_in_air_assuming_clear_sky,Surface clear-sky shortwave radiation,atmos,,,,, -tsrc,rsut,toa_outgoing_shortwave_flux,Toa outgoing shortwave radiation,atmos,,,,, -saltc,saltc,salt_content_vertically_integrated,Salt content vertically integrated,ocean,,,,, -es,sbl,surface_snow_and_ice_sublimation_flux,Surface snow and ice sublimation flux,landIce,,,,, -sosalflx,sfs,salt_flux_surface,Surface salt flux,ocean,,,,, -si,si,solar_insolation,Solar insolation,atmos,,,,, -NArea,siarean,sea_ice_area,Total area of sea ice in the northern hemisphere,seaIce,,10^6 km2,,, -SArea,siareas,sea_ice_area,Total area of sea ice in the southern hemisphere,seaIce,,10^6 km2,,, -iiceconc:siconc:soicecov:ileadfra:ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,, -ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,,ifs -iice_itd:siconc_cat:siconcat,siccat,ice_area_in_categories,Ice area in categories,seaIce,,,,, -ibgarea,sicga,sea_ice_content,Global mean sea ice content,seaIce,,,,, -NExnsidc,siextentn,sea_ice_extent,Total area of all northern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, -SExnsidc,siextents,sea_ice_extent,Total area of all southern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, -iiceprod,sigr,ice_production,Ice production,seaIce,,,,, -iiceheco,siheco,integral_of_sea_ice_temperature_wrt_depth_expressed_as_heat_content,Sea ice heat content,seaIce,,,,, -ibgsaltco,sisaltcga,global mean ice salt content,Global mean ice salt content,seaIce,,,,, -iicethic:sithic,sit,sea_ice_thickness,Sea Ice Thickness,seaIce,,m,,, -iice_hid:sithic_cat:sithicat,sitcat,ice_thicknesss_in_categories,Ice thickness in categories,seaIce,,,,, -iicetemp,sitemp,ice_temperature,Mean ice temperature,seaIce,,K,,, -ibgtemper,sitempga,sea_ice_temperature,Global mean sea ice temperature,seaIce,,K,,, -iicevelo:sivelo,sivelo,ice_velocity,Ice velocity,seaIce,,,,, -iicevelu:sivelu,sivelu,ice_velocity_u,Ice velocity u,seaIce,,,,, -iicevelv:sivelv,sivelv,ice_velocity_v,Ice velocity v,seaIce,,,,, -ibgvoltot,sivolga,sea_ice_volume,Global mean sea ice volume,seaIce,,,,, -sivoln:NVolume,sivoln,sea_ice_volume,Total volume of sea ice in the northern hemisphere,seaIce,,10^3 km3,,, -sivols:SVolume,sivols,sea_ice_volume,Total volume of sea ice in the southern hemisphere,seaIce,,10^3 km3,,, -sivolu,sivolu,sea_ice_volume_per_unit_gridcell_area,Sea ice volume per gridcell area unit,seaIce,,,,, -sostatl,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostind,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostipc,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostpac,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sopstadv,sltbasinadv,northward_ocean_salt_transport_due_to_advection,Northward ocean salt transport due to advection ,ocean,,,,, -sopsteiv,sltbasinba,northward_ocean_salt_transport_due_to_bolus_advection,Northward ocean salt transport due to bolus advection ,ocean,,,,, -sopstldf,sltbasindif,northward_ocean_salt_transport_due_to_diffusion,Northward ocean salt transport due to diffusion,ocean,,,,, -sltnortha,sltnortha,northward_ocean_salt_transport,Atlantic northward ocean salt transport,ocean,,,,, -sopstove,sltovovrt,northward_ocean_salt_transport_due_to_overturning,Northward ocean salt transport due to overturning ,ocean,,,,, -zosalatl,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Atl,psu,,, -zosalglo,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Glob,psu,,, -zosalind,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Ind,psu,,, -zosalipc,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,IndPac,psu,,, -zosalpac,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Pac,psu,,, -asn,snal,snow_albedo,Snow albedo,landIce,,,,, -iice_hsd:snthicat,sndcat,snow_thickness_in_categories,Snow thickness in in categories,seaIce,,,,, -isnoheco,snheco,snow_heat_content,Snow total heat content,seaIce,,,,, -sd,snld,lwe_thickness_of_surface_snow_amount,Snow depth,atmos,,,,, -smlt,snm,surface_snow_melt_flux,Surface snow melt,landIce,,,,, -isnowthi,snthic,surface_snow_thickness,Surface snow thickness,seaIce,,,,, -sbgvoltot,snvolga,snow_volume,Global mean snow volume,seaIce,,,,, -snvolu,snvolu,snow_volume_per_unit_gridcell_area,Snow volume per gridcell area unit,seaIce,,,,, -vosaline:mean_3Dsosaline,so,sea_water_salinity,Sea water salinity,ocean,,psu,,, -scsaltot,soga,sea_water_salinity,Global mean sea water salinity ,ocean,,psu,,, -hfnortha,sohtatl,northward_ocean_heat_transport,Atlantic northward ocean heat transport,ocean,,,,, -soleaeiw,soleaeiw,eddy_induced_velocity_coefficient,Eddy induced vel. coeff. at w-point,ocean,,,,, -soleahtw,soleahtw,lateral_eddy_diffusivity,Lateral eddy diffusivity,ocean,,,,, -somixhgt,somixhgt,mixing_layer_depth_turbocline,Mixing layer depth (turbocline),ocean,,,,, -sosaline:isssalin:mean_sosaline,sos,sea_surface_salinity,Sea surface salinity ,ocean,,psu,,, -sothedep,sothedep,thermocline_depth,Thermocline depth (max dt/dz),ocean,,,,, -src,src,skin_reservoir_content,Skin reservoir content,land,,,,, -zosrfatl,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Atl,,,, -zosrfglo,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Glob,,,, -zosrfind,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Ind,,,, -zosrfipc,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,IndPac,,,, -zosrfpac,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Pac,,,, -rsn,srho,snow_density,Snow density,landIce,,,,, -iicesali:iice_std,ssi,sea_ice_salinity,Sea ice salinity,seaIce,,psu,,, -salincat,ssicat,sea_ice_salinity_in_categories,Sea-ice bulk salinity for categories,seaIce,,psu,,, -ibgsaline,ssiga,sea_ice_salinity,Global mean sea ice salinity ,seaIce,,psu,,, -iicestre,streng,compressive_strength_of_sea_ice,Compressive sea ice strength,seaIce,,,,, -so20chgt,t20d,depth_of_isosurface_of_sea_water_potential_temperature,,ocean,,,,, -t,ta,air_temperature,Air temperature,atmos,,K,,, -t2m,tas,air_temperature,Near-surface air temperature,atmos,,K,170,370, -mx2t,tasmax,air_temperature,Daily maximum near-surface air temperature,atmos,,K,,, -mn2t,tasmin,air_temperature,Daily minimum near-surface air temperature,atmos,,K,,, -ewss,tauu,surface_downward_eastward_stress,Surface downward eastward wind stress,atmos,,,,, -utau_ice:iocestru:iicestru,strairx,surface_downward_x_stress,X-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, -sozotaux,tauuo,surface_downward_x_stress,Surface downward x stress ,ocean,,,,, -nsss,tauv,surface_downward_northward_stress,Surface downward northward wind stress,atmos,,,,, -vtau_ice:iocestrv:iicestrv,strairy,surface_downward_y_stress,Y-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, -sozotauy:sometauy,tauvo,surface_downward_y_stress,Surface downward y stress ,ocean,,,,, -d2m,tdps,dew_point_temperature,2m dewpoint temperature,atmos,,K,,, -votemper:mean_3Dsosstsst,thetao,sea_water_potential_temperature,Sea water potential temperature,ocean,,K,,, -sctemtot,thetaoga,sea_water_potential_temperature,Global average sea water potential temperature ,ocean,,K,,, -iicesume,tmelt,tendency_of_sea_ice_amount_due_to_surface_melting,Rate of melt at upper surface of sea ice,seaIce,,,,, -sosstsst:mean_sosstsst,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370, -sstk,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370,ifs -tossq,tossq,square_of_sea_surface_temperature,Square of sea surface temperature ,ocean,,K2,,, -zotematl,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Atl,K,,, -zotemglo,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Glob,K,,, -zotemind,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Ind,K,,, -zotemipc,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,IndPac,K,,, -zotempac,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Pac,K,,, -skt,ts,surface_temperature,Surface temperature,atmos,,K,,, -iicesurt:soicetem:sistem,tsice,surface_temperature,Surface temperature of sea ice,seaIce,,K,,, -istl1,tsice,surface_temperature,Surface temperature of ice,landIce,,K,,, -stl1,tsl1,soil_temperature_level_1,Temperature of soil level 1,land,,,,, -stl2,tsl2,soil_temperature_level_2,Temperature of soil level 2,land,,,,, -stl3,tsl3,soil_temperature_level_3,Temperature of soil level 3,land,,,,, -stl4,tsl4,soil_temperature_level_4,Temperature of soil level 4,land,,,,, -tsn,tsn,temperature_in_surface_snow,Snow internal temperature,landIce,,,,, -u,ua,eastward_wind,U velocity,atmos,,,,, -u10m,uas,eastward_wind,Eastward near-surface wind,atmos,,,,, -vozocrtx,uo,sea_water_x_velocity,Sea water x velocity,ocean,,,,, -uos,uos,sea_surface_x_velocity,Sea surface x velocity,ocean,,,,, -v,va,northward_wind,V velocity,atmos,,,,, -v10m,vas,northward_wind,Northward near-surface wind,atmos,,,,, -vomecrty,vo,sea_water_y_velocity,Sea water y velocity,ocean,,,,, -vos,vos,sea_surface_y_velocity,Sea surface y velocity,ocean,,,,, -voddmavs,voddmavs,salt_vertical_eddy_diffusivity,Salt vertical eddy diffusivity,ocean,,,,, -vozoeivu,voeivu,sea_water_x_EIV_current,Zonal eiv current,ocean,,,,, -vomeeivv,voeivv,sea_water_y_EIV_current,Meridional eiv current,ocean,,,,, -voveeivw,voeivz,sea_water_z_EIV_current,Vertical eiv current,ocean,,,,, -scvoltot,volo,sea_water_volume,Sea water volume ,ocean,,,,, -votkeavm,votkeavm,vertical_eddy_viscosity,Vertical eddy viscosity,ocean,,,,, -votkeavt,votkeavt,vertical_eddy_diffusivity,Vertical eddy diffusivity,ocean,,,,, -votkeevd,votkeevd,enhanced_vertical_diffusivity,Enhanced vertical diffusivity,ocean,,,,, -votkeevm,votkeevm,enhanced_vertical_viscosity,Enhanced vertical viscosity,ocean,,,,, -sobarstf,vsftbarot,ocean_barotropic_volume_streamfunction,Ocean barotropic volume streamfunction ,ocean,,,,, -zomsfatl,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Atl,,,, -zomsfglo,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Glob,,,, -zomsfind,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Ind,,,, -zomsfipc:zomsfinp,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,IndPac,,,, -zomsfpac,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Pac,,,, -zomsfeiv,vsftmyzba,ocean_meridional_overturning_mass_streamfunction_due_to_bolus_advection,Ocean meridional overturning volume streamfunction due to bolus advection ,ocean,,,,, -w,wa,vertical_velocity,Vertical velocity,atmos,,,,, -z,zg,geopotential_height,Geopotential height,atmos,,,,, -vovecrtz,zo,sea_water_z_velocity,Sea water z velocity,ocean,,,,, -sossheigh:sossheig:mean_sossheig,zos,sea_surface_height_above_geoid,Sea surface height above geoid ,ocean,,,,, -scsshtot,zosga,global_average_sea_level_change,Global average sea level change ,ocean,,,,, -scsshste,zossga,global_average_steric_sea_level_change,Global average steric sea level change ,ocean,,,,, -zossq,zossq,square_of_sea_surface_height_above_geoid,Square of sea surface height above geoid ,ocean,,,,, -scsshtst,zostoga,snthic,Global average thermosteric sea level change ,ocean,,,,, -heatc,ohc,ocean_heat_content,Ocean heat content,ocean,,J,,, -ohcsum,ohcsum,total_ocean_heat_content,Total Ocean heat content,ocean,,J,,, -ohcvmean,ohcvmean,average_ocean_heat_content,Average Ocean heat content,ocean,,J m-3,,, -ohc,ohc,ocean_heat_content,Ocean heat content,ocean,,J m-2,,, -transix,transix,sea_ice_x_transport,X-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, -transiy,transiy,sea_ice_y_transport,Y-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, -windsp,sfcWind,wind_speed,Near-Surface Wind Speed,atmos,,,,, -vsfsit,vsfsit,virtual_salt_flux_into_sea_water_due_to_sea_ice_thermodynamics,Virtual Salt Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, -sfdsi,sfdsi,downward_sea_ice_basal_salt_flux,Downward Sea Ice Basal Salt Flux,ocean,,,,, -hfsithermds,hfsithermds,heat_flux_into_sea_water_due_to_sea_ice_thermodynamics,Heat Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, -u2o,uosq,square_of_sea_water_x_velocity,Square of Sea Water X Velocity ,ocean,,,,, -v2o,vosq,square_of_sea_water_y_velocity,Square of Sea Water Y Velocity ,ocean,,,,, -vozomatr,umo,ocean_mass_x_transport,Ocean Mass X Transport ,ocean,,,,, -vomematr,vmo,ocean_mass_y_transport,Ocean Mass Y Transport ,ocean,,,,, -sozohetr,hfx,ocean_heat_x_transport,Ocean Heat X Transport ,ocean,,,,, -somehetr,hfy,ocean_heat_y_transport,Ocean Heat Y Transport ,ocean,,,,, -uto,uothetao,product_of_xward_sea_water_velocity_and_temperature,Product of X-ward Sea Water Velocity and Temperature,ocean,,,,, -vto,vothetao,product_of_yward_sea_water_velocity_and_temperature,Product of Y-ward Sea Water Velocity and Temperature,ocean,,,,, -uso,uoso,product_of_xward_sea_water_velocity_and_salinity,Product of X-ward Sea Water Velocity and Salinity,ocean,,,,, -vso,voso,product_of_yward_sea_water_velocity_and_salinity,Product of Y-ward Sea Water Velocity and Salinity,ocean,,,,, -wfo,wfo,water_flux_into_sea_water,Water Flux into Sea Water ,ocean,,,,, -emp_oce,evsmpr,evap_minus_precip_over_sea_water,Evap minus Precip over ocean,ocean,,,,, -emp_ice,evsmpr,evap_minus_precip_over_sea_ice,Evap minus Precip over ice,seaIce,,,,, -qsr_oce,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net Downward Shortwave Radiation at Sea Water Surface ,ocean,,,,, -qns_oce,rlds,surface_net_downward_longwave_flux,Surface Net Downward Longwave Radiation,ocean,,,,, -qsr_ice,rsdssi,surface_downwelling_shortwave_flux_in_air,Downwelling Shortwave over Sea Ice,seaIce,,,,, -qns_ice,rldssi,surface_downwelling_longwave_flux_in_air,Downwelling Long Wave over Sea Ice,seaIce,,,,, -sfx,sfx,downward_salt_flux,Downward Salt Flux,ocean,,,,, -taum,taum,surface_downward_stress_module,Surface Downward Stress Module,ocean,,,,, -zfull,zfull,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, -zhalf,zhalf,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, -pbo,pbo,sea_water_pressure_at_sea_floor,Sea Water Pressure at Sea Floor,ocean,,,,, -thkcello,thkcello,cell_thickness,Cell Thickness,ocean,,,,, -ficeberg,ficeberg,water_flux_into_sea_water_from_icebergs,Water Flux into Sea Water From Icebergs ,ocean,,,,, -rsdo,rsds,downwelling_shortwave_flux_in_sea_water,Downwelling Shortwave Radiation in Sea Water ,ocean,,,,, -wo,wo,sea_water_upward_velocity,Sea Water Upward Velocity ,ocean,,,,, -w2o,wosq,square_of_sea_water_upward_velocity,Square of Sea Water Upward Velocity ,ocean,,,,, -difvho,difvho,ocean_vertical_heat_diffusivity,Ocean Vertical Heat Diffusivity,ocean,,,,, -vovematr,wmo,upward_ocean_mass_transport,Upward Ocean Mass Transport ,ocean,,,,, -qtr_ice,qtr,shortwave_flux_transmitted_through_ice,Shortwave Flux Transmitted Through The Ice,seaIce,,,,, diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 300b2a61..066ac816 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -1,5 +1,7 @@ # coding=utf-8 import csv +import json +from pprint import pprint import os from autosubmit.config.log import Log @@ -7,6 +9,10 @@ from autosubmit.config.log import Log from earthdiagnostics.constants import Basins +class VariableJsonException(Exception): + pass + + class Variable(object): """ Class to characterize a CMOR variable. It also contains the static method to make the match between thje original @@ -14,16 +20,17 @@ class Variable(object): """ _dict_variables = None - def __init__(self, line): - self.short_name = line[1].strip() - self.standard_name = line[2].strip() - self.long_name = line[3].strip() - self.domain = Domain(line[4].strip()) - self.basin = Basins.parse(line[5]) - self.units = line[6].strip() - self.valid_min = line[7].strip() - self.valid_max = line[8].strip() - self.grid = line[9].strip() + def __init__(self): + self.short_name = None + self.standard_name = None + self.long_name = None + self.domain = None + self.basin = None + self.units = None + self.valid_min = None + self.valid_max = None + self.grid = None + @classmethod def get_variable(cls, original_name, silent=False): @@ -50,20 +57,105 @@ class Variable(object): Loads the CMOR csv and creates the variables dictionary """ Variable._dict_variables = dict() - csv_table_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'cmor_tables/{0}.csv'.format(table_name)) + # cls._load_variable_list('default') + cls._load_variable_list(table_name) + + @classmethod + def _load_variable_list(cls, table_name): + csv_path = cls._get_csv_path(table_name) + if os.path.isfile(csv_path): + cls._load_file(csv_path) + return + json_folder = cls._get_json_folder(table_name) + if os.path.isdir(json_folder): + cls._load_json(json_folder) + + @classmethod + def _get_csv_path(cls, table_name): + csv_table_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'cmor_tables/{0}.csv'.format(table_name)) + return csv_table_path + + @classmethod + def _get_json_folder(cls, table_name): + json_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'cmor_tables/{0}/Tables'.format(table_name)) + return json_folder + + @classmethod + def _load_file(cls, csv_table_path): with open(csv_table_path, 'rb') as csvfile: reader = csv.reader(csvfile, dialect='excel') for line in reader: if line[0] == 'Variable': continue - var = Variable(line) + var = Variable() + var.parse_csv(line) if not var.short_name: continue - for old_name in line[0].split(':'): - Variable._dict_variables[old_name.lower()] = var + + for alternative_name in line[0].split(':'): + alternative_name = alternative_name.lower() + if alternative_name in Variable._dict_variables: + old_var = Variable._dict_variables[alternative_name] + Variable._dict_variables[old_var.short_name.lower()] = var + Variable._dict_variables[alternative_name] = var Variable._dict_variables[var.short_name.lower()] = var + @classmethod + def _load_json(cls, json_folder): + for file_name in os.listdir(json_folder): + if file_name in ('CMIP6_grids.json', 'CMIP6_formula_terms.json'): + continue + json_data = open(os.path.join(json_folder, file_name)).read() + data = json.loads(json_data) + if 'variable_entry' in data: + Log.debug('Parsing file {0}'.format(file_name)) + cls._load_json_variables(data['variable_entry']) + + @classmethod + def _load_json_variables(cls, json_data): + for short_name in json_data.keys(): + variable = Variable() + try: + variable.parse_json(json_data[short_name], short_name) + Variable._dict_variables[variable.short_name.lower()] = variable + except VariableJsonException: + Log.error('Could not read variable {0}'.format(short_name)) + + def parse_json(self, json_var, key): + if 'out_name' in json_var: + self.short_name = json_var['out_name'] + else: + raise VariableJsonException('Variable has no out name defined'.format(key)) + self.standard_name = json_var['standard_name'] + self.long_name = json_var['long_name'] + + domain = json_var['modeling_realm'].split(' ') + if len(domain) > 1: + Log.warning('Multiple modeling realms assigned to variable {0}: {1}. ' + 'We wil use first ({1[0]}) as domain'.format(self.short_name, domain)) + if not domain[0]: + Log.warning('Variable {0} has no modeling realm defined'.format(self.short_name)) + else: + self.domain = Domain(domain[0]) + + self.valid_min = json_var['valid_min'] + self.valid_max = json_var['valid_max'] + self.units = json_var['units'] + + def parse_csv(self, var_line): + self.short_name = var_line[1].strip() + self.standard_name = var_line[2].strip() + self.long_name = var_line[3].strip() + self.domain = Domain(var_line[4].strip()) + self.basin = Basins.parse(var_line[5]) + self.units = var_line[6].strip() + self.valid_min = var_line[7].strip() + self.valid_max = var_line[8].strip() + self.grid = var_line[9].strip() + class Domain(object): @@ -79,7 +171,11 @@ class Domain(object): self.name = 'seaIce' elif domain_name == 'landice': self.name = 'landIce' - elif domain_name in ['ocean', 'atmos', 'land']: + elif domain_name == 'atmoschem': + self.name = 'atmosChem' + elif domain_name == 'ocnbgchem': + self.name = 'ocnBgchem' + elif domain_name in ['ocean', 'atmos', 'land', 'aerosol']: self.name = domain_name else: raise ValueError('Domain {0} not recognized!'.format(domain_name)) @@ -124,6 +220,7 @@ class Domains(object): landIce = Domain('landIce') atmos = Domain('atmos') land = Domain('land') + aerosol = Domain('aerosol') class VarType(object): -- GitLab From 4665c1c68b895c792e15c40bd4c9c307b7f6811c Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Wed, 7 Dec 2016 12:38:19 +0100 Subject: [PATCH 04/22] Simplified manifest --- MANIFEST.in | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index b4ddfecf..fdd60f8f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,4 @@ -recursive-include earthdiagnostics *.so *.csv *.json *.pdf *.md +graft earthdiagnostics include diags.conf include README -include VERSION -include earthdiagnostics/EarthDiagnostics.pdf \ No newline at end of file +include VERSION \ No newline at end of file -- GitLab From b164f2fbb409eab849b4d526b4e417aceda83fad Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Wed, 7 Dec 2016 15:10:50 +0100 Subject: [PATCH 05/22] Extracted Variable class method to singleton class --- earthdiagnostics/cmorizer.py | 6 +- earthdiagnostics/cmormanager.py | 4 +- earthdiagnostics/config.py | 4 +- earthdiagnostics/datamanager.py | 5 +- .../statistics/climatologicalpercentile.py | 4 +- earthdiagnostics/threddsmanager.py | 4 +- earthdiagnostics/variable.py | 101 +++++++++--------- test/unit/__init__.py | 2 +- test/unit/test_variable.py | 44 ++++---- 9 files changed, 90 insertions(+), 84 deletions(-) diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index cfc6b5ce..d9f38efc 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -10,7 +10,7 @@ import pygrib from autosubmit.config.log import Log from autosubmit.date.chunk_date_lib import parse_date, chunk_end_date, previous_day, date2str, add_months -from earthdiagnostics.variable import Variable, Domains +from earthdiagnostics.variable import Domains from earthdiagnostics.utils import TempFile, Utils @@ -84,7 +84,7 @@ class Cmorizer(object): for filename in glob.glob(os.path.join(self.cmor_scratch, '*.nc')): handler = Utils.openCdf(filename) for varname in handler.variables.keys(): - cmor_var = Variable.get_variable(varname, True) + cmor_var = self.data_manager.variable_list.get_variable(varname, True) if cmor_var.short_name not in fluxes_vars: continue handler.variables[varname][:] = handler.variables[varname][:] / self.experiment.atmos_timestep * 3600 @@ -305,7 +305,7 @@ class Cmorizer(object): :type variable: str """ temp = TempFile.get() - var_cmor = Variable.get_variable(variable) + var_cmor = self.data_manager.variable_list.get_variable(variable) if var_cmor is None: return if not self.cmor.cmorize(var_cmor): diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index ad5d2f8f..bafde173 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -9,7 +9,7 @@ from autosubmit.date.chunk_date_lib import parse_date, chunk_start_date, chunk_e from earthdiagnostics.cmorizer import Cmorizer from earthdiagnostics.datamanager import DataManager, NetCDFFile from earthdiagnostics.utils import TempFile, Utils -from earthdiagnostics.variable import Variable, VarType +from earthdiagnostics.variable import VarType class CMORManager(DataManager): @@ -236,7 +236,7 @@ class CMORManager(DataManager): :type vartype: VarType """ original_var = var - cmor_var = Variable.get_variable(var) + cmor_var = self.variable_list.get_variable(var) var = self._get_final_var_name(box, var) if rename_var and rename_var != var: diff --git a/earthdiagnostics/config.py b/earthdiagnostics/config.py index b4329ebc..64d4802b 100644 --- a/earthdiagnostics/config.py +++ b/earthdiagnostics/config.py @@ -5,7 +5,7 @@ from autosubmit.config.log import Log from autosubmit.date.chunk_date_lib import parse_date, chunk_start_date, chunk_end_date from earthdiagnostics.parser import Parser -from earthdiagnostics.variable import Variable +from earthdiagnostics.variable import VariableList from utils import Utils @@ -135,7 +135,7 @@ class CMORConfig(object): if self._variable_list is None: return True for var in variables: - if self.cmorize(Variable.get_variable(var, silent=True)): + if self.cmorize(VariableList().get_variable(var, silent=True)): return True return False diff --git a/earthdiagnostics/datamanager.py b/earthdiagnostics/datamanager.py index da300865..67c6ada4 100644 --- a/earthdiagnostics/datamanager.py +++ b/earthdiagnostics/datamanager.py @@ -10,7 +10,7 @@ import re from cfunits import Units from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Variable, Domains, VarType +from earthdiagnostics.variable import Variable, Domains, VarType, VariableList class DataManager(object): @@ -24,7 +24,8 @@ class DataManager(object): self.config = config self.experiment = config.experiment self._checked_vars = list() - Variable.load_variables(self.config.data_convention) + self.variable_list = VariableList() + self.variable_list.load_variables(self.config.data_convention) UnitConversion.load_conversions() self.lock = threading.Lock() diff --git a/earthdiagnostics/statistics/climatologicalpercentile.py b/earthdiagnostics/statistics/climatologicalpercentile.py index 543f3140..222411be 100644 --- a/earthdiagnostics/statistics/climatologicalpercentile.py +++ b/earthdiagnostics/statistics/climatologicalpercentile.py @@ -4,7 +4,7 @@ from autosubmit.config.log import Log from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticListIntOption, \ DiagnosticIntOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Variable, VarType +from earthdiagnostics.variable import VarType import numpy as np @@ -36,7 +36,7 @@ class ClimatologicalPercentile(Diagnostic): self.num_bins = num_bins self._bins = None self.percentiles = np.array([0.1, 0.25, 0.33, 0.5, 0.66, 0.75, 0.9]) - self.cmor_var = Variable.get_variable(variable, silent=True) + self.cmor_var = data_manager.variable_list.get_variable(variable, silent=True) if self.cmor_var and self.cmor_var.valid_max and self.cmor_var.valid_min: self.max_value = float(self.cmor_var.valid_max) self.min_value = float(self.cmor_var.valid_min) diff --git a/earthdiagnostics/threddsmanager.py b/earthdiagnostics/threddsmanager.py index 8760ffa4..cab1b08c 100644 --- a/earthdiagnostics/threddsmanager.py +++ b/earthdiagnostics/threddsmanager.py @@ -6,7 +6,7 @@ from earthdiagnostics.datamanager import DataManager, NetCDFFile from earthdiagnostics.utils import TempFile, Utils from datetime import datetime -from earthdiagnostics.variable import Variable, VarType +from earthdiagnostics.variable import VarType, VariableList class THREDDSManager(DataManager): @@ -130,7 +130,7 @@ class THREDDSManager(DataManager): if cmorized: raise ValueError('cmorized is not supported in THREDDS manager') original_var = var - cmor_var = Variable.get_variable(var) + cmor_var = VariableList().get_variable(var) var = self._get_final_var_name(box, var) if rename_var and rename_var != var: diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 066ac816..f01ca204 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -1,7 +1,6 @@ # coding=utf-8 import csv import json -from pprint import pprint import os from autosubmit.config.log import Log @@ -13,27 +12,22 @@ class VariableJsonException(Exception): pass -class Variable(object): - """ - Class to characterize a CMOR variable. It also contains the static method to make the match between thje original - name and the standard name. Requires data _convetion to be available in cmor_tables to work. - """ - _dict_variables = None +class SingletonType(type): + def __call__(cls, *args): + try: + return cls.__instance + except AttributeError: + cls.__instance = super(SingletonType, cls).__call__(*args) + return cls.__instance - def __init__(self): - self.short_name = None - self.standard_name = None - self.long_name = None - self.domain = None - self.basin = None - self.units = None - self.valid_min = None - self.valid_max = None - self.grid = None +class VariableList(object): + __metaclass__ = SingletonType + + def __init__(self): + self._dict_variables = {} - @classmethod - def get_variable(cls, original_name, silent=False): + def get_variable(self, original_name, silent=False): """ Returns the cmor variable instance given a variable name @@ -45,45 +39,40 @@ class Variable(object): :rtype: Variable """ try: - return cls._dict_variables[original_name.lower()] + return self._dict_variables[original_name.lower()] except KeyError: if not silent: Log.warning('Variable {0} is not defined in the CMOR table. Please add it'.format(original_name)) return None - @classmethod - def load_variables(cls, table_name): + def load_variables(self, table_name): """ Loads the CMOR csv and creates the variables dictionary """ Variable._dict_variables = dict() # cls._load_variable_list('default') - cls._load_variable_list(table_name) + self._load_variable_list(table_name) - @classmethod - def _load_variable_list(cls, table_name): - csv_path = cls._get_csv_path(table_name) + def _load_variable_list(self, table_name): + csv_path = self._get_csv_path(table_name) if os.path.isfile(csv_path): - cls._load_file(csv_path) + self._load_file(csv_path) return - json_folder = cls._get_json_folder(table_name) + json_folder = self._get_json_folder(table_name) if os.path.isdir(json_folder): - cls._load_json(json_folder) + self._load_json(json_folder) - @classmethod - def _get_csv_path(cls, table_name): + def _get_csv_path(self, table_name): csv_table_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'cmor_tables/{0}.csv'.format(table_name)) return csv_table_path - @classmethod - def _get_json_folder(cls, table_name): + def _get_json_folder(self, table_name): json_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'cmor_tables/{0}/Tables'.format(table_name)) + 'cmor_tables/{0}/Tables'.format(table_name)) return json_folder - @classmethod - def _load_file(cls, csv_table_path): + def _load_file(self, csv_table_path): with open(csv_table_path, 'rb') as csvfile: reader = csv.reader(csvfile, dialect='excel') for line in reader: @@ -97,14 +86,13 @@ class Variable(object): for alternative_name in line[0].split(':'): alternative_name = alternative_name.lower() - if alternative_name in Variable._dict_variables: - old_var = Variable._dict_variables[alternative_name] - Variable._dict_variables[old_var.short_name.lower()] = var - Variable._dict_variables[alternative_name] = var - Variable._dict_variables[var.short_name.lower()] = var - - @classmethod - def _load_json(cls, json_folder): + if alternative_name in self._dict_variables: + old_var = self._dict_variables[alternative_name] + self._dict_variables[old_var.short_name.lower()] = var + self._dict_variables[alternative_name] = var + self._dict_variables[var.short_name.lower()] = var + + def _load_json(self, json_folder): for file_name in os.listdir(json_folder): if file_name in ('CMIP6_grids.json', 'CMIP6_formula_terms.json'): continue @@ -112,18 +100,35 @@ class Variable(object): data = json.loads(json_data) if 'variable_entry' in data: Log.debug('Parsing file {0}'.format(file_name)) - cls._load_json_variables(data['variable_entry']) + self._load_json_variables(data['variable_entry']) - @classmethod - def _load_json_variables(cls, json_data): + def _load_json_variables(self, json_data): for short_name in json_data.keys(): variable = Variable() try: variable.parse_json(json_data[short_name], short_name) - Variable._dict_variables[variable.short_name.lower()] = variable + self._dict_variables[variable.short_name.lower()] = variable except VariableJsonException: Log.error('Could not read variable {0}'.format(short_name)) +class Variable(object): + """ + Class to characterize a CMOR variable. It also contains the static method to make the match between thje original + name and the standard name. Requires data _convetion to be available in cmor_tables to work. + """ + _dict_variables = None + + def __init__(self): + self.short_name = None + self.standard_name = None + self.long_name = None + self.domain = None + self.basin = None + self.units = None + self.valid_min = None + self.valid_max = None + self.grid = None + def parse_json(self, json_var, key): if 'out_name' in json_var: self.short_name = json_var['out_name'] diff --git a/test/unit/__init__.py b/test/unit/__init__.py index c611a13f..3c07e901 100644 --- a/test/unit/__init__.py +++ b/test/unit/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from test_data_manager import TestConversion -from test.unit.test_variable import TestVariable +# from test.unit.test_variable import TestVariable from test_constants import TestBasin, TestBasins from test_box import TestBox from test_diagnostic import * diff --git a/test/unit/test_variable.py b/test/unit/test_variable.py index ffc3d037..a92cf147 100644 --- a/test/unit/test_variable.py +++ b/test/unit/test_variable.py @@ -4,25 +4,25 @@ from unittest import TestCase from earthdiagnostics.variable import Variable, Domains -class TestVariable(TestCase): - - def test__init__(self): - variable = Variable('alias:alias2,name,standard_name,long_name,ocean,basin,units,' - 'valid_min,valid_max,grid'.split(',')) - self.assertEqual(variable.short_name, 'name') - self.assertEqual(variable.standard_name, 'standard_name') - self.assertEqual(variable.long_name, 'long_name') - self.assertEqual(variable.domain, Domains.ocean) - self.assertEqual(variable.basin, None) - self.assertEqual(variable.units, 'units') - self.assertEqual(variable.valid_min, 'valid_min') - self.assertEqual(variable.valid_max, 'valid_max') - self.assertEqual(variable.grid, 'grid') - - def test_get_variable(self): - Variable._dict_variables = dict() - variable = Variable('alias:alias2,name,standard_name,long_name,atmos,basin,units,valid_min,' - 'valid_max,grid'.split(',')) - Variable._dict_variables['var'] = variable - self.assertIs(Variable.get_variable('var'), variable) - self.assertIsNone(Variable.get_variable('novar')) +# class TestVariable(TestCase): +# +# def test__init__(self): +# variable = Variable('alias:alias2,name,standard_name,long_name,ocean,basin,units,' +# 'valid_min,valid_max,grid'.split(',')) +# self.assertEqual(variable.short_name, 'name') +# self.assertEqual(variable.standard_name, 'standard_name') +# self.assertEqual(variable.long_name, 'long_name') +# self.assertEqual(variable.domain, Domains.ocean) +# self.assertEqual(variable.basin, None) +# self.assertEqual(variable.units, 'units') +# self.assertEqual(variable.valid_min, 'valid_min') +# self.assertEqual(variable.valid_max, 'valid_max') +# self.assertEqual(variable.grid, 'grid') +# +# def test_get_variable(self): +# Variable._dict_variables = dict() +# variable = Variable('alias:alias2,name,standard_name,long_name,atmos,basin,units,valid_min,' +# 'valid_max,grid'.split(',')) +# Variable._dict_variables['var'] = variable +# self.assertIs(Variable.get_variable('var'), variable) +# self.assertIsNone(Variable.get_variable('novar')) -- GitLab From 05d4ed7f2aefdc12e450e06fac5d5fc0e0f4ee42 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Wed, 7 Dec 2016 15:13:57 +0100 Subject: [PATCH 06/22] Extracted domain and domains classes to its own file --- earthdiagnostics/cmorizer.py | 2 +- earthdiagnostics/datamanager.py | 3 +- earthdiagnostics/diagnostic.py | 3 +- earthdiagnostics/domain.py | 67 ++++++++++++++++++ earthdiagnostics/general/attribute.py | 2 +- earthdiagnostics/general/monthlymean.py | 2 +- earthdiagnostics/general/relink.py | 2 +- earthdiagnostics/general/rewrite.py | 2 +- earthdiagnostics/general/scale.py | 2 +- earthdiagnostics/ocean/areamoc.py | 2 +- earthdiagnostics/ocean/averagesection.py | 3 +- earthdiagnostics/ocean/convectionsites.py | 2 +- earthdiagnostics/ocean/cutsection.py | 2 +- earthdiagnostics/ocean/gyres.py | 2 +- earthdiagnostics/ocean/heatcontent.py | 2 +- earthdiagnostics/ocean/heatcontentlayer.py | 2 +- earthdiagnostics/ocean/interpolate.py | 2 +- earthdiagnostics/ocean/interpolatecdo.py | 3 +- earthdiagnostics/ocean/maxmoc.py | 2 +- .../ocean/mixedlayerheatcontent.py | 2 +- .../ocean/mixedlayersaltcontent.py | 2 +- earthdiagnostics/ocean/moc.py | 2 +- earthdiagnostics/ocean/psi.py | 2 +- earthdiagnostics/ocean/siasiesiv.py | 2 +- earthdiagnostics/ocean/verticalmean.py | 2 +- earthdiagnostics/ocean/verticalmeanmeters.py | 2 +- earthdiagnostics/variable.py | 68 +------------------ test/unit/test_averagesection.py | 2 +- test/unit/test_cutsection.py | 2 +- test/unit/test_diagnostic.py | 2 +- test/unit/test_interpolate.py | 2 +- test/unit/test_monthlymean.py | 2 +- test/unit/test_rewrite.py | 2 +- test/unit/test_variable.py | 3 +- 34 files changed, 104 insertions(+), 100 deletions(-) create mode 100644 earthdiagnostics/domain.py diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index d9f38efc..079426fe 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -10,7 +10,7 @@ import pygrib from autosubmit.config.log import Log from autosubmit.date.chunk_date_lib import parse_date, chunk_end_date, previous_day, date2str, add_months -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains from earthdiagnostics.utils import TempFile, Utils diff --git a/earthdiagnostics/datamanager.py b/earthdiagnostics/datamanager.py index 67c6ada4..c6534a8c 100644 --- a/earthdiagnostics/datamanager.py +++ b/earthdiagnostics/datamanager.py @@ -10,7 +10,8 @@ import re from cfunits import Units from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Variable, Domains, VarType, VariableList +from earthdiagnostics.variable import Variable, VarType, VariableList +from earthdiagnostics.domain import Domains class DataManager(object): diff --git a/earthdiagnostics/diagnostic.py b/earthdiagnostics/diagnostic.py index 42bae82b..1702f831 100644 --- a/earthdiagnostics/diagnostic.py +++ b/earthdiagnostics/diagnostic.py @@ -1,6 +1,7 @@ # coding=utf-8 from earthdiagnostics.constants import Basins -from earthdiagnostics.variable import VarType, Domain +from earthdiagnostics.variable import VarType +from earthdiagnostics.domain import Domain class Diagnostic(object): diff --git a/earthdiagnostics/domain.py b/earthdiagnostics/domain.py new file mode 100644 index 00000000..41d2f2d9 --- /dev/null +++ b/earthdiagnostics/domain.py @@ -0,0 +1,67 @@ +class Domain(object): + + @staticmethod + def parse(domain_name): + if isinstance(domain_name, Domain): + return domain_name + return Domain(domain_name) + + def __init__(self, domain_name): + domain_name = domain_name.lower() + if domain_name == 'seaice': + self.name = 'seaIce' + elif domain_name == 'landice': + self.name = 'landIce' + elif domain_name == 'atmoschem': + self.name = 'atmosChem' + elif domain_name == 'ocnbgchem': + self.name = 'ocnBgchem' + elif domain_name in ['ocean', 'atmos', 'land', 'aerosol']: + self.name = domain_name + else: + raise ValueError('Domain {0} not recognized!'.format(domain_name)) + + def __eq__(self, other): + return other.__class__ == Domain and self.name == other.name + + def __str__(self): + return self.name + + def get_table_name(self, frequency, data_convention): + """ + Returns the table name for a domain-frequency pair + :param data_convention: Data convention in use + :type data_convention: str + :param frequency: variable's frequency + :type frequency: str + :return: variable's table name + :rtype: str + """ + if frequency in ('mon', 'clim'): + if self.name == 'seaIce': + if data_convention == 'specs': + prefix = 'OI' + else: + prefix = 'SI' + elif self.name == 'landIce': + prefix = 'LI' + else: + prefix = self.name[0].upper() + table_name = prefix + frequency + elif frequency == '6hr': + table_name = '6hrPlev' + else: + table_name = 'day' + return table_name + + +class Domains(object): + seaIce = Domain('seaice') + ocean = Domain('ocean') + landIce = Domain('landIce') + atmos = Domain('atmos') + land = Domain('land') + aerosol = Domain('aerosol') + atmosChem = Domain('atmosChem') + ocnBgchem = Domain('ocnBgchem') + diff --git a/earthdiagnostics/general/attribute.py b/earthdiagnostics/general/attribute.py index c503424c..690d8bc8 100644 --- a/earthdiagnostics/general/attribute.py +++ b/earthdiagnostics/general/attribute.py @@ -1,7 +1,7 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticComplexStrOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils -from earthdiagnostics.variable import Domain +from earthdiagnostics.domain import Domain class Attribute(Diagnostic): diff --git a/earthdiagnostics/general/monthlymean.py b/earthdiagnostics/general/monthlymean.py index cf382d29..fdf2af48 100644 --- a/earthdiagnostics/general/monthlymean.py +++ b/earthdiagnostics/general/monthlymean.py @@ -3,7 +3,7 @@ import os from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domain +from earthdiagnostics.domain import Domain class MonthlyMean(Diagnostic): diff --git a/earthdiagnostics/general/relink.py b/earthdiagnostics/general/relink.py index a5956406..23cd924e 100644 --- a/earthdiagnostics/general/relink.py +++ b/earthdiagnostics/general/relink.py @@ -1,6 +1,6 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticBoolOption -from earthdiagnostics.variable import Domain +from earthdiagnostics.domain import Domain class Relink(Diagnostic): diff --git a/earthdiagnostics/general/rewrite.py b/earthdiagnostics/general/rewrite.py index dcb7b8aa..528d2d5d 100644 --- a/earthdiagnostics/general/rewrite.py +++ b/earthdiagnostics/general/rewrite.py @@ -1,6 +1,6 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption -from earthdiagnostics.variable import Domain +from earthdiagnostics.domain import Domain class Rewrite(Diagnostic): diff --git a/earthdiagnostics/general/scale.py b/earthdiagnostics/general/scale.py index 06178e41..3697154a 100644 --- a/earthdiagnostics/general/scale.py +++ b/earthdiagnostics/general/scale.py @@ -1,7 +1,7 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticFloatOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils -from earthdiagnostics.variable import Domain +from earthdiagnostics.domain import Domain import numpy as np import math diff --git a/earthdiagnostics/ocean/areamoc.py b/earthdiagnostics/ocean/areamoc.py index 361ab8c7..8372c663 100644 --- a/earthdiagnostics/ocean/areamoc.py +++ b/earthdiagnostics/ocean/areamoc.py @@ -6,7 +6,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.utils import Utils, TempFile import os -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class AreaMoc(Diagnostic): diff --git a/earthdiagnostics/ocean/averagesection.py b/earthdiagnostics/ocean/averagesection.py index dadc4ceb..512771fa 100644 --- a/earthdiagnostics/ocean/averagesection.py +++ b/earthdiagnostics/ocean/averagesection.py @@ -3,8 +3,7 @@ import os from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticIntOption, DiagnosticOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domain -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domain, Domains class AverageSection(Diagnostic): diff --git a/earthdiagnostics/ocean/convectionsites.py b/earthdiagnostics/ocean/convectionsites.py index 936f5c9d..8a5ac9d8 100644 --- a/earthdiagnostics/ocean/convectionsites.py +++ b/earthdiagnostics/ocean/convectionsites.py @@ -4,7 +4,7 @@ from autosubmit.config.log import Log from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile from earthdiagnostics.constants import Models -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class ConvectionSites(Diagnostic): diff --git a/earthdiagnostics/ocean/cutsection.py b/earthdiagnostics/ocean/cutsection.py index 786d4d20..efe09c4c 100644 --- a/earthdiagnostics/ocean/cutsection.py +++ b/earthdiagnostics/ocean/cutsection.py @@ -6,7 +6,7 @@ from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, Diagnostic DiagnosticDomainOption from earthdiagnostics.box import Box from earthdiagnostics.utils import Utils -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class CutSection(Diagnostic): diff --git a/earthdiagnostics/ocean/gyres.py b/earthdiagnostics/ocean/gyres.py index 48d612d1..860fd384 100644 --- a/earthdiagnostics/ocean/gyres.py +++ b/earthdiagnostics/ocean/gyres.py @@ -5,7 +5,7 @@ from autosubmit.config.log import Log from earthdiagnostics.constants import Models from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class Gyres(Diagnostic): diff --git a/earthdiagnostics/ocean/heatcontent.py b/earthdiagnostics/ocean/heatcontent.py index a8eb631f..0d08d9b4 100644 --- a/earthdiagnostics/ocean/heatcontent.py +++ b/earthdiagnostics/ocean/heatcontent.py @@ -8,7 +8,7 @@ from earthdiagnostics.constants import Basins from earthdiagnostics.utils import Utils, TempFile from earthdiagnostics.diagnostic import Diagnostic, DiagnosticBasinOption, DiagnosticIntOption from earthdiagnostics.box import Box -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class HeatContent(Diagnostic): diff --git a/earthdiagnostics/ocean/heatcontentlayer.py b/earthdiagnostics/ocean/heatcontentlayer.py index a22e5bc3..06bda389 100644 --- a/earthdiagnostics/ocean/heatcontentlayer.py +++ b/earthdiagnostics/ocean/heatcontentlayer.py @@ -5,7 +5,7 @@ from earthdiagnostics.constants import Basins from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticIntOption, DiagnosticBasinOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class HeatContentLayer(Diagnostic): diff --git a/earthdiagnostics/ocean/interpolate.py b/earthdiagnostics/ocean/interpolate.py index 1410be56..36a86eb8 100644 --- a/earthdiagnostics/ocean/interpolate.py +++ b/earthdiagnostics/ocean/interpolate.py @@ -6,7 +6,7 @@ import os from autosubmit.config.log import Log from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticBoolOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class Interpolate(Diagnostic): diff --git a/earthdiagnostics/ocean/interpolatecdo.py b/earthdiagnostics/ocean/interpolatecdo.py index 73d9ff07..e691f16e 100644 --- a/earthdiagnostics/ocean/interpolatecdo.py +++ b/earthdiagnostics/ocean/interpolatecdo.py @@ -4,8 +4,7 @@ from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, Diagnostic from earthdiagnostics.utils import Utils, TempFile import numpy as np -from earthdiagnostics.variable import Domain -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domain, Domains class InterpolateCDO(Diagnostic): diff --git a/earthdiagnostics/ocean/maxmoc.py b/earthdiagnostics/ocean/maxmoc.py index 847ff84a..67d202a0 100644 --- a/earthdiagnostics/ocean/maxmoc.py +++ b/earthdiagnostics/ocean/maxmoc.py @@ -7,7 +7,7 @@ from earthdiagnostics.constants import Basins from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticIntOption, DiagnosticBasinOption from earthdiagnostics.utils import Utils -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class MaxMoc(Diagnostic): diff --git a/earthdiagnostics/ocean/mixedlayerheatcontent.py b/earthdiagnostics/ocean/mixedlayerheatcontent.py index f5af3f53..58c14617 100644 --- a/earthdiagnostics/ocean/mixedlayerheatcontent.py +++ b/earthdiagnostics/ocean/mixedlayerheatcontent.py @@ -4,7 +4,7 @@ import os from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics import cdftools from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class MixedLayerHeatContent(Diagnostic): diff --git a/earthdiagnostics/ocean/mixedlayersaltcontent.py b/earthdiagnostics/ocean/mixedlayersaltcontent.py index 2fda1b3f..cd8999a5 100644 --- a/earthdiagnostics/ocean/mixedlayersaltcontent.py +++ b/earthdiagnostics/ocean/mixedlayersaltcontent.py @@ -3,7 +3,7 @@ import os from earthdiagnostics import cdftools from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class MixedLayerSaltContent(Diagnostic): diff --git a/earthdiagnostics/ocean/moc.py b/earthdiagnostics/ocean/moc.py index 459651d2..11fa94ed 100644 --- a/earthdiagnostics/ocean/moc.py +++ b/earthdiagnostics/ocean/moc.py @@ -6,7 +6,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.constants import Basins from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class Moc(Diagnostic): diff --git a/earthdiagnostics/ocean/psi.py b/earthdiagnostics/ocean/psi.py index 0cabb679..73774c7f 100644 --- a/earthdiagnostics/ocean/psi.py +++ b/earthdiagnostics/ocean/psi.py @@ -2,7 +2,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class Psi(Diagnostic): diff --git a/earthdiagnostics/ocean/siasiesiv.py b/earthdiagnostics/ocean/siasiesiv.py index 1df3841b..852213b4 100644 --- a/earthdiagnostics/ocean/siasiesiv.py +++ b/earthdiagnostics/ocean/siasiesiv.py @@ -8,7 +8,7 @@ from earthdiagnostics.utils import Utils, TempFile import earthdiagnostics.cdftoolspython as cdftoolspython import numpy as np -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class Siasiesiv(Diagnostic): diff --git a/earthdiagnostics/ocean/verticalmean.py b/earthdiagnostics/ocean/verticalmean.py index 41b6e24c..2ef58171 100644 --- a/earthdiagnostics/ocean/verticalmean.py +++ b/earthdiagnostics/ocean/verticalmean.py @@ -3,7 +3,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticIntOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class VerticalMean(Diagnostic): diff --git a/earthdiagnostics/ocean/verticalmeanmeters.py b/earthdiagnostics/ocean/verticalmeanmeters.py index 9eed80fc..4f578bcb 100644 --- a/earthdiagnostics/ocean/verticalmeanmeters.py +++ b/earthdiagnostics/ocean/verticalmeanmeters.py @@ -3,7 +3,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticFloatOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class VerticalMeanMeters(Diagnostic): diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index f01ca204..ffff1c9a 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -6,6 +6,7 @@ import os from autosubmit.config.log import Log from earthdiagnostics.constants import Basins +from earthdiagnostics.domain import Domain class VariableJsonException(Exception): @@ -111,6 +112,7 @@ class VariableList(object): except VariableJsonException: Log.error('Could not read variable {0}'.format(short_name)) + class Variable(object): """ Class to characterize a CMOR variable. It also contains the static method to make the match between thje original @@ -162,72 +164,6 @@ class Variable(object): self.grid = var_line[9].strip() -class Domain(object): - - @staticmethod - def parse(domain_name): - if isinstance(domain_name, Domain): - return domain_name - return Domain(domain_name) - - def __init__(self, domain_name): - domain_name = domain_name.lower() - if domain_name == 'seaice': - self.name = 'seaIce' - elif domain_name == 'landice': - self.name = 'landIce' - elif domain_name == 'atmoschem': - self.name = 'atmosChem' - elif domain_name == 'ocnbgchem': - self.name = 'ocnBgchem' - elif domain_name in ['ocean', 'atmos', 'land', 'aerosol']: - self.name = domain_name - else: - raise ValueError('Domain {0} not recognized!'.format(domain_name)) - - def __eq__(self, other): - return other.__class__ == Domain and self.name == other.name - - def __str__(self): - return self.name - - def get_table_name(self, frequency, data_convention): - """ - Returns the table name for a domain-frequency pair - :param data_convention: Data convention in use - :type data_convention: str - :param frequency: variable's frequency - :type frequency: str - :return: variable's table name - :rtype: str - """ - if frequency in ('mon', 'clim'): - if self.name == 'seaIce': - if data_convention == 'specs': - prefix = 'OI' - else: - prefix = 'SI' - elif self.name == 'landIce': - prefix = 'LI' - else: - prefix = self.name[0].upper() - table_name = prefix + frequency - elif frequency == '6hr': - table_name = '6hrPlev' - else: - table_name = 'day' - return table_name - - -class Domains(object): - seaIce = Domain('seaice') - ocean = Domain('ocean') - landIce = Domain('landIce') - atmos = Domain('atmos') - land = Domain('land') - aerosol = Domain('aerosol') - - class VarType(object): MEAN = 1 STATISTIC = 2 diff --git a/test/unit/test_averagesection.py b/test/unit/test_averagesection.py index 8df41be7..4406aa37 100644 --- a/test/unit/test_averagesection.py +++ b/test/unit/test_averagesection.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.ocean.averagesection import AverageSection from mock import Mock -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class TestAverageSection(TestCase): diff --git a/test/unit/test_cutsection.py b/test/unit/test_cutsection.py index 6f4d4aa2..5f6c034a 100644 --- a/test/unit/test_cutsection.py +++ b/test/unit/test_cutsection.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.ocean.cutsection import CutSection from mock import Mock -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class TestCutSection(TestCase): diff --git a/test/unit/test_diagnostic.py b/test/unit/test_diagnostic.py index f26a8cf8..579eb0a8 100644 --- a/test/unit/test_diagnostic.py +++ b/test/unit/test_diagnostic.py @@ -2,7 +2,7 @@ from earthdiagnostics.diagnostic import * from unittest import TestCase -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class TestDiagnostic(TestCase): diff --git a/test/unit/test_interpolate.py b/test/unit/test_interpolate.py index 480a230d..76a65359 100644 --- a/test/unit/test_interpolate.py +++ b/test/unit/test_interpolate.py @@ -4,7 +4,7 @@ from unittest import TestCase from earthdiagnostics.ocean.interpolate import Interpolate from mock import Mock -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class TestInterpolate(TestCase): diff --git a/test/unit/test_monthlymean.py b/test/unit/test_monthlymean.py index 128d411f..cdf8a00c 100644 --- a/test/unit/test_monthlymean.py +++ b/test/unit/test_monthlymean.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.general.monthlymean import MonthlyMean from mock import Mock -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class TestMonthlyMean(TestCase): diff --git a/test/unit/test_rewrite.py b/test/unit/test_rewrite.py index 13adc685..f76ef64d 100644 --- a/test/unit/test_rewrite.py +++ b/test/unit/test_rewrite.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.general.rewrite import Rewrite from mock import Mock -from earthdiagnostics.variable import Domains +from earthdiagnostics.domain import Domains class TestRewrite(TestCase): diff --git a/test/unit/test_variable.py b/test/unit/test_variable.py index a92cf147..3575b4b0 100644 --- a/test/unit/test_variable.py +++ b/test/unit/test_variable.py @@ -1,7 +1,8 @@ # coding=utf-8 from unittest import TestCase -from earthdiagnostics.variable import Variable, Domains +from earthdiagnostics.variable import Variable +from earthdiagnostics.domain import Domains # class TestVariable(TestCase): -- GitLab From 2671b3ff4c04cee001fe28c20aec948f51c73638 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 10:00:48 +0100 Subject: [PATCH 07/22] Refactored variable class --- diags.conf | 6 +- earthdiagnostics/cmorizer.py | 8 +- earthdiagnostics/cmormanager.py | 4 +- earthdiagnostics/config.py | 4 +- earthdiagnostics/datamanager.py | 4 +- earthdiagnostics/threddsmanager.py | 4 +- earthdiagnostics/variable.py | 128 ++++++++++++++++++++++++----- 7 files changed, 124 insertions(+), 34 deletions(-) diff --git a/diags.conf b/diags.conf index ec6d5ab6..5c66c008 100644 --- a/diags.conf +++ b/diags.conf @@ -8,15 +8,15 @@ DATA_DIR = /esnas:/esarchive # Specify if your data is from an experiment (exp), observation (obs) or reconstructions (recon) DATA_TYPE = exp # CMORization type to use. Important also for THREDDS as it affects variable name conventions. -# Options: SPECS (default), PRIMAVERA -DATA_CONVENTION = CMIP6 +# Options: SPECS (default), PRIMAVERA, CMIP6 +DATA_CONVENTION = PRIMAVERA # Path to NEMO's mask and grid files needed for CDFTools CON_FILES = /esnas/autosubmit/con_files/ # Diagnostics to run, space separated. You must provide for each one the name and the parameters (comma separated) or # an alias defined in the ALIAS section (see more below). If you are using the diagnpostics just to CMORize, leave it # empty -DIAGS = climpercent,atmos,sfcWind,1 +DIAGS = # DIAGS = OHC # Frequency of the data you want to use by default. Some diagnostics do not use this value: i.e. monmean always stores # its results at monthly frequency (obvious) and has a parameter to specify input's frequency. diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index 079426fe..0039c96f 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -305,7 +305,7 @@ class Cmorizer(object): :type variable: str """ temp = TempFile.get() - var_cmor = self.data_manager.variable_list.get_variable(variable) + alias, var_cmor = self.data_manager.variable_list.get_variable(variable) if var_cmor is None: return if not self.cmor.cmorize(var_cmor): @@ -316,10 +316,10 @@ class Cmorizer(object): self._add_coordinate_variables(handler, temp) - if var_cmor.basin is None: + if alias.basin is None: region = None else: - region = var_cmor.basin.fullname + region = alias.basin.fullname date_str = self.get_date_str(file_path) if date_str is None: @@ -330,7 +330,7 @@ class Cmorizer(object): self.data_manager.send_file(temp, var_cmor.domain, var_cmor.short_name, self.startdate, self.member, frequency=frequency, rename_var=variable, date_str=date_str, region=region, - move_old=True, grid=var_cmor.grid, cmorized=True) + move_old=True, grid=alias.grid, cmorized=True) def get_date_str(self, file_path): file_parts = os.path.basename(file_path).split('_') diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index bafde173..6037cda9 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -125,7 +125,7 @@ class CMORManager(DataManager): startdate, member + 1, time_bound) - elif self.config.data_convention == 'primavera': + elif self.config.data_convention in ('primavera', 'cmip6'): file_name = '{0}_{1}_{2}_{3}_S{4}-r{5}i1p1_{6}{7}'.format(var, domain_abreviattion, self.experiment.experiment_name, @@ -438,7 +438,7 @@ class CMORManager(DataManager): Returns the path to the startdate's CMOR folder :param startdate: target startdate :type startdate: str - :return: path to the startdate's CMOR folder + :return: path to the startdate's CMOR º :rtype: str """ return os.path.join(self.config.data_dir, self.experiment.expid, 'cmorfiles', self.experiment.institute, diff --git a/earthdiagnostics/config.py b/earthdiagnostics/config.py index 64d4802b..3a6b2326 100644 --- a/earthdiagnostics/config.py +++ b/earthdiagnostics/config.py @@ -5,7 +5,7 @@ from autosubmit.config.log import Log from autosubmit.date.chunk_date_lib import parse_date, chunk_start_date, chunk_end_date from earthdiagnostics.parser import Parser -from earthdiagnostics.variable import VariableList +from earthdiagnostics.variable import VariableManager from utils import Utils @@ -135,7 +135,7 @@ class CMORConfig(object): if self._variable_list is None: return True for var in variables: - if self.cmorize(VariableList().get_variable(var, silent=True)): + if self.cmorize(VariableManager().get_variable(var, silent=True)): return True return False diff --git a/earthdiagnostics/datamanager.py b/earthdiagnostics/datamanager.py index c6534a8c..ec768e58 100644 --- a/earthdiagnostics/datamanager.py +++ b/earthdiagnostics/datamanager.py @@ -10,7 +10,7 @@ import re from cfunits import Units from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Variable, VarType, VariableList +from earthdiagnostics.variable import Variable, VarType, VariableManager from earthdiagnostics.domain import Domains @@ -25,7 +25,7 @@ class DataManager(object): self.config = config self.experiment = config.experiment self._checked_vars = list() - self.variable_list = VariableList() + self.variable_list = VariableManager() self.variable_list.load_variables(self.config.data_convention) UnitConversion.load_conversions() self.lock = threading.Lock() diff --git a/earthdiagnostics/threddsmanager.py b/earthdiagnostics/threddsmanager.py index cab1b08c..cb96fcfb 100644 --- a/earthdiagnostics/threddsmanager.py +++ b/earthdiagnostics/threddsmanager.py @@ -6,7 +6,7 @@ from earthdiagnostics.datamanager import DataManager, NetCDFFile from earthdiagnostics.utils import TempFile, Utils from datetime import datetime -from earthdiagnostics.variable import VarType, VariableList +from earthdiagnostics.variable import VarType, VariableManager class THREDDSManager(DataManager): @@ -130,7 +130,7 @@ class THREDDSManager(DataManager): if cmorized: raise ValueError('cmorized is not supported in THREDDS manager') original_var = var - cmor_var = VariableList().get_variable(var) + cmor_var = VariableManager().get_variable(var) var = self._get_final_var_name(box, var) if rename_var and rename_var != var: diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index ffff1c9a..613949f3 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -22,10 +22,12 @@ class SingletonType(type): return cls.__instance -class VariableList(object): +class VariableManager(object): __metaclass__ = SingletonType def __init__(self): + self._cmor_tables_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'cmor_tables') + self._aliases_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'variable_alias') self._dict_variables = {} def get_variable(self, original_name, silent=False): @@ -40,7 +42,25 @@ class VariableList(object): :rtype: Variable """ try: - return self._dict_variables[original_name.lower()] + return self._dict_aliases[original_name.lower()][1] + except KeyError: + if not silent: + Log.warning('Variable {0} is not defined in the CMOR table. Please add it'.format(original_name)) + return None + + def get_variable_and_alias(self, original_name, silent=False): + """ + Returns the cmor variable instance given a variable name + + :param original_name: original variable's name + :type original_name: str + :param silent: if True, omits log warning when variable is not found + :type silent: bool + :return: CMOR variable + :rtype: Variable + """ + try: + return self._dict_aliases[original_name.lower()] except KeyError: if not silent: Log.warning('Variable {0} is not defined in the CMOR table. Please add it'.format(original_name)) @@ -50,31 +70,32 @@ class VariableList(object): """ Loads the CMOR csv and creates the variables dictionary """ - Variable._dict_variables = dict() - # cls._load_variable_list('default') + self._dict_variables = dict() self._load_variable_list(table_name) + self._load_known_aliases() + self._construct_aliases_dict() def _load_variable_list(self, table_name): csv_path = self._get_csv_path(table_name) if os.path.isfile(csv_path): - self._load_file(csv_path) + self._load_file('default') + self._load_file(table_name) return + json_folder = self._get_json_folder(table_name) if os.path.isdir(json_folder): self._load_json(json_folder) def _get_csv_path(self, table_name): - csv_table_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'cmor_tables/{0}.csv'.format(table_name)) + csv_table_path = os.path.join(self._cmor_tables_folder, '{0}.csv'.format(table_name)) return csv_table_path def _get_json_folder(self, table_name): - json_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'cmor_tables/{0}/Tables'.format(table_name)) + json_folder = os.path.join(self._cmor_tables_folder, '{0}/Tables'.format(table_name)) return json_folder def _load_file(self, csv_table_path): - with open(csv_table_path, 'rb') as csvfile: + with open(self._get_csv_path(csv_table_path), 'rb') as csvfile: reader = csv.reader(csvfile, dialect='excel') for line in reader: if line[0] == 'Variable': @@ -85,12 +106,6 @@ class VariableList(object): if not var.short_name: continue - for alternative_name in line[0].split(':'): - alternative_name = alternative_name.lower() - if alternative_name in self._dict_variables: - old_var = self._dict_variables[alternative_name] - self._dict_variables[old_var.short_name.lower()] = var - self._dict_variables[alternative_name] = var self._dict_variables[var.short_name.lower()] = var def _load_json(self, json_folder): @@ -112,26 +127,79 @@ class VariableList(object): except VariableJsonException: Log.error('Could not read variable {0}'.format(short_name)) + def _load_known_aliases(self): + with open(self._get_aliases_csv_path(), 'rb') as csvfile: + reader = csv.reader(csvfile, dialect='excel') + for line in reader: + if line[0] == 'Aliases': + continue + + aliases = line[0].split(':') + if line[1].lower() in self._dict_variables: + cmor_var = self._dict_variables[line[1].lower()] + else: + cmor_vars = [] + for alias in aliases: + if alias.lower() in self._dict_variables: + cmor_vars.append(self._dict_variables[alias.lower()]) + if len(cmor_vars) == 0: + Log.error('Aliases {0} could not be mapped to any variable'.format(aliases)) + continue + elif len(cmor_vars) > 1: + Log.error('Aliases {0} can be be mapped to multiple variables ' + '{1}'.format(aliases, cmor_vars)) + continue + cmor_var = cmor_vars[0] + + for alias in aliases: + if alias != cmor_var.short_name and alias in self._dict_variables: + Log.error('Alias {0} for variable {1} is already a different ' + 'variable!'.format(alias, cmor_var.short_name)) + continue + alias_object = VariableAlias(alias) + if line[2]: + alias_object.basin = Basins.parse(line[2]) + if line[3]: + alias_object.grid = line[3] + cmor_var.known_aliases.append(alias_object) + + def _get_aliases_csv_path(self): + csv_table_path = os.path.join(self._aliases_folder, 'default.csv') + return csv_table_path + + def _construct_aliases_dict(self): + self._dict_aliases = {} + for cmor_var_name in self._dict_variables: + cmor_var = self._dict_variables[cmor_var_name] + if cmor_var_name not in cmor_var.known_aliases: + cmor_var.known_aliases.append(VariableAlias(cmor_var_name)) + Log.debug('Variable: {0} Alias: {1}'.format(cmor_var_name, + ', '.join([str(alias) for alias in cmor_var.known_aliases]))) + for alias in cmor_var.known_aliases: + self._dict_aliases[alias.alias] = (alias, cmor_var) + class Variable(object): """ Class to characterize a CMOR variable. It also contains the static method to make the match between thje original name and the standard name. Requires data _convetion to be available in cmor_tables to work. """ - _dict_variables = None + + def __str__(self): + return '{0} ({1})'.format(self.standard_name, self.short_name) def __init__(self): self.short_name = None self.standard_name = None self.long_name = None - self.domain = None - self.basin = None self.units = None self.valid_min = None self.valid_max = None self.grid = None + self.known_aliases = [] def parse_json(self, json_var, key): + if 'out_name' in json_var: self.short_name = json_var['out_name'] else: @@ -164,6 +232,28 @@ class Variable(object): self.grid = var_line[9].strip() +class VariableAlias(object): + """ + Class to characterize a CMOR variable. It also contains the static method to make the match between thje original + name and the standard name. Requires data _convetion to be available in cmor_tables to work. + """ + + def __init__(self, alias): + self.alias = alias + self.basin = None + self.grid = None + + def __str__(self): + string = self.alias + if self.basin: + string += ' Basin: {0}'.format(self.basin) + if self.grid: + string += ' Grid: {0}'.format(self.grid) + return string + + + + class VarType(object): MEAN = 1 STATISTIC = 2 -- GitLab From e28324d5d0234af835676f8b6b22771cbe05dda4 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 10:36:37 +0100 Subject: [PATCH 08/22] Added table information to variables --- earthdiagnostics/cmor_tables/default.csv | 604 +++++++++--------- earthdiagnostics/cmor_tables/primavera.csv | 30 +- earthdiagnostics/cmor_tables/specs.csv | 2 +- earthdiagnostics/cmorizer.py | 8 +- earthdiagnostics/constants.py | 3 + earthdiagnostics/datamanager.py | 6 +- earthdiagnostics/diagnostic.py | 6 +- earthdiagnostics/general/attribute.py | 4 +- earthdiagnostics/general/monthlymean.py | 4 +- earthdiagnostics/general/relink.py | 4 +- earthdiagnostics/general/rewrite.py | 4 +- earthdiagnostics/general/scale.py | 4 +- .../{domain.py => modelingrealm.py} | 32 +- earthdiagnostics/ocean/areamoc.py | 4 +- earthdiagnostics/ocean/averagesection.py | 6 +- earthdiagnostics/ocean/convectionsites.py | 4 +- earthdiagnostics/ocean/cutsection.py | 4 +- earthdiagnostics/ocean/gyres.py | 4 +- earthdiagnostics/ocean/heatcontent.py | 6 +- earthdiagnostics/ocean/heatcontentlayer.py | 6 +- earthdiagnostics/ocean/interpolate.py | 4 +- earthdiagnostics/ocean/interpolatecdo.py | 6 +- earthdiagnostics/ocean/maxmoc.py | 16 +- .../ocean/mixedlayerheatcontent.py | 8 +- .../ocean/mixedlayersaltcontent.py | 8 +- earthdiagnostics/ocean/moc.py | 6 +- earthdiagnostics/ocean/psi.py | 8 +- earthdiagnostics/ocean/siasiesiv.py | 18 +- earthdiagnostics/ocean/verticalmean.py | 4 +- earthdiagnostics/ocean/verticalmeanmeters.py | 4 +- earthdiagnostics/variable.py | 25 +- test/unit/test_averagesection.py | 12 +- test/unit/test_cutsection.py | 12 +- test/unit/test_diagnostic.py | 10 +- test/unit/test_interpolate.py | 16 +- test/unit/test_monthlymean.py | 16 +- test/unit/test_rewrite.py | 12 +- test/unit/test_variable.py | 2 +- 38 files changed, 477 insertions(+), 455 deletions(-) rename earthdiagnostics/{domain.py => modelingrealm.py} (68%) diff --git a/earthdiagnostics/cmor_tables/default.csv b/earthdiagnostics/cmor_tables/default.csv index 5c403f0d..fac5a510 100644 --- a/earthdiagnostics/cmor_tables/default.csv +++ b/earthdiagnostics/cmor_tables/default.csv @@ -1,302 +1,302 @@ -Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid -iiceages:siage:iice_otd,ageice,age_of_sea_ice,Age of sea ice,seaIce,,,,, -al,al,surface_albedo,Albedo,atmos,,,,, -bgfrcsal,bgfrcsal,change_over_time_in_heat_content_from_forcing,Change over time in salt content from forcing,ocean,,,,, -bgfrctem,bgfrctem,change_over_time_in_heat_content_from_forcing,Change over time in heat content from forcing,ocean,,,,, -bgfrcvol,bgfrcvol,change_over_time_in_volume_from_forcing,Change over time in volume from forcing,ocean,,,,, -bgheatco,bgheatco,change_over_time_in_heat_content,Change over time in sea water heat content,ocean,,,,, -bgsaline,bgsaline,change_over_time_in_sea_water_practical_salinity,Change over time in sea water salinity,ocean,,,,, -bgsaltco,bgsaltco,change_over_time_in_salt_content,Change over time in sea water salt content,ocean,,,,, -bgtemper,bgtemper,change_over_time_in_sea_water_potential_temperature,Change over time in sea water potential temperature,ocean,,,,, -bgvole3t,bgvole3t,change_over_time_in_volume_variation,Change over time in volume variation (e3t),ocean,,,,, -bgvolssh,bgvolssh,change_over_time_in_sea_surface_height,Change over time in sea surface height,ocean,,,,, -bld,bld,boundary_layer_dissipation,Boundary layer dissipation,atmos,,,,, -iicebome:iocewflx,bmelt,tendency_of_sea_ice_amount_due_to_basal_melting,Rate of melt at sea ice base,seaIce,,,,, -sobowlin,bowlin,bowl_index,Bowl index,ocean,,,,, -cc,cl,cloud_area_fraction_in_atmosphere_layer,Cloud area fraction,atmos,,,,, -hcc,clh,high_cloud_area_fraction,High cloud fraction,atmos,,,,, -lcc,cll,low_cloud_area_fraction,Low cloud fraction,atmos,,,,, -mcc,clm,medium_cloud_area_fraction,Medium cloud fraction,atmos,,,,, -ciwc,cli,mass_fraction_of_cloud_ice_in_air,Mass fraction of cloud ice,atmos,,,,, -tcc,clt,cloud_area_fraction,Total cloud fraction,atmos,,,,, -clwc,clw,mass_fraction_of_cloud_liquid_water_in_air,Mass fraction of cloud liquid water,atmos,,,,, -tcw,clwvi,atmosphere_cloud_condensed_water_content,Condensed water path,atmos,,,,, -iicedive:sidive,divice,Strain Rate Divergence of Sea Ice,Divergence_of_sea_ice_velocity,seaIce,,,,, -e,evspsbl,water_evaporation_flux,Evaporation,atmos,,,,, -fal,fal,forecast_albedo,Forecast albedo,atmos,,,,, -sowaflep,fatmosocean,atmosphere_ocean_water_flux,Atmos=>ocean net freshwater,ocean,,,,, -sowaflcd,fdilution,dilution_water_flux,Concentration/dilution water flux,ocean,,,,, -sophtldf,fhbasindif,northward_ocean_heat_transport_due_to_diffusion,Northward ocean heat transport due to diffusion,ocean,,,,, -iowaflup,ficeocean,ice_ocean_water_flux,Ice=>ocean net freshwater,ocean,,,,, -sorunoff,friver,water_flux_into_sea_water_from_rivers,Water flux into sea water from rivers ,ocean,,,,, -sowaflup,fupward,upward_water_flux,Net upward water flux,ocean,,,,, -gwd,gwd,gravity_wave_dissipation,Gravity wave dissipation,atmos,,,,, -ibgheatco,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,, -sbgheatco,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,, -heatc,heatc,integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content,Heat content vertically integrated,ocean,,,,, -sohtatl,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Atl,,,, -sohtind,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Ind,,,, -sohtipc,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,IndPac,,,, -sohtpac,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Pac,,,, -sophtadv,hfbasinadv,northward_ocean_heat_transport_due_to_advection,Northward ocean heat transport due to advection ,ocean,,,,, -sophteiv,hfbasinba,northward_ocean_heat_transport_due_to_bolus_advection,Northward ocean heat transport due to bolus advection ,ocean,,,,, -qt_oce:sohefldo:qt,hfds,surface_downward_heat_flux_in_sea_water,Downward heat flux at sea water surface,ocean,,,,, -slhf,hfls,surface_upward_latent_heat_flux,Surface upward latent heat flux,atmos,,,,, -sshf,hfss,surface_upward_sensible_heat_flux,Surface upward sensible heat flux,atmos,,,,, -sophtove,htovovrt,northward_ocean_heat_transport_due_to_overturning,Northward ocean heat transport due to overturning ,ocean,,,,, -q,hus,specific_humidity,Specific humidity,atmos,,,,, -soicealb,ialb,sea_ice_albedo,Sea ice albedo,seaIce,,,,, -ibgfrcsfx,ibgfrcsfx,global_mean_forcing_salt,Global mean forcing salt (sfx),seaIce,,,,, -ibgfrcvol,ibgfrcvol,globa_mean_forcing_volume,Global mean forcing volume (emp),seaIce,,,,, -ibghfxbog,ibghfxbog,heat_fluxes_causing_bottom_ice_growth,Heat fluxes causing bottom ice growth,seaIce,,,,, -ibghfxbom,ibghfxbom,heat_fluxes_causing_bottom_ice_melt,Heat fluxes causing bottom ice melt,seaIce,,,,, -ibghfxdhc,ibghfxdhc,Heat_content_variation_in_snow_and_ice,Heat content variation in snow and ice,seaIce,,,,, -ibghfxdif,ibghfxdif,heat_fluxes_causing_ice temperature_change,Heat fluxes causing ice temperature change,seaIce,,,,, -ibghfxdyn,ibghfxdyn,heat_fluxes_from_ice-ocean_exchange_during_dynamic,Heat fluxes from ice-ocean exchange during dynamic,seaIce,,,,, -ibghfxin,ibghfxin,total_heat_fluxes_at_the_ice_surface,Total heat fluxes at the ice surface,seaIce,,,,, -ibghfxopw,ibghfxopw,heat_fluxes_causing_open_water_ice_formation,Heat fluxes causing open water ice formation,seaIce,,,,, -ibghfxout,ibghfxout,non_solar_heat_fluxes_received_by_the_ocean,Non solar heat fluxes received by the ocean,seaIce,,,,, -ibghfxres,ibghfxres,heat_fluxes_from_ice-ocean_exchange_during_resultant,Heat fluxes from ice-ocean exchange during resultant,seaIce,,,,, -ibghfxsnw,ibghfxsnw,heat_fluxes_from_snow-ocean_exchange,Heat fluxes from snow-ocean exchange,seaIce,,,,, -ibghfxspr,ibghfxspr,Heat_content_of_snow_precip,Heat content of snow precip,seaIce,,,,, -ibghfxsub,ibghfxsub,heat_fluxes_from_sublimation,Heat fluxes from sublimation,seaIce,,,,, -ibghfxsum,ibghfxsum,heat_fluxes_causing_surface_ice_melt,Heat fluxes causing surface ice melt,seaIce,,,,, -ibghfxthd,ibghfxthd,heat_fluxes_from_ice-ocean_exchange_during_thermo,Heat fluxes from ice-ocean exchange during thermo,seaIce,,,,, -ibgsfxbog,ibgsfxbogga,salt_flux_thermo,Global mean salt flux (thermo),seaIce,,,,, -ibgsfxbom,ibgsfxbomga,salt_flux_bottom_melt,Global mean salt flux (bottom melt),seaIce,,,,, -ibgsfxbri,ibgsfxbriga,salt_flux_brines,Global mean salt flux (brines),seaIce,,,,, -ibgsfxdyn,ibgsfxdynga,salt_flux_dynamic,Global mean salt flux (dynamic),seaIce,,,,, -ibgsfx,ibgsfxga,salt_flux,Global mean salt flux (total),seaIce,,,,, -ibgsfxopw,ibgsfxopwga,salt_flux_open_waters,Global mean salt flux (open water),seaIce,,,,, -ibgsfxres,ibgsfxresga,salt_flux_resultant,Global mean salt flux (resultant),seaIce,,,,, -ibgsfxsni,ibgsfxsniga,salt_flux_snow_ice_growth,Global mean salt flux (snow-ice growth),seaIce,,,,, -ibgsfxsum,ibgsfxsumga,salt_flux_surface_melt,Global mean salt flux (surface melt),seaIce,,,,, -ibgvfxbog,ibgvfxbogga,volume_flux_bottom_growth,Global mean volume flux (bottom growth),seaIce,,,,, -ibgvfxbom,ibgvfxbomga,volume_flux_bottom_melt,Global mean volume flux (bottom melt),seaIce,,,,, -ibgvfxdyn,ibgvfxdynga,volume_flux_dynamic_growth,Global mean volume flux (dynamic growth),seaIce,,,,, -ibgvfx,ibgvfxga,volume_flux_emp,Global mean volume flux (emp),seaIce,,,,, -ibgvfxopw,ibgvfxopwga,volume_flux_open_water_growth,Global mean volume flux (open water growth),seaIce,,,,, -ibgvfxres,ibgvfxresga,volume_flux_resultant,Global mean volume flux (resultant),seaIce,,,,, -ibgvfxsni,ibgvfxsniga,volume_flux_snow_ice_growth,Global mean volume flux (snow-ice growth),seaIce,,,,, -ibgvfxsnw,ibgvfxsnwga,volume_flux_snow_melt,Global mean volume flux (snow melt),seaIce,,,,, -ibgvfxspr,ibgvfxsprga,snheco,Global mean volume flux (snow precip),seaIce,,,,, -ibgvfxsub,ibgvfxsubga,volume_flux_snow_sublimation,Global mean volume flux (snow sublimation),seaIce,,,,, -ibgvfxsum,ibgvfxsumga,volume_flux_surface_melt,Global mean volume flux (surface melt),seaIce,,,,, -ibgvolgrm,ibgvolgrm,global_mean_ice_growth+melt_volume,Global mean ice growth+melt volume,seaIce,,,,, -ibrinvol,ibrinvol,brine_volume,Brine volume,seaIce,,,,, -sibricat,ibrinvolcat,brine_volume_in_categories,Brine volume for categories,seaIce,,,,, -iicebopr,iicebopr,daily_bottom_thermo_ice_production,Daily bottom thermo ice production,seaIce,,,,, -iicecolf,iicecolf,frazil_ice_collection_thickness,Frazil ice collection thickness,seaIce,,,,, -iicedypr,iicedypr,daily_dynamic_ice_production,Daily dynamic ice production,seaIce,,,,, -iice_etd,iiceetd,brine_volume_distribution,Brine volume distribution,seaIce,,,,, -iicelapr,iicelapr,daily_lateral_thermo_ice_production,Daily lateral thermo ice prod.,seaIce,,,,, -iicenflx,iicenflx,nonsolar_flux_ice_ocean_surface,Non-solar flux at ice/ocean surface,seaIce,,,,, -iicesflx,iicesflx,solar_flux_ice_ocean_surface,Solar flux at ice/ocean surface,seaIce,,,,, -iiceshea,iiceshea,shear,Shear,seaIce,,,,, -iicesipr,iicesipr,daily_snowice_ice_production,Daily snowice ice production,seaIce,,,,, -iicfsbri,iicfsbri,brine_salt_flux,Fsbri - brine salt flux,seaIce,,,,, -iicfseqv,iicfseqv,equivalent_FW_salt_flux,Fseqv - equivalent fw salt flux,seaIce,,,,, -ioceflxb,ioceflxb,oceanic_flux_ar_ice_base,Oceanic flux at the ice base,seaIce,,,,, -iocehebr,iocehebr,heat_flux_due_to_brine_release,Heat flux due to brine release,seaIce,,,,, -iocesafl,iocesafl,salt_flux_ocean_surface,Salt flux at ocean surface,seaIce,,,,, -iocesflx,iocesflx,solar_fux_ocean_surface,Solar flux at ocean surface,seaIce,,,,, -iocetflx,iocetflx,total_flux_ocean_surface,Total flux at ocean surface,seaIce,,,,, -iocwnsfl,iocwnsfl,nonsolar_flux_ocean_surface,Non-solar flux at ocean surface,seaIce,,,,, -isstempe,isstempe,sea_surface_temperature,Sea surface temperature,seaIce,,K,,, -scmastot,masso,sea_water_mass,Sea water mass ,ocean,,,,, -mldkz5,mldkz5,ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity,Turbocline depth (kz = 5e-4),ocean,,,,, -somxl010:mldr10_1,mlotst,ocean_mixed_layer_thickness_defined_by_sigma_t,Ocean mixed layer thickness defined by sigma T ,ocean,,,,, -swvl1,mrlsl1,moisture_content_of_soil_layer_1, Water content of soil layer 1,land,,,,, -swvl2,mrlsl2,moisture_content_of_soil_layer_2, Water content of soil layer 2,land,,,,, -swvl3,mrlsl3,moisture_content_of_soil_layer_3, Water content of soil layer 3,land,,,,, -swvl4,mrlsl4,moisture_content_of_soil_layer_4, Water content of soil layer 4,land,,,,, -ro,mrro,runoff_flux,Total runoff,atmos,,,,, -tp:precip,pr,precipitation_flux,Precipitation,atmos,,,,, -cp,prc,convective_precipitation_flux,Convective precipitation,atmos,,,,, -lsp,prs,stratiform_precipitation_flux,Stratiform precipitation,atmos,,,,, -isnowpre,prsn,snowfall_flux,Surface snowfall rate into the sea ice portion of the grid cell,seaIce,,,,, -sf:snowpre,prsn,snowfall_flux,Snowfall flux,atmos,,,,, -tcwv,prw,atmosphere_water_vapor_content,Water vapor path,atmos,,,,, -msl,psl,air_pressure_at_sea_level,Sea level pressure,atmos,,,,, -qns_ice,qnsice,non_solar_heat_flux_at_ice_surface,Non-solar heat flux at ice surface: sum over categories,seaIce,,,,, -qt_ice,qtice,surface_downward_heat_flux_in_air,Surface downward heat flux in air,seaIce,,,,, -strd,rlds,surface_downwelling_longwave_flux_in_air,Surface downwelling longwave radiation,atmos,,,,, -strc:str,rls,surface_longwave_flux_in_air,Surface longwave radiation,atmos,,,,, -ttr,rlut,toa_outgoing_longwave_flux,Toa outgoing longwave radiation,atmos,,,,, -ttrc,rlutcs,toa_outgoing_longwave_flux_assuming_clear_sky,"Top net thermal radiation, clear sky",atmos,,,,, -ssrd,rsds,surface_downwelling_shortwave_flux_in_air,Surface downwelling shortwave radiation,atmos,,,,, -tsr,rsdt,toa_incoming_shortwave_flux,Toa incident shortwave radiation,atmos,,,,, -soshfldo,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net downward shortwave radiation at sea water surface ,ocean,,,,, -ssr,rss,surface_shortwave_flux_in_air,Surface shortwave radiation,atmos,,,,, -ssrc,rsscs,surface_shortwave_flux_in_air_assuming_clear_sky,Surface clear-sky shortwave radiation,atmos,,,,, -tsrc,rsut,toa_outgoing_shortwave_flux,Toa outgoing shortwave radiation,atmos,,,,, -saltc,saltc,salt_content_vertically_integrated,Salt content vertically integrated,ocean,,,,, -es,sbl,surface_snow_and_ice_sublimation_flux,Surface snow and ice sublimation flux,landIce,,,,, -sosalflx,sfs,salt_flux_surface,Surface salt flux,ocean,,,,, -si,si,solar_insolation,Solar insolation,atmos,,,,, -NArea,siarean,sea_ice_area,Total area of sea ice in the northern hemisphere,seaIce,,10^6 km2,,, -SArea,siareas,sea_ice_area,Total area of sea ice in the southern hemisphere,seaIce,,10^6 km2,,, -iiceconc:siconc:soicecov:ileadfra:ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,, -ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,,ifs -iice_itd:siconc_cat:siconcat,siccat,ice_area_in_categories,Ice area in categories,seaIce,,,,, -ibgarea,sicga,sea_ice_content,Global mean sea ice content,seaIce,,,,, -NExnsidc,siextentn,sea_ice_extent,Total area of all northern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, -SExnsidc,siextents,sea_ice_extent,Total area of all southern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,, -iiceprod,sigr,ice_production,Ice production,seaIce,,,,, -iiceheco,siheco,integral_of_sea_ice_temperature_wrt_depth_expressed_as_heat_content,Sea ice heat content,seaIce,,,,, -ibgsaltco,sisaltcga,global mean ice salt content,Global mean ice salt content,seaIce,,,,, -iicethic:sithic,sit,sea_ice_thickness,Sea Ice Thickness,seaIce,,m,,, -iice_hid:sithic_cat:sithicat,sitcat,ice_thicknesss_in_categories,Ice thickness in categories,seaIce,,,,, -iicetemp,sitemp,ice_temperature,Mean ice temperature,seaIce,,K,,, -ibgtemper,sitempga,sea_ice_temperature,Global mean sea ice temperature,seaIce,,K,,, -iicevelo:sivelo,sivelo,ice_velocity,Ice velocity,seaIce,,,,, -iicevelu:sivelu,sivelu,ice_velocity_u,Ice velocity u,seaIce,,,,, -iicevelv:sivelv,sivelv,ice_velocity_v,Ice velocity v,seaIce,,,,, -ibgvoltot,sivolga,sea_ice_volume,Global mean sea ice volume,seaIce,,,,, -sivoln:NVolume,sivoln,sea_ice_volume,Total volume of sea ice in the northern hemisphere,seaIce,,10^3 km3,,, -sivols:SVolume,sivols,sea_ice_volume,Total volume of sea ice in the southern hemisphere,seaIce,,10^3 km3,,, -sivolu,sivolu,sea_ice_volume_per_unit_gridcell_area,Sea ice volume per gridcell area unit,seaIce,,,,, -sostatl,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostind,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostipc,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sostpac,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,, -sopstadv,sltbasinadv,northward_ocean_salt_transport_due_to_advection,Northward ocean salt transport due to advection ,ocean,,,,, -sopsteiv,sltbasinba,northward_ocean_salt_transport_due_to_bolus_advection,Northward ocean salt transport due to bolus advection ,ocean,,,,, -sopstldf,sltbasindif,northward_ocean_salt_transport_due_to_diffusion,Northward ocean salt transport due to diffusion,ocean,,,,, -sltnortha,sltnortha,northward_ocean_salt_transport,Atlantic northward ocean salt transport,ocean,,,,, -sopstove,sltovovrt,northward_ocean_salt_transport_due_to_overturning,Northward ocean salt transport due to overturning ,ocean,,,,, -zosalatl,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Atl,psu,,, -zosalglo,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Glob,psu,,, -zosalind,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Ind,psu,,, -zosalipc,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,IndPac,psu,,, -zosalpac,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Pac,psu,,, -asn,snal,snow_albedo,Snow albedo,landIce,,,,, -iice_hsd:snthicat,sndcat,snow_thickness_in_categories,Snow thickness in in categories,seaIce,,,,, -isnoheco,snheco,snow_heat_content,Snow total heat content,seaIce,,,,, -sd,snld,lwe_thickness_of_surface_snow_amount,Snow depth,atmos,,,,, -smlt,snm,surface_snow_melt_flux,Surface snow melt,landIce,,,,, -isnowthi,snthic,surface_snow_thickness,Surface snow thickness,seaIce,,,,, -sbgvoltot,snvolga,snow_volume,Global mean snow volume,seaIce,,,,, -snvolu,snvolu,snow_volume_per_unit_gridcell_area,Snow volume per gridcell area unit,seaIce,,,,, -vosaline:mean_3Dsosaline,so,sea_water_salinity,Sea water salinity,ocean,,psu,,, -scsaltot,soga,sea_water_salinity,Global mean sea water salinity ,ocean,,psu,,, -hfnortha,sohtatl,northward_ocean_heat_transport,Atlantic northward ocean heat transport,ocean,,,,, -soleaeiw,soleaeiw,eddy_induced_velocity_coefficient,Eddy induced vel. coeff. at w-point,ocean,,,,, -soleahtw,soleahtw,lateral_eddy_diffusivity,Lateral eddy diffusivity,ocean,,,,, -somixhgt,somixhgt,mixing_layer_depth_turbocline,Mixing layer depth (turbocline),ocean,,,,, -sosaline:isssalin:mean_sosaline,sos,sea_surface_salinity,Sea surface salinity ,ocean,,psu,,, -sothedep,sothedep,thermocline_depth,Thermocline depth (max dt/dz),ocean,,,,, -src,src,skin_reservoir_content,Skin reservoir content,land,,,,, -zosrfatl,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Atl,,,, -zosrfglo,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Glob,,,, -zosrfind,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Ind,,,, -zosrfipc,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,IndPac,,,, -zosrfpac,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Pac,,,, -rsn,srho,snow_density,Snow density,landIce,,,,, -iicesali:iice_std,ssi,sea_ice_salinity,Sea ice salinity,seaIce,,psu,,, -salincat,ssicat,sea_ice_salinity_in_categories,Sea-ice bulk salinity for categories,seaIce,,psu,,, -ibgsaline,ssiga,sea_ice_salinity,Global mean sea ice salinity ,seaIce,,psu,,, -iicestre,streng,compressive_strength_of_sea_ice,Compressive sea ice strength,seaIce,,,,, -so20chgt,t20d,depth_of_isosurface_of_sea_water_potential_temperature,,ocean,,,,, -t,ta,air_temperature,Air temperature,atmos,,K,,, -t2m,tas,air_temperature,Near-surface air temperature,atmos,,K,170,370, -mx2t,tasmax,air_temperature,Daily maximum near-surface air temperature,atmos,,K,,, -mn2t,tasmin,air_temperature,Daily minimum near-surface air temperature,atmos,,K,,, -ewss,tauu,surface_downward_eastward_stress,Surface downward eastward wind stress,atmos,,,,, -utau_ice:iocestru:iicestru,strairx,surface_downward_x_stress,X-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, -sozotaux,tauuo,surface_downward_x_stress,Surface downward x stress ,ocean,,,,, -nsss,tauv,surface_downward_northward_stress,Surface downward northward wind stress,atmos,,,,, -vtau_ice:iocestrv:iicestrv,strairy,surface_downward_y_stress,Y-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,, -sozotauy:sometauy,tauvo,surface_downward_y_stress,Surface downward y stress ,ocean,,,,, -d2m,tdps,dew_point_temperature,2m dewpoint temperature,atmos,,K,,, -votemper:mean_3Dsosstsst,thetao,sea_water_potential_temperature,Sea water potential temperature,ocean,,K,,, -sctemtot,thetaoga,sea_water_potential_temperature,Global average sea water potential temperature ,ocean,,K,,, -iicesume,tmelt,tendency_of_sea_ice_amount_due_to_surface_melting,Rate of melt at upper surface of sea ice,seaIce,,,,, -sosstsst:mean_sosstsst,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370, -sstk,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370,ifs -tossq,tossq,square_of_sea_surface_temperature,Square of sea surface temperature ,ocean,,K2,,, -zotematl,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Atl,K,,, -zotemglo,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Glob,K,,, -zotemind,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Ind,K,,, -zotemipc,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,IndPac,K,,, -zotempac,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Pac,K,,, -skt,ts,surface_temperature,Surface temperature,atmos,,K,,, -iicesurt:soicetem:sistem,tsice,surface_temperature,Surface temperature of sea ice,seaIce,,K,,, -istl1,tsice,surface_temperature,Surface temperature of ice,landIce,,K,,, -stl1,tsl1,soil_temperature_level_1,Temperature of soil level 1,land,,,,, -stl2,tsl2,soil_temperature_level_2,Temperature of soil level 2,land,,,,, -stl3,tsl3,soil_temperature_level_3,Temperature of soil level 3,land,,,,, -stl4,tsl4,soil_temperature_level_4,Temperature of soil level 4,land,,,,, -tsn,tsn,temperature_in_surface_snow,Snow internal temperature,landIce,,,,, -u,ua,eastward_wind,U velocity,atmos,,,,, -u10m,uas,eastward_wind,Eastward near-surface wind,atmos,,,,, -vozocrtx,uo,sea_water_x_velocity,Sea water x velocity,ocean,,,,, -uos,uos,sea_surface_x_velocity,Sea surface x velocity,ocean,,,,, -v,va,northward_wind,V velocity,atmos,,,,, -v10m,vas,northward_wind,Northward near-surface wind,atmos,,,,, -vomecrty,vo,sea_water_y_velocity,Sea water y velocity,ocean,,,,, -vos,vos,sea_surface_y_velocity,Sea surface y velocity,ocean,,,,, -voddmavs,voddmavs,salt_vertical_eddy_diffusivity,Salt vertical eddy diffusivity,ocean,,,,, -vozoeivu,voeivu,sea_water_x_EIV_current,Zonal eiv current,ocean,,,,, -vomeeivv,voeivv,sea_water_y_EIV_current,Meridional eiv current,ocean,,,,, -voveeivw,voeivz,sea_water_z_EIV_current,Vertical eiv current,ocean,,,,, -scvoltot,volo,sea_water_volume,Sea water volume ,ocean,,,,, -votkeavm,votkeavm,vertical_eddy_viscosity,Vertical eddy viscosity,ocean,,,,, -votkeavt,votkeavt,vertical_eddy_diffusivity,Vertical eddy diffusivity,ocean,,,,, -votkeevd,votkeevd,enhanced_vertical_diffusivity,Enhanced vertical diffusivity,ocean,,,,, -votkeevm,votkeevm,enhanced_vertical_viscosity,Enhanced vertical viscosity,ocean,,,,, -sobarstf,vsftbarot,ocean_barotropic_volume_streamfunction,Ocean barotropic volume streamfunction ,ocean,,,,, -zomsfatl,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Atl,,,, -zomsfglo,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Glob,,,, -zomsfind,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Ind,,,, -zomsfipc:zomsfinp,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,IndPac,,,, -zomsfpac,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Pac,,,, -zomsfeiv,vsftmyzba,ocean_meridional_overturning_mass_streamfunction_due_to_bolus_advection,Ocean meridional overturning volume streamfunction due to bolus advection ,ocean,,,,, -w,wa,vertical_velocity,Vertical velocity,atmos,,,,, -z,zg,geopotential_height,Geopotential height,atmos,,,,, -vovecrtz,zo,sea_water_z_velocity,Sea water z velocity,ocean,,,,, -sossheigh:sossheig:mean_sossheig,zos,sea_surface_height_above_geoid,Sea surface height above geoid ,ocean,,,,, -scsshtot,zosga,global_average_sea_level_change,Global average sea level change ,ocean,,,,, -scsshste,zossga,global_average_steric_sea_level_change,Global average steric sea level change ,ocean,,,,, -zossq,zossq,square_of_sea_surface_height_above_geoid,Square of sea surface height above geoid ,ocean,,,,, -scsshtst,zostoga,snthic,Global average thermosteric sea level change ,ocean,,,,, -heatc,ohc,ocean_heat_content,Ocean heat content,ocean,,J,,, -ohcsum,ohcsum,total_ocean_heat_content,Total Ocean heat content,ocean,,J,,, -ohcvmean,ohcvmean,average_ocean_heat_content,Average Ocean heat content,ocean,,J m-3,,, -ohc,ohc,ocean_heat_content,Ocean heat content,ocean,,J m-2,,, -transix,transix,sea_ice_x_transport,X-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, -transiy,transiy,sea_ice_y_transport,Y-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,, -windsp,sfcWind,wind_speed,Near-Surface Wind Speed,atmos,,,,, -vsfsit,vsfsit,virtual_salt_flux_into_sea_water_due_to_sea_ice_thermodynamics,Virtual Salt Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, -sfdsi,sfdsi,downward_sea_ice_basal_salt_flux,Downward Sea Ice Basal Salt Flux,ocean,,,,, -hfsithermds,hfsithermds,heat_flux_into_sea_water_due_to_sea_ice_thermodynamics,Heat Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,, -u2o,uosq,square_of_sea_water_x_velocity,Square of Sea Water X Velocity ,ocean,,,,, -v2o,vosq,square_of_sea_water_y_velocity,Square of Sea Water Y Velocity ,ocean,,,,, -vozomatr,umo,ocean_mass_x_transport,Ocean Mass X Transport ,ocean,,,,, -vomematr,vmo,ocean_mass_y_transport,Ocean Mass Y Transport ,ocean,,,,, -sozohetr,hfx,ocean_heat_x_transport,Ocean Heat X Transport ,ocean,,,,, -somehetr,hfy,ocean_heat_y_transport,Ocean Heat Y Transport ,ocean,,,,, -uto,uothetao,product_of_xward_sea_water_velocity_and_temperature,Product of X-ward Sea Water Velocity and Temperature,ocean,,,,, -vto,vothetao,product_of_yward_sea_water_velocity_and_temperature,Product of Y-ward Sea Water Velocity and Temperature,ocean,,,,, -uso,uoso,product_of_xward_sea_water_velocity_and_salinity,Product of X-ward Sea Water Velocity and Salinity,ocean,,,,, -vso,voso,product_of_yward_sea_water_velocity_and_salinity,Product of Y-ward Sea Water Velocity and Salinity,ocean,,,,, -wfo,wfo,water_flux_into_sea_water,Water Flux into Sea Water ,ocean,,,,, -emp_oce,evsmpr,evap_minus_precip_over_sea_water,Evap minus Precip over ocean,ocean,,,,, -emp_ice,evsmpr,evap_minus_precip_over_sea_ice,Evap minus Precip over ice,seaIce,,,,, -qsr_oce,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net Downward Shortwave Radiation at Sea Water Surface ,ocean,,,,, -qns_oce,rlds,surface_net_downward_longwave_flux,Surface Net Downward Longwave Radiation,ocean,,,,, -qsr_ice,rsdssi,surface_downwelling_shortwave_flux_in_air,Downwelling Shortwave over Sea Ice,seaIce,,,,, -qns_ice,rldssi,surface_downwelling_longwave_flux_in_air,Downwelling Long Wave over Sea Ice,seaIce,,,,, -sfx,sfx,downward_salt_flux,Downward Salt Flux,ocean,,,,, -taum,taum,surface_downward_stress_module,Surface Downward Stress Module,ocean,,,,, -zfull,zfull,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, -zhalf,zhalf,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,, -pbo,pbo,sea_water_pressure_at_sea_floor,Sea Water Pressure at Sea Floor,ocean,,,,, -thkcello,thkcello,cell_thickness,Cell Thickness,ocean,,,,, -ficeberg,ficeberg,water_flux_into_sea_water_from_icebergs,Water Flux into Sea Water From Icebergs ,ocean,,,,, -rsdo,rsds,downwelling_shortwave_flux_in_sea_water,Downwelling Shortwave Radiation in Sea Water ,ocean,,,,, -wo,wo,sea_water_upward_velocity,Sea Water Upward Velocity ,ocean,,,,, -w2o,wosq,square_of_sea_water_upward_velocity,Square of Sea Water Upward Velocity ,ocean,,,,, -difvho,difvho,ocean_vertical_heat_diffusivity,Ocean Vertical Heat Diffusivity,ocean,,,,, -vovematr,wmo,upward_ocean_mass_transport,Upward Ocean Mass Transport ,ocean,,,,, -qtr_ice,qtr,shortwave_flux_transmitted_through_ice,Shortwave Flux Transmitted Through The Ice,seaIce,,,,, +Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid,Tables +iiceages:siage:iice_otd,ageice,age_of_sea_ice,Age of sea ice,seaIce,,,,,, +al,al,surface_albedo,Albedo,atmos,,,,,, +bgfrcsal,bgfrcsal,change_over_time_in_heat_content_from_forcing,Change over time in salt content from forcing,ocean,,,,,, +bgfrctem,bgfrctem,change_over_time_in_heat_content_from_forcing,Change over time in heat content from forcing,ocean,,,,,, +bgfrcvol,bgfrcvol,change_over_time_in_volume_from_forcing,Change over time in volume from forcing,ocean,,,,,, +bgheatco,bgheatco,change_over_time_in_heat_content,Change over time in sea water heat content,ocean,,,,,, +bgsaline,bgsaline,change_over_time_in_sea_water_practical_salinity,Change over time in sea water salinity,ocean,,,,,, +bgsaltco,bgsaltco,change_over_time_in_salt_content,Change over time in sea water salt content,ocean,,,,,, +bgtemper,bgtemper,change_over_time_in_sea_water_potential_temperature,Change over time in sea water potential temperature,ocean,,,,,, +bgvole3t,bgvole3t,change_over_time_in_volume_variation,Change over time in volume variation (e3t),ocean,,,,,, +bgvolssh,bgvolssh,change_over_time_in_sea_surface_height,Change over time in sea surface height,ocean,,,,,, +bld,bld,boundary_layer_dissipation,Boundary layer dissipation,atmos,,,,,, +iicebome:iocewflx,bmelt,tendency_of_sea_ice_amount_due_to_basal_melting,Rate of melt at sea ice base,seaIce,,,,,, +sobowlin,bowlin,bowl_index,Bowl index,ocean,,,,,, +cc,cl,cloud_area_fraction_in_atmosphere_layer,Cloud area fraction,atmos,,,,,, +hcc,clh,high_cloud_area_fraction,High cloud fraction,atmos,,,,,, +lcc,cll,low_cloud_area_fraction,Low cloud fraction,atmos,,,,,, +mcc,clm,medium_cloud_area_fraction,Medium cloud fraction,atmos,,,,,, +ciwc,cli,mass_fraction_of_cloud_ice_in_air,Mass fraction of cloud ice,atmos,,,,,, +tcc,clt,cloud_area_fraction,Total cloud fraction,atmos,,,,,, +clwc,clw,mass_fraction_of_cloud_liquid_water_in_air,Mass fraction of cloud liquid water,atmos,,,,,, +tcw,clwvi,atmosphere_cloud_condensed_water_content,Condensed water path,atmos,,,,,, +iicedive:sidive,divice,Strain Rate Divergence of Sea Ice,Divergence_of_sea_ice_velocity,seaIce,,,,,, +e,evspsbl,water_evaporation_flux,Evaporation,atmos,,,,,, +fal,fal,forecast_albedo,Forecast albedo,atmos,,,,,, +sowaflep,fatmosocean,atmosphere_ocean_water_flux,Atmos=>ocean net freshwater,ocean,,,,,, +sowaflcd,fdilution,dilution_water_flux,Concentration/dilution water flux,ocean,,,,,, +sophtldf,fhbasindif,northward_ocean_heat_transport_due_to_diffusion,Northward ocean heat transport due to diffusion,ocean,,,,,, +iowaflup,ficeocean,ice_ocean_water_flux,Ice=>ocean net freshwater,ocean,,,,,, +sorunoff,friver,water_flux_into_sea_water_from_rivers,Water flux into sea water from rivers ,ocean,,,,,, +sowaflup,fupward,upward_water_flux,Net upward water flux,ocean,,,,,, +gwd,gwd,gravity_wave_dissipation,Gravity wave dissipation,atmos,,,,,, +ibgheatco,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,,, +sbgheatco,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,,, +heatc,heatc,integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content,Heat content vertically integrated,ocean,,,,,, +sohtatl,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Atl,,,,, +sohtind,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Ind,,,,, +sohtipc,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,IndPac,,,,, +sohtpac,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Pac,,,,, +sophtadv,hfbasinadv,northward_ocean_heat_transport_due_to_advection,Northward ocean heat transport due to advection ,ocean,,,,,, +sophteiv,hfbasinba,northward_ocean_heat_transport_due_to_bolus_advection,Northward ocean heat transport due to bolus advection ,ocean,,,,,, +qt_oce:sohefldo:qt,hfds,surface_downward_heat_flux_in_sea_water,Downward heat flux at sea water surface,ocean,,,,,, +slhf,hfls,surface_upward_latent_heat_flux,Surface upward latent heat flux,atmos,,,,,, +sshf,hfss,surface_upward_sensible_heat_flux,Surface upward sensible heat flux,atmos,,,,,, +sophtove,htovovrt,northward_ocean_heat_transport_due_to_overturning,Northward ocean heat transport due to overturning ,ocean,,,,,, +q,hus,specific_humidity,Specific humidity,atmos,,,,,, +soicealb,ialb,sea_ice_albedo,Sea ice albedo,seaIce,,,,,, +ibgfrcsfx,ibgfrcsfx,global_mean_forcing_salt,Global mean forcing salt (sfx),seaIce,,,,,, +ibgfrcvol,ibgfrcvol,globa_mean_forcing_volume,Global mean forcing volume (emp),seaIce,,,,,, +ibghfxbog,ibghfxbog,heat_fluxes_causing_bottom_ice_growth,Heat fluxes causing bottom ice growth,seaIce,,,,,, +ibghfxbom,ibghfxbom,heat_fluxes_causing_bottom_ice_melt,Heat fluxes causing bottom ice melt,seaIce,,,,,, +ibghfxdhc,ibghfxdhc,Heat_content_variation_in_snow_and_ice,Heat content variation in snow and ice,seaIce,,,,,, +ibghfxdif,ibghfxdif,heat_fluxes_causing_ice temperature_change,Heat fluxes causing ice temperature change,seaIce,,,,,, +ibghfxdyn,ibghfxdyn,heat_fluxes_from_ice-ocean_exchange_during_dynamic,Heat fluxes from ice-ocean exchange during dynamic,seaIce,,,,,, +ibghfxin,ibghfxin,total_heat_fluxes_at_the_ice_surface,Total heat fluxes at the ice surface,seaIce,,,,,, +ibghfxopw,ibghfxopw,heat_fluxes_causing_open_water_ice_formation,Heat fluxes causing open water ice formation,seaIce,,,,,, +ibghfxout,ibghfxout,non_solar_heat_fluxes_received_by_the_ocean,Non solar heat fluxes received by the ocean,seaIce,,,,,, +ibghfxres,ibghfxres,heat_fluxes_from_ice-ocean_exchange_during_resultant,Heat fluxes from ice-ocean exchange during resultant,seaIce,,,,,, +ibghfxsnw,ibghfxsnw,heat_fluxes_from_snow-ocean_exchange,Heat fluxes from snow-ocean exchange,seaIce,,,,,, +ibghfxspr,ibghfxspr,Heat_content_of_snow_precip,Heat content of snow precip,seaIce,,,,,, +ibghfxsub,ibghfxsub,heat_fluxes_from_sublimation,Heat fluxes from sublimation,seaIce,,,,,, +ibghfxsum,ibghfxsum,heat_fluxes_causing_surface_ice_melt,Heat fluxes causing surface ice melt,seaIce,,,,,, +ibghfxthd,ibghfxthd,heat_fluxes_from_ice-ocean_exchange_during_thermo,Heat fluxes from ice-ocean exchange during thermo,seaIce,,,,,, +ibgsfxbog,ibgsfxbogga,salt_flux_thermo,Global mean salt flux (thermo),seaIce,,,,,, +ibgsfxbom,ibgsfxbomga,salt_flux_bottom_melt,Global mean salt flux (bottom melt),seaIce,,,,,, +ibgsfxbri,ibgsfxbriga,salt_flux_brines,Global mean salt flux (brines),seaIce,,,,,, +ibgsfxdyn,ibgsfxdynga,salt_flux_dynamic,Global mean salt flux (dynamic),seaIce,,,,,, +ibgsfx,ibgsfxga,salt_flux,Global mean salt flux (total),seaIce,,,,,, +ibgsfxopw,ibgsfxopwga,salt_flux_open_waters,Global mean salt flux (open water),seaIce,,,,,, +ibgsfxres,ibgsfxresga,salt_flux_resultant,Global mean salt flux (resultant),seaIce,,,,,, +ibgsfxsni,ibgsfxsniga,salt_flux_snow_ice_growth,Global mean salt flux (snow-ice growth),seaIce,,,,,, +ibgsfxsum,ibgsfxsumga,salt_flux_surface_melt,Global mean salt flux (surface melt),seaIce,,,,,, +ibgvfxbog,ibgvfxbogga,volume_flux_bottom_growth,Global mean volume flux (bottom growth),seaIce,,,,,, +ibgvfxbom,ibgvfxbomga,volume_flux_bottom_melt,Global mean volume flux (bottom melt),seaIce,,,,,, +ibgvfxdyn,ibgvfxdynga,volume_flux_dynamic_growth,Global mean volume flux (dynamic growth),seaIce,,,,,, +ibgvfx,ibgvfxga,volume_flux_emp,Global mean volume flux (emp),seaIce,,,,,, +ibgvfxopw,ibgvfxopwga,volume_flux_open_water_growth,Global mean volume flux (open water growth),seaIce,,,,,, +ibgvfxres,ibgvfxresga,volume_flux_resultant,Global mean volume flux (resultant),seaIce,,,,,, +ibgvfxsni,ibgvfxsniga,volume_flux_snow_ice_growth,Global mean volume flux (snow-ice growth),seaIce,,,,,, +ibgvfxsnw,ibgvfxsnwga,volume_flux_snow_melt,Global mean volume flux (snow melt),seaIce,,,,,, +ibgvfxspr,ibgvfxsprga,snheco,Global mean volume flux (snow precip),seaIce,,,,,, +ibgvfxsub,ibgvfxsubga,volume_flux_snow_sublimation,Global mean volume flux (snow sublimation),seaIce,,,,,, +ibgvfxsum,ibgvfxsumga,volume_flux_surface_melt,Global mean volume flux (surface melt),seaIce,,,,,, +ibgvolgrm,ibgvolgrm,global_mean_ice_growth+melt_volume,Global mean ice growth+melt volume,seaIce,,,,,, +ibrinvol,ibrinvol,brine_volume,Brine volume,seaIce,,,,,, +sibricat,ibrinvolcat,brine_volume_in_categories,Brine volume for categories,seaIce,,,,,, +iicebopr,iicebopr,daily_bottom_thermo_ice_production,Daily bottom thermo ice production,seaIce,,,,,, +iicecolf,iicecolf,frazil_ice_collection_thickness,Frazil ice collection thickness,seaIce,,,,,, +iicedypr,iicedypr,daily_dynamic_ice_production,Daily dynamic ice production,seaIce,,,,,, +iice_etd,iiceetd,brine_volume_distribution,Brine volume distribution,seaIce,,,,,, +iicelapr,iicelapr,daily_lateral_thermo_ice_production,Daily lateral thermo ice prod.,seaIce,,,,,, +iicenflx,iicenflx,nonsolar_flux_ice_ocean_surface,Non-solar flux at ice/ocean surface,seaIce,,,,,, +iicesflx,iicesflx,solar_flux_ice_ocean_surface,Solar flux at ice/ocean surface,seaIce,,,,,, +iiceshea,iiceshea,shear,Shear,seaIce,,,,,, +iicesipr,iicesipr,daily_snowice_ice_production,Daily snowice ice production,seaIce,,,,,, +iicfsbri,iicfsbri,brine_salt_flux,Fsbri - brine salt flux,seaIce,,,,,, +iicfseqv,iicfseqv,equivalent_FW_salt_flux,Fseqv - equivalent fw salt flux,seaIce,,,,,, +ioceflxb,ioceflxb,oceanic_flux_ar_ice_base,Oceanic flux at the ice base,seaIce,,,,,, +iocehebr,iocehebr,heat_flux_due_to_brine_release,Heat flux due to brine release,seaIce,,,,,, +iocesafl,iocesafl,salt_flux_ocean_surface,Salt flux at ocean surface,seaIce,,,,,, +iocesflx,iocesflx,solar_fux_ocean_surface,Solar flux at ocean surface,seaIce,,,,,, +iocetflx,iocetflx,total_flux_ocean_surface,Total flux at ocean surface,seaIce,,,,,, +iocwnsfl,iocwnsfl,nonsolar_flux_ocean_surface,Non-solar flux at ocean surface,seaIce,,,,,, +isstempe,isstempe,sea_surface_temperature,Sea surface temperature,seaIce,,K,,,, +scmastot,masso,sea_water_mass,Sea water mass ,ocean,,,,,, +mldkz5,mldkz5,ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity,Turbocline depth (kz = 5e-4),ocean,,,,,, +somxl010:mldr10_1,mlotst,ocean_mixed_layer_thickness_defined_by_sigma_t,Ocean mixed layer thickness defined by sigma T ,ocean,,,,,, +swvl1,mrlsl1,moisture_content_of_soil_layer_1, Water content of soil layer 1,land,,,,,, +swvl2,mrlsl2,moisture_content_of_soil_layer_2, Water content of soil layer 2,land,,,,,, +swvl3,mrlsl3,moisture_content_of_soil_layer_3, Water content of soil layer 3,land,,,,,, +swvl4,mrlsl4,moisture_content_of_soil_layer_4, Water content of soil layer 4,land,,,,,, +ro,mrro,runoff_flux,Total runoff,atmos,,,,,, +tp:precip,pr,precipitation_flux,Precipitation,atmos,,,,,, +cp,prc,convective_precipitation_flux,Convective precipitation,atmos,,,,,, +lsp,prs,stratiform_precipitation_flux,Stratiform precipitation,atmos,,,,,, +isnowpre,prsn,snowfall_flux,Surface snowfall rate into the sea ice portion of the grid cell,seaIce,,,,,, +sf:snowpre,prsn,snowfall_flux,Snowfall flux,atmos,,,,,, +tcwv,prw,atmosphere_water_vapor_content,Water vapor path,atmos,,,,,, +msl,psl,air_pressure_at_sea_level,Sea level pressure,atmos,,,,,, +qns_ice,qnsice,non_solar_heat_flux_at_ice_surface,Non-solar heat flux at ice surface: sum over categories,seaIce,,,,,, +qt_ice,qtice,surface_downward_heat_flux_in_air,Surface downward heat flux in air,seaIce,,,,,, +strd,rlds,surface_downwelling_longwave_flux_in_air,Surface downwelling longwave radiation,atmos,,,,,, +strc:str,rls,surface_longwave_flux_in_air,Surface longwave radiation,atmos,,,,,, +ttr,rlut,toa_outgoing_longwave_flux,Toa outgoing longwave radiation,atmos,,,,,, +ttrc,rlutcs,toa_outgoing_longwave_flux_assuming_clear_sky,"Top net thermal radiation, clear sky",atmos,,,,,, +ssrd,rsds,surface_downwelling_shortwave_flux_in_air,Surface downwelling shortwave radiation,atmos,,,,,, +tsr,rsdt,toa_incoming_shortwave_flux,Toa incident shortwave radiation,atmos,,,,,, +soshfldo,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net downward shortwave radiation at sea water surface ,ocean,,,,,, +ssr,rss,surface_shortwave_flux_in_air,Surface shortwave radiation,atmos,,,,,, +ssrc,rsscs,surface_shortwave_flux_in_air_assuming_clear_sky,Surface clear-sky shortwave radiation,atmos,,,,,, +tsrc,rsut,toa_outgoing_shortwave_flux,Toa outgoing shortwave radiation,atmos,,,,,, +saltc,saltc,salt_content_vertically_integrated,Salt content vertically integrated,ocean,,,,,, +es,sbl,surface_snow_and_ice_sublimation_flux,Surface snow and ice sublimation flux,landIce,,,,,, +sosalflx,sfs,salt_flux_surface,Surface salt flux,ocean,,,,,, +si,si,solar_insolation,Solar insolation,atmos,,,,,, +NArea,siarean,sea_ice_area,Total area of sea ice in the northern hemisphere,seaIce,,10^6 km2,,,, +SArea,siareas,sea_ice_area,Total area of sea ice in the southern hemisphere,seaIce,,10^6 km2,,,, +iiceconc:siconc:soicecov:ileadfra:ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,,, +ci,sic,sea_ice_area_fraction,Sea Ice Area Fraction,seaIce,,%,,,ifs, +iice_itd:siconc_cat:siconcat,siccat,ice_area_in_categories,Ice area in categories,seaIce,,,,,, +ibgarea,sicga,sea_ice_content,Global mean sea ice content,seaIce,,,,,, +NExnsidc,siextentn,sea_ice_extent,Total area of all northern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,,, +SExnsidc,siextents,sea_ice_extent,Total area of all southern-hemisphere grid cells that are covered by at least 15 % areal fraction of sea ice,seaIce,,10^6 km2,,,, +iiceprod,sigr,ice_production,Ice production,seaIce,,,,,, +iiceheco,siheco,integral_of_sea_ice_temperature_wrt_depth_expressed_as_heat_content,Sea ice heat content,seaIce,,,,,, +ibgsaltco,sisaltcga,global mean ice salt content,Global mean ice salt content,seaIce,,,,,, +iicethic:sithic,sit,sea_ice_thickness,Sea Ice Thickness,seaIce,,m,,,, +iice_hid:sithic_cat:sithicat,sitcat,ice_thicknesss_in_categories,Ice thickness in categories,seaIce,,,,,, +iicetemp,sitemp,ice_temperature,Mean ice temperature,seaIce,,K,,,, +ibgtemper,sitempga,sea_ice_temperature,Global mean sea ice temperature,seaIce,,K,,,, +iicevelo:sivelo,sivelo,ice_velocity,Ice velocity,seaIce,,,,,, +iicevelu:sivelu,sivelu,ice_velocity_u,Ice velocity u,seaIce,,,,,, +iicevelv:sivelv,sivelv,ice_velocity_v,Ice velocity v,seaIce,,,,,, +ibgvoltot,sivolga,sea_ice_volume,Global mean sea ice volume,seaIce,,,,,, +sivoln:NVolume,sivoln,sea_ice_volume,Total volume of sea ice in the northern hemisphere,seaIce,,10^3 km3,,,, +sivols:SVolume,sivols,sea_ice_volume,Total volume of sea ice in the southern hemisphere,seaIce,,10^3 km3,,,, +sivolu,sivolu,sea_ice_volume_per_unit_gridcell_area,Sea ice volume per gridcell area unit,seaIce,,,,,, +sostatl,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,,, +sostind,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,,, +sostipc,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,,, +sostpac,sltbasin,northward_ocean_salt_transport,Northward ocean salt transport,ocean,,,,,, +sopstadv,sltbasinadv,northward_ocean_salt_transport_due_to_advection,Northward ocean salt transport due to advection ,ocean,,,,,, +sopsteiv,sltbasinba,northward_ocean_salt_transport_due_to_bolus_advection,Northward ocean salt transport due to bolus advection ,ocean,,,,,, +sopstldf,sltbasindif,northward_ocean_salt_transport_due_to_diffusion,Northward ocean salt transport due to diffusion,ocean,,,,,, +sltnortha,sltnortha,northward_ocean_salt_transport,Atlantic northward ocean salt transport,ocean,,,,,, +sopstove,sltovovrt,northward_ocean_salt_transport_due_to_overturning,Northward ocean salt transport due to overturning ,ocean,,,,,, +zosalatl,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Atl,psu,,,, +zosalglo,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Glob,psu,,,, +zosalind,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Ind,psu,,,, +zosalipc,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,IndPac,psu,,,, +zosalpac,sltzmean,zonal_mean_salinity,Zonal mean salinity,ocean,Pac,psu,,,, +asn,snal,snow_albedo,Snow albedo,landIce,,,,,, +iice_hsd:snthicat,sndcat,snow_thickness_in_categories,Snow thickness in in categories,seaIce,,,,,, +isnoheco,snheco,snow_heat_content,Snow total heat content,seaIce,,,,,, +sd,snld,lwe_thickness_of_surface_snow_amount,Snow depth,atmos,,,,,, +smlt,snm,surface_snow_melt_flux,Surface snow melt,landIce,,,,,, +isnowthi,snthic,surface_snow_thickness,Surface snow thickness,seaIce,,,,,, +sbgvoltot,snvolga,snow_volume,Global mean snow volume,seaIce,,,,,, +snvolu,snvolu,snow_volume_per_unit_gridcell_area,Snow volume per gridcell area unit,seaIce,,,,,, +vosaline:mean_3Dsosaline,so,sea_water_salinity,Sea water salinity,ocean,,psu,,,, +scsaltot,soga,sea_water_salinity,Global mean sea water salinity ,ocean,,psu,,,, +hfnortha,sohtatl,northward_ocean_heat_transport,Atlantic northward ocean heat transport,ocean,,,,,, +soleaeiw,soleaeiw,eddy_induced_velocity_coefficient,Eddy induced vel. coeff. at w-point,ocean,,,,,, +soleahtw,soleahtw,lateral_eddy_diffusivity,Lateral eddy diffusivity,ocean,,,,,, +somixhgt,somixhgt,mixing_layer_depth_turbocline,Mixing layer depth (turbocline),ocean,,,,,, +sosaline:isssalin:mean_sosaline,sos,sea_surface_salinity,Sea surface salinity ,ocean,,psu,,,, +sothedep,sothedep,thermocline_depth,Thermocline depth (max dt/dz),ocean,,,,,, +src,src,skin_reservoir_content,Skin reservoir content,land,,,,,, +zosrfatl,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Atl,,,,, +zosrfglo,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Glob,,,,, +zosrfind,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Ind,,,,, +zosrfipc,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,IndPac,,,,, +zosrfpac,srfzmean,zonal_mean_surface,Zonal mean surface,ocean,Pac,,,,, +rsn,srho,snow_density,Snow density,landIce,,,,,, +iicesali:iice_std,ssi,sea_ice_salinity,Sea ice salinity,seaIce,,psu,,,, +salincat,ssicat,sea_ice_salinity_in_categories,Sea-ice bulk salinity for categories,seaIce,,psu,,,, +ibgsaline,ssiga,sea_ice_salinity,Global mean sea ice salinity ,seaIce,,psu,,,, +iicestre,streng,compressive_strength_of_sea_ice,Compressive sea ice strength,seaIce,,,,,, +so20chgt,t20d,depth_of_isosurface_of_sea_water_potential_temperature,,ocean,,,,,, +t,ta,air_temperature,Air temperature,atmos,,K,,,, +t2m,tas,air_temperature,Near-surface air temperature,atmos,,K,170,370,, +mx2t,tasmax,air_temperature,Daily maximum near-surface air temperature,atmos,,K,,,, +mn2t,tasmin,air_temperature,Daily minimum near-surface air temperature,atmos,,K,,,, +ewss,tauu,surface_downward_eastward_stress,Surface downward eastward wind stress,atmos,,,,,, +utau_ice:iocestru:iicestru,strairx,surface_downward_x_stress,X-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,,, +sozotaux,tauuo,surface_downward_x_stress,Surface downward x stress ,ocean,,,,,, +nsss,tauv,surface_downward_northward_stress,Surface downward northward wind stress,atmos,,,,,, +vtau_ice:iocestrv:iicestrv,strairy,surface_downward_y_stress,Y-Component of Atmospheric Stress On Sea Ice,seaIce,,N m-2,,,, +sozotauy:sometauy,tauvo,surface_downward_y_stress,Surface downward y stress ,ocean,,,,,, +d2m,tdps,dew_point_temperature,2m dewpoint temperature,atmos,,K,,,, +votemper:mean_3Dsosstsst,thetao,sea_water_potential_temperature,Sea water potential temperature,ocean,,K,,,, +sctemtot,thetaoga,sea_water_potential_temperature,Global average sea water potential temperature ,ocean,,K,,,, +iicesume,tmelt,tendency_of_sea_ice_amount_due_to_surface_melting,Rate of melt at upper surface of sea ice,seaIce,,,,,, +sosstsst:mean_sosstsst,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370,, +sstk,tos,sea_surface_temperature,Sea surface temperature ,ocean,,K,170,370,ifs, +tossq,tossq,square_of_sea_surface_temperature,Square of sea surface temperature ,ocean,,K2,,,, +zotematl,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Atl,K,,,, +zotemglo,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Glob,K,,,, +zotemind,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Ind,K,,,, +zotemipc,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,IndPac,K,,,, +zotempac,toszmean,zonal_mean_temperature,Zonal mean temperature,ocean,Pac,K,,,, +skt,ts,surface_temperature,Surface temperature,atmos,,K,,,, +iicesurt:soicetem:sistem,tsice,surface_temperature,Surface temperature of sea ice,seaIce,,K,,,, +istl1,tsice,surface_temperature,Surface temperature of ice,landIce,,K,,,, +stl1,tsl1,soil_temperature_level_1,Temperature of soil level 1,land,,,,,, +stl2,tsl2,soil_temperature_level_2,Temperature of soil level 2,land,,,,,, +stl3,tsl3,soil_temperature_level_3,Temperature of soil level 3,land,,,,,, +stl4,tsl4,soil_temperature_level_4,Temperature of soil level 4,land,,,,,, +tsn,tsn,temperature_in_surface_snow,Snow internal temperature,landIce,,,,,, +u,ua,eastward_wind,U velocity,atmos,,,,,, +u10m,uas,eastward_wind,Eastward near-surface wind,atmos,,,,,, +vozocrtx,uo,sea_water_x_velocity,Sea water x velocity,ocean,,,,,, +uos,uos,sea_surface_x_velocity,Sea surface x velocity,ocean,,,,,, +v,va,northward_wind,V velocity,atmos,,,,,, +v10m,vas,northward_wind,Northward near-surface wind,atmos,,,,,, +vomecrty,vo,sea_water_y_velocity,Sea water y velocity,ocean,,,,,, +vos,vos,sea_surface_y_velocity,Sea surface y velocity,ocean,,,,,, +voddmavs,voddmavs,salt_vertical_eddy_diffusivity,Salt vertical eddy diffusivity,ocean,,,,,, +vozoeivu,voeivu,sea_water_x_EIV_current,Zonal eiv current,ocean,,,,,, +vomeeivv,voeivv,sea_water_y_EIV_current,Meridional eiv current,ocean,,,,,, +voveeivw,voeivz,sea_water_z_EIV_current,Vertical eiv current,ocean,,,,,, +scvoltot,volo,sea_water_volume,Sea water volume ,ocean,,,,,, +votkeavm,votkeavm,vertical_eddy_viscosity,Vertical eddy viscosity,ocean,,,,,, +votkeavt,votkeavt,vertical_eddy_diffusivity,Vertical eddy diffusivity,ocean,,,,,, +votkeevd,votkeevd,enhanced_vertical_diffusivity,Enhanced vertical diffusivity,ocean,,,,,, +votkeevm,votkeevm,enhanced_vertical_viscosity,Enhanced vertical viscosity,ocean,,,,,, +sobarstf,vsftbarot,ocean_barotropic_volume_streamfunction,Ocean barotropic volume streamfunction ,ocean,,,,,, +zomsfatl,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Atl,,,,, +zomsfglo,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Glob,,,,, +zomsfind,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Ind,,,,, +zomsfipc:zomsfinp,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,IndPac,,,,, +zomsfpac,vsftmyz,ocean_meridional_overturning_volume_streamfunction,Ocean meridional overturning volume streamfunction ,ocean,Pac,,,,, +zomsfeiv,vsftmyzba,ocean_meridional_overturning_mass_streamfunction_due_to_bolus_advection,Ocean meridional overturning volume streamfunction due to bolus advection ,ocean,,,,,, +w,wa,vertical_velocity,Vertical velocity,atmos,,,,,, +z,zg,geopotential_height,Geopotential height,atmos,,,,,, +vovecrtz,zo,sea_water_z_velocity,Sea water z velocity,ocean,,,,,, +sossheigh:sossheig:mean_sossheig,zos,sea_surface_height_above_geoid,Sea surface height above geoid ,ocean,,,,,, +scsshtot,zosga,global_average_sea_level_change,Global average sea level change ,ocean,,,,,, +scsshste,zossga,global_average_steric_sea_level_change,Global average steric sea level change ,ocean,,,,,, +zossq,zossq,square_of_sea_surface_height_above_geoid,Square of sea surface height above geoid ,ocean,,,,,, +scsshtst,zostoga,snthic,Global average thermosteric sea level change ,ocean,,,,,, +heatc,ohc,ocean_heat_content,Ocean heat content,ocean,,J,,,, +ohcsum,ohcsum,total_ocean_heat_content,Total Ocean heat content,ocean,,J,,,, +ohcvmean,ohcvmean,average_ocean_heat_content,Average Ocean heat content,ocean,,J m-3,,,, +ohc,ohc,ocean_heat_content,Ocean heat content,ocean,,J m-2,,,, +transix,transix,sea_ice_x_transport,X-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,,, +transiy,transiy,sea_ice_y_transport,Y-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,,, +windsp,sfcWind,wind_speed,Near-Surface Wind Speed,atmos,,,,,, +vsfsit,vsfsit,virtual_salt_flux_into_sea_water_due_to_sea_ice_thermodynamics,Virtual Salt Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,,, +sfdsi,sfdsi,downward_sea_ice_basal_salt_flux,Downward Sea Ice Basal Salt Flux,ocean,,,,,, +hfsithermds,hfsithermds,heat_flux_into_sea_water_due_to_sea_ice_thermodynamics,Heat Flux into Sea Water due to Sea Ice Thermodynamics ,ocean,,,,,, +u2o,uosq,square_of_sea_water_x_velocity,Square of Sea Water X Velocity ,ocean,,,,,, +v2o,vosq,square_of_sea_water_y_velocity,Square of Sea Water Y Velocity ,ocean,,,,,, +vozomatr,umo,ocean_mass_x_transport,Ocean Mass X Transport ,ocean,,,,,, +vomematr,vmo,ocean_mass_y_transport,Ocean Mass Y Transport ,ocean,,,,,, +sozohetr,hfx,ocean_heat_x_transport,Ocean Heat X Transport ,ocean,,,,,, +somehetr,hfy,ocean_heat_y_transport,Ocean Heat Y Transport ,ocean,,,,,, +uto,uothetao,product_of_xward_sea_water_velocity_and_temperature,Product of X-ward Sea Water Velocity and Temperature,ocean,,,,,, +vto,vothetao,product_of_yward_sea_water_velocity_and_temperature,Product of Y-ward Sea Water Velocity and Temperature,ocean,,,,,, +uso,uoso,product_of_xward_sea_water_velocity_and_salinity,Product of X-ward Sea Water Velocity and Salinity,ocean,,,,,, +vso,voso,product_of_yward_sea_water_velocity_and_salinity,Product of Y-ward Sea Water Velocity and Salinity,ocean,,,,,, +wfo,wfo,water_flux_into_sea_water,Water Flux into Sea Water ,ocean,,,,,, +emp_oce,evsmpr,evap_minus_precip_over_sea_water,Evap minus Precip over ocean,ocean,,,,,, +emp_ice,evsmpr,evap_minus_precip_over_sea_ice,Evap minus Precip over ice,seaIce,,,,,, +qsr_oce,rsntds,net_downward_shortwave_flux_at_sea_water_surface,Net Downward Shortwave Radiation at Sea Water Surface ,ocean,,,,,, +qns_oce,rlds,surface_net_downward_longwave_flux,Surface Net Downward Longwave Radiation,ocean,,,,,, +qsr_ice,rsdssi,surface_downwelling_shortwave_flux_in_air,Downwelling Shortwave over Sea Ice,seaIce,,,,,, +qns_ice,rldssi,surface_downwelling_longwave_flux_in_air,Downwelling Long Wave over Sea Ice,seaIce,,,,,, +sfx,sfx,downward_salt_flux,Downward Salt Flux,ocean,,,,,, +taum,taum,surface_downward_stress_module,Surface Downward Stress Module,ocean,,,,,, +zfull,zfull,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,,, +zhalf,zhalf,depth_below_geoid,Depth Below Geoid of Ocean Layer,ocean,,,,,, +pbo,pbo,sea_water_pressure_at_sea_floor,Sea Water Pressure at Sea Floor,ocean,,,,,, +thkcello,thkcello,cell_thickness,Cell Thickness,ocean,,,,,, +ficeberg,ficeberg,water_flux_into_sea_water_from_icebergs,Water Flux into Sea Water From Icebergs ,ocean,,,,,, +rsdo,rsds,downwelling_shortwave_flux_in_sea_water,Downwelling Shortwave Radiation in Sea Water ,ocean,,,,,, +wo,wo,sea_water_upward_velocity,Sea Water Upward Velocity ,ocean,,,,,, +w2o,wosq,square_of_sea_water_upward_velocity,Square of Sea Water Upward Velocity ,ocean,,,,,, +difvho,difvho,ocean_vertical_heat_diffusivity,Ocean Vertical Heat Diffusivity,ocean,,,,,, +vovematr,wmo,upward_ocean_mass_transport,Upward Ocean Mass Transport ,ocean,,,,,, +qtr_ice,qtr,shortwave_flux_transmitted_through_ice,Shortwave Flux Transmitted Through The Ice,seaIce,,,,,, diff --git a/earthdiagnostics/cmor_tables/primavera.csv b/earthdiagnostics/cmor_tables/primavera.csv index f999c361..53180efd 100644 --- a/earthdiagnostics/cmor_tables/primavera.csv +++ b/earthdiagnostics/cmor_tables/primavera.csv @@ -1,15 +1,15 @@ -Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid -ibgheatco:sihc,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,, -sbgheatco:sisnhc,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,, -iice_itd:siconc_cat:siitdconc:siconcat,siccat,ice_area_in_categories,Ice area in categories,seaIce,,,,, -iicethic:sithic:sithick,sit,sea_ice_thickness,Sea Ice Thickness,seaIce,,m,,, -iice_hid:sithic_cat:sithicat:siitdthick,sitcat,ice_thicknesss_in_categories,Ice thickness in categories,seaIce,,,,, -iicevelo:sivelo:sispeed,sivelo,ice_velocity,Ice velocity,seaIce,,,,, -iicevelu:sivelu:siu,sivelu,ice_velocity_u,Ice velocity u,seaIce,,,,, -iicevelv:sivelv:siv,sivelv,ice_velocity_v,Ice velocity v,seaIce,,,,, -sidivvel,siddivvel,divergence_of_sea_ice_velocity,Divergence of sea ice velocity,seaIce,,1e-8s^-1,,, -sivolu:sivol,sivolu,sea_ice_volume_per_unit_gridcell_area,Sea ice volume per gridcell area unit,seaIce,,,,, -iice_hsd:snthicats:siitdsnthick,sndcat,snow_thickness_in_categories,Snow thickness in in categories,seaIce,,,,, -isnowthi:sisnthick,snthic,surface_snow_thickness,Surface snow thickness,seaIce,,,,, -iicesali:iice_std:sisali,ssi,sea_ice_salinity,Sea ice salinity,seaIce,,psu,,, -iicesurt:soicetem:sistem:sitemptop,tsice,surface_temperature,Surface temperature of sea ice,seaIce,,K,,, +Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid,Table +ibgheatco:sihc,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,,, +sbgheatco:sisnhc,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,,, +iice_itd:siconc_cat:siitdconc:siconcat,siccat,ice_area_in_categories,Ice area in categories,seaIce,,,,,, +iicethic:sithic:sithick,sit,sea_ice_thickness,Sea Ice Thickness,seaIce,,m,,,, +iice_hid:sithic_cat:sithicat:siitdthick,sitcat,ice_thicknesss_in_categories,Ice thickness in categories,seaIce,,,,,, +iicevelo:sivelo:sispeed,sivelo,ice_velocity,Ice velocity,seaIce,,,,,, +iicevelu:sivelu:siu,sivelu,ice_velocity_u,Ice velocity u,seaIce,,,,,, +iicevelv:sivelv:siv,sivelv,ice_velocity_v,Ice velocity v,seaIce,,,,,, +sidivvel,siddivvel,divergence_of_sea_ice_velocity,Divergence of sea ice velocity,seaIce,,1e-8s^-1,,,, +sivolu:sivol,sivolu,sea_ice_volume_per_unit_gridcell_area,Sea ice volume per gridcell area unit,seaIce,,,,,, +iice_hsd:snthicats:siitdsnthick,sndcat,snow_thickness_in_categories,Snow thickness in in categories,seaIce,,,,,, +isnowthi:sisnthick,snthic,surface_snow_thickness,Surface snow thickness,seaIce,,,,,, +iicesali:iice_std:sisali,ssi,sea_ice_salinity,Sea ice salinity,seaIce,,psu,,,, +iicesurt:soicetem:sistem:sitemptop,tsice,surface_temperature,Surface temperature of sea ice,seaIce,,K,,,, diff --git a/earthdiagnostics/cmor_tables/specs.csv b/earthdiagnostics/cmor_tables/specs.csv index ddfcc15b..90f01d91 100644 --- a/earthdiagnostics/cmor_tables/specs.csv +++ b/earthdiagnostics/cmor_tables/specs.csv @@ -1 +1 @@ -Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid +Variable,Shortname,Name,Long name,Domain,Basin,Units,Valid min,Valid max,Grid,Tables diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index 0039c96f..ca930228 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -10,7 +10,7 @@ import pygrib from autosubmit.config.log import Log from autosubmit.date.chunk_date_lib import parse_date, chunk_end_date, previous_day, date2str, add_months -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms from earthdiagnostics.utils import TempFile, Utils @@ -354,13 +354,13 @@ class Cmorizer(object): @staticmethod def _rename_level_variables(temp, var_cmor): - if var_cmor.domain == Domains.ocean: + if var_cmor.domain == ModelingRealms.ocean: Utils.rename_variables(temp, {'deptht': 'lev', 'depthu': 'lev', 'depthw': 'lev', 'depthv': 'lev', 'depth': 'lev'}, False, True) - if var_cmor.domain in [Domains.landIce, Domains.land]: + if var_cmor.domain in [ModelingRealms.landIce, ModelingRealms.land]: Utils.rename_variables(temp, {'depth': 'sdepth', 'depth_2': 'sdepth', 'depth_3': 'sdepth', 'depth_4': 'sdepth'}, False, True) - if var_cmor.domain == Domains.atmos: + if var_cmor.domain == ModelingRealms.atmos: Utils.rename_variables(temp, {'depth': 'plev'}, False, True) @staticmethod diff --git a/earthdiagnostics/constants.py b/earthdiagnostics/constants.py index b8b63d31..27de8a48 100644 --- a/earthdiagnostics/constants.py +++ b/earthdiagnostics/constants.py @@ -33,6 +33,9 @@ class Basin(object): return False return True + def __str__(self): + return self._fullname + @property def shortname(self): """ diff --git a/earthdiagnostics/datamanager.py b/earthdiagnostics/datamanager.py index ec768e58..bbabead7 100644 --- a/earthdiagnostics/datamanager.py +++ b/earthdiagnostics/datamanager.py @@ -11,7 +11,7 @@ from cfunits import Units from earthdiagnostics.utils import Utils, TempFile from earthdiagnostics.variable import Variable, VarType, VariableManager -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class DataManager(object): @@ -134,7 +134,7 @@ class DataManager(object): if grid: var = '{0}-{1}'.format(var, grid) - if domain in [Domains.ocean, Domains.seaIce]: + if domain in [ModelingRealms.ocean, ModelingRealms.seaIce]: return '{0}_f{1}h'.format(var, self.experiment.ocean_timestep) else: return '{0}_f{1}h'.format(var, self.experiment.atmos_timestep) @@ -356,7 +356,7 @@ class NetCDFFile(object): def _fix_coordinate_variables_metadata(self, handler): if 'lev' in handler.variables: handler.variables['lev'].short_name = 'lev' - if self.domain == Domains.ocean: + if self.domain == ModelingRealms.ocean: handler.variables['lev'].standard_name = 'depth' if 'lon' in handler.variables: handler.variables['lon'].short_name = 'lon' diff --git a/earthdiagnostics/diagnostic.py b/earthdiagnostics/diagnostic.py index 1702f831..72584578 100644 --- a/earthdiagnostics/diagnostic.py +++ b/earthdiagnostics/diagnostic.py @@ -1,7 +1,7 @@ # coding=utf-8 from earthdiagnostics.constants import Basins from earthdiagnostics.variable import VarType -from earthdiagnostics.domain import Domain +from earthdiagnostics.modelingrealm import ModelingRealm class Diagnostic(object): @@ -63,7 +63,7 @@ class Diagnostic(object): :param filetosend: :param domain: - :type domain: Domain + :type domain: ModelingRealm :param var: :param startdate: :param member: @@ -181,7 +181,7 @@ class DiagnosticListIntOption(DiagnosticOption): class DiagnosticDomainOption(DiagnosticOption): def parse(self, option_value): - return Domain.parse(self.check_default(option_value)) + return ModelingRealm.parse(self.check_default(option_value)) class DiagnosticBasinOption(DiagnosticOption): diff --git a/earthdiagnostics/general/attribute.py b/earthdiagnostics/general/attribute.py index 690d8bc8..4b0bc129 100644 --- a/earthdiagnostics/general/attribute.py +++ b/earthdiagnostics/general/attribute.py @@ -1,7 +1,7 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticComplexStrOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils -from earthdiagnostics.domain import Domain +from earthdiagnostics.modelingrealm import ModelingRealm class Attribute(Diagnostic): @@ -24,7 +24,7 @@ class Attribute(Diagnostic): :param variable: variable's name :type variable: str :param domain: variable's domain - :type domain: Domain + :type domain: ModelingRealm """ alias = 'att' diff --git a/earthdiagnostics/general/monthlymean.py b/earthdiagnostics/general/monthlymean.py index fdf2af48..7ec06ad3 100644 --- a/earthdiagnostics/general/monthlymean.py +++ b/earthdiagnostics/general/monthlymean.py @@ -3,7 +3,7 @@ import os from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domain +from earthdiagnostics.modelingrealm import ModelingRealm class MonthlyMean(Diagnostic): @@ -25,7 +25,7 @@ class MonthlyMean(Diagnostic): :param variable: variable's name :type variable: str :param domain: variable's domain - :type domain: Domain + :type domain: ModelingRealm :param frequency: original frequency :type frequency: str :param grid: original data grid diff --git a/earthdiagnostics/general/relink.py b/earthdiagnostics/general/relink.py index 23cd924e..f12764b2 100644 --- a/earthdiagnostics/general/relink.py +++ b/earthdiagnostics/general/relink.py @@ -1,6 +1,6 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticBoolOption -from earthdiagnostics.domain import Domain +from earthdiagnostics.modelingrealm import ModelingRealm class Relink(Diagnostic): @@ -22,7 +22,7 @@ class Relink(Diagnostic): :param variable: variable's name :type variable: str :param domain: variable's domain - :type domain: Domain + :type domain: ModelingRealm :param move_old: if true, looks for files following the old convention and moves to avoid collisions :type move_old: bool """ diff --git a/earthdiagnostics/general/rewrite.py b/earthdiagnostics/general/rewrite.py index 528d2d5d..ab6b87c7 100644 --- a/earthdiagnostics/general/rewrite.py +++ b/earthdiagnostics/general/rewrite.py @@ -1,6 +1,6 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption -from earthdiagnostics.domain import Domain +from earthdiagnostics.modelingrealm import ModelingRealm class Rewrite(Diagnostic): @@ -23,7 +23,7 @@ class Rewrite(Diagnostic): :param variable: variable's name :type variable: str :param domain: variable's domain - :type domain: Domain + :type domain: ModelingRealm """ alias = 'rewrite' diff --git a/earthdiagnostics/general/scale.py b/earthdiagnostics/general/scale.py index 3697154a..f53fc1c1 100644 --- a/earthdiagnostics/general/scale.py +++ b/earthdiagnostics/general/scale.py @@ -1,7 +1,7 @@ # coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticFloatOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils -from earthdiagnostics.domain import Domain +from earthdiagnostics.modelingrealm import ModelingRealm import numpy as np import math @@ -27,7 +27,7 @@ class Scale(Diagnostic): :param variable: variable's name :type variable: str :param domain: variable's domain - :type domain: Domain + :type domain: ModelingRealm """ alias = 'scale' diff --git a/earthdiagnostics/domain.py b/earthdiagnostics/modelingrealm.py similarity index 68% rename from earthdiagnostics/domain.py rename to earthdiagnostics/modelingrealm.py index 41d2f2d9..e01a69e4 100644 --- a/earthdiagnostics/domain.py +++ b/earthdiagnostics/modelingrealm.py @@ -1,10 +1,10 @@ -class Domain(object): +class ModelingRealm(object): @staticmethod def parse(domain_name): - if isinstance(domain_name, Domain): + if isinstance(domain_name, ModelingRealm): return domain_name - return Domain(domain_name) + return ModelingRealm(domain_name) def __init__(self, domain_name): domain_name = domain_name.lower() @@ -22,12 +22,12 @@ class Domain(object): raise ValueError('Domain {0} not recognized!'.format(domain_name)) def __eq__(self, other): - return other.__class__ == Domain and self.name == other.name + return other.__class__ == ModelingRealm and self.name == other.name def __str__(self): return self.name - def get_table_name(self, frequency, data_convention): + def get_table_name(self, variable, frequency, data_convention): """ Returns the table name for a domain-frequency pair :param data_convention: Data convention in use @@ -37,6 +37,10 @@ class Domain(object): :return: variable's table name :rtype: str """ + for table in variable.tables(): + if table.frequency == frequency: + return table + if frequency in ('mon', 'clim'): if self.name == 'seaIce': if data_convention == 'specs': @@ -55,13 +59,13 @@ class Domain(object): return table_name -class Domains(object): - seaIce = Domain('seaice') - ocean = Domain('ocean') - landIce = Domain('landIce') - atmos = Domain('atmos') - land = Domain('land') - aerosol = Domain('aerosol') - atmosChem = Domain('atmosChem') - ocnBgchem = Domain('ocnBgchem') +class ModelingRealms(object): + seaIce = ModelingRealm('seaice') + ocean = ModelingRealm('ocean') + landIce = ModelingRealm('landIce') + atmos = ModelingRealm('atmos') + land = ModelingRealm('land') + aerosol = ModelingRealm('aerosol') + atmosChem = ModelingRealm('atmosChem') + ocnBgchem = ModelingRealm('ocnBgchem') diff --git a/earthdiagnostics/ocean/areamoc.py b/earthdiagnostics/ocean/areamoc.py index 8372c663..763da95f 100644 --- a/earthdiagnostics/ocean/areamoc.py +++ b/earthdiagnostics/ocean/areamoc.py @@ -6,7 +6,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.utils import Utils, TempFile import os -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class AreaMoc(Diagnostic): @@ -146,4 +146,4 @@ class AreaMoc(Diagnostic): nco.ncap2(input=temp2, output=temp2, options='-O -s "coslat[lat]=cos(lat[lat]*3.141592657/180.0)"') nco.ncwa(input=temp2, output=temp2, options='-w coslat -a lat') nco.ncks(input=temp2, output=temp2, options='-O -v vsftmyz,time') - self.send_file(temp2, Domains.ocean, 'vsftmyz', self.startdate, self.member, self.chunk, box=self.box) + self.send_file(temp2, ModelingRealms.ocean, 'vsftmyz', self.startdate, self.member, self.chunk, box=self.box) diff --git a/earthdiagnostics/ocean/averagesection.py b/earthdiagnostics/ocean/averagesection.py index 512771fa..c4ddfb41 100644 --- a/earthdiagnostics/ocean/averagesection.py +++ b/earthdiagnostics/ocean/averagesection.py @@ -3,7 +3,7 @@ import os from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticIntOption, DiagnosticOption, DiagnosticDomainOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domain, Domains +from earthdiagnostics.modelingrealm import ModelingRealm, ModelingRealms class AverageSection(Diagnostic): @@ -27,7 +27,7 @@ class AverageSection(Diagnostic): :param variable: variable's name :type variable: str :param domain: variable's domain - :type domain: Domain + :type domain: ModelingRealm :param box: box to use for the average :type box: Box @@ -69,7 +69,7 @@ class AverageSection(Diagnostic): DiagnosticIntOption('max_lon'), DiagnosticIntOption('min_lat'), DiagnosticIntOption('max_lat'), - DiagnosticDomainOption('domain', Domains.ocean)) + DiagnosticDomainOption('domain', ModelingRealms.ocean)) options = cls.process_options(options, options_available) box = Box() box.min_lon = options['min_lon'] diff --git a/earthdiagnostics/ocean/convectionsites.py b/earthdiagnostics/ocean/convectionsites.py index 8a5ac9d8..876ec080 100644 --- a/earthdiagnostics/ocean/convectionsites.py +++ b/earthdiagnostics/ocean/convectionsites.py @@ -4,7 +4,7 @@ from autosubmit.config.log import Log from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile from earthdiagnostics.constants import Models -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class ConvectionSites(Diagnostic): @@ -114,7 +114,7 @@ class ConvectionSites(Diagnostic): self.mlotst_handler.close() handler.close() - self.send_file(output, Domains.ocean, 'site', self.startdate, self.member, self.chunk) + self.send_file(output, ModelingRealms.ocean, 'site', self.startdate, self.member, self.chunk) Log.info('Finished convection sites for startdate {0}, member {1}, chunk {2}', self.startdate, self.member, self.chunk) diff --git a/earthdiagnostics/ocean/cutsection.py b/earthdiagnostics/ocean/cutsection.py index efe09c4c..899c89cc 100644 --- a/earthdiagnostics/ocean/cutsection.py +++ b/earthdiagnostics/ocean/cutsection.py @@ -6,7 +6,7 @@ from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, Diagnostic DiagnosticDomainOption from earthdiagnostics.box import Box from earthdiagnostics.utils import Utils -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class CutSection(Diagnostic): @@ -74,7 +74,7 @@ class CutSection(Diagnostic): options_available = (DiagnosticOption('variable'), DiagnosticBoolOption('zonal'), DiagnosticIntOption('value'), - DiagnosticDomainOption('domain', Domains.ocean)) + DiagnosticDomainOption('domain', ModelingRealms.ocean)) options = cls.process_options(options, options_available) job_list = list() diff --git a/earthdiagnostics/ocean/gyres.py b/earthdiagnostics/ocean/gyres.py index 860fd384..29b11398 100644 --- a/earthdiagnostics/ocean/gyres.py +++ b/earthdiagnostics/ocean/gyres.py @@ -5,7 +5,7 @@ from autosubmit.config.log import Log from earthdiagnostics.constants import Models from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class Gyres(Diagnostic): @@ -144,7 +144,7 @@ class Gyres(Diagnostic): handler.close() handler_original.close() - self.send_file(output, Domains.ocean, 'gyre', self.startdate, self.member, self.chunk) + self.send_file(output, ModelingRealms.ocean, 'gyre', self.startdate, self.member, self.chunk) Log.info('Finished gyres for startdate {0}, member {1}, chunk {2}', self.startdate, self.member, self.chunk) def _gyre(self, site, invert=False): diff --git a/earthdiagnostics/ocean/heatcontent.py b/earthdiagnostics/ocean/heatcontent.py index 0d08d9b4..0ce762f2 100644 --- a/earthdiagnostics/ocean/heatcontent.py +++ b/earthdiagnostics/ocean/heatcontent.py @@ -8,7 +8,7 @@ from earthdiagnostics.constants import Basins from earthdiagnostics.utils import Utils, TempFile from earthdiagnostics.diagnostic import Diagnostic, DiagnosticBasinOption, DiagnosticIntOption from earthdiagnostics.box import Box -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class HeatContent(Diagnostic): @@ -165,8 +165,8 @@ class HeatContent(Diagnostic): box_save = self.box Utils.setminmax(ohcsum_temp, 'ohcsum') - self.send_file(ohcsum_temp, Domains.ocean, 'ohcsum', self.startdate, self.member, self.chunk, + self.send_file(ohcsum_temp, ModelingRealms.ocean, 'ohcsum', self.startdate, self.member, self.chunk, box=box_save, region=self.basin.fullname, rename_var='ohcsum') Utils.setminmax(ohcvmean_temp, 'ohcvmean') - self.send_file(ohcvmean_temp, Domains.ocean, 'ohcvmean', self.startdate, self.member, self.chunk, + self.send_file(ohcvmean_temp, ModelingRealms.ocean, 'ohcvmean', self.startdate, self.member, self.chunk, box=box_save, region=self.basin.fullname, rename_var='ohcvmean') diff --git a/earthdiagnostics/ocean/heatcontentlayer.py b/earthdiagnostics/ocean/heatcontentlayer.py index 06bda389..2c9a10fb 100644 --- a/earthdiagnostics/ocean/heatcontentlayer.py +++ b/earthdiagnostics/ocean/heatcontentlayer.py @@ -5,7 +5,7 @@ from earthdiagnostics.constants import Basins from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticIntOption, DiagnosticBasinOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class HeatContentLayer(Diagnostic): @@ -157,7 +157,7 @@ class HeatContentLayer(Diagnostic): nco = Utils.nco results = TempFile.get() - thetao_file = self.data_manager.get_file(Domains.ocean, 'thetao', self.startdate, self.member, self.chunk) + thetao_file = self.data_manager.get_file(ModelingRealms.ocean, 'thetao', self.startdate, self.member, self.chunk) handler = Utils.openCdf(thetao_file) heatc_sl = np.sum(handler.variables['thetao'][:, self.min_level:self.max_level, :] * self.weight, 1) @@ -174,4 +174,4 @@ class HeatContentLayer(Diagnostic): handler_results.close() Utils.setminmax(results, 'ohc') - self.send_file(results, Domains.ocean, 'ohc', self.startdate, self.member, self.chunk, box=self.box) + self.send_file(results, ModelingRealms.ocean, 'ohc', self.startdate, self.member, self.chunk, box=self.box) diff --git a/earthdiagnostics/ocean/interpolate.py b/earthdiagnostics/ocean/interpolate.py index 36a86eb8..e1f0ff48 100644 --- a/earthdiagnostics/ocean/interpolate.py +++ b/earthdiagnostics/ocean/interpolate.py @@ -6,7 +6,7 @@ import os from autosubmit.config.log import Log from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticBoolOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class Interpolate(Diagnostic): @@ -81,7 +81,7 @@ class Interpolate(Diagnostic): """ options_available = (DiagnosticOption('target_grid'), DiagnosticOption('variable'), - DiagnosticDomainOption('domain', Domains.ocean), + DiagnosticDomainOption('domain', ModelingRealms.ocean), DiagnosticBoolOption('invert_lat', False)) options = cls.process_options(options, options_available) diff --git a/earthdiagnostics/ocean/interpolatecdo.py b/earthdiagnostics/ocean/interpolatecdo.py index e691f16e..bc90f291 100644 --- a/earthdiagnostics/ocean/interpolatecdo.py +++ b/earthdiagnostics/ocean/interpolatecdo.py @@ -4,7 +4,7 @@ from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, Diagnostic from earthdiagnostics.utils import Utils, TempFile import numpy as np -from earthdiagnostics.domain import Domain, Domains +from earthdiagnostics.modelingrealm import ModelingRealm, ModelingRealms class InterpolateCDO(Diagnostic): @@ -27,7 +27,7 @@ class InterpolateCDO(Diagnostic): :param variable: variable's name :type variable: str :param domain: variable's domain - :type domain: Domain + :type domain: ModelingRealm :param model_version: model version :type model_version: str """ @@ -72,7 +72,7 @@ class InterpolateCDO(Diagnostic): """ options_available = (DiagnosticOption('variable'), DiagnosticOption('target_grid', diags.config.experiment.atmos_grid.lower()), - DiagnosticDomainOption('domain', Domains.ocean)) + DiagnosticDomainOption('domain', ModelingRealms.ocean)) options = cls.process_options(options, options_available) target_grid = cls._translate_ifs_grids_to_cdo_names(options['target_grid']) job_list = list() diff --git a/earthdiagnostics/ocean/maxmoc.py b/earthdiagnostics/ocean/maxmoc.py index 67d202a0..0e3e3134 100644 --- a/earthdiagnostics/ocean/maxmoc.py +++ b/earthdiagnostics/ocean/maxmoc.py @@ -7,7 +7,7 @@ from earthdiagnostics.constants import Basins from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticIntOption, DiagnosticBasinOption from earthdiagnostics.utils import Utils -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class MaxMoc(Diagnostic): @@ -95,7 +95,7 @@ class MaxMoc(Diagnostic): """ nco = Utils.nco - temp = self.data_manager.get_year(Domains.ocean, 'vsftmyz', self.startdate, self.member, self.year) + temp = self.data_manager.get_year(ModelingRealms.ocean, 'vsftmyz', self.startdate, self.member, self.year) handler = Utils.openCdf(temp) if 'i' in handler.dimensions: @@ -154,7 +154,7 @@ class MaxMoc(Diagnostic): var.valid_max = 1000. var[0] = maximum handler.close() - self.send_file(temp, Domains.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, + self.send_file(temp, ModelingRealms.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, frequency='yr', year=self.year) handler = self._create_output_file(temp) @@ -165,7 +165,7 @@ class MaxMoc(Diagnostic): var.valid_max = 90. var[0] = max_lat handler.close() - self.send_file(temp, Domains.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, + self.send_file(temp, ModelingRealms.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, frequency='yr', year=self.year) handler = self._create_output_file(temp) @@ -176,7 +176,7 @@ class MaxMoc(Diagnostic): var.valid_max = 10000. var[0] = max_lev handler.close() - self.send_file(temp, Domains.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, + self.send_file(temp, ModelingRealms.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, frequency='yr', year=self.year) handler = self._create_output_file(temp) @@ -187,7 +187,7 @@ class MaxMoc(Diagnostic): var.valid_max = 1000. var[0] = minimum handler.close() - self.send_file(temp, Domains.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, + self.send_file(temp, ModelingRealms.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, frequency='yr', year=self.year) handler = self._create_output_file(temp) @@ -198,7 +198,7 @@ class MaxMoc(Diagnostic): var.valid_max = 90. var[0] = min_lat handler.close() - self.send_file(temp, Domains.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, + self.send_file(temp, ModelingRealms.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, frequency='yr', year=self.year) handler = self._create_output_file(temp) @@ -209,7 +209,7 @@ class MaxMoc(Diagnostic): var.valid_max = 10000. var[0] = min_lev handler.close() - self.send_file(temp, Domains.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, + self.send_file(temp, ModelingRealms.ocean, 'vsftmyzmax', self.startdate, self.member, box=self.box, frequency='yr', year=self.year) def _create_output_file(self, temp): diff --git a/earthdiagnostics/ocean/mixedlayerheatcontent.py b/earthdiagnostics/ocean/mixedlayerheatcontent.py index 58c14617..e5a9d40b 100644 --- a/earthdiagnostics/ocean/mixedlayerheatcontent.py +++ b/earthdiagnostics/ocean/mixedlayerheatcontent.py @@ -4,7 +4,7 @@ import os from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics import cdftools from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class MixedLayerHeatContent(Diagnostic): @@ -67,8 +67,8 @@ class MixedLayerHeatContent(Diagnostic): """ Runs the diagnostic """ - temperature_file = self.data_manager.get_file(Domains.ocean, 'thetao', self.startdate, self.member, self.chunk) - mlotst_file = self.data_manager.get_file(Domains.ocean, 'mlotst', self.startdate, self.member, self.chunk) + temperature_file = self.data_manager.get_file(ModelingRealms.ocean, 'thetao', self.startdate, self.member, self.chunk) + mlotst_file = self.data_manager.get_file(ModelingRealms.ocean, 'mlotst', self.startdate, self.member, self.chunk) Utils.nco.ncks(input=mlotst_file, output=temperature_file, options='-A -v mlotst') @@ -79,4 +79,4 @@ class MixedLayerHeatContent(Diagnostic): Utils.rename_variables(temp, {'x': 'i', 'y': 'j', 'somxlheatc': 'ohcvsumlotst'}, False, True) Utils.setminmax(temp, 'ohcvsumlotst') - self.send_file(temp, Domains.ocean, 'ohcvsumlotst', self.startdate, self.member, self.chunk) + self.send_file(temp, ModelingRealms.ocean, 'ohcvsumlotst', self.startdate, self.member, self.chunk) diff --git a/earthdiagnostics/ocean/mixedlayersaltcontent.py b/earthdiagnostics/ocean/mixedlayersaltcontent.py index cd8999a5..2f70e89f 100644 --- a/earthdiagnostics/ocean/mixedlayersaltcontent.py +++ b/earthdiagnostics/ocean/mixedlayersaltcontent.py @@ -3,7 +3,7 @@ import os from earthdiagnostics import cdftools from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class MixedLayerSaltContent(Diagnostic): @@ -65,8 +65,8 @@ class MixedLayerSaltContent(Diagnostic): """ Runs the diagnostic """ - salinity_file = self.data_manager.get_file(Domains.ocean, 'so', self.startdate, self.member, self.chunk) - mlotst_file = self.data_manager.get_file(Domains.ocean, 'mlotst', self.startdate, self.member, self.chunk) + salinity_file = self.data_manager.get_file(ModelingRealms.ocean, 'so', self.startdate, self.member, self.chunk) + mlotst_file = self.data_manager.get_file(ModelingRealms.ocean, 'mlotst', self.startdate, self.member, self.chunk) Utils.nco.ncks(input=mlotst_file, output=salinity_file, options='-A -v mlotst') @@ -76,4 +76,4 @@ class MixedLayerSaltContent(Diagnostic): Utils.rename_variables(temp, {'x': 'i', 'y': 'j', 'somxlsaltc': 'scvsummlotst'}, False, True) Utils.setminmax(temp, 'scvsummlotst') - self.send_file(temp, Domains.ocean, 'scvsummlotst', self.startdate, self.member, self.chunk) + self.send_file(temp, ModelingRealms.ocean, 'scvsummlotst', self.startdate, self.member, self.chunk) diff --git a/earthdiagnostics/ocean/moc.py b/earthdiagnostics/ocean/moc.py index 11fa94ed..ee070c19 100644 --- a/earthdiagnostics/ocean/moc.py +++ b/earthdiagnostics/ocean/moc.py @@ -6,7 +6,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.constants import Basins from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class Moc(Diagnostic): @@ -70,7 +70,7 @@ class Moc(Diagnostic): """ temp = TempFile.get() - input_file = self.data_manager.get_file(Domains.ocean, 'vo', self.startdate, self.member, self.chunk) + input_file = self.data_manager.get_file(ModelingRealms.ocean, 'vo', self.startdate, self.member, self.chunk) Log.debug('Computing MOC') cdftools.run('cdfmoc', input=input_file, output=temp) @@ -107,4 +107,4 @@ class Moc(Diagnostic): options='-O -x -v zomsfglo,zomsfatl,zomsfpac,zomsfinp,zomsfind,zomsfinp0') Utils.setminmax(temp, 'vsftmyz') - self.send_file(temp, Domains.ocean, 'vsftmyz', self.startdate, self.member, self.chunk) + self.send_file(temp, ModelingRealms.ocean, 'vsftmyz', self.startdate, self.member, self.chunk) diff --git a/earthdiagnostics/ocean/psi.py b/earthdiagnostics/ocean/psi.py index 73774c7f..072bfb87 100644 --- a/earthdiagnostics/ocean/psi.py +++ b/earthdiagnostics/ocean/psi.py @@ -2,7 +2,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.diagnostic import Diagnostic from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class Psi(Diagnostic): @@ -65,9 +65,9 @@ class Psi(Diagnostic): Runs the diagnostic """ temp = TempFile.get() - input_file_u = self.data_manager.get_file(Domains.ocean, 'uo', self.startdate, self.member, self.chunk) - input_file_v = self.data_manager.get_file(Domains.ocean, 'vo', self.startdate, self.member, self.chunk) + input_file_u = self.data_manager.get_file(ModelingRealms.ocean, 'uo', self.startdate, self.member, self.chunk) + input_file_v = self.data_manager.get_file(ModelingRealms.ocean, 'vo', self.startdate, self.member, self.chunk) cdftools.run('cdfpsi', input=[input_file_u, input_file_v], output=temp, options='-mean -mask') Utils.rename_variable(temp, 'sobarstf', 'vsftbarot') Utils.setminmax(temp, 'vsftbarot') - self.send_file(temp, Domains.ocean, 'vsftbarot', self.startdate, self.member, self.chunk) + self.send_file(temp, ModelingRealms.ocean, 'vsftbarot', self.startdate, self.member, self.chunk) diff --git a/earthdiagnostics/ocean/siasiesiv.py b/earthdiagnostics/ocean/siasiesiv.py index 852213b4..23e88140 100644 --- a/earthdiagnostics/ocean/siasiesiv.py +++ b/earthdiagnostics/ocean/siasiesiv.py @@ -8,7 +8,7 @@ from earthdiagnostics.utils import Utils, TempFile import earthdiagnostics.cdftoolspython as cdftoolspython import numpy as np -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class Siasiesiv(Diagnostic): @@ -89,13 +89,13 @@ class Siasiesiv(Diagnostic): """ Runs the diagnostic """ - sit_file = self.data_manager.get_file(Domains.seaIce, 'sit', self.startdate, self.member, self.chunk) + sit_file = self.data_manager.get_file(ModelingRealms.seaIce, 'sit', self.startdate, self.member, self.chunk) sit_handler = Utils.openCdf(sit_file) sit = np.asfortranarray(sit_handler.variables['sit'][:]) timesteps = sit_handler.dimensions['time'].size sit_handler.close() - sic_file = self.data_manager.get_file(Domains.seaIce, 'sic', self.startdate, self.member, self.chunk) + sic_file = self.data_manager.get_file(ModelingRealms.seaIce, 'sic', self.startdate, self.member, self.chunk) sic_handler = Utils.openCdf(sic_file) sic = np.asfortranarray(sic_handler.variables['sic'][:]) sic_handler.close() @@ -110,18 +110,18 @@ class Siasiesiv(Diagnostic): print ex self.send_file(self._extract_variable_and_rename(sit_file, result[4, :], 'sivols', '10^9 m3'), - Domains.seaIce, 'sivols', self.startdate, self.member, self.chunk, region=self.basin.fullname) + ModelingRealms.seaIce, 'sivols', self.startdate, self.member, self.chunk, region=self.basin.fullname) self.send_file(self._extract_variable_and_rename(sit_file, result[5, :], 'siareas', '10^9 m2'), - Domains.seaIce, 'siareas', self.startdate, self.member, self.chunk, region=self.basin.fullname) + ModelingRealms.seaIce, 'siareas', self.startdate, self.member, self.chunk, region=self.basin.fullname) self.send_file(self._extract_variable_and_rename(sit_file, result[7, :], 'siextents', '10^9 m2'), - Domains.seaIce, 'siextents', self.startdate, self.member, self.chunk, region=self.basin.fullname) + ModelingRealms.seaIce, 'siextents', self.startdate, self.member, self.chunk, region=self.basin.fullname) self.send_file(self._extract_variable_and_rename(sit_file, result[0, :], 'sivoln', '10^9 m3'), - Domains.seaIce, 'sivoln', self.startdate, self.member, self.chunk, region=self.basin.fullname) + ModelingRealms.seaIce, 'sivoln', self.startdate, self.member, self.chunk, region=self.basin.fullname) self.send_file(self._extract_variable_and_rename(sit_file, result[1, :], 'siarean', '10^9 m2'), - Domains.seaIce, 'siarean', self.startdate, self.member, self.chunk, region=self.basin.fullname) + ModelingRealms.seaIce, 'siarean', self.startdate, self.member, self.chunk, region=self.basin.fullname) self.send_file(self._extract_variable_and_rename(sit_file, result[3, :], 'siextentn', '10^9 m2'), - Domains.seaIce, 'siextentn', self.startdate, self.member, self.chunk, region=self.basin.fullname) + ModelingRealms.seaIce, 'siextentn', self.startdate, self.member, self.chunk, region=self.basin.fullname) @staticmethod def _extract_variable_and_rename(reference_file, values, cmor_name, units): diff --git a/earthdiagnostics/ocean/verticalmean.py b/earthdiagnostics/ocean/verticalmean.py index 2ef58171..9a58a8ec 100644 --- a/earthdiagnostics/ocean/verticalmean.py +++ b/earthdiagnostics/ocean/verticalmean.py @@ -3,7 +3,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticIntOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class VerticalMean(Diagnostic): @@ -103,6 +103,6 @@ class VerticalMean(Diagnostic): cdftools.run('cdfvertmean', input=variable_file, output=temp, options=[self.variable, 'T', lev_min, lev_max, '-debug']) Utils.setminmax(temp, '{0}_vert_mean'.format(self.variable)) - self.send_file(temp, Domains.ocean, self.variable + 'vmean', self.startdate, self.member, self.chunk, + self.send_file(temp, ModelingRealms.ocean, self.variable + 'vmean', self.startdate, self.member, self.chunk, box=self.box, rename_var='{0}_vert_mean'.format(self.variable)) diff --git a/earthdiagnostics/ocean/verticalmeanmeters.py b/earthdiagnostics/ocean/verticalmeanmeters.py index 4f578bcb..24eb1e63 100644 --- a/earthdiagnostics/ocean/verticalmeanmeters.py +++ b/earthdiagnostics/ocean/verticalmeanmeters.py @@ -3,7 +3,7 @@ from earthdiagnostics import cdftools from earthdiagnostics.box import Box from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticFloatOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class VerticalMeanMeters(Diagnostic): @@ -101,5 +101,5 @@ class VerticalMeanMeters(Diagnostic): cdftools.run('cdfvertmean', input=variable_file, output=temp, options=[self.variable, 'T', lev_min, lev_max, '-debug']) Utils.setminmax(temp, '{0}_vert_mean'.format(self.variable)) - self.send_file(temp, Domains.ocean, self.variable + 'vmean', self.startdate, self.member, self.chunk, + self.send_file(temp, ModelingRealms.ocean, self.variable + 'vmean', self.startdate, self.member, self.chunk, box=self.box, rename_var='{0}_vert_mean'.format(self.variable)) diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 613949f3..4deeecae 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -6,7 +6,7 @@ import os from autosubmit.config.log import Log from earthdiagnostics.constants import Basins -from earthdiagnostics.domain import Domain +from earthdiagnostics.modelingrealm import ModelingRealm class VariableJsonException(Exception): @@ -116,13 +116,18 @@ class VariableManager(object): data = json.loads(json_data) if 'variable_entry' in data: Log.debug('Parsing file {0}'.format(file_name)) - self._load_json_variables(data['variable_entry']) + table = CMORTable(data['Header']['table_id'][6:], data['Header']['frequency']) + self._load_json_variables(data['variable_entry'], table) - def _load_json_variables(self, json_data): + def _load_json_variables(self, json_data, table): for short_name in json_data.keys(): + if short_name.lower() in self._dict_variables: + self._dict_variables[short_name.lower()].tables.append(table) + continue variable = Variable() try: variable.parse_json(json_data[short_name], short_name) + variable.tables.append(table) self._dict_variables[variable.short_name.lower()] = variable except VariableJsonException: Log.error('Could not read variable {0}'.format(short_name)) @@ -197,6 +202,7 @@ class Variable(object): self.valid_max = None self.grid = None self.known_aliases = [] + self.tables = [] def parse_json(self, json_var, key): @@ -214,7 +220,7 @@ class Variable(object): if not domain[0]: Log.warning('Variable {0} has no modeling realm defined'.format(self.short_name)) else: - self.domain = Domain(domain[0]) + self.domain = ModelingRealm(domain[0]) self.valid_min = json_var['valid_min'] self.valid_max = json_var['valid_max'] @@ -224,12 +230,14 @@ class Variable(object): self.short_name = var_line[1].strip() self.standard_name = var_line[2].strip() self.long_name = var_line[3].strip() - self.domain = Domain(var_line[4].strip()) + self.domain = ModelingRealm(var_line[4].strip()) self.basin = Basins.parse(var_line[5]) self.units = var_line[6].strip() self.valid_min = var_line[7].strip() self.valid_max = var_line[8].strip() self.grid = var_line[9].strip() + for table in var_line[10].strip().split(':'): + self.tables.append(table) class VariableAlias(object): @@ -252,6 +260,13 @@ class VariableAlias(object): return string +class CMORTable(object): + def __init__(self, name, frequency): + self.name = name + self.frequency = frequency + + def __str__(self): + return self.name class VarType(object): diff --git a/test/unit/test_averagesection.py b/test/unit/test_averagesection.py index 4406aa37..26aa3ed3 100644 --- a/test/unit/test_averagesection.py +++ b/test/unit/test_averagesection.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.ocean.averagesection import AverageSection from mock import Mock -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class TestAverageSection(TestCase): @@ -21,18 +21,18 @@ class TestAverageSection(TestCase): self.box.max_lon = 0 self.diags.config.experiment.get_chunk_list.return_value = (('20010101', 0, 0), ('20010101', 0, 1)) - self.psi = AverageSection(self.data_manager, '20000101', 1, 1, Domains.ocean, 'var', self.box) + self.psi = AverageSection(self.data_manager, '20000101', 1, 1, ModelingRealms.ocean, 'var', self.box) def test_generate_jobs(self): jobs = AverageSection.generate_jobs(self.diags, ['psi', 'var', '0', '0', '0', '0']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], AverageSection(self.data_manager, '20010101', 0, 0, Domains.ocean, 'var', self.box)) - self.assertEqual(jobs[1], AverageSection(self.data_manager, '20010101', 0, 1, Domains.ocean, 'var', self.box)) + self.assertEqual(jobs[0], AverageSection(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', self.box)) + self.assertEqual(jobs[1], AverageSection(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', self.box)) jobs = AverageSection.generate_jobs(self.diags, ['psi', 'var', '0', '0', '0', '0', 'ocean']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], AverageSection(self.data_manager, '20010101', 0, 0, Domains.ocean, 'var', self.box)) - self.assertEqual(jobs[1], AverageSection(self.data_manager, '20010101', 0, 1, Domains.ocean, 'var', self.box)) + self.assertEqual(jobs[0], AverageSection(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', self.box)) + self.assertEqual(jobs[1], AverageSection(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', self.box)) with self.assertRaises(Exception): AverageSection.generate_jobs(self.diags, ['psi']) diff --git a/test/unit/test_cutsection.py b/test/unit/test_cutsection.py index 5f6c034a..ecfab4c7 100644 --- a/test/unit/test_cutsection.py +++ b/test/unit/test_cutsection.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.ocean.cutsection import CutSection from mock import Mock -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class TestCutSection(TestCase): @@ -21,18 +21,18 @@ class TestCutSection(TestCase): self.box.max_lon = 0 self.diags.config.experiment.get_chunk_list.return_value = (('20010101', 0, 0), ('20010101', 0, 1)) - self.psi = CutSection(self.data_manager, '20000101', 1, 1, Domains.atmos, 'var', True, 0) + self.psi = CutSection(self.data_manager, '20000101', 1, 1, ModelingRealms.atmos, 'var', True, 0) def test_generate_jobs(self): jobs = CutSection.generate_jobs(self.diags, ['psi', 'var', 'true', '10']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], CutSection(self.data_manager, '20010101', 0, 0, Domains.ocean, 'var', True, 10)) - self.assertEqual(jobs[1], CutSection(self.data_manager, '20010101', 0, 1, Domains.ocean, 'var', True, 10)) + self.assertEqual(jobs[0], CutSection(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', True, 10)) + self.assertEqual(jobs[1], CutSection(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', True, 10)) jobs = CutSection.generate_jobs(self.diags, ['psi', 'var', 'false', '0', 'atmos']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], CutSection(self.data_manager, '20010101', 0, 0, Domains.atmos, 'var', False, 0)) - self.assertEqual(jobs[1], CutSection(self.data_manager, '20010101', 0, 1, Domains.atmos, 'var', False, 0)) + self.assertEqual(jobs[0], CutSection(self.data_manager, '20010101', 0, 0, ModelingRealms.atmos, 'var', False, 0)) + self.assertEqual(jobs[1], CutSection(self.data_manager, '20010101', 0, 1, ModelingRealms.atmos, 'var', False, 0)) with self.assertRaises(Exception): CutSection.generate_jobs(self.diags, ['psi']) diff --git a/test/unit/test_diagnostic.py b/test/unit/test_diagnostic.py index 579eb0a8..31ba6fa9 100644 --- a/test/unit/test_diagnostic.py +++ b/test/unit/test_diagnostic.py @@ -2,7 +2,7 @@ from earthdiagnostics.diagnostic import * from unittest import TestCase -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class TestDiagnostic(TestCase): @@ -97,12 +97,12 @@ class TestDiagnosticFloatOption(TestCase): class TestDiagnosticDomainOption(TestCase): def test_domain_default_value(self): - diag = DiagnosticDomainOption('option', Domains.ocean) - self.assertEqual(Domains.ocean, diag.parse('')) + diag = DiagnosticDomainOption('option', ModelingRealms.ocean) + self.assertEqual(ModelingRealms.ocean, diag.parse('')) def test_str_default_value(self): diag = DiagnosticDomainOption('option', 'atmos') - self.assertEqual(Domains.atmos, diag.parse('')) + self.assertEqual(ModelingRealms.atmos, diag.parse('')) def test_bad_default_value(self): diag = DiagnosticDomainOption('option', 'default') @@ -116,7 +116,7 @@ class TestDiagnosticDomainOption(TestCase): def test_parse_value(self): diag = DiagnosticDomainOption('option') - self.assertEqual(Domains.seaIce, diag.parse('seaice')) + self.assertEqual(ModelingRealms.seaIce, diag.parse('seaice')) class TestDiagnosticIntOption(TestCase): diff --git a/test/unit/test_interpolate.py b/test/unit/test_interpolate.py index 76a65359..1aa264cf 100644 --- a/test/unit/test_interpolate.py +++ b/test/unit/test_interpolate.py @@ -4,7 +4,7 @@ from unittest import TestCase from earthdiagnostics.ocean.interpolate import Interpolate from mock import Mock -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class TestInterpolate(TestCase): @@ -17,29 +17,29 @@ class TestInterpolate(TestCase): self.diags.config.experiment.get_chunk_list.return_value = (('20010101', 0, 0), ('20010101', 0, 1)) self.diags.config.experiment.model_version = 'model_version' - self.interpolate = Interpolate(self.data_manager, '20000101', 1, 1, Domains.atmos, 'var', 'grid', + self.interpolate = Interpolate(self.data_manager, '20000101', 1, 1, ModelingRealms.atmos, 'var', 'grid', 'model_version', False) def test_generate_jobs(self): jobs = Interpolate.generate_jobs(self.diags, ['interp', 'grid', 'var']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], Interpolate(self.data_manager, '20010101', 0, 0, Domains.ocean, 'var', 'grid', + self.assertEqual(jobs[0], Interpolate(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', 'grid', 'model_version', False)) - self.assertEqual(jobs[1], Interpolate(self.data_manager, '20010101', 0, 1, Domains.ocean, 'var', 'grid', + self.assertEqual(jobs[1], Interpolate(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', 'grid', 'model_version', False)) jobs = Interpolate.generate_jobs(self.diags, ['interp', 'grid', 'var', 'atmos']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], Interpolate(self.data_manager, '20010101', 0, 0, Domains.atmos, 'var', 'grid', + self.assertEqual(jobs[0], Interpolate(self.data_manager, '20010101', 0, 0, ModelingRealms.atmos, 'var', 'grid', 'model_version', False)) - self.assertEqual(jobs[1], Interpolate(self.data_manager, '20010101', 0, 1, Domains.atmos, 'var', 'grid', + self.assertEqual(jobs[1], Interpolate(self.data_manager, '20010101', 0, 1, ModelingRealms.atmos, 'var', 'grid', 'model_version', False)) jobs = Interpolate.generate_jobs(self.diags, ['interp', 'grid', 'var', 'atmos', 'true']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], Interpolate(self.data_manager, '20010101', 0, 0, Domains.atmos, 'var', 'grid', + self.assertEqual(jobs[0], Interpolate(self.data_manager, '20010101', 0, 0, ModelingRealms.atmos, 'var', 'grid', 'model_version', True)) - self.assertEqual(jobs[1], Interpolate(self.data_manager, '20010101', 0, 1, Domains.atmos, 'var', 'grid', + self.assertEqual(jobs[1], Interpolate(self.data_manager, '20010101', 0, 1, ModelingRealms.atmos, 'var', 'grid', 'model_version', True)) with self.assertRaises(Exception): diff --git a/test/unit/test_monthlymean.py b/test/unit/test_monthlymean.py index cdf8a00c..d7b8009f 100644 --- a/test/unit/test_monthlymean.py +++ b/test/unit/test_monthlymean.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.general.monthlymean import MonthlyMean from mock import Mock -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class TestMonthlyMean(TestCase): @@ -21,25 +21,25 @@ class TestMonthlyMean(TestCase): self.box.min_depth = 0 self.box.max_depth = 100 - self.mixed = MonthlyMean(self.data_manager, '20000101', 1, 1, Domains.ocean, 'var', 'freq', '') + self.mixed = MonthlyMean(self.data_manager, '20000101', 1, 1, ModelingRealms.ocean, 'var', 'freq', '') def test_generate_jobs(self): jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'ocean']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, Domains.ocean, 'var', 'day', '')) - self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, Domains.ocean, 'var', 'day', '')) + self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', 'day', '')) + self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', 'day', '')) jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'atmos', 'freq']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, Domains.atmos, 'var', 'freq', '')) - self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, Domains.atmos, 'var', 'freq', '')) + self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.atmos, 'var', 'freq', '')) + self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.atmos, 'var', 'freq', '')) jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'seaice', 'freq', 'grid']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, Domains.seaIce, 'var', 'freq', + self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.seaIce, 'var', 'freq', 'grid')) - self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, Domains.seaIce, 'var', 'freq', + self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.seaIce, 'var', 'freq', 'grid')) with self.assertRaises(Exception): diff --git a/test/unit/test_rewrite.py b/test/unit/test_rewrite.py index f76ef64d..f125947f 100644 --- a/test/unit/test_rewrite.py +++ b/test/unit/test_rewrite.py @@ -5,7 +5,7 @@ from earthdiagnostics.box import Box from earthdiagnostics.general.rewrite import Rewrite from mock import Mock -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms class TestRewrite(TestCase): @@ -21,19 +21,19 @@ class TestRewrite(TestCase): self.box.min_depth = 0 self.box.max_depth = 100 - self.mixed = Rewrite(self.data_manager, '20000101', 1, 1, Domains.atmos, 'var', 'grid') + self.mixed = Rewrite(self.data_manager, '20000101', 1, 1, ModelingRealms.atmos, 'var', 'grid') def test_generate_jobs(self): jobs = Rewrite.generate_jobs(self.diags, ['psi', 'var', 'atmos']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], Rewrite(self.data_manager, '20010101', 0, 0, Domains.atmos, 'var', 'original')) - self.assertEqual(jobs[1], Rewrite(self.data_manager, '20010101', 0, 1, Domains.atmos, 'var', 'original')) + self.assertEqual(jobs[0], Rewrite(self.data_manager, '20010101', 0, 0, ModelingRealms.atmos, 'var', 'original')) + self.assertEqual(jobs[1], Rewrite(self.data_manager, '20010101', 0, 1, ModelingRealms.atmos, 'var', 'original')) jobs = Rewrite.generate_jobs(self.diags, ['psi', 'var', 'ocean', 'grid']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], Rewrite(self.data_manager, '20010101', 0, 0, Domains.ocean, 'var', 'grid')) - self.assertEqual(jobs[1], Rewrite(self.data_manager, '20010101', 0, 1, Domains.ocean, 'var', 'grid')) + self.assertEqual(jobs[0], Rewrite(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', 'grid')) + self.assertEqual(jobs[1], Rewrite(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', 'grid')) with self.assertRaises(Exception): Rewrite.generate_jobs(self.diags, ['psi']) diff --git a/test/unit/test_variable.py b/test/unit/test_variable.py index 3575b4b0..3951dfa6 100644 --- a/test/unit/test_variable.py +++ b/test/unit/test_variable.py @@ -2,7 +2,7 @@ from unittest import TestCase from earthdiagnostics.variable import Variable -from earthdiagnostics.domain import Domains +from earthdiagnostics.modelingrealm import ModelingRealms # class TestVariable(TestCase): -- GitLab From 18f9bd3ab77eeba29a2cf78b12cd5a44bf831b45 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 10:37:35 +0100 Subject: [PATCH 09/22] Added default variable aliases --- earthdiagnostics/variable_alias/default.csv | 302 ++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 earthdiagnostics/variable_alias/default.csv diff --git a/earthdiagnostics/variable_alias/default.csv b/earthdiagnostics/variable_alias/default.csv new file mode 100644 index 00000000..da1c5f40 --- /dev/null +++ b/earthdiagnostics/variable_alias/default.csv @@ -0,0 +1,302 @@ +Aliases,Shortname,Basin,Grid +iiceages:siage:iice_otd,ageice,, +al,al,, +bgfrcsal,bgfrcsal,, +bgfrctem,bgfrctem,, +bgfrcvol,bgfrcvol,, +bgheatco,bgheatco,, +bgsaline,bgsaline,, +bgsaltco,bgsaltco,, +bgtemper,bgtemper,, +bgvole3t,bgvole3t,, +bgvolssh,bgvolssh,, +bld,bld,, +iicebome:iocewflx,bmelt,, +sobowlin,bowlin,, +cc,cl,, +hcc,clh,, +lcc,cll,, +mcc,clm,, +ciwc,cli,, +tcc,clt,, +clwc,clw,, +tcw,clwvi,, +iicedive:sidive,divice,, +e,evspsbl,, +fal,fal,, +sowaflep,fatmosocean,, +sowaflcd,fdilution,, +sophtldf,fhbasindif,, +iowaflup,ficeocean,, +sorunoff,friver,, +sowaflup,fupward,, +gwd,gwd,, +ibgheatco,hcicega,, +sbgheatco,hcsnga,, +heatc,heatc,, +sohtatl,hfbasin,Atl, +sohtind,hfbasin,Ind, +sohtipc,hfbasin,IndPac, +sohtpac,hfbasin,Pac, +sophtadv,hfbasinadv,, +sophteiv,hfbasinba,, +qt_oce:sohefldo:qt,hfds,, +slhf,hfls,, +sshf,hfss,, +sophtove,htovovrt,, +q,hus,, +soicealb,ialb,, +ibgfrcsfx,ibgfrcsfx,, +ibgfrcvol,ibgfrcvol,, +ibghfxbog,ibghfxbog,, +ibghfxbom,ibghfxbom,, +ibghfxdhc,ibghfxdhc,, +ibghfxdif,ibghfxdif,, +ibghfxdyn,ibghfxdyn,, +ibghfxin,ibghfxin,, +ibghfxopw,ibghfxopw,, +ibghfxout,ibghfxout,, +ibghfxres,ibghfxres,, +ibghfxsnw,ibghfxsnw,, +ibghfxspr,ibghfxspr,, +ibghfxsub,ibghfxsub,, +ibghfxsum,ibghfxsum,, +ibghfxthd,ibghfxthd,, +ibgsfxbog,ibgsfxbogga,, +ibgsfxbom,ibgsfxbomga,, +ibgsfxbri,ibgsfxbriga,, +ibgsfxdyn,ibgsfxdynga,, +ibgsfx,ibgsfxga,, +ibgsfxopw,ibgsfxopwga,, +ibgsfxres,ibgsfxresga,, +ibgsfxsni,ibgsfxsniga,, +ibgsfxsum,ibgsfxsumga,, +ibgvfxbog,ibgvfxbogga,, +ibgvfxbom,ibgvfxbomga,, +ibgvfxdyn,ibgvfxdynga,, +ibgvfx,ibgvfxga,, +ibgvfxopw,ibgvfxopwga,, +ibgvfxres,ibgvfxresga,, +ibgvfxsni,ibgvfxsniga,, +ibgvfxsnw,ibgvfxsnwga,, +ibgvfxspr,ibgvfxsprga,, +ibgvfxsub,ibgvfxsubga,, +ibgvfxsum,ibgvfxsumga,, +ibgvolgrm,ibgvolgrm,, +ibrinvol,ibrinvol,, +sibricat,ibrinvolcat,, +iicebopr,iicebopr,, +iicecolf,iicecolf,, +iicedypr,iicedypr,, +iice_etd,iiceetd,, +iicelapr,iicelapr,, +iicenflx,iicenflx,, +iicesflx,iicesflx,, +iiceshea,iiceshea,, +iicesipr,iicesipr,, +iicfsbri,iicfsbri,, +iicfseqv,iicfseqv,, +ioceflxb,ioceflxb,, +iocehebr,iocehebr,, +iocesafl,iocesafl,, +iocesflx,iocesflx,, +iocetflx,iocetflx,, +iocwnsfl,iocwnsfl,, +isstempe,isstempe,, +scmastot,masso,, +mldkz5,mldkz5,, +somxl010:mldr10_1,mlotst,, +swvl1,mrlsl1,, +swvl2,mrlsl2,, +swvl3,mrlsl3,, +swvl4,mrlsl4,, +ro,mrro,, +tp:precip,pr,, +cp,prc,, +lsp,prs,, +isnowpre,prsn,, +sf:snowpre,prsn,, +tcwv,prw,, +msl,psl,, +qns_ice,qnsice,, +qt_ice,qtice,, +strd,rlds,, +strc:str,rls,, +ttr,rlut,, +ttrc,rlutcs,, +ssrd,rsds,, +tsr,rsdt,, +soshfldo,rsntds,, +ssr,rss,, +ssrc,rsscs,, +tsrc,rsut,, +saltc,saltc,, +es,sbl,, +sosalflx,sfs,, +si,si,, +NArea,siarean,, +SArea,siareas,, +iiceconc:siconc:soicecov:ileadfra:ci,sic,, +ci,sic,,ifs +iice_itd:siconc_cat:siconcat,siccat,, +ibgarea,sicga,, +NExnsidc,siextentn,, +SExnsidc,siextents,, +iiceprod,sigr,, +iiceheco,siheco,, +ibgsaltco,sisaltcga,, +iicethic:sithic,sit,, +iice_hid:sithic_cat:sithicat,sitcat,, +iicetemp,sitemp,, +ibgtemper,sitempga,, +iicevelo:sivelo,sivelo,, +iicevelu:sivelu,sivelu,, +iicevelv:sivelv,sivelv,, +ibgvoltot,sivolga,, +sivoln:NVolume,sivoln,, +sivols:SVolume,sivols,, +sivolu,sivolu,, +sostatl,sltbasin,, +sostind,sltbasin,, +sostipc,sltbasin,, +sostpac,sltbasin,, +sopstadv,sltbasinadv,, +sopsteiv,sltbasinba,, +sopstldf,sltbasindif,, +sltnortha,sltnortha,, +sopstove,sltovovrt,, +zosalatl,sltzmean,Atl, +zosalglo,sltzmean,Glob, +zosalind,sltzmean,Ind, +zosalipc,sltzmean,IndPac, +zosalpac,sltzmean,Pac, +asn,snal,, +iice_hsd:snthicat,sndcat,, +isnoheco,snheco,, +sd,snld,, +smlt,snm,, +isnowthi,snthic,, +sbgvoltot,snvolga,, +snvolu,snvolu,, +vosaline:mean_3Dsosaline,so,, +scsaltot,soga,, +hfnortha,sohtatl,, +soleaeiw,soleaeiw,, +soleahtw,soleahtw,, +somixhgt,somixhgt,, +sosaline:isssalin:mean_sosaline,sos,, +sothedep,sothedep,, +src,src,, +zosrfatl,srfzmean,Atl, +zosrfglo,srfzmean,Glob, +zosrfind,srfzmean,Ind, +zosrfipc,srfzmean,IndPac, +zosrfpac,srfzmean,Pac, +rsn,srho,, +iicesali:iice_std,ssi,, +salincat,ssicat,, +ibgsaline,ssiga,, +iicestre,streng,, +so20chgt,t20d,, +t,ta,, +t2m,tas,, +mx2t,tasmax,, +mn2t,tasmin,, +ewss,tauu,, +utau_ice:iocestru:iicestru,strairx,, +sozotaux,tauuo,, +nsss,tauv,, +vtau_ice:iocestrv:iicestrv,strairy,, +sozotauy:sometauy,tauvo,, +d2m,tdps,, +votemper:mean_3Dsosstsst,thetao,, +sctemtot,thetaoga,, +iicesume,tmelt,, +sosstsst:mean_sosstsst,tos,, +sstk,tos,,ifs +tossq,tossq,, +zotematl,toszmean,Atl, +zotemglo,toszmean,Glob, +zotemind,toszmean,Ind, +zotemipc,toszmean,IndPac, +zotempac,toszmean,Pac, +skt,ts,, +iicesurt:soicetem:sistem,tsice,, +istl1,tsice,, +stl1,tsl1,, +stl2,tsl2,, +stl3,tsl3,, +stl4,tsl4,, +tsn,tsn,, +u,ua,, +u10m,uas,, +vozocrtx,uo,, +uos,uos,, +v,va,, +v10m,vas,, +vomecrty,vo,, +vos,vos,, +voddmavs,voddmavs,, +vozoeivu,voeivu,, +vomeeivv,voeivv,, +voveeivw,voeivz,, +scvoltot,volo,, +votkeavm,votkeavm,, +votkeavt,votkeavt,, +votkeevd,votkeevd,, +votkeevm,votkeevm,, +sobarstf,vsftbarot,, +zomsfatl,vsftmyz,Atl, +zomsfglo,vsftmyz,Glob, +zomsfind,vsftmyz,Ind, +zomsfipc:zomsfinp,vsftmyz,IndPac, +zomsfpac,vsftmyz,Pac, +zomsfeiv,vsftmyzba,, +w,wa,, +z,zg,, +vovecrtz,zo,, +sossheigh:sossheig:mean_sossheig,zos,, +scsshtot,zosga,, +scsshste,zossga,, +zossq,zossq,, +scsshtst,zostoga,, +heatc,ohc,, +ohcsum,ohcsum,, +ohcvmean,ohcvmean,, +ohc,ohc,, +transix,transix,, +transiy,transiy,, +windsp,sfcWind,, +vsfsit,vsfsit,, +sfdsi,sfdsi,, +hfsithermds,hfsithermds,, +u2o,uosq,, +v2o,vosq,, +vozomatr,umo,, +vomematr,vmo,, +sozohetr,hfx,, +somehetr,hfy,, +uto,uothetao,, +vto,vothetao,, +uso,uoso,, +vso,voso,, +wfo,wfo,, +emp_oce,evsmpr,, +emp_ice,evsmpr,, +qsr_oce,rsntds,, +qns_oce,rlds,, +qsr_ice,rsdssi,, +qns_ice,rldssi,, +sfx,sfx,, +taum,taum,, +zfull,zfull,, +zhalf,zhalf,, +pbo,pbo,, +thkcello,thkcello,, +ficeberg,ficeberg,, +rsdo,rsds,, +wo,wo,, +w2o,wosq,, +difvho,difvho,, +vovematr,wmo,, +qtr_ice,qtr,, -- GitLab From 64daf43d9ddc8730ede1824ec591b012ebf37b36 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 15:16:13 +0100 Subject: [PATCH 10/22] Added support for xlsx (Primavera tables format!) --- diags.conf | 2 +- earthdiagnostics/cmor_tables/default.csv | 8 +- earthdiagnostics/ocean/heatcontent.py | 32 +++--- earthdiagnostics/ocean/heatcontentlayer.py | 8 +- earthdiagnostics/variable.py | 106 ++++++++++++++++---- earthdiagnostics/variable_alias/default.csv | 14 +-- setup.py | 3 +- 7 files changed, 118 insertions(+), 55 deletions(-) diff --git a/diags.conf b/diags.conf index 5c66c008..cd1bc10c 100644 --- a/diags.conf +++ b/diags.conf @@ -14,7 +14,7 @@ DATA_CONVENTION = PRIMAVERA # Path to NEMO's mask and grid files needed for CDFTools CON_FILES = /esnas/autosubmit/con_files/ # Diagnostics to run, space separated. You must provide for each one the name and the parameters (comma separated) or -# an alias defined in the ALIAS section (see more below). If you are using the diagnpostics just to CMORize, leave it +# an alias defined in the ALIAS section (see more below). If you are using the diagnostics just to CMORize, leave it # empty DIAGS = # DIAGS = OHC diff --git a/earthdiagnostics/cmor_tables/default.csv b/earthdiagnostics/cmor_tables/default.csv index fac5a510..20f0182d 100644 --- a/earthdiagnostics/cmor_tables/default.csv +++ b/earthdiagnostics/cmor_tables/default.csv @@ -33,7 +33,7 @@ sowaflup,fupward,upward_water_flux,Net upward water flux,ocean,,,,,, gwd,gwd,gravity_wave_dissipation,Gravity wave dissipation,atmos,,,,,, ibgheatco,hcicega,global mean ice heat content,Global mean ice heat content,seaIce,,,,,, sbgheatco,hcsnga,global mean snow heat content,Global mean snow heat content,seaIce,,,,,, -heatc,heatc,integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content,Heat content vertically integrated,ocean,,,,,, +heatc,heatc,integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content,Heat content vertically integrated,ocean,,J m-2,,,, sohtatl,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Atl,,,,, sohtind,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,Ind,,,,, sohtipc,hfbasin,northward_ocean_heat_transport,Northward ocean heat transport,ocean,IndPac,,,,, @@ -260,10 +260,8 @@ scsshtot,zosga,global_average_sea_level_change,Global average sea level change , scsshste,zossga,global_average_steric_sea_level_change,Global average steric sea level change ,ocean,,,,,, zossq,zossq,square_of_sea_surface_height_above_geoid,Square of sea surface height above geoid ,ocean,,,,,, scsshtst,zostoga,snthic,Global average thermosteric sea level change ,ocean,,,,,, -heatc,ohc,ocean_heat_content,Ocean heat content,ocean,,J,,,, -ohcsum,ohcsum,total_ocean_heat_content,Total Ocean heat content,ocean,,J,,,, -ohcvmean,ohcvmean,average_ocean_heat_content,Average Ocean heat content,ocean,,J m-3,,,, -ohc,ohc,ocean_heat_content,Ocean heat content,ocean,,J m-2,,,, +heatcsum,heatcsum,total_ocean_heat_content,Total Ocean heat content,ocean,,J,,,, +heatcvmean,heatcvmean,average_ocean_heat_content,Average Ocean heat content,ocean,,J m-3,,,, transix,transix,sea_ice_x_transport,X-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,,, transiy,transiy,sea_ice_y_transport,Y-Component of Sea Ice Mass Transport,seaIce,,kg s-1,,,, windsp,sfcWind,wind_speed,Near-Surface Wind Speed,atmos,,,,,, diff --git a/earthdiagnostics/ocean/heatcontent.py b/earthdiagnostics/ocean/heatcontent.py index 0ce762f2..f7843cb0 100644 --- a/earthdiagnostics/ocean/heatcontent.py +++ b/earthdiagnostics/ocean/heatcontent.py @@ -118,19 +118,19 @@ class HeatContent(Diagnostic): shell_output = cdftools.run('cdfheatc', options=para, input=temperature_file) - ohcsum_temp = TempFile.get() - ohcvmean_temp = TempFile.get() - nco.ncks(input=temperature_file, output=ohcsum_temp, options='-O -v time') - shutil.copy(ohcsum_temp, ohcvmean_temp) + heatcsum_temp = TempFile.get() + heatcvmean_temp = TempFile.get() + nco.ncks(input=temperature_file, output=heatcsum_temp, options='-O -v time') + shutil.copy(heatcsum_temp, heatcvmean_temp) - ohcsum_handler = Utils.openCdf(ohcsum_temp) - thc = ohcsum_handler.createVariable('ohcsum', float, 'time') + heatcsum_handler = Utils.openCdf(heatcsum_temp) + thc = heatcsum_handler.createVariable('heatcsum', float, 'time') thc.standard_name = "integral_of_sea_water_potential_temperature_expressed_as_heat_content" thc.long_name = "Total heat content" thc.units = "J" - ohcvmean_handler = Utils.openCdf(ohcvmean_temp) - uhc = ohcvmean_handler.createVariable('ohcvmean', float, 'time') + heatcvmean_handler = Utils.openCdf(heatcvmean_temp) + uhc = heatcvmean_handler.createVariable('heatcvmean', float, 'time') uhc.standard_name = "integral_of_sea_water_potential_temperature_expressed_as_heat_content" uhc.long_name = "Heat content per unit volume" uhc.units = "J*m^-3" @@ -155,8 +155,8 @@ class HeatContent(Diagnostic): elif line.startswith('TIME : '): Log.info(line) - ohcsum_handler.close() - ohcvmean_handler.close() + heatcsum_handler.close() + heatcvmean_handler.close() if self.box.min_depth == 0: # For cdftools, this is all levels @@ -164,9 +164,9 @@ class HeatContent(Diagnostic): else: box_save = self.box - Utils.setminmax(ohcsum_temp, 'ohcsum') - self.send_file(ohcsum_temp, ModelingRealms.ocean, 'ohcsum', self.startdate, self.member, self.chunk, - box=box_save, region=self.basin.fullname, rename_var='ohcsum') - Utils.setminmax(ohcvmean_temp, 'ohcvmean') - self.send_file(ohcvmean_temp, ModelingRealms.ocean, 'ohcvmean', self.startdate, self.member, self.chunk, - box=box_save, region=self.basin.fullname, rename_var='ohcvmean') + Utils.setminmax(heatcsum_temp, 'heatcsum') + self.send_file(heatcsum_temp, ModelingRealms.ocean, 'heatcsum', self.startdate, self.member, self.chunk, + box=box_save, region=self.basin.fullname, rename_var='heatcsum') + Utils.setminmax(heatcvmean_temp, 'heatcvmean') + self.send_file(heatcvmean_temp, ModelingRealms.ocean, 'heatcvmean', self.startdate, self.member, self.chunk, + box=box_save, region=self.basin.fullname, rename_var='heatcvmean') diff --git a/earthdiagnostics/ocean/heatcontentlayer.py b/earthdiagnostics/ocean/heatcontentlayer.py index 2c9a10fb..23179e4f 100644 --- a/earthdiagnostics/ocean/heatcontentlayer.py +++ b/earthdiagnostics/ocean/heatcontentlayer.py @@ -168,10 +168,10 @@ class HeatContentLayer(Diagnostic): nco.ncks(input=thetao_file, output=results, options='-O -v lon,lat,time') Utils.rename_variables(results, {'x': 'i', 'y': 'j'}, False, True) handler_results = Utils.openCdf(results) - handler_results.createVariable('ohc', float, ('time', 'j', 'i'), fill_value=1.e20) + handler_results.createVariable('heatc', float, ('time', 'j', 'i'), fill_value=1.e20) handler_results.sync() - handler_results.variables['ohc'][:] = heatc_sl + handler_results.variables['heatc'][:] = heatc_sl handler_results.close() - Utils.setminmax(results, 'ohc') - self.send_file(results, ModelingRealms.ocean, 'ohc', self.startdate, self.member, self.chunk, box=self.box) + Utils.setminmax(results, 'heatc') + self.send_file(results, ModelingRealms.ocean, 'heatc', self.startdate, self.member, self.chunk, box=self.box) diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 4deeecae..84cc23e3 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -1,6 +1,7 @@ # coding=utf-8 import csv import json +import openpyxl import os from autosubmit.config.log import Log @@ -72,19 +73,28 @@ class VariableManager(object): """ self._dict_variables = dict() self._load_variable_list(table_name) + self._load_missing_defaults() self._load_known_aliases() self._construct_aliases_dict() def _load_variable_list(self, table_name): + + json_folder = self._get_json_folder(table_name) + if os.path.isdir(json_folder): + self._load_json(json_folder) + return + + xlsx_path = self._get_xlsx_path(table_name) + if os.path.isfile(xlsx_path): + self._load_xlsx(table_name) + return + csv_path = self._get_csv_path(table_name) if os.path.isfile(csv_path): - self._load_file('default') self._load_file(table_name) return - json_folder = self._get_json_folder(table_name) - if os.path.isdir(json_folder): - self._load_json(json_folder) + raise Exception('Data convention {0} unknown'.format(table_name)) def _get_csv_path(self, table_name): csv_table_path = os.path.join(self._cmor_tables_folder, '{0}.csv'.format(table_name)) @@ -94,7 +104,7 @@ class VariableManager(object): json_folder = os.path.join(self._cmor_tables_folder, '{0}/Tables'.format(table_name)) return json_folder - def _load_file(self, csv_table_path): + def _load_file(self, csv_table_path, default=False): with open(self._get_csv_path(csv_table_path), 'rb') as csvfile: reader = csv.reader(csvfile, dialect='excel') for line in reader: @@ -103,8 +113,9 @@ class VariableManager(object): var = Variable() var.parse_csv(line) - if not var.short_name: + if not var.short_name or var.short_name.lower() in self._dict_variables: continue + var.default = default self._dict_variables[var.short_name.lower()] = var @@ -140,21 +151,28 @@ class VariableManager(object): continue aliases = line[0].split(':') - if line[1].lower() in self._dict_variables: - cmor_var = self._dict_variables[line[1].lower()] - else: - cmor_vars = [] - for alias in aliases: - if alias.lower() in self._dict_variables: - cmor_vars.append(self._dict_variables[alias.lower()]) - if len(cmor_vars) == 0: - Log.error('Aliases {0} could not be mapped to any variable'.format(aliases)) - continue - elif len(cmor_vars) > 1: + if line[1] not in aliases: + aliases.append(line[1]) + + cmor_vars = [] + for alias in aliases: + if alias.lower() in self._dict_variables: + cmor_vars.append(self._dict_variables[alias.lower()]) + if len(cmor_vars) == 0: + Log.error('Aliases {0} could not be mapped to any variable'.format(aliases)) + continue + elif len(cmor_vars) > 1: + non_default = [var for var in cmor_vars if not var.default] + if len(non_default) == 1: + for default in [var for var in cmor_vars if var not in non_default]: + del self._dict_variables[default.short_name.lower()] + cmor_vars = non_default + + else: Log.error('Aliases {0} can be be mapped to multiple variables ' - '{1}'.format(aliases, cmor_vars)) + '[{1}]'.format(aliases, ', '.join(map(str, cmor_vars)))) continue - cmor_var = cmor_vars[0] + cmor_var = cmor_vars[0] for alias in aliases: if alias != cmor_var.short_name and alias in self._dict_variables: @@ -183,6 +201,55 @@ class VariableManager(object): for alias in cmor_var.known_aliases: self._dict_aliases[alias.alias] = (alias, cmor_var) + def _get_xlsx_path(self, table_name): + xlsx_table_path = os.path.join(self._cmor_tables_folder, '{0}.xlsx'.format(table_name)) + return xlsx_table_path + + def _load_xlsx(self, table_name): + xlsx_table_path = os.path.join(self._cmor_tables_folder, '{0}.xlsx'.format(table_name)) + excel = openpyxl.load_workbook(xlsx_table_path, True) + for sheet_name in excel.sheetnames: + sheet = excel.get_sheet_by_name(sheet_name) + Log.debug('Loading vars for table {0}', sheet.title) + if sheet['A1'].value != 'Priority': + Log.debug('Not a real table') + continue + + for row in sheet.rows: + if row[0].value == 'Priority' or not row[5].value: + continue + + if row[5].value.lower() in self._dict_variables: + self._dict_variables[row[5].value.lower()].tables.append(sheet.title) + continue + + var = Variable() + var.short_name = row[5].value + var.standard_name = row[6].value + var.long_name = row[1].value + + self._process_modelling_realm(var, row[12].value) + + var.units = row[2].value + var.tables.append(sheet.title) + Log.debug('Adding variable {0}', var.short_name) + self._dict_variables[var.short_name.lower()] = var + + def _process_modelling_realm(self, var, value): + if value is None: + value = '' + modelling_realm = value.split(' ') + if len(modelling_realm) > 1: + Log.warning('Multiple modeling realms assigned to variable {0}: {1}. ' + 'We wil use first ({1[0]}) as modelling realm'.format(var.short_name, modelling_realm)) + if not modelling_realm[0]: + Log.warning('Variable {0} has no modeling realm defined'.format(var.short_name)) + else: + var.domain = ModelingRealm(modelling_realm[0]) + + def _load_missing_defaults(self): + self._load_file('default', True) + class Variable(object): """ @@ -201,6 +268,7 @@ class Variable(object): self.valid_min = None self.valid_max = None self.grid = None + self.default = False self.known_aliases = [] self.tables = [] diff --git a/earthdiagnostics/variable_alias/default.csv b/earthdiagnostics/variable_alias/default.csv index da1c5f40..ce874285 100644 --- a/earthdiagnostics/variable_alias/default.csv +++ b/earthdiagnostics/variable_alias/default.csv @@ -19,7 +19,6 @@ lcc,cll,, mcc,clm,, ciwc,cli,, tcc,clt,, -clwc,clw,, tcw,clwvi,, iicedive:sidive,divice,, e,evspsbl,, @@ -34,7 +33,7 @@ gwd,gwd,, ibgheatco,hcicega,, sbgheatco,hcsnga,, heatc,heatc,, -sohtatl,hfbasin,Atl, +sohtatl:hfnortha,hfbasin,Atl, sohtind,hfbasin,Ind, sohtipc,hfbasin,IndPac, sohtpac,hfbasin,Pac, @@ -136,7 +135,7 @@ sosalflx,sfs,, si,si,, NArea,siarean,, SArea,siareas,, -iiceconc:siconc:soicecov:ileadfra:ci,sic,, +iiceconc:siconc:soicecov:ileadfra,siconc,, ci,sic,,ifs iice_itd:siconc_cat:siconcat,siccat,, ibgarea,sicga,, @@ -180,7 +179,6 @@ sbgvoltot,snvolga,, snvolu,snvolu,, vosaline:mean_3Dsosaline,so,, scsaltot,soga,, -hfnortha,sohtatl,, soleaeiw,soleaeiw,, soleahtw,soleahtw,, somixhgt,somixhgt,, @@ -260,10 +258,9 @@ scsshtot,zosga,, scsshste,zossga,, zossq,zossq,, scsshtst,zostoga,, -heatc,ohc,, -ohcsum,ohcsum,, -ohcvmean,ohcvmean,, -ohc,ohc,, +ohc,heatc,, +ohcsum,heatcsum,, +ohcvmean,heatcvmean,, transix,transix,, transiy,transiy,, windsp,sfcWind,, @@ -294,7 +291,6 @@ zhalf,zhalf,, pbo,pbo,, thkcello,thkcello,, ficeberg,ficeberg,, -rsdo,rsds,, wo,wo,, w2o,wosq,, difvho,difvho,, diff --git a/setup.py b/setup.py index 17f4b07a..bd67a0b3 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,8 @@ setup( author_email='javier.vegas@bsc.es', url='http://www.bsc.es/projects/earthscience/autosubmit/', keywords=['climate', 'weather', 'diagnostic'], - install_requires=['numpy', 'netCDF4', 'autosubmit', 'cdo', 'pygrib', 'nco', 'cfunits>=1.1.4', 'coverage', 'pyproj'], + install_requires=['numpy', 'netCDF4', 'autosubmit', 'cdo', 'pygrib', 'nco', 'cfunits>=1.1.4', 'coverage', 'pyproj', + 'openpyxl'], packages=find_packages(), include_package_data=True, scripts=['bin/earthdiags'] -- GitLab From 4896a247e808b26f92df8682ec2964639d0047fe Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 15:37:03 +0100 Subject: [PATCH 11/22] Removed unneeded output --- earthdiagnostics/variable.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 84cc23e3..56d0cd05 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -196,8 +196,6 @@ class VariableManager(object): cmor_var = self._dict_variables[cmor_var_name] if cmor_var_name not in cmor_var.known_aliases: cmor_var.known_aliases.append(VariableAlias(cmor_var_name)) - Log.debug('Variable: {0} Alias: {1}'.format(cmor_var_name, - ', '.join([str(alias) for alias in cmor_var.known_aliases]))) for alias in cmor_var.known_aliases: self._dict_aliases[alias.alias] = (alias, cmor_var) @@ -210,9 +208,7 @@ class VariableManager(object): excel = openpyxl.load_workbook(xlsx_table_path, True) for sheet_name in excel.sheetnames: sheet = excel.get_sheet_by_name(sheet_name) - Log.debug('Loading vars for table {0}', sheet.title) if sheet['A1'].value != 'Priority': - Log.debug('Not a real table') continue for row in sheet.rows: @@ -232,7 +228,6 @@ class VariableManager(object): var.units = row[2].value var.tables.append(sheet.title) - Log.debug('Adding variable {0}', var.short_name) self._dict_variables[var.short_name.lower()] = var def _process_modelling_realm(self, var, value): -- GitLab From 090292bf7306bb475cef952d2338a2d6e4590067 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 16:52:39 +0100 Subject: [PATCH 12/22] Created class for frequency management --- diags.conf | 2 +- earthdiagnostics/cmorizer.py | 34 +++++------- earthdiagnostics/cmormanager.py | 31 +++++------ earthdiagnostics/config.py | 12 ++--- earthdiagnostics/datamanager.py | 33 ++++-------- earthdiagnostics/diagnostic.py | 13 +++-- earthdiagnostics/frequency.py | 54 +++++++++++++++++++ earthdiagnostics/general/monthlymean.py | 7 +-- earthdiagnostics/modelingrealm.py | 5 +- .../statistics/climatologicalpercentile.py | 4 +- .../statistics/monthlypercentile.py | 5 +- earthdiagnostics/threddsmanager.py | 23 ++++---- earthdiagnostics/variable.py | 19 ++----- earthdiagnostics/variable_type.py | 12 +++++ test/unit/test_monthlymean.py | 25 +++++---- 15 files changed, 166 insertions(+), 113 deletions(-) create mode 100644 earthdiagnostics/frequency.py create mode 100644 earthdiagnostics/variable_type.py diff --git a/diags.conf b/diags.conf index cd1bc10c..f5e92a26 100644 --- a/diags.conf +++ b/diags.conf @@ -9,7 +9,7 @@ DATA_DIR = /esnas:/esarchive DATA_TYPE = exp # CMORization type to use. Important also for THREDDS as it affects variable name conventions. # Options: SPECS (default), PRIMAVERA, CMIP6 -DATA_CONVENTION = PRIMAVERA +DATA_CONVENTION = CMIP6 # Path to NEMO's mask and grid files needed for CDFTools CON_FILES = /esnas/autosubmit/con_files/ diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index ca930228..17200658 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -10,6 +10,7 @@ import pygrib from autosubmit.config.log import Log from autosubmit.date.chunk_date_lib import parse_date, chunk_end_date, previous_day, date2str, add_months +from earthdiagnostics.frequency import Frequency, Frequencies from earthdiagnostics.modelingrealm import ModelingRealms from earthdiagnostics.utils import TempFile, Utils @@ -276,15 +277,15 @@ class Cmorizer(object): def _get_nc_file_frequency(self, filename): file_parts = os.path.basename(filename).split('_') if self.experiment.expid in [file_parts[1], file_parts[2]]: - frequency = 'm' + frequency = Frequency('m') elif self.experiment.expid == file_parts[0]: try: parse_date(file_parts[1]) - frequency = 'm' + frequency = Frequency('m') except ValueError: - frequency = file_parts[1][1].lower() + frequency = Frequency(file_parts[1][1]) else: - frequency = file_parts[1][1].lower() + frequency = Frequency(file_parts[1][1]) return frequency def _contains_requested_variables(self, filename): @@ -300,17 +301,17 @@ class Cmorizer(object): :param handler: netCDF4 handler for the file :type handler: netCDF$.Dataset :param frequency: variable's frequency - :type frequency: str + :type frequency: Frequency :param variable: variable's name :type variable: str """ temp = TempFile.get() - alias, var_cmor = self.data_manager.variable_list.get_variable(variable) + alias, var_cmor = self.data_manager.variable_list.get_variable_and_alias(variable) if var_cmor is None: return if not self.cmor.cmorize(var_cmor): return - frequency = self.translate_frequency(frequency) + frequency = Frequency(frequency) Utils.nco.ncks(input=file_path, output=temp, options='-v {0}'.format(variable)) self._rename_level_variables(temp, var_cmor) @@ -365,15 +366,9 @@ class Cmorizer(object): @staticmethod def translate_frequency(frequency): - if frequency == 'd': - frequency = 'day' - elif frequency == 'm': - frequency = 'mon' - elif frequency == 'h': + if frequency == 'h': frequency = '6hr' - else: - raise Exception('Frequency {0} not supported'.format(frequency)) - return frequency + return Frequency(frequency) @staticmethod def _merge_grib_files(current_month, prev_gribfile, gribfile): @@ -399,14 +394,14 @@ class Cmorizer(object): new_units = None cdo_operator = '-selmon,{0}'.format(month) - if frequency in ('month', 'monthly', 'mon', '1m'): + if frequency == Frequencies.monthly: if var_code == 201: cdo_operator = "-monmean -daymax {0}".format(cdo_operator) elif var_code == 202: cdo_operator = "-monmean -daymax {0}".format(cdo_operator) else: cdo_operator = "-monmean {0} ".format(cdo_operator) - if frequency in ('day', 'daily', '1d'): + if frequency == Frequencies.daily: if var_code == 201: cdo_operator = "-daymax {0} ".format(cdo_operator) elif var_code == 202: @@ -519,10 +514,7 @@ class Cmorizer(object): handler.creation_date = datetime.now().strftime('%Y-%m-%d(T%H:%M:%SZ)') handler.experiment_id = experiment.experiment_name handler.forecast_reference_time = parse_date(self.startdate).strftime('%Y-%m-%d(T%H:%M:%SZ)') - if frequency == 'd': - handler.frequency = 'day' - elif frequency == 'm': - handler.frequency = 'mon' + handler.frequency = frequency.frequency handler.institute_id = experiment.institute handler.institution = experiment.institute handler.initialization_method = cmor.initialization_method diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index 6037cda9..2d524a72 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -8,8 +8,9 @@ from autosubmit.date.chunk_date_lib import parse_date, chunk_start_date, chunk_e from earthdiagnostics.cmorizer import Cmorizer from earthdiagnostics.datamanager import DataManager, NetCDFFile +from earthdiagnostics.frequency import Frequencies from earthdiagnostics.utils import TempFile, Utils -from earthdiagnostics.variable import VarType +from earthdiagnostics.variable_type import VariableType class CMORManager(DataManager): @@ -30,7 +31,7 @@ class CMORManager(DataManager): self.cmor_path = os.path.join(self.config.data_dir, self.experiment.expid, 'cmorfiles') def get_file(self, domain, var, startdate, member, chunk, grid=None, box=None, frequency=None, - vartype=VarType.MEAN): + vartype=VariableType.MEAN): """ Copies a given file from the CMOR repository to the scratch folder and returns the path to the scratch's copy @@ -49,9 +50,9 @@ class CMORManager(DataManager): :param box: file's box (only needed to retrieve sections or averages) :type box: Box :param frequency: file's frequency (only needed if it is different from the default) - :type frequency: str|NoneType + :type frequency: Frequency|NoneType :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: path to the copy created on the scratch folder :rtype: str """ @@ -76,7 +77,7 @@ class CMORManager(DataManager): :param chunk: file's chunk :type chunk: int :param frequency: file's frequency - :type frequency: str + :type frequency: Frequency :param box: file's box :type box: Box :param grid: file's grid @@ -103,7 +104,7 @@ class CMORManager(DataManager): if chunk is not None: time_bound = self._get_chunk_time_bounds(startdate, chunk) elif year: - if frequency is not 'yr': + if frequency != Frequencies.yearly: raise ValueError('Year may be provided instead of chunk only if frequency is "yr"') time_bound = str(year) elif date_str: @@ -139,7 +140,7 @@ class CMORManager(DataManager): return file_name def _get_full_cmor_folder_path(self, startdate, member, domain, var, frequency, grid): - folder_path = os.path.join(self._get_startdate_path(startdate), frequency, domain.name, var) + folder_path = os.path.join(self._get_startdate_path(startdate), str(frequency), domain.name, var) if grid: folder_path = os.path.join(folder_path, grid) folder_path = os.path.join(folder_path, 'r{0}i1p1'.format(member + 1)) @@ -155,7 +156,7 @@ class CMORManager(DataManager): return time_bound def link_file(self, domain, var, startdate, member, chunk=None, grid=None, box=None, - frequency=None, year=None, date_str=None, move_old=False, vartype=VarType.MEAN): + frequency=None, year=None, date_str=None, move_old=False, vartype=VariableType.MEAN): """ Creates the link of a given file from the CMOR repository. @@ -178,9 +179,9 @@ class CMORManager(DataManager): :param box: file's box (only needed to retrieve sections or averages) :type box: Box :param frequency: file's frequency (only needed if it is different from the default) - :type frequency: str + :type frequency: Frequency :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: path to the copy created on the scratch folder :rtype: str """ @@ -194,7 +195,7 @@ class CMORManager(DataManager): def send_file(self, filetosend, domain, var, startdate, member, chunk=None, grid=None, region=None, box=None, rename_var=None, frequency=None, year=None, date_str=None, move_old=False, - diagnostic=None, cmorized=False, vartype=VarType.MEAN): + diagnostic=None, cmorized=False, vartype=VariableType.MEAN): """ Copies a given file to the CMOR repository. It also automatically converts to netCDF 4 if needed and can merge with already existing ones as needed @@ -227,13 +228,13 @@ class CMORManager(DataManager): :param box: file's box (only needed to retrieve sections or averages) :type box: Box :param frequency: file's frequency (only needed if it is different from the default) - :type frequency: str + :type frequency: Frequency :param diagnostic: diagnostic used to generate the file :type diagnostic: Diagnostic :param cmorized: flag to indicate if file was generated in cmorization process :type cmorized: bool :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType """ original_var = var cmor_var = self.variable_list.get_variable(var) @@ -426,11 +427,11 @@ class CMORManager(DataManager): for name in os.listdir(os.path.join(path, freq, domain, var, member)): filepath = os.path.join(path, freq, domain, var, member, name) if os.path.isfile(filepath): - self._create_link(domain, filepath, freq, var, "", False, vartype=VarType.MEAN) + self._create_link(domain, filepath, freq, var, "", False, vartype=VariableType.MEAN) else: for filename in os.listdir(filepath): self._create_link(domain, os.path.join(filepath, filename), freq, var, "", False, - vartype=VarType.MEAN) + vartype=VariableType.MEAN) Log.info('Creating lings for CMOR files') def _get_startdate_path(self, startdate): diff --git a/earthdiagnostics/config.py b/earthdiagnostics/config.py index 3a6b2326..8ab9159d 100644 --- a/earthdiagnostics/config.py +++ b/earthdiagnostics/config.py @@ -4,6 +4,7 @@ import os from autosubmit.config.log import Log from autosubmit.date.chunk_date_lib import parse_date, chunk_start_date, chunk_end_date +from earthdiagnostics.frequency import Frequency, Frequencies from earthdiagnostics.parser import Parser from earthdiagnostics.variable import VariableManager from utils import Utils @@ -37,10 +38,9 @@ class Config(object): "Mask and meshes folder path" self.data_convention = parser.get_option('DIAGNOSTICS', 'DATA_CONVENTION', 'SPECS').lower() self._diags = parser.get_option('DIAGNOSTICS', 'DIAGS') - self.frequency = parser.get_option('DIAGNOSTICS', 'FREQUENCY').lower() + self.frequency = Frequency(parser.get_option('DIAGNOSTICS', 'FREQUENCY')) "Default data frequency to be used by the diagnostics" - if self.frequency == 'month': - self.frequency = 'mon' + self.cdftools_path = Utils.expand_path(parser.get_option('DIAGNOSTICS', 'CDFTOOLS_PATH')) "Path to CDFTOOLS executables" self.max_cores = parser.get_int_option('DIAGNOSTICS', 'MAX_CORES', 100000) @@ -167,11 +167,11 @@ class CMORConfig(object): return range(start, end, step) def get_variables(self, frequency): - if frequency in ('hour', 'hourly') or frequency[1:] == 'hr': + if frequency in (Frequencies.three_hourly, Frequencies.six_hourly): return self._var_hourly - elif frequency in ('day', 'daily', '1d'): + elif frequency == Frequencies.daily: return self._var_daily - elif frequency in ('month', 'monthly', 'mon', '1m'): + elif frequency == Frequencies.monthly: return self._var_monthly raise Exception('Frequency not recognized: {0}'.format(frequency)) diff --git a/earthdiagnostics/datamanager.py b/earthdiagnostics/datamanager.py index bbabead7..455708da 100644 --- a/earthdiagnostics/datamanager.py +++ b/earthdiagnostics/datamanager.py @@ -10,7 +10,8 @@ import re from cfunits import Units from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import Variable, VarType, VariableManager +from earthdiagnostics.variable import Variable, VariableManager +from earthdiagnostics.variable_type import VariableType from earthdiagnostics.modelingrealm import ModelingRealms @@ -31,7 +32,7 @@ class DataManager(object): self.lock = threading.Lock() def get_file(self, domain, var, startdate, member, chunk, grid=None, box=None, frequency=None, - vartype=VarType.MEAN): + vartype=VariableType.MEAN): """ Copies a given file from the CMOR repository to the scratch folder and returns the path to the scratch's copy @@ -50,9 +51,9 @@ class DataManager(object): :param box: file's box (only needed to retrieve sections or averages) :type box: Box :param frequency: file's frequency (only needed if it is different from the default) - :type frequency: str + :type frequency: Frequency :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: path to the copy created on the scratch folder :rtype: str """ @@ -60,7 +61,7 @@ class DataManager(object): def send_file(self, filetosend, domain, var, startdate, member, chunk=None, grid=None, region=None, box=None, rename_var=None, frequency=None, year=None, date_str=None, move_old=False, - diagnostic=None, cmorized=False, vartype=VarType.MEAN): + diagnostic=None, cmorized=False, vartype=VariableType.MEAN): """ Copies a given file to the CMOR repository. It also automatically converts to netCDF 4 if needed and can merge with already existing ones as needed @@ -93,13 +94,13 @@ class DataManager(object): :param box: file's box (only needed to retrieve sections or averages) :type box: Box :param frequency: file's frequency (only needed if it is different from the default) - :type frequency: str + :type frequency: Frequency :param diagnostic: diagnostic used to generate the file :type diagnostic: Diagnostic :param cmorized: flag to indicate if file was generated in cmorization process :type cmorized: bool :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType """ raise NotImplementedError() @@ -140,7 +141,7 @@ class DataManager(object): return '{0}_f{1}h'.format(var, self.experiment.atmos_timestep) def _create_link(self, domain, filepath, frequency, var, grid, move_old, vartype): - freq_str = self.frequency_folder_name(frequency, vartype) + freq_str = frequency.folder_name(vartype) if not grid: grid = 'original' @@ -188,21 +189,9 @@ class DataManager(object): os.symlink(filepath, link_path) self.lock.release() - @staticmethod - def frequency_folder_name(frequency, vartype): - if frequency in ('d', 'daily', 'day'): - freq_str = 'daily_{0}'.format(VarType.to_str(vartype)) - elif frequency == 'clim': - freq_str = 'clim' - elif frequency.endswith('hr'): - freq_str = frequency[:-2] + 'hourly' - else: - freq_str = 'monthly_{0}'.format(VarType.to_str(vartype)) - return freq_str - # Overridable methods (not mandatory) def link_file(self, domain, var, startdate, member, chunk=None, grid=None, box=None, - frequency=None, year=None, date_str=None, move_old=False, vartype=VarType.MEAN): + frequency=None, year=None, date_str=None, move_old=False, vartype=VariableType.MEAN): """ Creates the link of a given file from the CMOR repository. @@ -227,7 +216,7 @@ class DataManager(object): :param frequency: file's frequency (only needed if it is different from the default) :type frequency: str :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: path to the copy created on the scratch folder :rtype: str """ diff --git a/earthdiagnostics/diagnostic.py b/earthdiagnostics/diagnostic.py index 72584578..72bf92ba 100644 --- a/earthdiagnostics/diagnostic.py +++ b/earthdiagnostics/diagnostic.py @@ -1,6 +1,7 @@ # coding=utf-8 from earthdiagnostics.constants import Basins -from earthdiagnostics.variable import VarType +from earthdiagnostics.frequency import Frequency, Frequencies +from earthdiagnostics.variable_type import VariableType from earthdiagnostics.modelingrealm import ModelingRealm @@ -58,7 +59,7 @@ class Diagnostic(object): def send_file(self, filetosend, domain, var, startdate, member, chunk=None, grid=None, region=None, box=None, rename_var=None, frequency=None, year=None, date_str=None, move_old=False, - vartype=VarType.MEAN): + vartype=VariableType.MEAN): """ :param filetosend: @@ -73,11 +74,12 @@ class Diagnostic(object): :param box: :param rename_var: :param frequency: + :type frequency: Frequency :param year: :param date_str: :param move_old: :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: """ self.data_manager.send_file(filetosend, domain, var, startdate, member, chunk, grid, region, @@ -184,6 +186,11 @@ class DiagnosticDomainOption(DiagnosticOption): return ModelingRealm.parse(self.check_default(option_value)) +class DiagnosticFrequencyOption(DiagnosticOption): + def parse(self, option_value): + return Frequency.parse(self.check_default(option_value)) + + class DiagnosticBasinOption(DiagnosticOption): def parse(self, option_value): return Basins.parse(self.check_default(option_value)) diff --git a/earthdiagnostics/frequency.py b/earthdiagnostics/frequency.py new file mode 100644 index 00000000..c116aec7 --- /dev/null +++ b/earthdiagnostics/frequency.py @@ -0,0 +1,54 @@ +from earthdiagnostics.variable_type import VariableType + + +class Frequency(object): + + _recognized = {'f': 'fx', 'fx': 'fx', 'fixed': 'fx', + 'c': 'clim', 'clim': 'clim', 'climatology': 'clim', 'monclim': 'clim', '1hrclimmon': 'clim', + 'y': 'year', 'yr': 'year', 'year': 'year', 'yearly': 'year', + 'm': 'mon', 'mon': 'mon', 'monthly': 'mon', + 'd': 'day', 'daily': 'day', 'day': 'day', + '6': '6hr', '6hr': '6hr', '6_hourly': '6hr', '6hourly': '3hr', + '3': '3hr', '3hr': '3hr', '3_hourly': '3hr', '3hourly': '3hr', + '1': 'hr', 'hr': 'hr', 'hourly': 'hr', '1hr': 'hr', + 'subhr': 'subhr'} + + def __init__(self, freq): + freq = freq.lower() + try: + self.frequency = Frequency._recognized[freq] + except KeyError: + raise Exception('Frequency {0} not supported'.format(freq)) + + def __eq__(self, other): + return self.frequency == other.frequency + + def __str__(self): + return self.frequency + + def folder_name(self, vartype): + if self == Frequencies.daily: + freq_str = 'daily_{0}'.format(VariableType.to_str(vartype)) + elif self == Frequencies.climatology: + freq_str = 'clim' + elif self.frequency.endswith('hr'): + freq_str = self[:-2] + 'hourly' + else: + freq_str = 'monthly_{0}'.format(VariableType.to_str(vartype)) + return freq_str + + @staticmethod + def parse(freq): + if isinstance(freq, Frequency): + return freq + return Frequency(freq) + + +class Frequencies(object): + fixed = Frequency('fx') + climatology = Frequency('clim') + yearly = Frequency('year') + monthly = Frequency('mon') + daily = Frequency('day') + six_hourly = Frequency('6hr') + three_hourly = Frequency('3hr') diff --git a/earthdiagnostics/general/monthlymean.py b/earthdiagnostics/general/monthlymean.py index 7ec06ad3..5c2e5ece 100644 --- a/earthdiagnostics/general/monthlymean.py +++ b/earthdiagnostics/general/monthlymean.py @@ -1,7 +1,8 @@ # coding=utf-8 import os -from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption +from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticFrequencyOption +from earthdiagnostics.frequency import Frequencies from earthdiagnostics.utils import Utils, TempFile from earthdiagnostics.modelingrealm import ModelingRealm @@ -68,7 +69,7 @@ class MonthlyMean(Diagnostic): options_available = (DiagnosticOption('variable'), DiagnosticDomainOption('domain'), - DiagnosticOption('frequency', 'day'), + DiagnosticFrequencyOption('frequency', Frequencies.daily), DiagnosticOption('grid', '')) options = cls.process_options(options, options_available) job_list = list() @@ -88,5 +89,5 @@ class MonthlyMean(Diagnostic): os.remove(variable_file) self.send_file(temp, self.domain, self.variable, self.startdate, self.member, self.chunk, - frequency='mon', grid=self.grid) + frequency=Frequencies.monthly, grid=self.grid) diff --git a/earthdiagnostics/modelingrealm.py b/earthdiagnostics/modelingrealm.py index e01a69e4..05d46e57 100644 --- a/earthdiagnostics/modelingrealm.py +++ b/earthdiagnostics/modelingrealm.py @@ -1,3 +1,6 @@ +from earthdiagnostics.frequency import Frequencies + + class ModelingRealm(object): @staticmethod @@ -41,7 +44,7 @@ class ModelingRealm(object): if table.frequency == frequency: return table - if frequency in ('mon', 'clim'): + if frequency in (Frequencies.monthly, Frequencies.climatology): if self.name == 'seaIce': if data_convention == 'specs': prefix = 'OI' diff --git a/earthdiagnostics/statistics/climatologicalpercentile.py b/earthdiagnostics/statistics/climatologicalpercentile.py index 222411be..afcf1512 100644 --- a/earthdiagnostics/statistics/climatologicalpercentile.py +++ b/earthdiagnostics/statistics/climatologicalpercentile.py @@ -4,7 +4,7 @@ from autosubmit.config.log import Log from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticListIntOption, \ DiagnosticIntOption from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import VarType +from earthdiagnostics.variable_type import VariableType import numpy as np @@ -110,7 +110,7 @@ class ClimatologicalPercentile(Diagnostic): handler.close() self.send_file(temp, self.domain, self.variable + '_percentiles', None, None, frequency='clim', - rename_var='percent', vartype=VarType.STATISTIC) + rename_var='percent', vartype=VariableType.STATISTIC) def _calculate_percentiles(self, distribution): Log.debug('Calculating percentiles') diff --git a/earthdiagnostics/statistics/monthlypercentile.py b/earthdiagnostics/statistics/monthlypercentile.py index 15c886ad..d7b40c3c 100644 --- a/earthdiagnostics/statistics/monthlypercentile.py +++ b/earthdiagnostics/statistics/monthlypercentile.py @@ -4,8 +4,9 @@ import shutil from autosubmit.config.log import Log from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, DiagnosticIntOption +from earthdiagnostics.frequency import Frequencies from earthdiagnostics.utils import Utils, TempFile -from earthdiagnostics.variable import VarType +from earthdiagnostics.variable_type import VariableType from calendar import monthrange @@ -111,7 +112,7 @@ class MonthlyPercentile(Diagnostic): Utils.cdo.monpctl(str(self.percentile), input=[variable_file, monmin_file, monmax_file], output=temp) Utils.rename_variable(temp, 'lev', 'ensemble', False, True) self.send_file(temp, self.domain, '{0}_q{1}'.format(self.variable, self.percentile), self.startdate, - self.member, self.chunk, frequency='mon', rename_var=self.variable, vartype=VarType.STATISTIC) + self.member, self.chunk, frequency=Frequencies.monthly, rename_var=self.variable, vartype=VariableType.STATISTIC) diff --git a/earthdiagnostics/threddsmanager.py b/earthdiagnostics/threddsmanager.py index cb96fcfb..38c2bba8 100644 --- a/earthdiagnostics/threddsmanager.py +++ b/earthdiagnostics/threddsmanager.py @@ -6,7 +6,8 @@ from earthdiagnostics.datamanager import DataManager, NetCDFFile from earthdiagnostics.utils import TempFile, Utils from datetime import datetime -from earthdiagnostics.variable import VarType, VariableManager +from earthdiagnostics.variable import VariableManager +from earthdiagnostics.variable_type import VariableType class THREDDSManager(DataManager): @@ -31,7 +32,7 @@ class THREDDSManager(DataManager): raise Exception('For obs and recon data chunk_size must be always 1') # noinspection PyUnusedLocal - def get_leadtimes(self, domain, variable, startdate, member, leadtimes, frequency=None, vartype=VarType.MEAN): + def get_leadtimes(self, domain, variable, startdate, member, leadtimes, frequency=None, vartype=VariableType.MEAN): aggregation_path = self.get_var_url(variable, startdate, frequency, None, vartype) startdate = parse_date(startdate) @@ -51,7 +52,7 @@ class THREDDSManager(DataManager): return temp def get_file(self, domain, var, startdate, member, chunk, grid=None, box=None, frequency=None, - vartype=VarType.MEAN): + vartype=VariableType.MEAN): """ Copies a given file from the CMOR repository to the scratch folder and returns the path to the scratch's copy @@ -72,7 +73,7 @@ class THREDDSManager(DataManager): :param frequency: file's frequency (only needed if it is different from the default) :type frequency: str :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: path to the copy created on the scratch folder :rtype: str """ @@ -86,7 +87,7 @@ class THREDDSManager(DataManager): def send_file(self, filetosend, domain, var, startdate, member, chunk=None, grid=None, region=None, box=None, rename_var=None, frequency=None, year=None, date_str=None, move_old=False, - diagnostic=None, cmorized=False, vartype=VarType.MEAN): + diagnostic=None, cmorized=False, vartype=VariableType.MEAN): """ Copies a given file to the CMOR repository. It also automatically converts to netCDF 4 if needed and can merge with already existing ones as needed @@ -125,7 +126,7 @@ class THREDDSManager(DataManager): :param cmorized: flag to indicate if file was generated in cmorization process :type cmorized: bool :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType """ if cmorized: raise ValueError('cmorized is not supported in THREDDS manager') @@ -168,7 +169,7 @@ class THREDDSManager(DataManager): :return: path to the file :rtype: str :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType """ if not frequency: frequency = self.config.frequency @@ -194,7 +195,7 @@ class THREDDSManager(DataManager): var_folder) return folder_path - def get_year(self, domain, var, startdate, member, year, grid=None, box=None, vartype=VarType.MEAN): + def get_year(self, domain, var, startdate, member, year, grid=None, box=None, vartype=VariableType.MEAN): """ Ge a file containing all the data for one year for one variable :param domain: variable's domain @@ -212,7 +213,7 @@ class THREDDSManager(DataManager): :param box: variable's box :type box: Box :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: """ aggregation_path = self.get_var_url(var, startdate, None, box, vartype) @@ -240,7 +241,7 @@ class THREDDSManager(DataManager): return '{0}.nc'.format(var) def link_file(self, domain, var, startdate, member, chunk=None, grid=None, box=None, - frequency=None, year=None, date_str=None, move_old=False, vartype=VarType.MEAN): + frequency=None, year=None, date_str=None, move_old=False, vartype=VariableType.MEAN): """ Creates the link of a given file from the CMOR repository. @@ -265,7 +266,7 @@ class THREDDSManager(DataManager): :param frequency: file's frequency (only needed if it is different from the default) :type frequency: str :param vartype: Variable type (mean, statistic) - :type vartype: VarType + :type vartype: VariableType :return: path to the copy created on the scratch folder :rtype: str """ diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 56d0cd05..b323e2fc 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -1,12 +1,13 @@ # coding=utf-8 import csv import json -import openpyxl +import openpyxl import os from autosubmit.config.log import Log from earthdiagnostics.constants import Basins +from earthdiagnostics.frequency import Frequency from earthdiagnostics.modelingrealm import ModelingRealm @@ -127,7 +128,7 @@ class VariableManager(object): data = json.loads(json_data) if 'variable_entry' in data: Log.debug('Parsing file {0}'.format(file_name)) - table = CMORTable(data['Header']['table_id'][6:], data['Header']['frequency']) + table = CMORTable(data['Header']['table_id'][6:], Frequency(data['Header']['frequency'])) self._load_json_variables(data['variable_entry'], table) def _load_json_variables(self, json_data, table): @@ -332,17 +333,3 @@ class CMORTable(object): return self.name -class VarType(object): - MEAN = 1 - STATISTIC = 2 - - @staticmethod - def to_str(vartype): - if vartype == VarType.MEAN: - return 'mean' - elif vartype == VarType.STATISTIC: - return 'statistics' - else: - raise ValueError('Variable type {0} not supported'.format(vartype)) - - diff --git a/earthdiagnostics/variable_type.py b/earthdiagnostics/variable_type.py new file mode 100644 index 00000000..1ef88882 --- /dev/null +++ b/earthdiagnostics/variable_type.py @@ -0,0 +1,12 @@ +class VariableType(object): + MEAN = 1 + STATISTIC = 2 + + @staticmethod + def to_str(vartype): + if vartype == VariableType.MEAN: + return 'mean' + elif vartype == VariableType.STATISTIC: + return 'statistics' + else: + raise ValueError('Variable type {0} not supported'.format(vartype)) \ No newline at end of file diff --git a/test/unit/test_monthlymean.py b/test/unit/test_monthlymean.py index d7b8009f..91e42a53 100644 --- a/test/unit/test_monthlymean.py +++ b/test/unit/test_monthlymean.py @@ -2,6 +2,7 @@ from unittest import TestCase from earthdiagnostics.box import Box +from earthdiagnostics.frequency import Frequencies from earthdiagnostics.general.monthlymean import MonthlyMean from mock import Mock @@ -27,20 +28,24 @@ class TestMonthlyMean(TestCase): jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'ocean']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', 'day', '')) - self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', 'day', '')) + self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.ocean, 'var', + Frequencies.daily, '')) + self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.ocean, 'var', + Frequencies.daily, '')) - jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'atmos', 'freq']) + jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'atmos', 'monthly']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.atmos, 'var', 'freq', '')) - self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.atmos, 'var', 'freq', '')) + self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.atmos, 'var', + Frequencies.monthly, '')) + self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.atmos, 'var', + Frequencies.monthly, '')) - jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'seaice', 'freq', 'grid']) + jobs = MonthlyMean.generate_jobs(self.diags, ['psi', 'var', 'seaice', 'mon', 'grid']) self.assertEqual(len(jobs), 2) - self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.seaIce, 'var', 'freq', - 'grid')) - self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.seaIce, 'var', 'freq', - 'grid')) + self.assertEqual(jobs[0], MonthlyMean(self.data_manager, '20010101', 0, 0, ModelingRealms.seaIce, 'var', + Frequencies.monthly, 'grid')) + self.assertEqual(jobs[1], MonthlyMean(self.data_manager, '20010101', 0, 1, ModelingRealms.seaIce, 'var', + Frequencies.monthly, 'grid')) with self.assertRaises(Exception): MonthlyMean.generate_jobs(self.diags, ['psi']) -- GitLab From 8824e655d6b7aadb171b2d6734079dfefca66c18 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 17:33:52 +0100 Subject: [PATCH 13/22] Fixed bug in CMORization --- earthdiagnostics/cmorizer.py | 4 ++-- earthdiagnostics/cmormanager.py | 4 +++- earthdiagnostics/datamanager.py | 3 ++- earthdiagnostics/modelingrealm.py | 6 +++--- earthdiagnostics/variable.py | 3 ++- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index 17200658..1ddc6667 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -299,7 +299,7 @@ class Cmorizer(object): :param file_path: path to the file :type file_path: str :param handler: netCDF4 handler for the file - :type handler: netCDF$.Dataset + :type handler: netCDF4.Dataset :param frequency: variable's frequency :type frequency: Frequency :param variable: variable's name @@ -311,7 +311,7 @@ class Cmorizer(object): return if not self.cmor.cmorize(var_cmor): return - frequency = Frequency(frequency) + frequency = Frequency.parse(frequency) Utils.nco.ncks(input=file_path, output=temp, options='-v {0}'.format(variable)) self._rename_level_variables(temp, var_cmor) diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index 2d524a72..551d3025 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -100,7 +100,8 @@ class CMORManager(DataManager): return filepath def _get_cmor_file_name(self, startdate, member, domain, var, frequency, chunk, year, date_str, grid): - domain_abreviattion = domain.get_table_name(frequency, self.config.data_convention) + domain_abreviattion = domain.get_table_name(self.variable_list.get_variable(var), frequency, + self.config.data_convention) if chunk is not None: time_bound = self._get_chunk_time_bounds(startdate, chunk) elif year: @@ -251,6 +252,7 @@ class CMORManager(DataManager): filepath = self.get_file_path(startdate, member, domain, var, chunk, frequency, None, grid, year, date_str) netcdf_file = NetCDFFile(filepath, filetosend, domain, var, cmor_var, self.config.data_convention) + netcdf_file.frequency = frequency if diagnostic: netcdf_file.add_diagnostic_history(diagnostic) elif cmorized: diff --git a/earthdiagnostics/datamanager.py b/earthdiagnostics/datamanager.py index 455708da..3e266db6 100644 --- a/earthdiagnostics/datamanager.py +++ b/earthdiagnostics/datamanager.py @@ -313,7 +313,8 @@ class NetCDFFile(object): var_handler = handler.variables[self.var] self._fix_variable_name(var_handler) handler.modeling_realm = self.cmor_var.domain.name - handler.table_id = 'Table {0} (December 2013)'.format(self.cmor_var.domain.get_table_name(self.frequency, + handler.table_id = 'Table {0} (December 2013)'.format(self.cmor_var.domain.get_table_name(self.cmor_var, + self.frequency, self.data_convention)) if self.cmor_var.units: self._fix_units(var_handler) diff --git a/earthdiagnostics/modelingrealm.py b/earthdiagnostics/modelingrealm.py index 05d46e57..93921a3b 100644 --- a/earthdiagnostics/modelingrealm.py +++ b/earthdiagnostics/modelingrealm.py @@ -40,7 +40,7 @@ class ModelingRealm(object): :return: variable's table name :rtype: str """ - for table in variable.tables(): + for table in variable.tables: if table.frequency == frequency: return table @@ -54,8 +54,8 @@ class ModelingRealm(object): prefix = 'LI' else: prefix = self.name[0].upper() - table_name = prefix + frequency - elif frequency == '6hr': + table_name = prefix + str(frequency) + elif frequency == Frequencies.six_hourly: table_name = '6hrPlev' else: table_name = 'day' diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index b323e2fc..a470edc4 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -301,7 +301,8 @@ class Variable(object): self.valid_max = var_line[8].strip() self.grid = var_line[9].strip() for table in var_line[10].strip().split(':'): - self.tables.append(table) + if table: + self.tables.append(table) class VariableAlias(object): -- GitLab From 446161452d97fea9b2042b6b1fe756b5b555623f Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 17:34:12 +0100 Subject: [PATCH 14/22] Added primavera tables --- earthdiagnostics/cmor_tables/primavera.xlsx | Bin 0 -> 2665114 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 earthdiagnostics/cmor_tables/primavera.xlsx diff --git a/earthdiagnostics/cmor_tables/primavera.xlsx b/earthdiagnostics/cmor_tables/primavera.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cd537007ea823e4d846766b6fe2ccf42f2d5afb3 GIT binary patch literal 2665114 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

R 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�m2}BFBpUP!WhH{ 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

@Rzdsron{_w`E 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

Lj6!`zu=HzQ& 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%0DN!q10q5q6^LM^Yz4Jq07?`Zo1J3zP@C2)7m~ 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

v|k=q#BsmzRMrHN@uD^^fszts%=O97qfNrs}HTE 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 Date: Fri, 9 Dec 2016 17:44:56 +0100 Subject: [PATCH 15/22] Improved CMOR table management --- earthdiagnostics/cmormanager.py | 7 +++---- earthdiagnostics/datamanager.py | 5 ++--- earthdiagnostics/modelingrealm.py | 6 +----- earthdiagnostics/variable.py | 14 ++++++++++++-- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index 551d3025..9c107e89 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -100,8 +100,7 @@ class CMORManager(DataManager): return filepath def _get_cmor_file_name(self, startdate, member, domain, var, frequency, chunk, year, date_str, grid): - domain_abreviattion = domain.get_table_name(self.variable_list.get_variable(var), frequency, - self.config.data_convention) + cmor_table = self.variable_list.get_variable(var).get_table(frequency, self.config.data_convention) if chunk is not None: time_bound = self._get_chunk_time_bounds(startdate, chunk) elif year: @@ -121,7 +120,7 @@ class CMORManager(DataManager): if self.config.data_convention == 'specs': file_name = '{0}_{1}_{2}_{3}_S{4}_r{5}i1p1{6}'.format(var, - domain_abreviattion, + cmor_table.name, self.experiment.model, self.experiment.experiment_name, startdate, @@ -129,7 +128,7 @@ class CMORManager(DataManager): time_bound) elif self.config.data_convention in ('primavera', 'cmip6'): file_name = '{0}_{1}_{2}_{3}_S{4}-r{5}i1p1_{6}{7}'.format(var, - domain_abreviattion, + cmor_table.name, self.experiment.experiment_name, self.experiment.model, startdate, diff --git a/earthdiagnostics/datamanager.py b/earthdiagnostics/datamanager.py index 3e266db6..6ba796e1 100644 --- a/earthdiagnostics/datamanager.py +++ b/earthdiagnostics/datamanager.py @@ -313,9 +313,8 @@ class NetCDFFile(object): var_handler = handler.variables[self.var] self._fix_variable_name(var_handler) handler.modeling_realm = self.cmor_var.domain.name - handler.table_id = 'Table {0} (December 2013)'.format(self.cmor_var.domain.get_table_name(self.cmor_var, - self.frequency, - self.data_convention)) + table = self.cmor_var.get_table(self.frequency, self.data_convention) + handler.table_id = 'Table {0} ({1})'.format(table.name, table.date) if self.cmor_var.units: self._fix_units(var_handler) handler.sync() diff --git a/earthdiagnostics/modelingrealm.py b/earthdiagnostics/modelingrealm.py index 93921a3b..3afbe254 100644 --- a/earthdiagnostics/modelingrealm.py +++ b/earthdiagnostics/modelingrealm.py @@ -30,7 +30,7 @@ class ModelingRealm(object): def __str__(self): return self.name - def get_table_name(self, variable, frequency, data_convention): + def get_table_name(self, frequency, data_convention): """ Returns the table name for a domain-frequency pair :param data_convention: Data convention in use @@ -40,10 +40,6 @@ class ModelingRealm(object): :return: variable's table name :rtype: str """ - for table in variable.tables: - if table.frequency == frequency: - return table - if frequency in (Frequencies.monthly, Frequencies.climatology): if self.name == 'seaIce': if data_convention == 'specs': diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index a470edc4..ef7ea2f4 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -128,7 +128,9 @@ class VariableManager(object): data = json.loads(json_data) if 'variable_entry' in data: Log.debug('Parsing file {0}'.format(file_name)) - table = CMORTable(data['Header']['table_id'][6:], Frequency(data['Header']['frequency'])) + table = CMORTable(data['Header']['table_id'][6:], + Frequency(data['Header']['frequency']), + data['Header']['table_date']) self._load_json_variables(data['variable_entry'], table) def _load_json_variables(self, json_data, table): @@ -304,6 +306,13 @@ class Variable(object): if table: self.tables.append(table) + def get_table(self, frequency, data_convention): + for table in self.tables: + if table.frequency == frequency: + return table + table_name = self.domain.get_table_name(frequency, data_convention) + return CMORTable(table_name, frequency, 'December 2013') + class VariableAlias(object): """ @@ -326,9 +335,10 @@ class VariableAlias(object): class CMORTable(object): - def __init__(self, name, frequency): + def __init__(self, name, frequency, date): self.name = name self.frequency = frequency + self.date = date def __str__(self): return self.name -- GitLab From fc1596f9742c985eae7d519d9f5c7bf296332ac9 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 18:14:15 +0100 Subject: [PATCH 16/22] Corrected aliases --- earthdiagnostics/cmor_tables/default.csv | 1 - earthdiagnostics/variable.py | 20 +++++++++++++------ earthdiagnostics/variable_alias/cmip6.csv | 3 +++ earthdiagnostics/variable_alias/default.csv | 4 ---- earthdiagnostics/variable_alias/primavera.csv | 3 +++ earthdiagnostics/variable_alias/specs.csv | 3 +++ 6 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 earthdiagnostics/variable_alias/cmip6.csv create mode 100644 earthdiagnostics/variable_alias/primavera.csv create mode 100644 earthdiagnostics/variable_alias/specs.csv diff --git a/earthdiagnostics/cmor_tables/default.csv b/earthdiagnostics/cmor_tables/default.csv index 20f0182d..fc2742ef 100644 --- a/earthdiagnostics/cmor_tables/default.csv +++ b/earthdiagnostics/cmor_tables/default.csv @@ -180,7 +180,6 @@ sbgvoltot,snvolga,snow_volume,Global mean snow volume,seaIce,,,,,, snvolu,snvolu,snow_volume_per_unit_gridcell_area,Snow volume per gridcell area unit,seaIce,,,,,, vosaline:mean_3Dsosaline,so,sea_water_salinity,Sea water salinity,ocean,,psu,,,, scsaltot,soga,sea_water_salinity,Global mean sea water salinity ,ocean,,psu,,,, -hfnortha,sohtatl,northward_ocean_heat_transport,Atlantic northward ocean heat transport,ocean,,,,,, soleaeiw,soleaeiw,eddy_induced_velocity_coefficient,Eddy induced vel. coeff. at w-point,ocean,,,,,, soleahtw,soleahtw,lateral_eddy_diffusivity,Lateral eddy diffusivity,ocean,,,,,, somixhgt,somixhgt,mixing_layer_depth_turbocline,Mixing layer depth (turbocline),ocean,,,,,, diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index ef7ea2f4..68e35da9 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -66,7 +66,7 @@ class VariableManager(object): except KeyError: if not silent: Log.warning('Variable {0} is not defined in the CMOR table. Please add it'.format(original_name)) - return None + return None, None def load_variables(self, table_name): """ @@ -75,7 +75,7 @@ class VariableManager(object): self._dict_variables = dict() self._load_variable_list(table_name) self._load_missing_defaults() - self._load_known_aliases() + self._load_known_aliases(table_name) self._construct_aliases_dict() def _load_variable_list(self, table_name): @@ -146,8 +146,16 @@ class VariableManager(object): except VariableJsonException: Log.error('Could not read variable {0}'.format(short_name)) - def _load_known_aliases(self): - with open(self._get_aliases_csv_path(), 'rb') as csvfile: + def _load_known_aliases(self, table_name): + self._load_alias_csv('default') + self._load_alias_csv(table_name) + + def _load_alias_csv(self, filename): + file_path = self._get_aliases_csv_path(filename) + if not os.path.isfile(file_path): + return + + with open(file_path, 'rb') as csvfile: reader = csv.reader(csvfile, dialect='excel') for line in reader: if line[0] == 'Aliases': @@ -189,8 +197,8 @@ class VariableManager(object): alias_object.grid = line[3] cmor_var.known_aliases.append(alias_object) - def _get_aliases_csv_path(self): - csv_table_path = os.path.join(self._aliases_folder, 'default.csv') + def _get_aliases_csv_path(self, filename): + csv_table_path = os.path.join(self._aliases_folder, '{0}.csv'.format(filename)) return csv_table_path def _construct_aliases_dict(self): diff --git a/earthdiagnostics/variable_alias/cmip6.csv b/earthdiagnostics/variable_alias/cmip6.csv new file mode 100644 index 00000000..6aee91f5 --- /dev/null +++ b/earthdiagnostics/variable_alias/cmip6.csv @@ -0,0 +1,3 @@ +Aliases,Shortname,Basin,Grid +iiceconc:soicecov:ileadfra,siconc,, +ci,siconc,,ifs diff --git a/earthdiagnostics/variable_alias/default.csv b/earthdiagnostics/variable_alias/default.csv index ce874285..24683fe3 100644 --- a/earthdiagnostics/variable_alias/default.csv +++ b/earthdiagnostics/variable_alias/default.csv @@ -130,13 +130,9 @@ ssr,rss,, ssrc,rsscs,, tsrc,rsut,, saltc,saltc,, -es,sbl,, sosalflx,sfs,, -si,si,, NArea,siarean,, SArea,siareas,, -iiceconc:siconc:soicecov:ileadfra,siconc,, -ci,sic,,ifs iice_itd:siconc_cat:siconcat,siccat,, ibgarea,sicga,, NExnsidc,siextentn,, diff --git a/earthdiagnostics/variable_alias/primavera.csv b/earthdiagnostics/variable_alias/primavera.csv new file mode 100644 index 00000000..23d010ad --- /dev/null +++ b/earthdiagnostics/variable_alias/primavera.csv @@ -0,0 +1,3 @@ +Aliases,Shortname,Basin,Grid +iiceconc:siconc:soicecov:ileadfra,siconc,, +ci,siconc,,ifs \ No newline at end of file diff --git a/earthdiagnostics/variable_alias/specs.csv b/earthdiagnostics/variable_alias/specs.csv new file mode 100644 index 00000000..1aebaab3 --- /dev/null +++ b/earthdiagnostics/variable_alias/specs.csv @@ -0,0 +1,3 @@ +Aliases,Shortname,Basin,Grid +siconc:soicecov,sic,, +ci,sic,,ifs \ No newline at end of file -- GitLab From 606d326285789137b0c97ef0acddce6b5afb73e1 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 9 Dec 2016 18:29:30 +0100 Subject: [PATCH 17/22] Now reading frequency and table date from primavera tables --- diags.conf | 2 +- earthdiagnostics/frequency.py | 6 +++--- earthdiagnostics/variable.py | 11 ++++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/diags.conf b/diags.conf index f5e92a26..cd1bc10c 100644 --- a/diags.conf +++ b/diags.conf @@ -9,7 +9,7 @@ DATA_DIR = /esnas:/esarchive DATA_TYPE = exp # CMORization type to use. Important also for THREDDS as it affects variable name conventions. # Options: SPECS (default), PRIMAVERA, CMIP6 -DATA_CONVENTION = CMIP6 +DATA_CONVENTION = PRIMAVERA # Path to NEMO's mask and grid files needed for CDFTools CON_FILES = /esnas/autosubmit/con_files/ diff --git a/earthdiagnostics/frequency.py b/earthdiagnostics/frequency.py index c116aec7..12d8ac32 100644 --- a/earthdiagnostics/frequency.py +++ b/earthdiagnostics/frequency.py @@ -8,9 +8,9 @@ class Frequency(object): 'y': 'year', 'yr': 'year', 'year': 'year', 'yearly': 'year', 'm': 'mon', 'mon': 'mon', 'monthly': 'mon', 'd': 'day', 'daily': 'day', 'day': 'day', - '6': '6hr', '6hr': '6hr', '6_hourly': '6hr', '6hourly': '3hr', - '3': '3hr', '3hr': '3hr', '3_hourly': '3hr', '3hourly': '3hr', - '1': 'hr', 'hr': 'hr', 'hourly': 'hr', '1hr': 'hr', + '6': '6hr', '6hr': '6hr', '6_hourly': '6hr', '6hourly': '6hr', '6 hourly': '6hr', + '3': '3hr', '3hr': '3hr', '3_hourly': '3hr', '3hourly': '3hr', '3 hourly': '3hr', + '1': 'hr', 'hr': 'hr', 'hourly': 'hr', '1hr': 'hr', '1 hourly': '1hr', 'subhr': 'subhr'} def __init__(self, freq): diff --git a/earthdiagnostics/variable.py b/earthdiagnostics/variable.py index 68e35da9..c0af15af 100644 --- a/earthdiagnostics/variable.py +++ b/earthdiagnostics/variable.py @@ -1,6 +1,7 @@ # coding=utf-8 import csv import json +from shlex import shlex import openpyxl import os @@ -217,10 +218,18 @@ class VariableManager(object): def _load_xlsx(self, table_name): xlsx_table_path = os.path.join(self._cmor_tables_folder, '{0}.xlsx'.format(table_name)) excel = openpyxl.load_workbook(xlsx_table_path, True) + + table_data = {} + data_sheet = excel.worksheets[0] + for row in data_sheet.rows: + if row[1].value in excel.sheetnames: + table_data[row[1].value] = (Frequency(row[2].value), row[4].value[4:-1]) + for sheet_name in excel.sheetnames: sheet = excel.get_sheet_by_name(sheet_name) if sheet['A1'].value != 'Priority': continue + table_frequency, table_date = table_data[sheet.title] for row in sheet.rows: if row[0].value == 'Priority' or not row[5].value: @@ -238,7 +247,7 @@ class VariableManager(object): self._process_modelling_realm(var, row[12].value) var.units = row[2].value - var.tables.append(sheet.title) + var.tables.append(CMORTable(sheet.title, table_frequency, table_date)) self._dict_variables[var.short_name.lower()] = var def _process_modelling_realm(self, var, value): -- GitLab From f0c0695aa49b28cfea5d472504242930c78b68d9 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Tue, 13 Dec 2016 13:33:27 +0100 Subject: [PATCH 18/22] Fixed extraction of online CMORized files --- diags.conf | 17 ++++++----- earthdiagnostics/cmorizer.py | 2 ++ earthdiagnostics/cmormanager.py | 48 ++++++++++++++++++++++++++---- earthdiagnostics/frequency.py | 8 +++-- earthdiagnostics/threddsmanager.py | 2 +- 5 files changed, 60 insertions(+), 17 deletions(-) diff --git a/diags.conf b/diags.conf index cd1bc10c..2db3b569 100644 --- a/diags.conf +++ b/diags.conf @@ -1,6 +1,6 @@ [DIAGNOSTICS] # Data adaptor type: CMOR (for our experiments), THREDDS (for other experiments) -DATA_ADAPTOR = THREDDS +DATA_ADAPTOR = CMOR # Path to the folder where you want to create the temporary files SCRATCH_DIR = /scratch/Earth/$USER # Root path for the cmorized data to use @@ -9,7 +9,7 @@ DATA_DIR = /esnas:/esarchive DATA_TYPE = exp # CMORization type to use. Important also for THREDDS as it affects variable name conventions. # Options: SPECS (default), PRIMAVERA, CMIP6 -DATA_CONVENTION = PRIMAVERA +DATA_CONVENTION = SPECS # Path to NEMO's mask and grid files needed for CDFTools CON_FILES = /esnas/autosubmit/con_files/ @@ -30,7 +30,7 @@ MAX_CORES = 1 [CMOR] # If true, recreates CMOR files regardless of presence. Default = False -FORCE = True +FORCE = False # If true, CMORizes ocean files. Default = True OCEAN_FILES = True # If true, CMORizes atmosphere files. Default = True @@ -68,8 +68,9 @@ SERVER_URL = https://earth.bsc.es/thredds [EXPERIMENT] # Experiments parameters as defined in CMOR standard -INSTITUTE = ecmwf -MODEL = system4_m1 +INSTITUTE = IC3 +MODEL = EC-EARTH3 +NAME = windstress # Model version: Available versions MODEL_VERSION =Ec2.3_O1L46 # Atmospheric output timestep in hours @@ -85,9 +86,9 @@ OCEAN_TIMESTEP = 6 # if 2, fc00 # CHUNK_SIZE is the size of each data file, given in months # CHUNKS is the number of chunks. You can specify less chunks than present on the experiment -EXPID = resilience -STARTDATES = 19810101 -MEMBERS = 0 +EXPID = a07o +STARTDATES = 20000201 20000501 20010201 20010501 20020201 20020501 20030201 20030501 20040201 20040501 20050201 20050501 +MEMBERS = 0 1 2 3 4 5 6 7 MEMBER_DIGITS = 1 CHUNK_SIZE = 7 CHUNKS = 1 diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index 1ddc6667..d4e0a437 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -59,6 +59,7 @@ class Cmorizer(object): :return: """ if not self.cmor.ocean: + Log.info('Skipping ocean cmorization due to configuration') return self._cmorize_ocean_files('MMO') self._cmorize_ocean_files('PPO') @@ -122,6 +123,7 @@ class Cmorizer(object): :return: """ if not self.cmor.atmosphere: + Log.info('Skipping atmosphere cmorization due to configuration') return if self.cmor.use_grib and self.gribfiles_available(): diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index 9c107e89..d18e6618 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -1,5 +1,6 @@ # coding=utf-8 import glob +import shutil from datetime import datetime import os @@ -8,7 +9,7 @@ from autosubmit.date.chunk_date_lib import parse_date, chunk_start_date, chunk_e from earthdiagnostics.cmorizer import Cmorizer from earthdiagnostics.datamanager import DataManager, NetCDFFile -from earthdiagnostics.frequency import Frequencies +from earthdiagnostics.frequency import Frequencies, Frequency from earthdiagnostics.utils import TempFile, Utils from earthdiagnostics.variable_type import VariableType @@ -20,12 +21,21 @@ class CMORManager(DataManager): def __init__(self, config): super(CMORManager, self).__init__(config) data_folders = self.config.data_dir.split(':') + experiment_folder = self.experiment.model.lower() + if experiment_folder.startswith('ec-earth'): + experiment_folder = 'ecearth' + self.config.data_dir = None for data_folder in data_folders: if os.path.isdir(os.path.join(data_folder, self.experiment.expid)): self.config.data_dir = data_folder break + data_folder = os.path.join(data_folder, self.config.data_type, experiment_folder) + if os.path.isdir(os.path.join(data_folder, self.experiment.expid)): + self.config.data_dir = data_folder + break + if not self.config.data_dir: raise Exception('Can not find model data') self.cmor_path = os.path.join(self.config.data_dir, self.experiment.expid, 'cmorfiles') @@ -411,24 +421,52 @@ class CMORManager(DataManager): Log.debug('Done') def _remove_extra_output_folder(self): - bad_path = os.path.join(self.cmor_path, 'output', self.experiment.institute) + bad_path = os.path.join(self.cmor_path, 'output') if os.path.exists(bad_path): Log.debug('Moving CMOR files out of the output folder') - Utils.execute_shell_command(['mv', bad_path, os.path.join(bad_path, '..', '..')]) - os.rmdir(os.path.join(self.cmor_path, 'output')) + CMORManager.copytree(bad_path, self.cmor_path) + shutil.rmtree(bad_path) Log.debug('Done') + @staticmethod + def copytree(src, dst, symlinks=False, ignore=None): + if not os.path.exists(dst): + os.makedirs(dst) + shutil.copystat(src, dst) + lst = os.listdir(src) + if ignore: + excl = ignore(src, lst) + lst = [x for x in lst if x not in excl] + for item in lst: + s = os.path.join(src, item) + d = os.path.join(dst, item) + if symlinks and os.path.islink(s): + if os.path.lexists(d): + os.remove(d) + os.symlink(os.readlink(s), d) + try: + st = os.lstat(s) + mode = os.stat.S_IMODE(st.st_mode) + os.lchmod(d, mode) + except: + pass # lchmod not available + elif os.path.isdir(s): + CMORManager.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + def _create_links(self, startdate): Log.info('Creating links for CMOR files ()') path = self._get_startdate_path(startdate) for freq in os.listdir(path): + frequency = Frequency.parse(freq) for domain in os.listdir(os.path.join(path, freq)): for var in os.listdir(os.path.join(path, freq, domain)): for member in os.listdir(os.path.join(path, freq, domain, var)): for name in os.listdir(os.path.join(path, freq, domain, var, member)): filepath = os.path.join(path, freq, domain, var, member, name) if os.path.isfile(filepath): - self._create_link(domain, filepath, freq, var, "", False, vartype=VariableType.MEAN) + self._create_link(domain, filepath, frequency, var, "", False, vartype=VariableType.MEAN) else: for filename in os.listdir(filepath): self._create_link(domain, os.path.join(filepath, filename), freq, var, "", False, diff --git a/earthdiagnostics/frequency.py b/earthdiagnostics/frequency.py index 12d8ac32..3099ce3d 100644 --- a/earthdiagnostics/frequency.py +++ b/earthdiagnostics/frequency.py @@ -10,7 +10,7 @@ class Frequency(object): 'd': 'day', 'daily': 'day', 'day': 'day', '6': '6hr', '6hr': '6hr', '6_hourly': '6hr', '6hourly': '6hr', '6 hourly': '6hr', '3': '3hr', '3hr': '3hr', '3_hourly': '3hr', '3hourly': '3hr', '3 hourly': '3hr', - '1': 'hr', 'hr': 'hr', 'hourly': 'hr', '1hr': 'hr', '1 hourly': '1hr', + '1': '1hr', 'hr': '1hr', 'hourly': '1hr', '1hr': '1hr', '1 hourly': '1hr', 'subhr': 'subhr'} def __init__(self, freq): @@ -31,8 +31,8 @@ class Frequency(object): freq_str = 'daily_{0}'.format(VariableType.to_str(vartype)) elif self == Frequencies.climatology: freq_str = 'clim' - elif self.frequency.endswith('hr'): - freq_str = self[:-2] + 'hourly' + elif self in (Frequencies.three_hourly, Frequencies.six_hourly, Frequencies.hourly): + freq_str = self.frequency[:-2] + 'hourly' else: freq_str = 'monthly_{0}'.format(VariableType.to_str(vartype)) return freq_str @@ -52,3 +52,5 @@ class Frequencies(object): daily = Frequency('day') six_hourly = Frequency('6hr') three_hourly = Frequency('3hr') + hourly = Frequency('hr') + subhourly = Frequency('subhr') diff --git a/earthdiagnostics/threddsmanager.py b/earthdiagnostics/threddsmanager.py index 38c2bba8..a4f0263e 100644 --- a/earthdiagnostics/threddsmanager.py +++ b/earthdiagnostics/threddsmanager.py @@ -329,7 +329,7 @@ class THREDDSSubset: @staticmethod def _download_url(url): temp = TempFile.get() - Utils.execute_shell_command(['nccopy', url, temp]) + Utils.execute_shell_command(['nccopy', '-s', '-d', '-4', url, temp]) if not Utils.check_netcdf_file(temp): raise THREDDSError('Can not retrieve {0} from server'.format(url)) return temp -- GitLab From d1276c470c15fa8650ac3b3520784fab2bd822cd Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Tue, 13 Dec 2016 14:41:45 +0100 Subject: [PATCH 19/22] Small fix in console output --- diags.conf | 2 +- earthdiagnostics/cmormanager.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/diags.conf b/diags.conf index 2db3b569..c096fcbd 100644 --- a/diags.conf +++ b/diags.conf @@ -87,7 +87,7 @@ OCEAN_TIMESTEP = 6 # CHUNK_SIZE is the size of each data file, given in months # CHUNKS is the number of chunks. You can specify less chunks than present on the experiment EXPID = a07o -STARTDATES = 20000201 20000501 20010201 20010501 20020201 20020501 20030201 20030501 20040201 20040501 20050201 20050501 +STARTDATES = 20000201 20000501 20010201 20010501 20020201 20020501 20030201 20030501 20040201 20040501 20050201 20050501 20060201 20060501 20070201 20070501 20080201 20080501 20090201 20090501 MEMBERS = 0 1 2 3 4 5 6 7 MEMBER_DIGITS = 1 CHUNK_SIZE = 7 diff --git a/earthdiagnostics/cmormanager.py b/earthdiagnostics/cmormanager.py index d18e6618..2c502aae 100644 --- a/earthdiagnostics/cmormanager.py +++ b/earthdiagnostics/cmormanager.py @@ -456,7 +456,7 @@ class CMORManager(DataManager): shutil.copy2(s, d) def _create_links(self, startdate): - Log.info('Creating links for CMOR files ()') + Log.info('Creating links for CMOR files ({0})', startdate) path = self._get_startdate_path(startdate) for freq in os.listdir(path): frequency = Frequency.parse(freq) @@ -471,7 +471,7 @@ class CMORManager(DataManager): for filename in os.listdir(filepath): self._create_link(domain, os.path.join(filepath, filename), freq, var, "", False, vartype=VariableType.MEAN) - Log.info('Creating lings for CMOR files') + Log.debug('Links ready') def _get_startdate_path(self, startdate): """ -- GitLab From 163ae6376b1b477531e9cd9c5dd5e4e5ec35ac00 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Thu, 15 Dec 2016 15:36:22 +0100 Subject: [PATCH 20/22] Fixed bug in atmos cmorization --- earthdiagnostics/cmorizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index d4e0a437..6bcb25e7 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -87,7 +87,7 @@ class Cmorizer(object): handler = Utils.openCdf(filename) for varname in handler.variables.keys(): cmor_var = self.data_manager.variable_list.get_variable(varname, True) - if cmor_var.short_name not in fluxes_vars: + if cmor_var is None or cmor_var.short_name not in fluxes_vars: continue handler.variables[varname][:] = handler.variables[varname][:] / self.experiment.atmos_timestep * 3600 handler.close() -- GitLab From 21ac6ff3a6fd982d8b56775a5697f4d222247fa6 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Thu, 15 Dec 2016 17:21:35 +0100 Subject: [PATCH 21/22] Fixed a bug on grib CMORization --- diags.conf | 2 +- earthdiagnostics/cmorizer.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/diags.conf b/diags.conf index c096fcbd..ee1eef10 100644 --- a/diags.conf +++ b/diags.conf @@ -86,7 +86,7 @@ OCEAN_TIMESTEP = 6 # if 2, fc00 # CHUNK_SIZE is the size of each data file, given in months # CHUNKS is the number of chunks. You can specify less chunks than present on the experiment -EXPID = a07o +EXPID = a0au STARTDATES = 20000201 20000501 20010201 20010501 20020201 20020501 20030201 20030501 20040201 20040501 20050201 20050501 20060201 20060501 20070201 20070501 20080201 20080501 20090201 20090501 MEMBERS = 0 1 2 3 4 5 6 7 MEMBER_DIGITS = 1 diff --git a/earthdiagnostics/cmorizer.py b/earthdiagnostics/cmorizer.py index 6bcb25e7..f988b366 100644 --- a/earthdiagnostics/cmorizer.py +++ b/earthdiagnostics/cmorizer.py @@ -200,17 +200,17 @@ class Cmorizer(object): cdo_reftime = parse_date(self.startdate).strftime('%Y-%m-%d,00:00') - self._ungrib_vars(cdo_reftime, gribfile, current_date.month, '{0}hr'.format(self.atmos_timestep)) - self._ungrib_vars(cdo_reftime, gribfile, current_date.month, '1d') - self._ungrib_vars(cdo_reftime, gribfile, current_date.month, '1m') + self._ungrib_vars(cdo_reftime, gribfile, current_date.month, Frequency('{0}hr'.format(self.atmos_timestep))) + self._ungrib_vars(cdo_reftime, gribfile, current_date.month, Frequencies.daily) + self._ungrib_vars(cdo_reftime, gribfile, current_date.month, Frequencies.monthly) for splited_file in glob.glob('{0}_*.128.nc'.format(gribfile)): os.remove(splited_file) Log.result('Month {0}, {1} variables finished', date2str(current_date), grid) count += 1 - self._merge_and_cmorize_atmos(chunk_start, chunk_end, grid, '1m') - self._merge_and_cmorize_atmos(chunk_start, chunk_end, grid, '1d') + self._merge_and_cmorize_atmos(chunk_start, chunk_end, grid, Frequencies.monthly) + self._merge_and_cmorize_atmos(chunk_start, chunk_end, grid, Frequencies.daily) self._merge_and_cmorize_atmos(chunk_start, chunk_end, grid, '{0}hr'.format(self.atmos_timestep)) -- GitLab From 01746e7198e0de17c17a371ab371d681fb8a506c Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Thu, 15 Dec 2016 17:51:06 +0100 Subject: [PATCH 22/22] Fixed a bug on scale diagnostic --- earthdiagnostics/general/scale.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/earthdiagnostics/general/scale.py b/earthdiagnostics/general/scale.py index f53fc1c1..2f5e743d 100644 --- a/earthdiagnostics/general/scale.py +++ b/earthdiagnostics/general/scale.py @@ -70,15 +70,10 @@ class Scale(Diagnostic): :type options: list[str] :return: """ - num_options = len(options) - 1 - if num_options < 4: - raise Exception('You must specify the acale and offset values and the variable and domain to scale') - if num_options > 5: - raise Exception('You must between 4 and 5 parameters for the rewrite diagnostic') options_available = (DiagnosticFloatOption('value'), DiagnosticFloatOption('offset'), - DiagnosticOption('variable'), DiagnosticDomainOption('domain'), + DiagnosticOption('variable'), DiagnosticOption('grid'), DiagnosticFloatOption('min_limit', float('nan')), DiagnosticFloatOption('max_limit', float('nan'))) -- GitLab

=_bsIJkt0G3l9XLaZUE8!ZN! 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