From 07a136aad45b50ac1065a4023c72b4297f3611af Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Thu, 31 Oct 2024 15:55:22 +1100 Subject: [PATCH 01/17] solved issue #197 --- mappings/map_AUS2200.csv | 4 ++-- src/mopdata/access.db | Bin 1212416 -> 1212416 bytes src/mopdata/access_dump.sql | 6 +++--- src/mopper/setup_utils.py | 3 ++- tests/test_setup_utils.py | 2 ++ 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/mappings/map_AUS2200.csv b/mappings/map_AUS2200.csv index bb2ca4e..2358e9e 100644 --- a/mappings/map_AUS2200.csv +++ b/mappings/map_AUS2200.csv @@ -29,13 +29,13 @@ hus;fld_s00i010;level_to_height(var[0],levs=(0,66));1;time model_theta_level_num huslev1;fld_s00i010;;1;time lat lon;longitude latitude time1;10minPt;atmos;area: time: point;;AUS2200_A10min;AUS2200;float32;22048000;2304;umnsa_spec;SPECIFIC HUMIDITY AFTER TIMESTEP;surface_specific_humidity huss;fld_s03i237;;1;time_0 lat lon;longitude latitude time height1.5m;1hr;atmos;area: time: mean;;AUS2200_A1hr;AUS2200;float32;22048000;384;umnsa_slv;SPECIFIC HUMIDITY AT 1.5M;specific_humidity huss;fld_s03i237;;1;time lat lon;longitude latitude time1 height1.5m;10minPt;atmos;area: time: point;;AUS2200_A10min;AUS2200;float32;22048000;2304;umnsa_spec;SPECIFIC HUMIDITY AT 1.5M;specific_humidity -lmask;fld_s00i030;var[0].isel(time=0).astype(int);1;time_1 lat lon;longitude latitude;1hrPt;land;area: time: point;;AUS2200_fx;AUS2200;float64;44096000;384;umnsa_slv;LAND MASK (No halo) (LAND=TRUE);land_binary_mask +lmask;fld_s00i030;var[0].isel(time=0).astype(int);1;time_1 lat lon;longitude latitude;fx;land;area: time: point;;AUS2200_fx;AUS2200;float64;44096000;384;umnsa_slv;LAND MASK (No halo) (LAND=TRUE);land_binary_mask lwp;fld_s30i405;;kg m-2;time lat lon;longitude latitude time1;10minPt;atmos;area: time: point;;AUS2200_A10min;AUS2200;float32;22048000;2304;umnsa_spec;TOTAL COLUMN QCL RHO GRID;atmosphere_cloud_liquid_water_content mrso;fld_s08i223;var[0].sum(dim='depth');kg m-2;time depth lat lon;longitude latitude time1;1hrPt;land;area: time: point;;AUS2200_A1hr;AUS2200;float32;22048000;384;umnsa_slv;; mrsol;fld_s08i223;;kg m-2;time depth lat lon;longitude latitude sdepth time1;1hrPt;land;area: time: point;;AUS2200_A1hr;AUS2200;float32;88192000;384;umnsa_slv;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer mrsos;fld_s08i223;calc_top_soil(var[0]);kg m-2;time depth lat lon;longitude latitude time1 sdepth1;1hrPt;land;area: time: point;;AUS2200_A1hr;AUS2200;float32;22048000;384;umnsa_slv;; nflash;fld_s21i104;;1;time_0 lat lon;longitude latitude time;10min;atmos;area: time: sum;;AUS2200_A10min;AUS2200;float32;22048000;2304;umnsa_spec;Number_of_lightning_flashes; -orog;fld_s00i033;var[0].isel(time=0);m;time_1 lat lon;longitude latitude;1hrPt;land;area: time: point;;CMIP6_fx;AUS2200;float32;22048000;384;umnsa_slv;OROGRAPHY (/STRAT LOWER BC);surface_altitude +orog;fld_s00i033;var[0].isel(time=0);m;time_1 lat lon;longitude latitude;fx;land;area: time: point;;CMIP6_fx;AUS2200;float32;22048000;384;umnsa_slv;OROGRAPHY (/STRAT LOWER BC);surface_altitude pfull;fld_s00i408;level_to_height(var[0],levs=(0,66));Pa;time model_theta_level_number lat lon_0;longitude latitude alevel time1;1hrPt;atmos;area: time: point;;AUS2200_A1hr;AUS2200;float32;1543360000;384;umnsa_mdl;PRESSURE AT THETA LEVELS AFTER TS;air_pressure phalf;fld_s00i407;level_to_height(var[0],levs=(0,66));Pa;time model_rho_level_number_0 lat lon_0;longitude latitude alevel time1;1hrPt;atmos;area: time: point;;AUS2200_A1hr;AUS2200;float32;1565408000;384;umnsa_mdl;PRESSURE AT RHO LEVELS AFTER TS;air_pressure pralsns;fld_s04i202;;kg m-2;time_0 lat lon;longitude latitude time;10min;atmos;area: time: sum;;AUS2200_A10min;AUS2200;float32;22048000;2304;umnsa_spec;LARGE SCALE SNOW AMOUNT KG/M2/TS;stratiform_snowfall_amount diff --git a/src/mopdata/access.db b/src/mopdata/access.db index 29dc7546174fdb261303f9ca5c1c2cc427fee241..96bcc86776899fe2bdc5f28df06509262c7b8db2 100644 GIT binary patch delta 1479 zcmXX_eN0wW7(eIS^Sc<(*uUU@_L5MDw2Kwn=pwU`=du%)A+W`!Vq4G?&YtspoZs*FJWnLD zFcMj~FNWwTRdMsZdI}1a9j>q)8#^{}Y{{{yV|yIi>)1ZWmK|GhY}K(f$M!q6?$}1F z%?>4K`Vc}02aR@pNSKN251n8?ly;dNqCLc(3&tusiX!bu=}=-Rl5Enh&rpx~cWVP$ zo`}m~J-9j}+#}kTuti=&Z9s-w?a6_LHZEgN|d?8|3IsOvP~*Tt+(WaqIL zuy}d}yG9h{EDE3nNWBYcAsa{3ED)rq=Ldsr{BP_46D8dv7 zX5h*GiWC-|6pUTOCZ(Csdz2TG;&QmKi%o*Hja(D6cd&0~j-pj)6mCLNpOnfnaT6(} zjUwti+d_%4ADS!80MuM(%@A{mO#$^PD}{_MHeR^qd-5>QW*6uQC~apckdtrf@aM~B z4rC~t!qporofach401P{inq9dAqa-pA>q5pq7%4hjvxi{Fj{P=@p>?)<~)E z99rXsu7>_0_8GjC$9!<P7NM)1c@TWo8a)JemcP;$vqFPj+CMJ~b7#t}~-y@F27PW(ePTbFJ(yb_WbxF{g^cD`uCMkojVAx7mgX%5#5v z70Pa#x5bzqGj@0z>Fc67Y^+vJ2U2lBls2U348CFip2kh&#F! z9>+a(`WXLu?X>!jw_06HAB&i#Zv8H{&bG2J)z9JG zEotFO3~QdXj)|dktAkLMj|Sb80dZ=c6)~yb(0+yoUzs6c=U7`cYDCZ!*F6y;1=gpc VG2i-rWK}+K-}Z~qE3JEp{{gKkyw?B# delta 1356 zcmXAndu$X{6o=>DncaEq%)K-0vbIZYmljGX-L@cLs@4htIs_SU3qq|PPbqv=r zTOGDLT{qJNK_F4H!%V|yyJf4`K4dTC*gG4(%`| z1UBin^*Lk^N0hRD0_Ejwo1_{-@s`4ZBJ7yUX89#=^GR!fT;T4k$4A0Sk#C@;k~k>^gzI{d_O3uVWt>QczedfRsZgkVIEtM91+CpVlJCTj?fx&D+b$Hy#$9^csHb+VR@ikU^P&3mW{&HGi;Rt2fEmC zsO?~*ptQm=;LkU$QYcZm1Q#x`B3kKv*30t5N}=8hoeRShdmqYuES%2uL4BTfOnX*! zmA{m7`839c*a1oO;=%V1*v`Er1qAEvv)Kd&?y;}1;vw52!i)FVPHcS4J{HFf6B-2N zqQd33{Kx$v-%7SXXpl6i%RFUT#_~W8rx=IDUuQ|_avN&Fzi zLBbajv=sg!foX&v#zKwv`@D{Bdf1$gk*H19{wM1u=S`Hn?)5&4V86}F3@R_iSO#A& zC58Nhh1bX<0&isS6zCnzw*ei^Phw;YAIw%*&>Ufe1JltilRnUG`&9-=Hq|6}2-dsdr%4O@vB+~38(rXmAU9qY|nPj*S z6lw+KZMi`|uj|@0dRINHK0_{%Npz9aE#(WfkTqn@fvfkeX6h>g66NVQ`Hqz(Q935M zDvM&n1ItxXdx%$mmi$yM@`c16shT-vn{ma+3skjc*uPS*yly-%+GQd&SHrPJD+n`X z`y6E0yaiFQkBFN0UTt`VrKCk5KEsMYwrDp)%&@=4tA-sL$&J%SO5lC{g!V||>Jp_3 zQw!|*lEf-R6{FX5pNRF7?N Date: Fri, 1 Nov 2024 08:40:47 +1100 Subject: [PATCH 02/17] mereging issue197 --- src/mopper/setup_utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mopper/setup_utils.py b/src/mopper/setup_utils.py index 039406b..0424d1c 100755 --- a/src/mopper/setup_utils.py +++ b/src/mopper/setup_utils.py @@ -639,7 +639,6 @@ def add_files(ctx, cursor, opts, mp): update = ctx.obj['update'] exp_start = opts['exp_start'] exp_end = opts['exp_end'] - print("I am here") # only used in cmip mode if mp['years'] != 'all' and ctx.obj['dreq_years']: exp_start, exp_end = fix_years(mp['years'], exp_start[:4], exp_end[:4]) From c4bde4ebfc2a19621a5c43d6129e6d8a30f3bf89 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Thu, 7 Nov 2024 13:48:01 +1100 Subject: [PATCH 03/17] fixed #199 and #200 --- src/mopper/mop_setup.py | 10 +++++++++- src/mopper/mopper.py | 1 + src/mopper/setup_utils.py | 5 +++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mopper/mop_setup.py b/src/mopper/mop_setup.py index 80fa4f0..29e499a 100755 --- a/src/mopper/mop_setup.py +++ b/src/mopper/mop_setup.py @@ -200,10 +200,12 @@ def setup_env(ctx): cdict['outpath'] = Path(cdict['outpath']) mop_log.debug(f"outpath: {cdict['outpath']}, {type(cdict['outpath'])}") cdict['master_map'] = appdir / cdict['master_map'] + mop_log.debug(f"Setting env, map file: {cdict['master_map']}") if cdict['tables_path'] is None or cdict['tables_path'] == "": cdict['tables_path'] = appdir / "non-existing-path" else: cdict['tables_path'] = appdir / cdict['tables_path'] + mop_log.debug(f"Setting env, tables_path: {cdict['tables_path']}") cdict['ancils_path'] = appdir / cdict['ancils_path'] # conda env to run job if cdict['conda_env'] == 'default': @@ -213,6 +215,7 @@ def setup_env(ctx): if not path.is_absolute(): path = appdir / path cdict['conda_env'] = f"source {str(path)}" + mop_log.debug(f"Setting env, conda_env: {cdict['conda_env']}") # Output subdirectories outpath = cdict['outpath'] cdict['maps'] = outpath / "maps" @@ -231,6 +234,9 @@ def setup_env(ctx): if len(cdict['start_date']) < 13: cdict['start_date'] += 'T0000' cdict['end_date'] += 'T0000'#'T2359' + mop_log.debug(f"""Setup_env dates ref, start and end: + {cdict['reference_date']}, + {cdict['start_date']}, {cdict['end_date']}""") # if parent False set parent attrs to 'no parent' if cdict['attrs']['parent'] is False and cdict['mode'] == 'cmip6': p_attrs = [k for k in cdict['attrs'].keys() if 'parent' in k] @@ -305,7 +311,8 @@ def var_map(ctx, activity_id=None): mop_log.info(f"\n{table}:") varsel = create_var_map(table, masters, varsel, activity_id) else: - varsel = create_var_map(tables, varsel, masters) + mop_log.info(f"Experiment {ctx.obj['exp']}: processing table {tables}") + varsel = create_var_map(tables, masters, varsel) write_yaml(varsel, 'mop_var_selection.yaml', 'mop_log') return ctx @@ -366,6 +373,7 @@ def create_var_map(ctx, table, mappings, varsel, activity_id=None, dreq_years = read_dreq_vars(table_id, activity_id) all_dreq = [v for v in dreq_years.keys()] select = set(select).intersection(all_dreq) + mop_log.debug(f"Selecting variables: {select}") for var,row in row_dict.items(): if var not in select: continue diff --git a/src/mopper/mopper.py b/src/mopper/mopper.py index 5ad0563..4aa339a 100644 --- a/src/mopper/mopper.py +++ b/src/mopper/mopper.py @@ -533,6 +533,7 @@ def process_row(ctx, row): 'version', 'rowid'] for i,val in enumerate(header): record[val] = row[i] + print(i, val) # call logging varlog_file = (f"{ctx.obj['var_logs']}/{record['variable_id']}" + f"_{record['table']}_{record['tstart']}.txt") diff --git a/src/mopper/setup_utils.py b/src/mopper/setup_utils.py index 0424d1c..d1a03bf 100755 --- a/src/mopper/setup_utils.py +++ b/src/mopper/setup_utils.py @@ -306,9 +306,10 @@ def create_exp_json(ctx, json_cv): # and add attributes for path and file template to required required = cv_dict['CV']['required_global_attributes'] tmp_str = (ctx.obj['path_template'].replace('}/{','/') - + ctx.obj['file_template'].replace('}_{','/')) + + "/" + ctx.obj['file_template'].replace('}_{','/')) attrs_template = tmp_str.replace('}','').replace('{','').split('/') required.extend( set(attrs_template)) + mop_log.debug(f"Setup json exp file, attributes to write: {required}") # plus any other attrs hardcoded in cmor required.extend(['_control_vocabulary_file', '_AXIS_ENTRY_FILE', '_FORMULA_VAR_FILE', 'outpath'] ) @@ -757,6 +758,6 @@ def define_template(ctx, flag, nrows): {ctx.obj['conda_env']} cd {ctx.obj['appdir']} -mop run -c {ctx.obj['exp']}_config.yaml # --debug (uncomment to run in debug mode) +mop run -c {ctx.obj['exp']}_config.yaml # --debug #(uncomment to run in debug mode) echo 'APP completed for exp {ctx.obj['exp']}.'""" return template From f6535e44828aa91b345f198e098defb8a781722e Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Thu, 7 Nov 2024 17:19:01 +1100 Subject: [PATCH 04/17] solved re-opened #197 --- src/mopper/mop_utils.py | 6 +++++- src/mopper/mopper.py | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mopper/mop_utils.py b/src/mopper/mop_utils.py index 95745be..25923fe 100755 --- a/src/mopper/mop_utils.py +++ b/src/mopper/mop_utils.py @@ -1075,7 +1075,11 @@ def extract_var(ctx, input_ds, in_missing): var_log.error(f"error evaluating calculation, {ctx.obj['calculation']}: {e}") raise MopException(f"Error evaluating calculation: {e}") #Call to resample operation is defined based on timeshot - tdim = [d for d in array.dims if 'time' in d][0] + tdims = [d for d in array.dims if 'time' in d] + if len(tdims) >= 1: + tdim = tdims[0] + else: + tdim = None if ctx.obj['resample'] != '': array = time_resample(array, ctx.obj['resample'], tdim, stats=ctx.obj['timeshot']) diff --git a/src/mopper/mopper.py b/src/mopper/mopper.py index 4aa339a..5ad0563 100644 --- a/src/mopper/mopper.py +++ b/src/mopper/mopper.py @@ -533,7 +533,6 @@ def process_row(ctx, row): 'version', 'rowid'] for i,val in enumerate(header): record[val] = row[i] - print(i, val) # call logging varlog_file = (f"{ctx.obj['var_logs']}/{record['variable_id']}" + f"_{record['table']}_{record['tstart']}.txt") From 2016a0c47e82e1302b9ad661bdfda609fb4eabc0 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Wed, 13 Nov 2024 09:40:20 +1100 Subject: [PATCH 05/17] fixed issues #202, #201 and #197, small update to mappings and db --- mappings/map_atmos_CM2.csv | 1 + mappings/map_land_CM2.csv | 3 +++ src/mopdata/access.db | Bin 1212416 -> 1212416 bytes src/mopdata/access_dump.sql | 7 ++++++- src/mopdata/cmor_tables/CM2_mon.json | 18 ++++++++++++++++++ src/mopper/mop_utils.py | 5 ++++- tests/test_mop_utils.py | 27 +++++++++++++++++---------- 7 files changed, 49 insertions(+), 12 deletions(-) diff --git a/mappings/map_atmos_CM2.csv b/mappings/map_atmos_CM2.csv index ac46956..149853b 100644 --- a/mappings/map_atmos_CM2.csv +++ b/mappings/map_atmos_CM2.csv @@ -16,6 +16,7 @@ hfls;fld_s03i234;;W m-2;time lat lon;longitude latitude time;day;atmos;area: tim hfss;fld_s03i217;;W m-2;time lat lon;longitude latitude time;mon;atmos;area: time: mean;up;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;SURFACE SENSIBLE HEAT FLUX W/M2;surface_upward_sensible_heat_flux hfss;fld_s03i217;;W m-2;time_0 lat lon;longitude latitude time;3hr;atmos;area: time: mean;up;CMIP6_3hr;CM2;float32;110592;578880;cm000a.p8;SURFACE SENSIBLE HEAT FLUX W/M2;surface_upward_sensible_heat_flux hfss;fld_s03i217;;W m-2;time lat lon;longitude latitude time;day;atmos;area: time: mean;up;CMIP6_day;CM2;float32;110592;74772;cm000a.pd;SURFACE SENSIBLE HEAT FLUX W/M2;surface_upward_sensible_heat_flux +hur;fld_s30i296;;%;time pressure lat lon;longitude latitude plev8 time;day;atmos;area: time: mean;;CMIP6_day;CM2;float32;2101248;2400;da130a.pd;RELATIVE HUMIDITY ON P LEV/T GRID;relative_humidity hur;fld_s30i296;;%;time pressure lat lon;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;2101248;12;cw323a.pm;RELATIVE HUMIDITY ON P LEV/T GRID;relative_humidity hur19;fld_s30i296;;%;time pressure lat lon;longitude latitude plev19 time;day;atmos;area: time: mean;;CM2_day;CM2;float32;884736;74772;cm000a.pd;RELATIVE HUMIDITY ON P LEV/T GRID;relative_humidity hurs;fld_s03i245;;%;time lat lon;longitude latitude time height1.5m;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;110592;12;cw323a.pm;RELATIVE HUMIDITY AT 1.5M;relative_humidity diff --git a/mappings/map_land_CM2.csv b/mappings/map_land_CM2.csv index c57ed32..1f89a14 100644 --- a/mappings/map_land_CM2.csv +++ b/mappings/map_land_CM2.csv @@ -28,8 +28,11 @@ mrsfl;fld_s08i223 fld_s08i230;var[0]*var[1];kg m-2;time depth lat lon;longitude mrsll;fld_s08i223 fld_s08i229;var[0]*var[1];kg m-2;time depth lat lon;longitude latitude sdepth time;mon;land;area: mean where land time: mean;;CMIP6_Emon;CM2;float32;663552;12;cw323a.pm;Liquid Water Content of Soil Layer;liquid_water_content_of_soil_layer mrso;fld_s08i208;;kg m-2;time lat lon;longitude latitude time;mon;land;area: time: mean;;CMIP6_Lmon;CM2;float32;110592;12;cw323a.pm;SOIL MOISTURE CONTENT;mass_content_of_water_in_soil mrso;fld_s08i223;var[0].sum(dim='depth');kg m-2;time lat lon;longitude latitude time;mon;land;area: time: mean;;CMIP6_Lmon;CM2;float32;110592;12;cw323a.pm;SOIL MOISTURE CONTENT;mass_content_of_water_in_soil +mrso;fld_s08i223;var[0].sum(dim='depth');kg m-2;time depth lat lon;longitude latitude time;day;land;area: time: mean;;CMIP6_day;CM2;float32;663552;2400;da130a.pd;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer mrsol;fld_s08i223;;kg m-2;time depth lat lon;longitude latitude sdepth time;mon;land;area: time: mean;;CMIP6_Emon;CM2;float32;663552;12;cw323a.pm;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer +mrsol;fld_s08i223;;kg m-2;time depth lat lon;longitude latitude sdepth time;day;land;area: time: mean;;CMIP6_Eday;CM2;float32;663552;2400;da130a.pd;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer mrsos;fld_s08i223;calc_topsoil(var[0]);kg m-2;time depth lat lon;longitude latitude time sdepth1;mon;land;area: mean where land time: mean;;CMIP6_Lmon;CM2;float32;663552;12;cw323a.pm;Moisture in Upper Portion of Soil Column;mass_content_of_water_in_soil_layer +mrsos;fld_s08i223;calc_topsoil(var[0]);kg m-2;time depth lat lon;longitude latitude time sdepth1;day;land;area: time: mean;;CMIP6_day;CM2;float32;663552;2400;da130a.pd;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer nep;fld_s03i262 fld_s03i293;var[0]-var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: mean where land time: mean;down;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;Net Carbon Mass Flux out of Atmosphere Due to Net Ecosystem Productivity on Land [kgC m-2 s-1];surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change npp;fld_s03i262;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;down;CMIP6_Lmon;CM2;float32;110592;12;cw323a.pm;NET PRIMARY PRODUCTIVITY KG C/M2/S;net_primary_productivity_of_biomass_expressed_as_carbon nwdFracLut;fld_s03i317 fld_s03i395;landuse_frac(var[0],landfrac=var[1],nwd=1);1;time pseudo_level_1 lat lon;longitude latitude landUse time typenwd;mon;land;area: time: mean;;CMIP6_Emon;CM2;float32;1880064;12;cw323a.pm;SURFACE TILE FRACTIONS; diff --git a/src/mopdata/access.db b/src/mopdata/access.db index 96bcc86776899fe2bdc5f28df06509262c7b8db2..76d3e33213ea10cb677cb29b2747405623132dbd 100644 GIT binary patch delta 3827 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 diff --git a/src/mopdata/access_dump.sql b/src/mopdata/access_dump.sql index 85d4043..3881981 100644 --- a/src/mopdata/access_dump.sql +++ b/src/mopdata/access_dump.sql @@ -2318,6 +2318,7 @@ INSERT INTO cmorvar VALUES('sndmasssnf-CMIP6_SImon','mon','seaIce','snowfall_flu INSERT INTO cmorvar VALUES('sndmasssubl-CMIP6_SImon','mon','seaIce','tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice','kg m-2 s-1','area: time: mean where sea_ice (comment: mask=siconc)','area: areacello','Snow Mass Rate of Change Through Evaporation or Sublimation','the rate of change of snow mass through sublimation and evaporation divided by sea-ice area','longitude latitude time','sndmasssubl','real','','','','','','',''); INSERT INTO cmorvar VALUES('sndmasswindrif-CMIP6_SImon','mon','seaIce','tendency_of_surface_snow_amount_due_to_drifting_into_sea','kg m-2 s-1','area: time: mean where sea_ice (comment: mask=siconc)','area: areacello','Snow Mass Rate of Change Through Wind Drift of Snow','the rate of change of snow mass through wind drift of snow (from sea-ice into the sea) divided by sea-ice area','longitude latitude time','sndmasswindrif','real','','','','','','',''); INSERT INTO cmorvar VALUES('snmassacrossline-CMIP6_SImon','mon','seaIce','snow_transport_across_line_due_to_sea_ice_dynamics','kg s-1','time: mean','','Snow Mass Flux Through Straits','net (sum of transport in all directions) sea ice area transport through the following four passages, positive into the Arctic Ocean 1. Fram Strait = (11.5W,81.3N to (10.5E,79.6N) 2. Canadian Archipelago = (128.2W,70.6N) to (59.3W,82.1N) 3. Barents opening = (16.8E,76.5N) to (19.2E,70.2N) 4. Bering Strait = (171W,66.2N) to (166W,65N)','siline time','snmassacrossline','real','','','','','','',''); +INSERT INTO cmorvar VALUES('phalf-CM2_mon','mon','atmos','air_pressure','Pa','area: time: mean','area: areacella','Pressure on Model Half-Levels','Air pressure on model half-levels','longitude latitude alevhalf time','phalf','real','','','','','','',''); CREATE TABLE mapping ( cmor_var TEXT, input_vars TEXT, @@ -2399,7 +2400,7 @@ INSERT INTO mapping VALUES('clw','fld_s00i254','level_to_height(var[0],levs=(0,6 INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','CM2','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','ESM1.5','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('clwvol','fld_s00i267','level_to_height(var[0],levs=(0,66))','1','time model_theta_level_number lat lon','longitude latitude alevel time1','1hrPt','atmos','area: time: point','','AUS2200_A1hr','AUS2200','liquid_cloud_volume_fraction_in_atmosphere_layer','map_AUS2200.csv'); -INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_AUS2200.csv'); +INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','CM2','area_fraction','map_land_CM2.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','ESM1.5','area_fraction','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('cropFracC3','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typec3crop'')','1','time pseudo_level_1 lat lon','longitude latitude time typec3crop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Emon','CM2','area_fraction','map_land_CM2.csv'); @@ -2513,6 +2514,7 @@ INSERT INTO mapping VALUES('hfsso','sens_heat','','W m-2','time yt_ocean xt_ocea INSERT INTO mapping VALUES('hfsso','sens_heat','','W m-2','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','OM2','surface_downward_sensible_heat_flux','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('hur','fld_s30i296','','%','time pressure lat lon','longitude latitude plev19 time','mon','atmos','area: time: mean','','CMIP6_Amon','CM2','relative_humidity','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('hur','fld_s30i296','','%','time pressure lat lon','longitude latitude plev19 time','mon','atmos','area: time: mean','','CMIP6_Amon','ESM1.5','relative_humidity','map_atmos_ESM1.5.csv'); +INSERT INTO mapping VALUES('hur','fld_s30i296','','%','time pressure lat lon','longitude latitude plev8 time','day','atmos','area: time: mean','','CMIP6_day','CM2','relative_humidity','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('hur17','fld_s30i296','','%','time pressure lat lon','longitude latitude plev17 time','mon','atmos','area: time: mean','','AM3_Amon','AM3','relative_humidity','map_atmos_AM3.csv'); INSERT INTO mapping VALUES('hur17uvgrid','fld_s30i206','','%','time pressure lat_v lon_u','longitude latitude plev17 time','mon','atmos','area: time: mean','','AM3_Amon','AM3','relative_humidity','map_atmos_AM3.csv'); INSERT INTO mapping VALUES('hur19','fld_s30i296','','%','time pressure lat lon','longitude latitude plev19 time','day','atmos','area: time: mean','','CM2_day','CM2','relative_humidity','map_atmos_CM2.csv'); @@ -2623,7 +2625,9 @@ INSERT INTO mapping VALUES('mrso','fld_s08i223','var[0].sum(dim=''depth'')','kg INSERT INTO mapping VALUES('mrso','fld_s08i223','var[0].sum(dim=''depth'')','kg m-2','time depth lat lon','longitude latitude time','mon','land','area: time: mean','','CMIP6_Lmon','AM3','mass_content_of_water_in_soil_layer','map_land_AM3.csv'); INSERT INTO mapping VALUES('mrso','fld_s08i223','var[0].sum(dim=''depth'')','kg m-2','time lat lon','longitude latitude time','mon','land','area: time: mean','','CMIP6_Lmon','CM2','mass_content_of_water_in_soil','map_land_CM2.csv'); INSERT INTO mapping VALUES('mrso','fld_s08i223','var[0].sum(dim=''depth'')','kg m-2','time lat lon','longitude latitude time','mon','land','area: time: mean','','CMIP6_Lmon','ESM1.5','mass_content_of_water_in_soil','map_land_ESM1.5.csv'); +INSERT INTO mapping VALUES('mrso','fld_s08i223','var[0].sum(dim=''depth'')','kg m-2','time depth lat lon','longitude latitude time','day','land','area: time: mean','','CMIP6_day','CM2','mass_content_of_water_in_soil_layer','map_land_CM2.csv'); INSERT INTO mapping VALUES('mrsol','fld_s08i223','','kg m-2','time depth lat lon','longitude latitude sdepth time1','1hrPt','land','area: time: point','','AUS2200_A1hr','AUS2200','mass_content_of_water_in_soil_layer','map_AUS2200.csv'); +INSERT INTO mapping VALUES('mrsol','fld_s08i223','','kg m-2','time depth lat lon','longitude latitude sdepth time','day','land','area: time: mean','','CMIP6_Eday','CM2','mass_content_of_water_in_soil_layer','map_land_CM2.csv'); INSERT INTO mapping VALUES('mrsol','fld_s08i223','','kg m-2','time depth lat lon','longitude latitude sdepth time','mon','land','area: time: mean','','CMIP6_Emon','AM3','mass_content_of_water_in_soil_layer','map_land_AM3.csv'); INSERT INTO mapping VALUES('mrsol','fld_s08i223','','kg m-2','time depth lat lon','longitude latitude sdepth time','mon','land','area: time: mean','','CMIP6_Emon','CM2','mass_content_of_water_in_soil_layer','map_land_CM2.csv'); INSERT INTO mapping VALUES('mrsol','fld_s08i223','','kg m-2','time depth lat lon','longitude latitude sdepth time','mon','land','area: time: mean','','CMIP6_Emon','ESM1.5','mass_content_of_water_in_soil_layer','map_land_ESM1.5.csv'); @@ -2631,6 +2635,7 @@ INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_top_soil(var[0])','kg m-2 INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2','time depth lat lon','longitude latitude time sdepth1','mon','land','area: time: mean','','CMIP6_Lmon','AM3','mass_content_of_water_in_soil_layer','map_land_AM3.csv'); INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2','time depth lat lon','longitude latitude time sdepth1','mon','land','area: mean where land time: mean','','CMIP6_Lmon','CM2','mass_content_of_water_in_soil_layer','map_land_CM2.csv'); INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2','time depth lat lon','longitude latitude time sdepth1','mon','land','area: mean where land time: mean','','CMIP6_Lmon','ESM1.5','mass_content_of_water_in_soil_layer','map_land_ESM1.5.csv'); +INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2','time depth lat lon','longitude latitude time sdepth1','day','land','area: time: mean','','CMIP6_day','CM2','mass_content_of_water_in_soil_layer','map_land_CM2.csv'); INSERT INTO mapping VALUES('msftmrho','ty_trans_rho ty_trans_rho_gm','calc_overt(var)','kg s-1','time potrho grid_yu_ocean grid_xt_ocean','latitude rho basin time','mon','ocean','longitude: sum depth: sum time: mean','','CMIP6_Omon','CM2','ocean_meridional_overturning_mass_streamfunction','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('msftmrho','ty_trans_rho ty_trans_rho_gm','calc_overt(var)','kg s-1','time potrho grid_yu_ocean grid_xt_ocean','latitude rho basin time','mon','ocean','longitude: sum depth: sum time: mean','','CMIP6_Omon','ESM1.5','ocean_meridional_overturning_mass_streamfunction','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('msftmrho','ty_trans_rho ty_trans_rho_gm','calc_overt(var)','kg s-1','time potrho grid_yu_ocean grid_xt_ocean','latitude rho basin time','mon','ocean','longitude: sum depth: sum time: mean','','CMIP6_Omon','OM2','ocean_meridional_overturning_mass_streamfunction','map_ocean_OM2.csv'); diff --git a/src/mopdata/cmor_tables/CM2_mon.json b/src/mopdata/cmor_tables/CM2_mon.json index f3642fa..b91d6b9 100644 --- a/src/mopdata/cmor_tables/CM2_mon.json +++ b/src/mopdata/cmor_tables/CM2_mon.json @@ -104,6 +104,24 @@ "ok_min_mean_abs": "", "ok_max_mean_abs": "" }, + "phalf": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_pressure", + "units": "Pa", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Pressure on Model Half-Levels", + "comment": "Air pressure on model half-levels", + "dimensions": "longitude latitude alevhalf time", + "out_name": "phalf", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, "theta": { "frequency": "mon", "modeling_realm": "atmos", diff --git a/src/mopper/mop_utils.py b/src/mopper/mop_utils.py index 25923fe..417e1a2 100755 --- a/src/mopper/mop_utils.py +++ b/src/mopper/mop_utils.py @@ -347,6 +347,9 @@ def check_timestamp(ctx, all_files): if pattern == []: var_log.error(f"couldn't find timestamp for {infile}") tstamp = d.replace('-','') + # to take into acocunt 3-5 hourly files from UM + if tstamp[0:2] in ['p7', 'p8']: + tstamp = tstamp[2:] #var_log.debug(f"first tstamp: {tstamp}") # check if timestamp as the date time separator T hhmm = '' @@ -519,7 +522,7 @@ def generic_name(ctx, aname, orig, cnames): elif "level_number" in aname: cmor_name = "hybrid_height" elif orig == "alevhalf": - if "rho_level_number" in axname: + if any(x in aname for x in ["rho_level_number", "rho_level_height"]): cmor_name = "hybrid_height_half" if cmor_name == orig: var_log.error(f"""cmor name for axis {aname} and diff --git a/tests/test_mop_utils.py b/tests/test_mop_utils.py index 908fcee..34c0468 100644 --- a/tests/test_mop_utils.py +++ b/tests/test_mop_utils.py @@ -58,6 +58,13 @@ def test_check_timestamp(caplog): with ctx2: out3 = check_timestamp(files) assert out3 == inrange + # test atmos archiver style 6hr files + files = [Path(f'da130a.p71983{m}_6h.nc') + for m in ['01','02','03']] + inrange = files[1:2] + with ctx2: + out4 = check_timestamp(files) + assert out4 == inrange # test atmos 1hr AUS2200 style files ctx2.obj['frequency'] = '1hr' ctx2.obj['sel_start'] = '198302150530' @@ -66,16 +73,16 @@ def test_check_timestamp(caplog): for h in range(0,24)] inrange = files[6:12] with ctx2: - out4 = check_timestamp(files) - assert out4 == inrange + out5 = check_timestamp(files) + assert out5 == inrange # function is now independent from realm no need to fix it in ctx # test ocean files ctx.obj['frequency'] = 'day' files = [Path(f'ocn_daily.nc-198302{str(d).zfill(2)}') for d in range(1,29)] inrange = files[16:18] with ctx: - out5 = check_timestamp(files) - assert out5 == inrange + out6 = check_timestamp(files) + assert out6 == inrange # test ice files # this pass but because month and year are separated by "-" # it selects more than we would expect as tstamp is only 1983 @@ -84,21 +91,21 @@ def test_check_timestamp(caplog): files = [Path(f'iceh_d.1983-{str(m).zfill(2)}.nc') for m in range(1,12)] inrange = files with ctx2: - out6 = check_timestamp(files) - assert out6 == inrange + out7 = check_timestamp(files) + assert out7 == inrange # test with 3 digit number in filename which is not a date files = [Path(f'/sc/AM3/di787/di787a.pd198303.nc')] with ctx2: - out7 = check_timestamp(files) - assert out7 == files + out8 = check_timestamp(files) + assert out8 == files # test with 3 digit number in filename which is not a date # and missing 0 at start of year ctx2.obj['sel_start'] = '078301010000' ctx2.obj['sel_end'] = '078312311200' files = [Path(f'/sc/AM3/di787/di787a.pd78303.nc')] with ctx2: - out8 = check_timestamp(files) - assert out8 == files + out9 = check_timestamp(files) + assert out9 == files def test_get_cmorname(caplog): From aa97be0b974614ac588fb9d77c376d200934d372 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Mon, 18 Nov 2024 10:10:32 +1100 Subject: [PATCH 06/17] closing #203 and fixed wrong mapping for phalf --- mappings/map_atmos_AM3.csv | 2 +- mappings/map_atmos_CM2.csv | 2 +- mappings/map_atmos_ESM1.5.csv | 2 +- src/mopdata/access.db | Bin 1212416 -> 1212416 bytes src/mopdata/access_dump.sql | 8 +-- src/mopper/mop_utils.py | 100 +++++++++++++++++++++++----------- src/mopper/mopper.py | 10 ++-- tests/test_setup_utils.py | 12 ++++ 8 files changed, 92 insertions(+), 44 deletions(-) diff --git a/mappings/map_atmos_AM3.csv b/mappings/map_atmos_AM3.csv index 0e941ca..c599342 100644 --- a/mappings/map_atmos_AM3.csv +++ b/mappings/map_atmos_AM3.csv @@ -23,7 +23,7 @@ hus17uvgrid;fld_s30i205;;1;time pressure lat_v lon_u;longitude latitude plev17 t intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;AM3;float32;110592;480;di787a.pm;dry mass col int u*q per unit area; intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;AM3;float32;110592;480;di787a.pm;dry mass col int v*q per unit area; pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;AM3;float32;9400320;480;di787a.pa;PRESSURE AT THETA LEVELS AFTER TS;air_pressure -phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time2;mon;atmos;area: time: mean;;CMIP6_Amon;AM3;float32;9400320;480;di787a.pa;PRESSURE AT RHO LEVELS AFTER TS;air_pressure +phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time;mon;atmos;area: time: mean;;CM2_mon;AM3;float32;9400320;480;di787a.pa;PRESSURE AT RHO LEVELS AFTER TS;air_pressure pr;fld_s05i216;;kg m-2 s-1;time lat lon;longitude latitude time;day;atmos;area: time: mean;;CMIP6_day;AM3;float32;110592;14400;di787a.pd;TOTAL PRECIPITATION RATE KG/M2/S;precipitation_flux pr;fld_s05i216;;kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;AM3;float32;110592;480;di787a.pm;TOTAL PRECIPITATION RATE KG/M2/S;precipitation_flux prlsns;fld_s04i204;;kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CM2_mon;AM3;float32;110592;480;di787a.pm;LARGE SCALE SNOWFALL RATE KG/M2/S;stratiform_snowfall_flux diff --git a/mappings/map_atmos_CM2.csv b/mappings/map_atmos_CM2.csv index 149853b..557c173 100644 --- a/mappings/map_atmos_CM2.csv +++ b/mappings/map_atmos_CM2.csv @@ -37,7 +37,7 @@ intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;ar intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;CM2;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure -phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time2;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure +phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time_0 lat lon;longitude latitude time;3hr;atmos;;;CMIP6_3hr;CM2;float32;110592;578880;cm000a.p8;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;day;atmos;;;CMIP6_day;CM2;float32;110592;74772;cm000a.pd;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux diff --git a/mappings/map_atmos_ESM1.5.csv b/mappings/map_atmos_ESM1.5.csv index 4fc2d1b..5a327d4 100644 --- a/mappings/map_atmos_ESM1.5.csv +++ b/mappings/map_atmos_ESM1.5.csv @@ -36,7 +36,7 @@ intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;ar intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;ESM1.5;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;ESM1.5;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure -phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time2;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure +phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time_0 lat lon;longitude latitude time;3hr;atmos;;;CMIP6_3hr;ESM1.5;float32;110592;578880;cm000a.p8;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;day;atmos;;;CMIP6_day;ESM1.5;float32;110592;74772;cm000a.pd;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux diff --git a/src/mopdata/access.db b/src/mopdata/access.db index 76d3e33213ea10cb677cb29b2747405623132dbd..3ed60d33ae04144409ba44c979571996f2d0c8d5 100644 GIT binary patch delta 3937 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 delta 3878 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 Nt?MD~D@*ny{}TcAx7q*z diff --git a/src/mopdata/access_dump.sql b/src/mopdata/access_dump.sql index 3881981..dd4d377 100644 --- a/src/mopdata/access_dump.sql +++ b/src/mopdata/access_dump.sql @@ -2400,7 +2400,7 @@ INSERT INTO mapping VALUES('clw','fld_s00i254','level_to_height(var[0],levs=(0,6 INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','CM2','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','ESM1.5','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('clwvol','fld_s00i267','level_to_height(var[0],levs=(0,66))','1','time model_theta_level_number lat lon','longitude latitude alevel time1','1hrPt','atmos','area: time: point','','AUS2200_A1hr','AUS2200','liquid_cloud_volume_fraction_in_atmosphere_layer','map_AUS2200.csv'); -INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_atmos_CM2.csv'); +INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_atmos_AM3.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','CM2','area_fraction','map_land_CM2.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','ESM1.5','area_fraction','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('cropFracC3','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typec3crop'')','1','time pseudo_level_1 lat lon','longitude latitude time typec3crop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Emon','CM2','area_fraction','map_land_CM2.csv'); @@ -2720,9 +2720,9 @@ INSERT INTO mapping VALUES('pfull','fld_s00i408','level_to_height(var[0])','Pa', INSERT INTO mapping VALUES('pfull','fld_s00i408','level_to_height(var[0])','Pa','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CM2_mon','CM2','air_pressure','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('pfull','fld_s00i408','level_to_height(var[0])','Pa','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CM2_mon','ESM1.5','air_pressure','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('phalf','fld_s00i407','level_to_height(var[0],levs=(0,66))','Pa','time model_rho_level_number_0 lat lon_0','longitude latitude alevel time1','1hrPt','atmos','area: time: point','','AUS2200_A1hr','AUS2200','air_pressure','map_AUS2200.csv'); -INSERT INTO mapping VALUES('phalf','fld_s00i407','level_to_height(var[0])','Pa','time model_rho_level_number lat lon','longitude latitude alevhalf time2','mon','atmos','area: time: mean','','CMIP6_Amon','AM3','air_pressure','map_atmos_AM3.csv'); -INSERT INTO mapping VALUES('phalf','fld_s00i407','level_to_height(var[0])','Pa','time model_rho_level_number lat lon','longitude latitude alevhalf time2','mon','atmos','area: time: mean','','CMIP6_Amon','CM2','air_pressure','map_atmos_CM2.csv'); -INSERT INTO mapping VALUES('phalf','fld_s00i407','level_to_height(var[0])','Pa','time model_rho_level_number lat lon','longitude latitude alevhalf time2','mon','atmos','area: time: mean','','CMIP6_Amon','ESM1.5','air_pressure','map_atmos_ESM1.5.csv'); +INSERT INTO mapping VALUES('phalf','fld_s00i407','level_to_height(var[0])','Pa','time model_rho_level_number lat lon','longitude latitude alevhalf time','mon','atmos','area: time: mean','','CM2_mon','AM3','air_pressure','map_atmos_AM3.csv'); +INSERT INTO mapping VALUES('phalf','fld_s00i407','level_to_height(var[0])','Pa','time model_rho_level_number lat lon','longitude latitude alevhalf time','mon','atmos','area: time: mean','','CM2_mon','CM2','air_pressure','map_atmos_CM2.csv'); +INSERT INTO mapping VALUES('phalf','fld_s00i407','level_to_height(var[0])','Pa','time model_rho_level_number lat lon','longitude latitude alevhalf time','mon','atmos','area: time: mean','','CM2_mon','ESM1.5','air_pressure','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('pr','fld_s05i216','','kg m-2 s-1','time_0 lat lon','longitude latitude time','3hr','atmos','area: time: mean','','CMIP6_3hr','CM2','precipitation_flux','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('pr','fld_s05i216','','kg m-2 s-1','time_0 lat lon','longitude latitude time','3hr','atmos','area: time: mean','','CMIP6_3hr','ESM1.5','precipitation_flux','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('pr','fld_s05i216','','kg m-2 s-1','time lat lon','longitude latitude time','mon','atmos','area: time: mean','','CMIP6_Amon','AM3','precipitation_flux','map_atmos_AM3.csv'); diff --git a/src/mopper/mop_utils.py b/src/mopper/mop_utils.py index 417e1a2..acc16df 100755 --- a/src/mopper/mop_utils.py +++ b/src/mopper/mop_utils.py @@ -35,6 +35,8 @@ import json from functools import partial from pathlib import Path +from datetime import datetime +from dateutil.relativedelta import relativedelta from mopper.calc_land import * from mopper.calc_atmos import * @@ -264,7 +266,10 @@ def check_vars_in_file(ctx, invars, fname): @click.pass_context def get_time_dim(ctx, ds): """Find time info: time axis, reference time and set tstart and tend - also return mutlitple_times True if more than one time axis + also return mutltiple_times True if more than one time axis + + Parameters + ---------- ctx : click context Includes obj dict with 'cmor' settings, exp attributes """ @@ -320,9 +325,9 @@ def check_timestamp(ctx, all_files): var_log = logging.getLogger(ctx.obj['var_log']) inrange_files = [] var_log.info("checking files timestamp ...") - tstart = ctx.obj['sel_start'] - tend = ctx.obj['sel_end'] - var_log.debug(f"tstart, tend: {tstart}, {tend}") + sel_start = ctx.obj['sel_start'] + sel_end = ctx.obj['sel_end'] + var_log.debug(f"sel_start, sel_end: {sel_start}, {sel_end}") #if we are using a time invariant parameter, just use a file with vin if 'fx' in ctx.obj['frequency']: inrange_files = [all_files[0]] @@ -364,21 +369,21 @@ def check_timestamp(ctx, all_files): #assume year is yyy and 0 tstamp = '0' + tstamp if len(tstamp) == 4: - tstart = tstart[:4] - tend = tend[:4] + sel_start = sel_start[:4] + sel_end = sel_end[:4] elif len(tstamp) == 6: - tstart = tstart[:6] - tend = tend[:6] + sel_start = sel_start[:6] + sel_end = sel_end[:6] else: # if hhmm were present add them back to tstamp otherwise as 0000 #tstamp = tstamp + hhmm.ljust(4,'0') tstamp = tstamp + hhmm if len(tstamp) == 8: - tstart = tstart[:8] - tend = tend[:8] + sel_start = sel_start[:8] + sel_end = sel_end[:8] var_log.debug(f"tstamp for {inf}: {tstamp}") - var_log.debug(f"tstart, tend {tstart}, {tend}") - if tstart <= tstamp <= tend: + var_log.debug(f"sel start, end {sel_start}, {sel_end}") + if sel_start <= tstamp <= sel_end: inrange_files.append(infile) var_log.debug("file selected") return inrange_files @@ -411,8 +416,10 @@ def check_timeaxis(ctx, all_files, tdim): inrange_files = [] var_log.info("loading files...") var_log.debug(f"time dimension: {tdim}") - tstart = ctx.obj['tstart'].replace('T','') - tend = ctx.obj['tend'].replace('T','') + # switching to sel_start, sel_end because of unexpected values + # for example UM aus2200 1 hourly saved at 01 min instead of 00 + tstart = ctx.obj['sel_start'].replace('T','') + tend = ctx.obj['sel_end'].replace('T','') var_log.debug(f"tstart, tend from opts: {tstart}, {tend}") if 'fx' in ctx.obj['table']: inrange_files = [all_files[0]] @@ -479,15 +486,16 @@ def load_data(ctx, path_vars): in_units, in_missing, positive, coords = get_attrs(dsin, first) dsin = xr.decode_cf(dsin, use_cftime=True) - if tdim is not None and 'fx' not in ctx.obj['frequency']: - var_log.debug(f"load_data: slicing time {tdim}") - dsin = dsin.sel({tdim: slice(ctx.obj['tstart'], - ctx.obj['tend'])}) + #if tdim is not None and 'fx' not in ctx.obj['frequency']: + # var_log.debug(f"load_data: slicing time {tdim}") + # dsin = dsin.sel({tdim: slice(ctx.obj['tstart'], + # ctx.obj['tend'])}) for field in v['vars']: var_log.debug(f"load_data, var & path: {field}, {v['vars']}") input_ds[field] = dsin return input_ds, in_units, in_missing, positive, coords + @click.pass_context def generic_name(ctx, aname, orig, cnames): """Get cmor name for z axes with generic name @@ -531,9 +539,9 @@ def generic_name(ctx, aname, orig, cnames): raise MopException("cmor name not defined for generic axis") if cmor_name not in cnames: var_log.warning(f"{cmor_name} not in axes_names.yaml file") - return cmor_name + @click.pass_context def get_cmorname(ctx, axis_name): """Get cmor name for axes based on their name, cmor var definition @@ -606,6 +614,7 @@ def create_axis(ctx, axis, table): var_log.info(f"setup of {axis.name} axis complete") return axis_id + @click.pass_context def hybrid_axis(ctx, lev, z_ax_id, z_ids): """Setting up additional hybrid axis information @@ -634,22 +643,27 @@ def hybrid_axis(ctx, lev, z_ax_id, z_ids): zfactor_values=orog_vals) return zfactor_b_id, zfactor_orog_id + @click.pass_context def ij_axis(ctx, ax, ax_name, table): """ ctx : click context Includes obj dict with 'cmor' settings, exp attributes """ - #var_log = logging.getLogger(ctx.obj['var_log']) + var_log = logging.getLogger(ctx.obj['var_log']) + var_log.debug(f"ij_axis: ax is {ax}") cmor.set_table(table) ax_id = cmor.axis(table_entry=ax_name, units='1', coord_vals=ax.values) return ax_id + @click.pass_context def ll_axis(ctx, ax, ax_name, ds, table, bounds_list): """ + Parameters + ---------- ctx : click context Includes obj dict with 'cmor' settings, exp attributes """ @@ -677,6 +691,7 @@ def ll_axis(ctx, ax, ax_name, ds, table, bounds_list): interval=None) return ax_id + @click.pass_context def define_grid(ctx, j_id, i_id, lat, lat_bnds, lon, lon_bnds): """If we are on a non-cartesian grid, Define the spatial grid @@ -696,6 +711,7 @@ def define_grid(ctx, j_id, i_id, lat, lat_bnds, lon, lon_bnds): var_log.info("setup of lat,lon grid complete") return grid_id + @click.pass_context def get_coords(ctx, ovar, coords): """Get lat/lon and their boundaries from ancil file @@ -755,6 +771,13 @@ def get_axis_dim(ctx, var): var_log.debug(f"axis found: {dim}") else: var_log.warning(f"No coordinate variable associated with the dimension {dim}") + # have to add this because a simulation didn't have the dimension variables + if any(x in dim.lower() for x in ['nj', 'yu_ocean', 'yt_ocean']): + axes['j_ax'] = var[dim] + axes_str += f"j_ax: {dim}; " + elif any(x in dim.lower() for x in ['ni', 'xu_ocean', 'xt_ocean']): + axes['i_ax'] = var[dim] + axes_str += f"i_ax: {dim}; " axis = None if axis is not None: attrs = axis.attrs @@ -775,10 +798,6 @@ def get_axis_dim(ctx, var): elif any(x in dim.lower() for x in ['nj', 'yu_ocean', 'yt_ocean']): axes['j_ax'] = axis axes_str += f"j_ax: {axis.name}; " - # have to add this because a simulation didn't have the dimension variables - elif any(x in dim.lower() for x in ['nj', 'yu_ocean', 'yt_ocean']): - axes['j_ax'] = axis - axes_str += f"j_ax: {axis.name}; " elif axis_attr and 'X' in axis_attr: if 'glon' in dim.lower(): axes['glon_ax'] = axis @@ -789,10 +808,6 @@ def get_axis_dim(ctx, var): elif any(x in dim.lower() for x in ['ni', 'xu_ocean', 'xt_ocean']): axes['i_ax'] = axis axes_str += f"i_ax: {axis.name}; " - # have to add this because a simulation didn't have the dimension variables - elif any(x in dim.lower() for x in ['ni', 'xu_ocean', 'xt_ocean']): - axes['i_ax'] = axis - axes_str += f"i_ax: {axis.name}; " elif axis_attr == 'Z' or any(x in dim for x in ['lev', 'heigth', 'depth']): axes['z_ax'] = axis @@ -824,7 +839,7 @@ def check_time_bnds(ctx, bnds, frequency): """ var_log = logging.getLogger(ctx.obj['var_log']) - var_log.debug(f"Time bnds 1,0: {bnds[:,1], bnds[:,0]}") + var_log.debug(f"Time bnds 1,0: {bnds[0:1,1], bnds[0:1,0]}") diff = bnds[:,1] - bnds[:,0] #approx_int = [np.timedelta64(x, 'D').astype(float) for x in diff] approx_int = [x.astype(float) for x in diff] @@ -880,6 +895,7 @@ def bounds_change(ctx, axis): changed_bnds = True return changed_bnds + @click.pass_context def get_bounds(ctx, ds, axis, cmor_name, ax_val=None): """Returns bounds for input dimension, if bounds are not available @@ -889,9 +905,12 @@ def get_bounds(ctx, ds, axis, cmor_name, ax_val=None): ctx : click context Includes obj dict with 'cmor' settings, exp attributes + ds : Xarray Dataset + The input xarray dataset + axis : Xarray DataArray + cmor_name: """ var_log = logging.getLogger(ctx.obj['var_log']) - var_log.debug(f'in getting bounds: {axis}') dim = axis.name var_log.info(f"Getting bounds for axis: {dim}") changed_bnds = bounds_change(axis) @@ -933,7 +952,7 @@ def get_bounds(ctx, ds, axis, cmor_name, ax_val=None): max_val = np.roll(min_val, -1) max_val[-1] = 1.5*ax_val[-1] - 0.5*ax_val[-2] dim_bnds_val = np.column_stack((min_val, max_val)) - var_log.debug(f"{axis.name} bnds: {dim_bnds_val}") + var_log.debug(f"New {axis.name} bnds: {dim_bnds_val}") except Exception as e: var_log.warning(f"dodgy bounds for dimension: {dim}") var_log.error(f"error: {e}") @@ -967,6 +986,7 @@ def get_bounds(ctx, ds, axis, cmor_name, ax_val=None): var_log.info(f"setting minimum {cmor_name} bound to 0") return dim_bnds_val + @click.pass_context def get_bounds_values(ctx, ds, bname): """Return values of axis bounds, if they're not in file @@ -974,6 +994,11 @@ def get_bounds_values(ctx, ds, bname): ctx : click context Includes obj dict with 'cmor' settings, exp attributes + ds : Xarray Dataset + The input xarray dataset + bname : str + Bounds variable name + """ calc = False var_log = logging.getLogger(ctx.obj['var_log']) @@ -993,6 +1018,7 @@ def get_bounds_values(ctx, ds, bname): calc = True return calc, bnds_val + @click.pass_context def get_attrs(ctx, ds, var1): """ @@ -1100,8 +1126,16 @@ def extract_var(ctx, input_ds, in_missing): # Some ops (e.g., resample) might introduce extra tstep: select time range if tdim is not None and 'fx' not in ctx.obj['frequency']: var_log.debug(f"{ctx.obj['tstart']}, {ctx.obj['tend']}") - array = array.sel({tdim: slice(ctx.obj['tstart'], ctx.obj['tend'])}) - var_log.debug(f"{array[tdim][0].values}, {array[tdim][-1].values}") + # add some tolerance to slice to avoid missing steps at higher frequencies + tol = relativedelta(minutes=2) + ts = datetime.strptime(ctx.obj['tstart'], '%Y%m%dT%H%M') - tol + te = datetime.strptime(ctx.obj['tend'], '%Y%m%dT%H%M') + tol + tstart = ts.strftime('%4Y%m%dT%H%M') + tend = te.strftime('%4Y%m%dT%H%M') + var_log.debug(f"Before slicing: {array[tdim][0].values}, {array[tdim][-1].values}") + var_log.debug(f"tstart and tend: {tstart}, {tend}") + array = array.sel({tdim: slice(tstart,tend)}) + var_log.debug(f"After: {array[tdim][0].values}, {array[tdim][-1].values}") return array, failed diff --git a/src/mopper/mopper.py b/src/mopper/mopper.py index 5ad0563..304814f 100644 --- a/src/mopper/mopper.py +++ b/src/mopper/mopper.py @@ -337,8 +337,9 @@ def mop_process(ctx): interval=None) axis_ids.append(p_ax_id) # if both i, j are defined call setgrid, if only one treat as lat/lon + if axes['i_ax'] is not None and axes['j_ax'] is not None: - var_log.debug(f"Setting grid with {axes}") + var_log.debug(f"Setting grid with {axes['j_ax']}, {axes['i_ax']}") setgrid = True j_id = ij_axis(axes['j_ax'], 'j_index', tables[0]) i_id = ij_axis(axes['i_ax'], 'i_index', tables[0]) @@ -369,9 +370,10 @@ def mop_process(ctx): axis_ids.append(grid_id) z_ids.append(grid_id) # Set up additional hybrid coordinate information - if (axes['z_ax'] is not None and cmor_zName in - ['hybrid_height', 'hybrid_height_half']): - zfactor_b_id, zfactor_orog_id = hybrid_axis(cmor_zName, z_ax_id, z_ids) + # temporarily disabling this, not sure if it's needed! + #if (axes['z_ax'] is not None and cmor_zName in + # ['hybrid_height', 'hybrid_height_half']): + # zfactor_b_id, zfactor_orog_id = hybrid_axis(cmor_zName, z_ax_id, z_ids) # Freeing up memory del dsin diff --git a/tests/test_setup_utils.py b/tests/test_setup_utils.py index 51ab173..cbfae40 100644 --- a/tests/test_setup_utils.py +++ b/tests/test_setup_utils.py @@ -191,5 +191,17 @@ def test_define_file(): opts, newtime = define_file({'timeshot':'mean', 'frequency': 'mon'}, st, fin, delta, tstep, half_tstep) assert newtime == datetime.strptime('20230701T0000', frm) + # test 10min frequency + st = datetime.strptime('20230614T1900', frm) + delta = relativedelta(days=1) + half_tstep = relativedelta(hours=3) + tstep = relativedelta(hours=6) + opts, newtime = define_file({'timeshot':'point', 'frequency': '6hr'}, + st, fin, delta, tstep, half_tstep) + assert opts['tstart'] == '20230615T0100' + assert opts['sel_start'] == '202306141900' + assert opts['tend'] == '20230615T1900' + assert opts['sel_end'] == '202306160100' + assert newtime == datetime.strptime('20230615T1900', frm) # see issue 197 when defining tests for add_files function From f2bc525e68d0f0014e7954f08379d0a5ca1e0198 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Mon, 18 Nov 2024 17:17:46 +1100 Subject: [PATCH 07/17] solved #206 and added test for check_time_bnds --- src/mopper/mop_utils.py | 12 ++++++------ tests/test_mop_utils.py | 14 +++++++++++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/mopper/mop_utils.py b/src/mopper/mop_utils.py index acc16df..2c020d8 100755 --- a/src/mopper/mop_utils.py +++ b/src/mopper/mop_utils.py @@ -486,10 +486,10 @@ def load_data(ctx, path_vars): in_units, in_missing, positive, coords = get_attrs(dsin, first) dsin = xr.decode_cf(dsin, use_cftime=True) - #if tdim is not None and 'fx' not in ctx.obj['frequency']: - # var_log.debug(f"load_data: slicing time {tdim}") - # dsin = dsin.sel({tdim: slice(ctx.obj['tstart'], - # ctx.obj['tend'])}) + if tdim is not None and 'fx' not in ctx.obj['frequency']: + var_log.debug(f"load_data: slicing time {tdim}") + dsin = dsin.sel({tdim: slice(ctx.obj['tstart'], + ctx.obj['tend'])}) for field in v['vars']: var_log.debug(f"load_data, var & path: {field}, {v['vars']}") input_ds[field] = dsin @@ -995,9 +995,9 @@ def get_bounds_values(ctx, ds, bname): ctx : click context Includes obj dict with 'cmor' settings, exp attributes ds : Xarray Dataset - The input xarray dataset + The input xarray dataset bname : str - Bounds variable name + Bounds variable name """ calc = False diff --git a/tests/test_mop_utils.py b/tests/test_mop_utils.py index 34c0468..5173a93 100644 --- a/tests/test_mop_utils.py +++ b/tests/test_mop_utils.py @@ -23,7 +23,7 @@ from pathlib import Path from mopper.mop_utils import (check_timestamp, get_cmorname, - define_attrs) + define_attrs, check_time_bnds) ctx = click.Context(click.Command('cmd'), @@ -33,6 +33,10 @@ ctx2 = click.Context(click.Command('cmd'), obj={'sel_start': '198302170000', 'sel_end': '198302182100', 'realm': 'atmos', 'frequency': '6hr', 'var_log': 'varlog_1'}) +# to test daily files +ctx3 = click.Context(click.Command('cmd'), + obj={'sel_start': '198302170000', 'sel_end': '198302182100', + 'realm': 'atmos', 'frequency': 'day', 'var_log': 'varlog_1'}) def test_check_timestamp(caplog): global ctx @@ -151,3 +155,11 @@ def test_define_attrs(caplog): with ctx: out = define_attrs() assert out['notes'] == "Linearly interpolated from model levels using numpy.interp() function. NaNs are assigned to pressure levels falling out of the height range covered by the model" + +def test_check_time_bnds(caplog): + global ctx3 + caplog.set_level(logging.DEBUG, logger='mop_log') + bnds = np.array([[18262., 18263.], [18263.,18264.],[18264.,18265.]]) + with ctx3: + res = check_time_bnds(bnds, 'day') + assert res is True From 8fb7447cf8362221803eb0b64fcea3d205eaf829 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Mon, 25 Nov 2024 15:30:15 +1100 Subject: [PATCH 08/17] fixed mappings for phalf and removed squeeze from calc_depositions --- ACDD_conf.yaml | 2 ++ CMIP6_conf.yaml | 2 ++ mappings/map_atmos_CM2.csv | 4 ++- mappings/map_atmos_ESM1.5.csv | 4 ++- mappings/map_ocean_CM2.csv | 1 + src/mopdata/access.db | Bin 1212416 -> 1212416 bytes src/mopdata/access_dump.sql | 14 +++++++--- src/mopdata/cmor_tables/CM2_mon.json | 38 ++++++++++++++++++++++++++- src/mopper/calc_atmos.py | 2 +- src/mopper/mop_utils.py | 3 ++- src/mopper/mopper.py | 6 ++--- 11 files changed, 64 insertions(+), 12 deletions(-) diff --git a/ACDD_conf.yaml b/ACDD_conf.yaml index 5ab33ef..e9d2454 100755 --- a/ACDD_conf.yaml +++ b/ACDD_conf.yaml @@ -83,6 +83,8 @@ cmor: land_frac: "" # to supply tile area fraction if not available in output tile_frac: "" + # used for atmospheric hybrid coordinates + orog: "" # defines Controlled Vocabularies and required attributes # leave ACDD to follow NCI publishing requirements _control_vocabulary_file: "ACDD_CV.json" diff --git a/CMIP6_conf.yaml b/CMIP6_conf.yaml index 2deb98e..7a8dd59 100755 --- a/CMIP6_conf.yaml +++ b/CMIP6_conf.yaml @@ -76,6 +76,8 @@ cmor: land_frac: "" # to supply tile area fraction if not available in output tile_frac: "" + # used for atmospheric hybrid coordinates + orog: "" history_data: '' # DO NOT REMOVE OR ALTER this if you don't know what you're doing :-) # defines Controlled Vocabularies and required attributes diff --git a/mappings/map_atmos_CM2.csv b/mappings/map_atmos_CM2.csv index 557c173..4ae7d8b 100644 --- a/mappings/map_atmos_CM2.csv +++ b/mappings/map_atmos_CM2.csv @@ -37,7 +37,7 @@ intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;ar intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;CM2;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure -phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure +phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time_0 lat lon;longitude latitude time;3hr;atmos;;;CMIP6_3hr;CM2;float32;110592;578880;cm000a.p8;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;day;atmos;;;CMIP6_day;CM2;float32;110592;74772;cm000a.pd;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux @@ -117,7 +117,9 @@ tas;fld_s03i236;;K;time lat lon;longitude latitude time height1.5m;mon;atmos;are tas;fld_s03i236;;K;time lat lon;longitude latitude time height1.5m;3hrPt;atmos;area: time: point;;CM2_3hr;CM2;float32;110592;578880;cm000a.p8;TEMPERATURE AT 1.5M;air_temperature tas;fld_s03i236;;K;time lat lon;longitude latitude time height1.5m;day;atmos;area: time: mean;;CM2_day;CM2;float32;110592;74772;cm000a.pd;TEMPERATURE AT 1.5M;air_temperature tasmax;fld_s03i236_max;;K;time lat lon;longitude latitude time height1.5m;day;atmos;area: time: maximum;;CM2_day;CM2;float32;110592;74772;cm000a.pd;TEMPERATURE AT 1.5M;air_temperature +tasmax;fld_s03i236_max;;K;time lat lon;longitude latitude time height1.5m;mon;atmos;area: time: maximum;;CM2_mon;CM2;float32;110592;2412;cm000a.pm;TEMPERATURE AT 1.5M;air_temperature tasmin;fld_s03i236_min;;K;time lat lon;longitude latitude time height1.5m;day;atmos;area: time: minimum;;CM2_day;CM2;float32;110592;74772;cm000a.pd;TEMPERATURE AT 1.5M;air_temperature +tasmin;fld_s03i236_min;;K;time lat lon;longitude latitude time height1.5m;mon;atmos;area: time: minimum;;CM2_mon;CM2;float32;110592;2412;cm000a.pm;TEMPERATURE AT 1.5M;air_temperature tauu;fld_s03i460;;Pa;time lat lon_u;longitude latitude time;mon;atmos;area: time: mean;down;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;X-COMP SURFACE BL STRESS;surface_downward_eastward_stress tauv;fld_s03i461;;Pa;time lat_v lon;longitude latitude time;mon;atmos;area: time: mean;down;CMIP6_Amon;CM2;float32;111360;12;cw323a.pm;Y-COMP SURFACE BL STRESS;surface_downward_northward_stress ta19uvgrid;fld_s30i204;;K;time pressure lat_v lon_u;longitude latitude plev19 time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;2115840;12;cw323a.pm;TEMPERATURE ON P LEV/UV GRID;air_temperature diff --git a/mappings/map_atmos_ESM1.5.csv b/mappings/map_atmos_ESM1.5.csv index 5a327d4..00e02f3 100644 --- a/mappings/map_atmos_ESM1.5.csv +++ b/mappings/map_atmos_ESM1.5.csv @@ -36,7 +36,7 @@ intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;ar intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;ESM1.5;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;ESM1.5;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure -phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevhalf time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure +phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time_0 lat lon;longitude latitude time;3hr;atmos;;;CMIP6_3hr;ESM1.5;float32;110592;578880;cm000a.p8;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;day;atmos;;;CMIP6_day;ESM1.5;float32;110592;74772;cm000a.pd;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux @@ -116,7 +116,9 @@ tas;fld_s03i236;;K;time lat lon;longitude latitude time height1.5m;mon;atmos;are tas;fld_s03i236;;K;time lat lon;longitude latitude time height1.5m;3hrPt;atmos;area: time: point;;CM2_3hr;ESM1.5;float32;110592;578880;cm000a.p8;TEMPERATURE AT 1.5M;air_temperature tas;fld_s03i236;;K;time lat lon;longitude latitude time height1.5m;day;atmos;area: time: mean;;CM2_day;ESM1.5;float32;110592;74772;cm000a.pd;TEMPERATURE AT 1.5M;air_temperature tasmax;fld_s03i236_max;;K;time lat lon;longitude latitude time height1.5m;day;atmos;area: time: maximum;;CM2_day;ESM1.5;float32;110592;74772;cm000a.pd;TEMPERATURE AT 1.5M;air_temperature +tasmax;fld_s03i236_max;;K;time lat lon;longitude latitude time height1.5m;mon;atmos;area: time: maximum;;CM2_mon;ESM1.5;float32;110592;2412;cm000a.pm;TEMPERATURE AT 1.5M;air_temperature tasmin;fld_s03i236_min;;K;time lat lon;longitude latitude time height1.5m;day;atmos;area: time: minimum;;CM2_day;ESM1.5;float32;110592;74772;cm000a.pd;TEMPERATURE AT 1.5M;air_temperature +tasmin;fld_s03i236_min;;K;time lat lon;longitude latitude time height1.5m;mon;atmos;area: time: minimum;;CM2_mon;ESM1.5;float32;110592;2412;cm000a.pm;TEMPERATURE AT 1.5M;air_temperature tauu;fld_s03i460;;Pa;time lat lon_u;longitude latitude time;mon;atmos;area: time: mean;down;CMIP6_Amon;ESM1.5;float32;110592;12;cw323a.pm;X-COMP SURFACE BL STRESS;surface_downward_eastward_stress tauv;fld_s03i461;;Pa;time lat_v lon;longitude latitude time;mon;atmos;area: time: mean;down;CMIP6_Amon;ESM1.5;float32;111360;12;cw323a.pm;Y-COMP SURFACE BL STRESS;surface_downward_northward_stress ta19uvgrid;fld_s30i204;;K;time pressure lat_v lon_u;longitude latitude plev19 time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;2115840;12;cw323a.pm;TEMPERATURE ON P LEV/UV GRID;air_temperature diff --git a/mappings/map_ocean_CM2.csv b/mappings/map_ocean_CM2.csv index ffd3e65..23a0753 100644 --- a/mappings/map_ocean_CM2.csv +++ b/mappings/map_ocean_CM2.csv @@ -25,6 +25,7 @@ masscello;rho_dzt;;kg m-2;time st_ocean yt_ocean xt_ocean;longitude latitude ole mlotst;mld;;m;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;708;ocean_month.nc-;mixed layer depth determined by density criteria;ocean_mixed_layer_thickness_defined_by_sigma_t mlotst;mld;;m;time yt_ocean xt_ocean;longitude latitude time;day;ocean;area: time: mean;;CM2_day;CM2;float32;432000;708;ocean_daily.nc-;mixed layer depth determined by density criteria;ocean_mixed_layer_thickness_defined_by_sigma_t mlotstsq;mld_sq;;m2;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;708;ocean_month.nc-;squared mixed layer depth determined by density criteria;square_of_ocean_mixed_layer_thickness_defined_by_sigma_t +msftbarot;psiu;;kg/s;time yt_ocean xu_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;36;ocean_month.nc-;quasi-barotropic strmfcn psiu (compatible with tx_trans);ocean_barotropic_mass_streamfunction msftmrho;ty_trans_rho ty_trans_rho_gm;calc_overt(var);kg s-1;time potrho grid_yu_ocean grid_xt_ocean;latitude rho basin time;mon;ocean;longitude: sum depth: sum time: mean;;CMIP6_Omon;CM2;float32;34560000;708;ocean_month.nc-;Overturning mass streamfunction arising from all advective mass transport processes, resolved and parameterized.;ocean_meridional_overturning_mass_streamfunction msftmz;ty_trans ty_trans_gm ty_trans_submeso;calc_overt(var);kg s-1;time potrho grid_yu_ocean grid_xt_ocean;latitude olevel basin time;mon;ocean;longitude: sum depth: sum time: mean;;CMIP6_Omon;CM2;float32;34560000;708;ocean_month.nc-;Overturning mass streamfunction arising from all advective mass transport processes, resolved and parameterized.;ocean_meridional_overturning_mass_streamfunction msftyrho;ty_trans_rho ty_trans_rho_gm;calc_overt(var);kg s-1;time potrho grid_yu_ocean grid_xt_ocean;gridlatitude rho basin time;mon;ocean;time: mean grid_longitude: mean;;CMIP6_Omon;CM2;float32;34560000;708;ocean_month.nc-;Overturning mass streamfunction arising from all advective mass transport processes, resolved and parameterized.;ocean_y_overturning_mass_streamfunction diff --git a/src/mopdata/access.db b/src/mopdata/access.db index 3ed60d33ae04144409ba44c979571996f2d0c8d5..f2770586ed66dc8c5fa9d29c39a7ece1ae7970e8 100644 GIT binary patch delta 4363 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 JZcg{7|1Y<*Q*i(Q delta 3973 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 Date: Mon, 25 Nov 2024 15:45:32 +1100 Subject: [PATCH 09/17] fixed missing import in calc_atmos --- src/mopper/calc_atmos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mopper/calc_atmos.py b/src/mopper/calc_atmos.py index fe76415..2b7118f 100644 --- a/src/mopper/calc_atmos.py +++ b/src/mopper/calc_atmos.py @@ -41,7 +41,7 @@ from importlib.resources import files as import_files from mopdb.utils import read_yaml, MopException -from mopper.calc_utils import rename_coord, get_plev +from mopper.calc_utils import rename_coord, get_plev, sum_vars # Global Variables #---------------------------------------------------------------------- From 762592914d24239184e4f27f2cd944450be3d45d Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Fri, 29 Nov 2024 13:16:41 +1100 Subject: [PATCH 10/17] updated mappings and maing sure only lat, lon selected when getting coords from ancil files --- ACDD_conf.yaml | 2 +- CMIP6_conf.yaml | 2 +- mappings/map_atmos_CM2.csv | 4 +++- mappings/map_atmos_ESM1.5.csv | 4 +++- src/mopdata/access.db | Bin 1212416 -> 1216512 bytes src/mopdata/access_dump.sql | 18 +++++++++++++----- src/mopdata/cmor_tables/CM2_mon.json | 18 ++++++++++++++++++ src/mopdata/latlon_vertices.yaml | 6 +++--- src/mopper/mop_utils.py | 12 ++++++++++-- 9 files changed, 52 insertions(+), 14 deletions(-) diff --git a/ACDD_conf.yaml b/ACDD_conf.yaml index e9d2454..986aef8 100755 --- a/ACDD_conf.yaml +++ b/ACDD_conf.yaml @@ -77,7 +77,7 @@ cmor: # ancillary files relative path to or fullpath ancils_path: "localdata/ancils" grid_ocean: "" - grid_ice: "" + grid_seaIce: "" mask_ocean: "" # to supply land area fraction if not available in output land_frac: "" diff --git a/CMIP6_conf.yaml b/CMIP6_conf.yaml index 7a8dd59..3cfea7c 100755 --- a/CMIP6_conf.yaml +++ b/CMIP6_conf.yaml @@ -70,7 +70,7 @@ cmor: # ancillary files relative path to or fullpath ancils_path: "localdata/ancils" grid_ocean: "" - grid_ice: "" + grid_seaIce: "" mask_ocean: "" # to supply land area fraction if not available in output land_frac: "" diff --git a/mappings/map_atmos_CM2.csv b/mappings/map_atmos_CM2.csv index 4ae7d8b..fee6ec7 100644 --- a/mappings/map_atmos_CM2.csv +++ b/mappings/map_atmos_CM2.csv @@ -1,6 +1,7 @@ cmor_var;input_vars;calculation;units;dimensions;axes;frequency;realm;cell_methods;positive;cmor_table;version;vtype;size;nsteps;fpattern;long_name;standard_name amdry;fld_s30i403;;kg m-2;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;110592;12;cw323a.pm;TOTAL COLUMN DRY MASS RHO GRID;atmosphere_mass_per_unit_area amwet;fld_s30i404;;kg m-2;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;110592;12;cw323a.pm;TOTAL COLUMN WET MASS RHO GRID;atmosphere_mass_per_unit_area +areacella;areacella;;m2;latitude longitude;longitude latitude;fx;atmos;area: sum;;CMIP6_fx;CM2;float32;110592;1;cm2_areacella;t-cell grid area;cell_area ci;fld_s05i269;;1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;deep convection indicator; cl;fld_s02i261;level_to_height(var[0]);1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;9400320;12;cw323a.pm;TOTAL CLOUD AMOUNT ON LEVELS;cloud_area_fraction_in_atmosphere_layer cli;fld_s02i309;level_to_height(var[0]);1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;9400320;12;cw323a.pm;GRIDBOX LSC Qcf IN RADIATION KG/KG;mass_fraction_of_stratiform_cloud_ice_in_air @@ -36,6 +37,7 @@ hus19uvgrid;fld_s30i205;;1;time pressure lat_v lon_u;longitude latitude plev19 t intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;dry mass col int u*q per unit area;eastward_atmosphere_water_transport_across_unit_distance intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;CM2;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux +orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;fx;land;area: time: mean;;CMIP6_fx;CM2;float32;110592;1;cm000a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux @@ -106,7 +108,7 @@ sci;fld_s05i270;;1;time lat lon;longitude latitude time;mon;atmos;area: time: me sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;10 METRE WIND SPEED ON C GRID;wind_speed sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: mean;;CMIP6_day;CM2;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed sfcWindmax;fld_s03i230_max;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: maximum;;CMIP6_day;CM2;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed -sftlf;fld_s03i395;;1;time lat lon;longitude latitude;mon;atmos;area: time: mean;;CMIP6_fx;CM2;float32;110592;12;cw323a.pm;FRACTION OF LAND;land_area_fraction +sftlf;fld_s03i395;var[0].isel(time=0);1;time lat lon;longitude latitude;fx;atmos;area: time: mean;;CMIP6_fx;CM2;float32;110592;12;cw323a.pm;FRACTION OF LAND;land_area_fraction ta;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;2101248;12;cw323a.pm;TEMPERATURE ON P LEV/T GRID;air_temperature ta;fld_s30i204;;K;time pressure lat_v lon_u;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;2115840;2081;cm000a.pm;TEMPERATURE ON P LEV/UV GRID;air_temperature ta19;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time1;6hrPt;atmos;area: time: point;;CM2_6hr;CM2;float32;331776;289440;cm000a.p7;TEMPERATURE ON 19 P LEV/T GRID;air_temperature diff --git a/mappings/map_atmos_ESM1.5.csv b/mappings/map_atmos_ESM1.5.csv index 00e02f3..8ac7aac 100644 --- a/mappings/map_atmos_ESM1.5.csv +++ b/mappings/map_atmos_ESM1.5.csv @@ -1,6 +1,7 @@ cmor_var;input_vars;calculation;units;dimensions;axes;frequency;realm;cell_methods;positive;cmor_table;version;vtype;size;nsteps;fpattern;long_name;standard_name amdry;fld_s30i403;;kg m-2;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;110592;12;cw323a.pm;TOTAL COLUMN DRY MASS RHO GRID;atmosphere_mass_per_unit_area amwet;fld_s30i404;;kg m-2;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;110592;12;cw323a.pm;TOTAL COLUMN WET MASS RHO GRID;atmosphere_mass_per_unit_area +areacella;areacella;;m2;latitude longitude;longitude latitude;fx;atmos;area: sum;;CMIP6_fx;ESM1.5;float32;110592;1;esm_areacella;t-cell grid area;cell_area ci;fld_s05i269;;1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;110592;12;cw323a.pm;deep convection indicator; cl;fld_s02i261;level_to_height(var[0]);1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;9400320;12;cw323a.pm;TOTAL CLOUD AMOUNT ON LEVELS;cloud_area_fraction_in_atmosphere_layer cli;fld_s02i309;level_to_height(var[0]);1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;9400320;12;cw323a.pm;GRIDBOX LSC Qcf IN RADIATION KG/KG;mass_fraction_of_stratiform_cloud_ice_in_air @@ -35,6 +36,7 @@ hus19uvgrid;fld_s30i205;;1;time pressure lat_v lon_u;longitude latitude plev19 t intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;ESM1.5;float32;110592;12;cw323a.pm;dry mass col int u*q per unit area;eastward_atmosphere_water_transport_across_unit_distance intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;ESM1.5;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;ESM1.5;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux +orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;fx;land;area: time: mean;;CMIP6_fx;ESM1.5;float32;110592;1;cm000a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux @@ -105,7 +107,7 @@ sci;fld_s05i270;;1;time lat lon;longitude latitude time;mon;atmos;area: time: me sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;110592;12;cw323a.pm;10 METRE WIND SPEED ON C GRID;wind_speed sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: mean;;CMIP6_day;ESM1.5;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed sfcWindmax;fld_s03i230_max;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: maximum;;CMIP6_day;ESM1.5;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed -sftlf;fld_s03i395;;1;time lat lon;longitude latitude;mon;atmos;area: time: mean;;CMIP6_fx;ESM1.5;float32;110592;12;cw323a.pm;FRACTION OF LAND;land_area_fraction +sftlf;fld_s03i395;;1;time lat lon;longitude latitude;fx;atmos;area: time: mean;;CMIP6_fx;ESM1.5;float32;110592;12;cw323a.pm;FRACTION OF LAND;land_area_fraction ta;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;2101248;12;cw323a.pm;TEMPERATURE ON P LEV/T GRID;air_temperature ta;fld_s30i204;;K;time pressure lat_v lon_u;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;2115840;2081;cm000a.pm;TEMPERATURE ON P LEV/UV GRID;air_temperature ta19;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time1;6hrPt;atmos;area: time: point;;CM2_6hr;ESM1.5;float32;331776;289440;cm000a.p7;TEMPERATURE ON 19 P LEV/T GRID;air_temperature diff --git a/src/mopdata/access.db b/src/mopdata/access.db index f2770586ed66dc8c5fa9d29c39a7ece1ae7970e8..ba06a2184bc092e01caa2a1c3ad176e70c2118f8 100644 GIT binary patch delta 3786 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 K+v)TT`F{XyKWktB delta 3311 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 diff --git a/src/mopdata/access_dump.sql b/src/mopdata/access_dump.sql index ac5945d..9e56ac8 100644 --- a/src/mopdata/access_dump.sql +++ b/src/mopdata/access_dump.sql @@ -2321,6 +2321,7 @@ INSERT INTO cmorvar VALUES('snmassacrossline-CMIP6_SImon','mon','seaIce','snow_t INSERT INTO cmorvar VALUES('phalf-CM2_mon','mon','atmos','air_pressure','Pa','area: time: mean','area: areacella','Pressure on Model Half-Levels','Air pressure on model half-levels','longitude latitude alevel time','phalf','real','','','','','','',''); INSERT INTO cmorvar VALUES('tasmax-CM2_mon','mon','atmos','air_temperature','K','area: mean time: maximum within days time: mean over days','area: areacella','Daily Maximum Near-Surface Air Temperature','maximum near-surface (1.5 meter) air temperature (add cell_method attribute ''time: max'')','longitude latitude time height1.5m','tasmax','real','','','','','','',''); INSERT INTO cmorvar VALUES('tasmin-CM2_mon','mon','atmos','air_temperature','K','area: mean time: minimum within days time: mean over days','area: areacella','Daily Minimum Near-Surface Air Temperature','minimum near-surface (1.5 meter) air temperature (add cell_method attribute ''time: min'')','longitude latitude time height1.5m','tasmin','real','','','','','','',''); +INSERT INTO cmorvar VALUES('sidivvel-CM2_mon','mon','seaIce','divergence_of_sea_ice_velocity','s-1','area: mean where sea_ice (comment: mask=siconc) time: mean','area: areacello','Divergence of the Sea-Ice Velocity Field','Divergence of sea-ice velocity field (first shear strain invariant)','longitude latitude time','sidivvel','real','','','','','','',''); CREATE TABLE mapping ( cmor_var TEXT, input_vars TEXT, @@ -2355,6 +2356,8 @@ INSERT INTO mapping VALUES('amwet','fld_s30i404','','kg m-2','time lat lon','lon INSERT INTO mapping VALUES('amwet','fld_s30i404','','kg m-2','time lat lon','longitude latitude time','mon','atmos','area: time: mean','','CM2_mon','AM3','atmosphere_mass_per_unit_area','map_atmos_AM3.csv'); INSERT INTO mapping VALUES('amwet','fld_s30i404','','kg m-2','time lat lon','longitude latitude time','mon','atmos','area: time: mean','','CM2_mon','CM2','atmosphere_mass_per_unit_area','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('amwet','fld_s30i404','','kg m-2','time lat lon','longitude latitude time','mon','atmos','area: time: mean','','CM2_mon','ESM1.5','atmosphere_mass_per_unit_area','map_atmos_ESM1.5.csv'); +INSERT INTO mapping VALUES('areacella','areacella','','m2','latitude longitude','longitude latitude','fx','atmos','area: sum','','CMIP6_fx','CM2','cell_area','map_atmos_CM2.csv'); +INSERT INTO mapping VALUES('areacella','areacella','','m2','latitude longitude','longitude latitude','fx','atmos','area: sum','','CMIP6_fx','ESM1.5','cell_area','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('areacello','area_t','get_areacello(area_t=var[0])','m-2','yt_ocean xt_ocean','longitude latitude','mon','ocean','area: sum','','CMIP6_Ofx','CM2','cell_area','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('areacello','area_t','get_areacello(area_t=var[0])','m-2','yt_ocean xt_ocean','longitude latitude','mon','ocean','area: sum','','CMIP6_Ofx','ESM1.5','cell_area','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('areacello','area_t','get_areacello(area_t=var[0])','m-2','yt_ocean xt_ocean','longitude latitude','mon','ocean','area: sum','','CMIP6_Ofx','OM2','cell_area','map_ocean_OM2.csv'); @@ -2402,7 +2405,7 @@ INSERT INTO mapping VALUES('clw','fld_s00i254','level_to_height(var[0],levs=(0,6 INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','CM2','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','ESM1.5','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('clwvol','fld_s00i267','level_to_height(var[0],levs=(0,66))','1','time model_theta_level_number lat lon','longitude latitude alevel time1','1hrPt','atmos','area: time: point','','AUS2200_A1hr','AUS2200','liquid_cloud_volume_fraction_in_atmosphere_layer','map_AUS2200.csv'); -INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_atmos_ESM1.5.csv'); +INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','CM2','area_fraction','map_land_CM2.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','ESM1.5','area_fraction','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('cropFracC3','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typec3crop'')','1','time pseudo_level_1 lat lon','longitude latitude time typec3crop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Emon','CM2','area_fraction','map_land_CM2.csv'); @@ -2692,8 +2695,8 @@ INSERT INTO mapping VALUES('omldamax','hblt_max','','m','time yt_ocean xt_ocean' INSERT INTO mapping VALUES('omldamax','hblt_max','','m','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: max','','CM2_mon','OM2','ocean_mixed_layer_thickness_defined_by_mixing_scheme','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','mon','land','area: time: mean','','CMIP6_fx','AM3','surface_altitude','map_land_AM3.csv'); INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time_1 lat lon','longitude latitude','fx','land','area: time: point','','CMIP6_fx','AUS2200','surface_altitude','map_AUS2200.csv'); -INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','mon','land','area: mean','','CMIP6_fx','CM2','surface_altitude','map_land_CM2.csv'); -INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','mon','land','area: mean','','CMIP6_fx','ESM1.5','surface_altitude','map_land_ESM1.5.csv'); +INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','fx','land','area: time: mean','','CMIP6_fx','CM2','surface_altitude','map_atmos_CM2.csv'); +INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','fx','land','area: time: mean','','CMIP6_fx','ESM1.5','surface_altitude','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('orog','surface_altitude','','m','time lat lon','longitude latitude','mon','land','area: time: mean','','CMIP6_fx','CM2','surface_altitude','map_land_CM2.csv'); INSERT INTO mapping VALUES('orog','surface_altitude','','m','time lat lon','longitude latitude','mon','land','area: time: mean','','CMIP6_fx','ESM1.5','surface_altitude','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('osaltdiff','salt_vdiffuse_diff_cbt','','kg m-2 -s','time st_ocean yt_ocean xt_ocean','longitude latitude olevel time','mon','ocean','area: time: mean','','CMIP6_Emon','CM2','tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing','map_ocean_CM2.csv'); @@ -2952,20 +2955,23 @@ INSERT INTO mapping VALUES('sfriver','sfc_salt_flux_runoff','','kg m-2 s-1','tim INSERT INTO mapping VALUES('sfriver','sfc_salt_flux_runoff','','kg m-2 s-1','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','OM2','salt_flux_into_sea_water_from_rivers','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('sftgif','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],17,landfrac=var[1])','1','time pseudo_level_1 lat lon','longitude latitude time','mon','land','area: mean','','CMIP6_LImon','CM2','land_ice_area_fraction','map_land_CM2.csv'); INSERT INTO mapping VALUES('sftgif','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],17,landfrac=var[1])','1','time pseudo_level_1 lat lon','longitude latitude time','mon','land','area: mean','','CMIP6_LImon','ESM1.5','land_ice_area_fraction','map_land_ESM1.5.csv'); -INSERT INTO mapping VALUES('sftlf','fld_s03i395','','1','time lat lon','longitude latitude','mon','atmos','area: time: mean','','CMIP6_fx','CM2','land_area_fraction','map_atmos_CM2.csv'); -INSERT INTO mapping VALUES('sftlf','fld_s03i395','','1','time lat lon','longitude latitude','mon','atmos','area: time: mean','','CMIP6_fx','ESM1.5','land_area_fraction','map_atmos_ESM1.5.csv'); +INSERT INTO mapping VALUES('sftlf','fld_s03i395','var[0].isel(time=0)','1','time lat lon','longitude latitude','fx','atmos','area: time: mean','','CMIP6_fx','CM2','land_area_fraction','map_atmos_CM2.csv'); +INSERT INTO mapping VALUES('sftlf','fld_s03i395','','1','time lat lon','longitude latitude','fx','atmos','area: time: mean','','CMIP6_fx','ESM1.5','land_area_fraction','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('shrubFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],[5,8],landfrac=var[1],lev=''typeshrub'')','1','time lat lon','longitude latitude time typeshrub','mon','land','','','CMIP6_Lmon','CM2','area_fraction','map_land_CM2.csv'); INSERT INTO mapping VALUES('shrubFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],[5,8],landfrac=var[1],lev=''typeshrub'')','1','time lat lon','longitude latitude time typeshrub','mon','land','','','CMIP6_Lmon','ESM1.5','area_fraction','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('siage','siage','','s','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','age_of_sea_ice','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siareaacrossline','aice uvel vvel','icearealineTransports(var[0],var[1],var[2])','m2 s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_area_transport_across_line','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siareaacrossline','aice uvel vvel','icearealineTransports(var[0],var[1],var[2])','m2 s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','SImon','CM2','sea_ice_area_transport_across_line','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siarean','aice tarea','calc_hemi_seaice(var[0],var[1],''north'')','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_area','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siareas','aice tarea','calc_hemi_seaice(var[0],var[1],''south'')','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_area','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sicompstren','sicompstren','','N m-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','compressive_strength_of_sea_ice','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siconc','aice','','1','time nj ni','longitude latitude time typesi','day','seaIce','area: time: mean','','CMIP6_SIday','CM2','sea_ice_area_fraction','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siconc','aice','','1','time nj ni','longitude latitude time typesi','day','seaIce','area: time: mean','','SIday','CM2','sea_ice_area_fraction','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siconca','fld_s00i031','','1','time lat lon','longitude latitude time1 typesi','1hrPt','atmos','area: time: point','','AUS2200_A1hr','AUS2200','sea_ice_area_fraction','map_AUS2200.csv'); INSERT INTO mapping VALUES('sidconcdyn','sidconcdyn','var[0]*100','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_area_fraction_due_to_dynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidconcth','sidconcth','var[0]*100','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_area_fraction_due_to_thermodynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidivvel','sidivvel','','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','','','divergence_of_sea_ice_velocity','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sidivvel','sidivvel','','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CM2_mon','CM2','divergence_of_sea_ice_velocity','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassdyn','sidmassdyn','','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassevapsubl','sidmassevapsubl','var[0]*-1','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','water_evapotranspiration_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassgrowthbot','sidmassgrowthbot','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_congelation_ice_accumulation','map_seaice_CM2.csv'); @@ -3003,6 +3009,7 @@ INSERT INTO mapping VALUES('siitdsnconc','snowfracn','','1','time nc nj ni','lon INSERT INTO mapping VALUES('siitdsnthick','vsnon','','m','time nc nj ni','longitude latitude iceband time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','surface_snow_thickness','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siitdthick','vicen','','m','time nc nj ni','longitude latitude iceband time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_thickness','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('simass','hi hs','var[0]*917+var[1]*330','kg m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_amount','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('simassacrossline','hi uvel vvel','icelineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_transport_across_line','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('simassacrossline','hi uvel vvel','icelineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','SImon','CM2','sea_ice_transport_across_line','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('simpconc','apond_ai aice','maskSeaIce(var[0],var[1])','1','time nj ni','longitude latitude time typemp','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','area_fraction','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sipr','sipr','','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','rainfall_flux','map_seaice_CM2.csv'); @@ -3036,6 +3043,7 @@ INSERT INTO mapping VALUES('snm','fld_s08i231','','kg m-2 s-1','time lat lon','l INSERT INTO mapping VALUES('snm','fld_s08i231','','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','ESM1.5','surface_snow_melt_flux_where_land','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('snm','fld_s08i237 fld_s03i317','average_tile(var[0],tilefrac=var[1],lfrac=0)','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','CM2','surface_snow_melt_flux_where_land','map_land_CM2.csv'); INSERT INTO mapping VALUES('snm','fld_s08i237 fld_s03i317','average_tile(var[0],tilefrac=var[1],lfrac=0)','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','ESM1.5','surface_snow_melt_flux_where_land','map_land_ESM1.5.csv'); +INSERT INTO mapping VALUES('snmassacrossline','hs uvel vvel','snowlineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','snow_transport_across_line_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('snmassacrossline','hs uvel vvel','snowlineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','SImon','CM2','snow_transport_across_line_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('snw','fld_s00i023','','kg m-2','time lat lon','longitude latitude time1','1hrPt','land','area: time: point','','AUS2200_A1hr','AUS2200','surface_snow_amount','map_AUS2200.csv'); INSERT INTO mapping VALUES('snw','fld_s08i023','','kg m-2','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','AM3','surface_snow_amount','map_land_AM3.csv'); diff --git a/src/mopdata/cmor_tables/CM2_mon.json b/src/mopdata/cmor_tables/CM2_mon.json index 2b9fade..197d274 100644 --- a/src/mopdata/cmor_tables/CM2_mon.json +++ b/src/mopdata/cmor_tables/CM2_mon.json @@ -660,6 +660,24 @@ "ok_min_mean_abs": "", "ok_max_mean_abs": "" }, + "sidivvel": { + "frequency": "mon", + "modeling_realm": "seaIce", + "standard_name": "divergence_of_sea_ice_velocity", + "units": "s-1", + "cell_methods": "area: mean where sea_ice (comment: mask=siconc) time: mean", + "cell_measures": "area: areacello", + "long_name": "Divergence of the Sea-Ice Velocity Field", + "comment": "Divergence of sea-ice velocity field (first shear strain invariant)", + "dimensions": "longitude latitude time", + "out_name": "sidivvel", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, "rho0": { "frequency": "mon", "modeling_realm": "ocean", diff --git a/src/mopdata/latlon_vertices.yaml b/src/mopdata/latlon_vertices.yaml index faefb8b..9fc10d0 100644 --- a/src/mopdata/latlon_vertices.yaml +++ b/src/mopdata/latlon_vertices.yaml @@ -1,16 +1,16 @@ -ice: +seaIce: 'ULON': - 'ulon' - 'lonu_bonds' 'ULAT': - 'ulat' - - 'latu_bnds' + - 'latu_bonds' 'TLON': - 'tlon' - 'lont_bonds' 'TLAT': - 'tlat' - - 'latt_bnds' + - 'latt_bonds' ocean: 'geolon_c': - 'x_C' diff --git a/src/mopper/mop_utils.py b/src/mopper/mop_utils.py index d08f312..0734c25 100755 --- a/src/mopper/mop_utils.py +++ b/src/mopper/mop_utils.py @@ -719,13 +719,18 @@ def get_coords(ctx, ovar, coords): ctx : click context Includes obj dict with 'cmor' settings, exp attributes + ovar : Xarray DataArray + the variable to process + coords : list + List of coordinates retrieved from variable encoding """ var_log = logging.getLogger(ctx.obj['var_log']) # open ancil grid file to read vertices #PP be careful this is currently hardcoded which is not ok! ancil_dir = ctx.obj.get('ancils_path', '') ancil_file = ancil_dir + "/" + ctx.obj.get(f"grid_{ctx.obj['realm']}", '') - if ancil_file == '' or not Path(ancil_file).exists(): + if (ancil_file == '' or not Path(ancil_file).exists() or + f"grid_{ctx.obj['realm']}" not in ctx.obj.keys()): var_log.error(f"Ancil file {ancil_file} not set or inexistent") raise MopException(f"Ancil file {ancil_file} not set or inexistent") var_log.debug(f"getting lat/lon and bnds from ancil file: {ancil_file}") @@ -737,7 +742,8 @@ def get_coords(ctx, ovar, coords): data = yaml.safe_load(yfile) ll_dict = data[ctx.obj['realm']] #ensure longitudes are in the 0-360 range. - for c in coords: + # first two coordinates should be lon,lat + for c in coords[:2]: var_log.debug(f"ancil coord: {c}") coord = ds[ll_dict[c][0]] var_log.debug(f"bnds name: {ll_dict[c]}") @@ -1025,6 +1031,8 @@ def get_attrs(ctx, ds, var1): """ ctx : click context Includes obj dict with 'cmor' settings, exp attributes + ds : Xarray Dataset + """ var_log = logging.getLogger(ctx.obj['var_log']) var_attrs = ds[var1].attrs From 2cb81ef112f59c8fee04702bf6691211c2bf0c4e Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Fri, 29 Nov 2024 19:25:54 +1100 Subject: [PATCH 11/17] improved mappings reset db and solved #209 --- mappings/map_atmos_CM2.csv | 2 +- mappings/map_atmos_ESM1.5.csv | 2 +- mappings/map_land_AM3.csv | 2 +- mappings/map_land_CM2.csv | 4 +- mappings/map_land_ESM1.5.csv | 4 +- mappings/map_seaice_CM2.csv | 77 +++++ src/mopdata/access.db | Bin 1216512 -> 1200128 bytes src/mopdata/access_dump.sql | 533 +++++++++++++++++----------------- src/mopdb/mopdb.py | 1 + src/mopdb/mopdb_map.py | 6 +- src/mopdb/mopdb_utils.py | 8 +- 11 files changed, 359 insertions(+), 280 deletions(-) create mode 100644 mappings/map_seaice_CM2.csv diff --git a/mappings/map_atmos_CM2.csv b/mappings/map_atmos_CM2.csv index fee6ec7..8cdacfd 100644 --- a/mappings/map_atmos_CM2.csv +++ b/mappings/map_atmos_CM2.csv @@ -37,7 +37,6 @@ hus19uvgrid;fld_s30i205;;1;time pressure lat_v lon_u;longitude latitude plev19 t intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;dry mass col int u*q per unit area;eastward_atmosphere_water_transport_across_unit_distance intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;CM2;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux -orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;fx;land;area: time: mean;;CMIP6_fx;CM2;float32;110592;1;cm000a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;CM2;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux @@ -109,6 +108,7 @@ sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;mon;at sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: mean;;CMIP6_day;CM2;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed sfcWindmax;fld_s03i230_max;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: maximum;;CMIP6_day;CM2;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed sftlf;fld_s03i395;var[0].isel(time=0);1;time lat lon;longitude latitude;fx;atmos;area: time: mean;;CMIP6_fx;CM2;float32;110592;12;cw323a.pm;FRACTION OF LAND;land_area_fraction +siconca;fld_s00i031;;1;time lat lon;time lat lon;mon;atmos;area: time: mean;;CMIP6_SImon;CM2;float32;110592;2400;da130a.pm;FRAC OF SEA ICE IN SEA AFTER TSTEP;sea_ice_area_fraction ta;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;2101248;12;cw323a.pm;TEMPERATURE ON P LEV/T GRID;air_temperature ta;fld_s30i204;;K;time pressure lat_v lon_u;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;CM2;float32;2115840;2081;cm000a.pm;TEMPERATURE ON P LEV/UV GRID;air_temperature ta19;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time1;6hrPt;atmos;area: time: point;;CM2_6hr;CM2;float32;331776;289440;cm000a.p7;TEMPERATURE ON 19 P LEV/T GRID;air_temperature diff --git a/mappings/map_atmos_ESM1.5.csv b/mappings/map_atmos_ESM1.5.csv index 8ac7aac..d68cbd5 100644 --- a/mappings/map_atmos_ESM1.5.csv +++ b/mappings/map_atmos_ESM1.5.csv @@ -36,7 +36,6 @@ hus19uvgrid;fld_s30i205;;1;time pressure lat_v lon_u;longitude latitude plev19 t intuaw;fld_s30i428;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;ESM1.5;float32;110592;12;cw323a.pm;dry mass col int u*q per unit area;eastward_atmosphere_water_transport_across_unit_distance intvaw;fld_s30i429;;kg m-1 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Emon;ESM1.5;float32;110592;12;cw323a.pm;dry mass col int v*q per unit area;northward_atmosphere_water_transport_across_unit_distance mc;fld_s05i250 fld_s05i251;level_to_height((var[0]-var[1])/9.80665);kg m-2 s-1;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;;up;CM2_mon;ESM1.5;float32;9400320;2081;cm000a.pm;Convective Mass Flux;atmosphere_net_upward_convective_mass_flux -orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;fx;land;area: time: mean;;CMIP6_fx;ESM1.5;float32;110592;1;cm000a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude pfull;fld_s00i408;level_to_height(var[0]);Pa;time model_theta_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT THETA LEVELS AFTER TS;air_pressure phalf;fld_s00i407;level_to_height(var[0]);Pa;time model_rho_level_number lat lon;longitude latitude alevel time;mon;atmos;area: time: mean;;CM2_mon;ESM1.5;float32;9400320;12;cw323a.pm;PRESSURE AT RHO LEVELS AFTER TS;air_pressure prc;fld_s05i205 fld_s05i206;var[0]+var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;110592;12;cw323a.pm;Convective precipitation at surface, includes both liquid and solid phases;convective_precipitation_flux @@ -108,6 +107,7 @@ sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;mon;at sfcWind;fld_s03i230;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: mean;;CMIP6_day;ESM1.5;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed sfcWindmax;fld_s03i230_max;;m s-1;time lat lon;longitude latitude time height10m;day;atmos;area: time: maximum;;CMIP6_day;ESM1.5;float32;110592;74772;cm000a.pd;10 METRE WIND SPEED ON C GRID;wind_speed sftlf;fld_s03i395;;1;time lat lon;longitude latitude;fx;atmos;area: time: mean;;CMIP6_fx;ESM1.5;float32;110592;12;cw323a.pm;FRACTION OF LAND;land_area_fraction +siconca;fld_s00i031;;1;time lat lon;time lat lon;mon;atmos;area: time: mean;;CMIP6_SImon;ESM1.5;float32;110592;2400;da130a.pm;FRAC OF SEA ICE IN SEA AFTER TSTEP;sea_ice_area_fraction ta;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;2101248;12;cw323a.pm;TEMPERATURE ON P LEV/T GRID;air_temperature ta;fld_s30i204;;K;time pressure lat_v lon_u;longitude latitude plev19 time;mon;atmos;area: time: mean;;CMIP6_Amon;ESM1.5;float32;2115840;2081;cm000a.pm;TEMPERATURE ON P LEV/UV GRID;air_temperature ta19;fld_s30i294;;K;time pressure lat lon;longitude latitude plev19 time1;6hrPt;atmos;area: time: point;;CM2_6hr;ESM1.5;float32;331776;289440;cm000a.p7;TEMPERATURE ON 19 P LEV/T GRID;air_temperature diff --git a/mappings/map_land_AM3.csv b/mappings/map_land_AM3.csv index 3e5efdb..ebbb97b 100644 --- a/mappings/map_land_AM3.csv +++ b/mappings/map_land_AM3.csv @@ -11,7 +11,7 @@ mrros;fld_s08i234;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area mrso;fld_s08i223;var[0].sum(dim='depth');kg m-2;time depth lat lon;longitude latitude time;mon;land;area: time: mean;;CMIP6_Lmon;AM3;float32;663552;480;di787a.pm;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer mrsol;fld_s08i223;;kg m-2;time depth lat lon;longitude latitude sdepth time;mon;land;area: time: mean;;CMIP6_Emon;AM3;float32;663552;480;di787a.pm;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer mrsos;fld_s08i223;calc_topsoil(var[0]);kg m-2;time depth lat lon;longitude latitude time sdepth1;mon;land;area: time: mean;;CMIP6_Lmon;AM3;float32;663552;480;di787a.pm;SOIL MOISTURE CONTENT IN A LAYER;mass_content_of_water_in_soil_layer -orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;mon;land;area: time: mean;;CMIP6_fx;AM3;float32;110592;480;di787a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude +orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;fx;land;area: time: mean;;CMIP6_fx;AM3;float32;110592;480;di787a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude rh;fld_s03i293;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;up;CMIP6_Lmon;AM3;float32;110592;480;di787a.pm;SOIL RESPIRATION KG C/M2/S;soil_respiration_carbon_flux sbl;fld_s03i298;;kg m-2 s-1;time lat lon;longitude latitude time;mon;landIce;area: time: mean;;CMIP6_LImon;AM3;float32;110592;480;di787a.pm;SUBLIM. SURFACE (GBM) : RATE KG/M2/S;surface_snow_and_ice_sublimation_flux snm;fld_s08i231;;kg m-2 s-1;time lat lon;longitude latitude time;mon;landIce land;area: time: mean;;CMIP6_LImon;AM3;float32;110592;480;di787a.pm;surface_snow_melt_flux_where_land; diff --git a/mappings/map_land_CM2.csv b/mappings/map_land_CM2.csv index 1f89a14..25a2008 100644 --- a/mappings/map_land_CM2.csv +++ b/mappings/map_land_CM2.csv @@ -36,8 +36,8 @@ mrsos;fld_s08i223;calc_topsoil(var[0]);kg m-2;time depth lat lon;longitude latit nep;fld_s03i262 fld_s03i293;var[0]-var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: mean where land time: mean;down;CMIP6_Emon;CM2;float32;110592;12;cw323a.pm;Net Carbon Mass Flux out of Atmosphere Due to Net Ecosystem Productivity on Land [kgC m-2 s-1];surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change npp;fld_s03i262;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;down;CMIP6_Lmon;CM2;float32;110592;12;cw323a.pm;NET PRIMARY PRODUCTIVITY KG C/M2/S;net_primary_productivity_of_biomass_expressed_as_carbon nwdFracLut;fld_s03i317 fld_s03i395;landuse_frac(var[0],landfrac=var[1],nwd=1);1;time pseudo_level_1 lat lon;longitude latitude landUse time typenwd;mon;land;area: time: mean;;CMIP6_Emon;CM2;float32;1880064;12;cw323a.pm;SURFACE TILE FRACTIONS; -orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;mon;land;area: mean;;CMIP6_fx;CM2;float32;110592;12;cw323a.pm;Surface Altitude;surface_altitude -orog;surface_altitude;;m;time lat lon;longitude latitude;mon;land;area: time: mean;;CMIP6_fx;CM2;float32;110592;12;cw323a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude +orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;fx;land;area: mean;;CMIP6_fx;CM2;float32;110592;12;cw323a.pm;Surface Altitude;surface_altitude +orog;surface_altitude;;m;time lat lon;longitude latitude;fx;land;area: time: mean;;CMIP6_fx;CM2;float32;110592;12;cw323a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude ra;fld_s03i263;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;up;CMIP6_Lmon;CM2;float32;110592;12;cw323a.pm;PLANT RESPIRATION KG/M2/S;plant_respiration_carbon_flux residualFrac;fld_s03i317 fld_s03i395;extract_tilefrac(var[0],[15,16,17],landfrac=var[1],lev='typeresidual');1;time pseudo_level_1 lat lon;longitude latitude time typeresidual;mon;land;area: mean where land over all_area_types time: mean;;CMIP6_Lmon;CM2;float32;1880064;12;cw323a.pm;Percentage of Grid Cell That Is Land but neither Vegetation Covered nor Bare Soil;area_fraction rh;fld_s03i293;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;up;CMIP6_Lmon;CM2;float32;110592;12;cw323a.pm;SOIL RESPIRATION KG C/M2/S;soil_respiration_carbon_flux diff --git a/mappings/map_land_ESM1.5.csv b/mappings/map_land_ESM1.5.csv index d091cd0..9859ba2 100644 --- a/mappings/map_land_ESM1.5.csv +++ b/mappings/map_land_ESM1.5.csv @@ -32,8 +32,8 @@ mrsos;fld_s08i223;calc_topsoil(var[0]);kg m-2;time depth lat lon;longitude latit nep;fld_s03i262 fld_s03i293;var[0]-var[1];kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: mean where land time: mean;down;CMIP6_Emon;ESM1.5;float32;110592;12;cw323a.pm;Net Carbon Mass Flux out of Atmosphere Due to Net Ecosystem Productivity on Land [kgC m-2 s-1];surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change npp;fld_s03i262;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;down;CMIP6_Lmon;ESM1.5;float32;110592;12;cw323a.pm;NET PRIMARY PRODUCTIVITY KG C/M2/S;net_primary_productivity_of_biomass_expressed_as_carbon nwdFracLut;fld_s03i317 fld_s03i395;landuse_frac(var[0],landfrac=var[1],nwd=1);1;time pseudo_level_1 lat lon;longitude latitude landUse time typenwd;mon;land;area: time: mean;;CMIP6_Emon;ESM1.5;float32;1880064;12;cw323a.pm;SURFACE TILE FRACTIONS; -orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;mon;land;area: mean;;CMIP6_fx;ESM1.5;float32;110592;12;cw323a.pm;Surface Altitude;surface_altitude -orog;surface_altitude;;m;time lat lon;longitude latitude;mon;land;area: time: mean;;CMIP6_fx;ESM1.5;float32;110592;12;cw323a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude +orog;fld_s00i033;var[0].isel(time=0);m;time lat lon;longitude latitude;fx;land;area: mean;;CMIP6_fx;ESM1.5;float32;110592;12;cw323a.pm;Surface Altitude;surface_altitude +orog;surface_altitude;;m;time lat lon;longitude latitude;fx;land;area: time: mean;;CMIP6_fx;ESM1.5;float32;110592;12;cw323a.pm;OROGRAPHY (/STRAT LOWER BC);surface_altitude ra;fld_s03i263;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;up;CMIP6_Lmon;ESM1.5;float32;110592;12;cw323a.pm;PLANT RESPIRATION KG/M2/S;plant_respiration_carbon_flux residualFrac;fld_s03i317 fld_s03i395;extract_tilefrac(var[0],[15,16,17],landfrac=var[1],lev='typeresidual');1;time pseudo_level_1 lat lon;longitude latitude time typeresidual;mon;land;area: mean where land over all_area_types time: mean;;CMIP6_Lmon;ESM1.5;float32;1880064;12;cw323a.pm;Percentage of Grid Cell That Is Land but neither Vegetation Covered nor Bare Soil;area_fraction rh;fld_s03i293;;kg m-2 s-1;time lat lon;longitude latitude time;mon;land;area: time: mean;up;CMIP6_Lmon;ESM1.5;float32;110592;12;cw323a.pm;SOIL RESPIRATION KG C/M2/S;soil_respiration_carbon_flux diff --git a/mappings/map_seaice_CM2.csv b/mappings/map_seaice_CM2.csv new file mode 100644 index 0000000..7c41eab --- /dev/null +++ b/mappings/map_seaice_CM2.csv @@ -0,0 +1,77 @@ +cmor_var;input_vars;calculation;units;dimensions;axes;frequency;realm;cell_methods;positive;cmor_table;version;vtype;size;nsteps;fpattern;long_name;standard_name +sos;sss;;0.001;time nj ni;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;1200;iceh_m.;sea surface salinity; +tos;sst;K_degC(var[0]);degC;time nj ni;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;1200;iceh_m.;sea surface temperature; +siconc;aice;;1;time nj ni;longitude latitude time typesi;day;seaIce;area: time: mean;;CMIP6_SIday;CM2;float32;432000;37200;iceh_d.;ice area (aggregate);sea_ice_area_fraction +sivol;hi;;m;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;grid cell mean ice thickness;sea_ice_thickness +simass;hi hs;var[0]*917+var[1]*330;kg m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;grid cell mean ice thickness;sea_ice_amount +simpconc;apond_ai aice;"maskSeaIce(var[0],var[1])";1;time nj ni;longitude latitude time typemp;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;melt pond fraction of grid cell;area_fraction +sidivvel;sidivvel;;s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CM2_mon;CM2;float32;432000;1200;iceh_m.;divergence of the sea ice velocity field (ice area weig;divergence_of_sea_ice_velocity +sidmasstranx;sidmasstranx;;kg s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;x component of snow and sea ice mass transport;sea_ice_x_transport +sidmasstrany;sidmasstrany;;kg s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;y component of snow and sea ice mass transport;sea_ice_y_transport +siage;siage;;s;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice age;age_of_sea_ice +sicompstren;sicompstren;;N m-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;compressive sea ice strength;compressive_strength_of_sea_ice +sidconcdyn;sidconcdyn;var[0]*100;s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice area change from dynamics;tendency_of_sea_ice_area_fraction_due_to_dynamics +sidconcth;sidconcth;var[0]*100;s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice area change from thermodynamics;tendency_of_sea_ice_area_fraction_due_to_thermodynamics +sidmassdyn;sidmassdyn;;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from dynamics;tendency_of_sea_ice_amount_due_to_sea_ice_dynamics +sidmassth;sidmassth;;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from thermodynamics;tendency_of_sea_ice_amount_due_to_sea_ice_thermodynamics +sidmasslat;sidmasslat;var[0]/-1800.;kg m-2 s-1;longitude latitude time;time nj ni;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from lateral ice melt;tendency_of_sea_ice_amount_due_to_lateral_melting +sidmassevapsubl;sidmassevapsubl;var[0]*-1;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from evaporation and sublimation;water_evapotranspiration_flux +sidmassgrowthbot;sidmassgrowthbot;var[0]/1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from bottom growth;tendency_of_sea_ice_amount_due_to_congelation_ice_accumulation +sidmassgrowthwat;sidmassgrowthwat;var[0]/1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from frazil growth;tendency_of_sea_ice_amount_due_to_frazil_ice_accumulation_in_leads +sidmassmeltbot;sidmassmeltbot;var[0]/-1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from bottom ice melt;tendency_of_sea_ice_amount_due_to_basal_melting +sidmassmelttop;sidmassmelttop;var[0]/-1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from top ice melt;tendency_of_sea_ice_amount_due_to_surface_melting +sidmasssi;sidmasssi;var[0]/1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from snow ice conversion;tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice +sifb;sifb;;m;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice freeboard;sea_ice_freeboard +siflcondbot;siflcondbot;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;conductive heat flux at bottom of sea ice;basal_downward_heat_flux_in_sea_ice +siflcondtop;siflcondtop;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;conductive heat flux at top of sea ice;surface_downward_sensible_heat_flux +siforcecoriolx;siforcecoriolx;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;x component of Coriolis force;sea_ice_x_force_per_unit_area_due_to_coriolis_effect +siforcecorioly;siforcecorioly;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;y component of Coriolis force;sea_ice_y_force_per_unit_area_due_to_coriolis_effect +siforceintstrx;siforceintstrx;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;x component of internal ice stress force;sea_ice_x_internal_stress +siforceintstry;siforceintstry;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;y component of internal ice stress force;sea_ice_y_internal_stress +sifllatstop;fld_s03i234 fld_s00i031;"maskSeaIce(var[0],var[1])";W m-2;time lat lon;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;110592;12;cw323a.pm;latent heat flux over sea ice;surface_upward_latent_heat_flux +sifllwdtop;fld_s02i501 fld_s00i031;var[0]/var[1];W m-2;time lat lon;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;110592;12;cw323a.pm;down longwave flux over sea ice;surface_downwelling_longwave_flux_in_air +sifllwutop;fld_s03i531 fld_s00i031;var[0]/var[1];W m-2;time lat lon;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;110592;12;cw323a.pm;upward longwave flux over sea ice;surface_upwelling_longwave_flux_in_air +sifllatstop;sifllatstop;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;latent heat flux over sea ice;surface_upward_latent_heat_flux +sifllwdtop;sifllwdtop;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;down longwave flux over sea ice;surface_downwelling_longwave_flux_in_air +sifllwutop;sifllwutop;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;upward longwave flux over sea ice;surface_upwelling_longwave_flux_in_air +siflsensupbot;siflsensupbot;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sensible heat flux at bottom of sea ice;upward_sea_ice_basal_heat_flux +siflswdbot;siflswdbot;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;down shortwave flux at bottom of ice;downwelling_shortwave_flux_in_sea_water_at_sea_ice_base +siflswdtop;fld_s01i501 fld_s00i031;var[0]/var[1];W m-2;time lat lon;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;110592;12;cw323a.pm;down shortwave flux over sea ice;surface_downwelling_shortwave_flux_in_air +siflswutop;fld_s01i503 fld_s00i031;var[0]/var[1];W m-2;time lat lon;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;110592;12;cw323a.pm;upward shortwave flux over sea ice;surface_upwelling_shortwave_flux_in_air +siflsenstop;fld_s03i533 fld_s00i031;var[0]/var[1];W m-2;time lat lon;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;110592;12;cw323a.pm;sensible heat flux over sea ice;surface_upward_sensible_heat_flux +siflswdtop;siflswdtop;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;down shortwave flux over sea ice;surface_downwelling_shortwave_flux_in_air +siflswutop;siflswutop;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;upward shortwave flux over sea ice;surface_upwelling_shortwave_flux_in_air +siflsenstop;siflsenstop;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sensible heat flux over sea ice;surface_upward_sensible_heat_flux +siflfwbot;siflfwbot;;W m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;fresh water flux from sea ice;water_flux_into_sea_water_due_to_sea_ice_thermodynamics +sfdsi;siflsaltbot;;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;salt flux from sea ice;downward_sea_ice_basal_salt_flux +siforcetiltx;siforcetiltx;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;x component of sea surface tilt force;sea_ice_x_force_per_unit_area_due_to_sea_surface_tilt +siforcetilty;siforcetilty;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;y component of sea surface tilt force;sea_ice_y_force_per_unit_area_due_to_sea_surface_tilt +sihc;sihc;;J m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice heat content;sea_ice_temperature_expressed_as_heat_content +sipr;sipr;;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;rainfall over sea ice;rainfall_flux +sisaltmass;sisaltmass;;kg m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;mass of salt in sea ice (for ocean fluxes);sea_ice_mass_content_of_salt +# sisnconc,yes,sisnthick,sisnconc(var[0]),1,,,CM2,seaIce, don't see why we shouldn't use this instead +sisnconc;sisnconc;;%;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;snow area fraction;surface_snow_area_fraction +siu;siu;;m s-1;time nj ni;longitude latitude time;day;seaIce;area: time: mean;;CMIP6_SIday;CM2;float32;432000;37200;iceh_d.;ice x velocity component;sea_ice_x_velocity +siv;siv;;m s-1;time nj ni;longitude latitude time;day;seaIce;area: time: mean;;CMIP6_SIday;CM2;float32;432000;37200;iceh_d.;ice y velocity component;sea_ice_y_velocity +sisnhc;sisnhc;"maskSeaIce(var[0],var[1])";J m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;snow heat content;thermal_energy_content_of_surface_snow +sisnthick;sisnthick;;m;time nj ni;longitude latitude time;day;seaIce;area: time: mean;;CMIP6_SIday;CM2;float32;432000;37200;iceh_d.;sea ice snow thickness;surface_snow_thickness +sispeed;sispeed;;m s-1;time nj ni;longitude latitude time;day;seaIce;area: time: mean;;CMIP6_SIday;CM2;float32;432000;37200;iceh_d.;ice speed;sea_ice_speed +sistrxdtop;sistrxdtop;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;x component of atmospheric stress on sea ice;surface_downward_x_stress +sistrxubot;sistrxubot;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;x component of ocean stress on sea ice;upward_x_stress_at_sea_ice_base +sistrydtop;sistrydtop;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;down;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;y component of atmospheric stress on sea ice;surface_downward_y_stress +sistryubot;sistryubot;;N m-2;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;y component of ocean stress on sea ice;upward_y_stress_at_sea_ice_base +sitempbot;sitempbot;;K;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice bottom temperature;sea_ice_basal_temperature +sitempsnic;sitempsnic;K_degC(var[0],inverse=True);K;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;snow ice interface temperature;sea_ice_surface_temperatureCMIP6_SImon;CM2 +sitemptop;sitemptop;K_degC(var[0],inverse=True);K;time nj ni;longitude latitude time;day;seaIce;area: time: mean;;CMIP6_SIday;CM2;float32;432000;37200;iceh_d.;sea ice surface temperature;sea_ice_surface_temperature +sndmassmelt;sndmassmelt;var[0]*-1/1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;snow mass change from melt;surface_snow_melt_flux +sndmasssnf;sndmasssnf;var[0]/1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;snow mass change from snow fall;snowfall_flux +sithick;sithick;;m;time nj ni;longitude latitude time;day;seaIce;area: time: mean;;CMIP6_SIday;CM2;float32;432000;37200;iceh_d.;sea ice thickness;sea_ice_thickness +siv;vvel;;m s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;ice velocity (y);sea_ice_y_velocity +siu;uvel;;m s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;ice velocity (x);sea_ice_x_velocity +sivoln;hi tarea;"calc_hemi_seaice(var[0],var[1],'north')";m3;time nj ni;time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;grid cell mean ice thickness;sea_ice_volume +sivols;hi tarea;"calc_hemi_seaice_area_vol(var[0],var[1],'south')";m3;time nj ni;time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;grid cell mean ice thickness;sea_ice_volume +# in cmip6 units are 1e6 km2 +siarean;aice tarea;"calc_hemi_seaice(var[0],var[1],'north')";m2;time nj ni;time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;ice area (aggregate);sea_ice_area +siareas;aice tarea;"calc_hemi_seaice(var[0],var[1],'south')";m2;time nj ni;time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;ice area (aggregate);sea_ice_area +siextentn;aice tarea;"calc_hemi_seaice(var[0],var[1],'north',extent=True)";m2;time nj ni;time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;ice area (aggregate);sea_ice_extent +siextents;aice tarea;"calc_hemi_seaice(var[0],var[1],'south',extent=True)";m2;time nj ni;time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;ice area (aggregate);sea_ice_extent diff --git a/src/mopdata/access.db b/src/mopdata/access.db index ba06a2184bc092e01caa2a1c3ad176e70c2118f8..3dc3acc98988f204d3e0d3fa24953303f957867e 100644 GIT binary patch delta 93754 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 diff --git a/src/mopdata/access_dump.sql b/src/mopdata/access_dump.sql index 9e56ac8..e0a45cd 100644 --- a/src/mopdata/access_dump.sql +++ b/src/mopdata/access_dump.sql @@ -20,242 +20,6 @@ CREATE TABLE cmorvar ( flag_meanings TEXT, ok_min_mean_abs TEXT, ok_max_mean_abs TEXT); -INSERT INTO cmorvar VALUES('tas-AM3_A1hrClimMon','1hrCM','atmos','air_temperature','K','area: mean time: mean within days time: mean over days','area: areacella','Air Temperature','Monthly Air Temperature averaged by hour of day','longitude latitude time3','tas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('co217-AM3_Amon','mon','atmos','mole_fraction_of_carbon_dioxide_in_air','mol mol-1','time: mean','area: areacella','Mole Fraction of CO2','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time','co2','real','','','','','','',''); -INSERT INTO cmorvar VALUES('co2Clim17-AM3_Amon','monC','atmos','mole_fraction_of_carbon_dioxide_in_air','mol mol-1','area: mean time: mean within years time: mean over years','area: areacella','Mole Fraction of CO2','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time2','co2','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hur17-AM3_Amon','mon','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude plev17 time','hur','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hus17-AM3_Amon','mon','atmos','specific_humidity','1','time: mean','area: areacella','Specific Humidity','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude plev17 time','hus','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hus17uvgrid-AM3_Amon','mon','atmos','specific_humidity','%','time: mean','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air. Defined on uv grid','longitude latitude plev17 time','hur','real','','','','','','',''); -INSERT INTO cmorvar VALUES('n2o17-AM3_Amon','mon','atmos atmosChem','mole_fraction_of_nitrous_oxide_in_air','mol mol-1','time: mean','area: areacella','Mole Fraction of N2O','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.','longitude latitude plev17 time','n2o','real','','','','','','',''); -INSERT INTO cmorvar VALUES('n2oClim17-AM3_Amon','monC','atmos atmosChem','mole_fraction_of_nitrous_oxide_in_air','mol mol-1','area: mean time: mean within years time: mean over years','area: areacella','Mole Fraction of N2O','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.','longitude latitude plev17 time2','n2o','real','','','','','','',''); -INSERT INTO cmorvar VALUES('o317-AM3_Amon','mon','atmos atmosChem','mole_fraction_of_ozone_in_air','mol mol-1','time: mean','area: areacella','Mole Fraction of O3','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time','o3','real','','','','','','',''); -INSERT INTO cmorvar VALUES('o3Clim17-AM3_Amon','monC','atmos atmosChem','mole_fraction_of_ozone_in_air','mol mol-1','area: mean time: mean within years time: mean over years','area: areacella','Mole Fraction of O3','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time2','o3','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta17-AM3_Amon','mon','atmos','air_temperature','K','time: mean','area: areacella','Air Temperature','Air Temperature','longitude latitude plev17 time','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ua17-AM3_Amon','mon','atmos','eastward_wind','m s-1','time: mean','area: areacella','Eastward Wind','Zonal wind (positive in a eastward direction).','longitude latitude plev17 time','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va17-AM3_Amon','mon','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind','Meridional wind (positive in a northward direction).','longitude latitude plev17 time','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wap17-AM3_Amon','mon','atmos','lagrangian_tendency_of_air_pressure','Pa s-1','time: mean','area: areacella','Omega (=dp/dt)','Omega (vertical velocity in pressure coordinates, positive downwards)','longitude latitude plev17 time','wap','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zg17-AM3_Amon','mon','atmos','geopotential_height','m','time: mean','area: areacella','Geopotential Height','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev17 time','zg','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa17-AM3_Amon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev17 time','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa17uvgrid-AM3_Amon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention. Defined on uv grid','longitude latitude plev17 time','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ua17uvgrid-AM3_Amon','mon','atmos','eastward_wind','m s-1','time: mean','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction). Defined on uv grid','longitude latitude plev17 time','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va17uvgrid-AM3_Amon','mon','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction). Defined on uv grid','longitude latitude plev17 time','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta17uvgrid-AM3_Amon','mon','atmos','air_temperature','K','time: mean','area: areacella','Air Temperature on pressure levels','Air Temperature. Defined on uv grid','longitude latitude plev17 time','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hur17uvgrid-AM3_Amon','mon','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity on pressure levels','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C. Defined on uv grid','longitude latitude plev17 time','hur','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wap17uvgrid-AM3_Amon','mon','atmos','lagrangian_tendency_of_air_pressure','Pa s-1','time: mean','area: areacella','Omega (=dp/dt) on pressure levels','Omega (vertical velocity in pressure coordinates, positive downwards). Defined on uv grid','longitude latitude plev17 time','wap','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mrlqso-AM3_Amon','mon','land','mass_fraction_of_unfrozen_water_in_soil_moisture','1','area: mean where land time: mean','area: areacella','Average Layer Fraction of Liquid Moisture','Fraction of soil moisture mass in the liquid phase in each user-defined soil layer (3D variable)','longitude latitude sdepth time','mrlqso','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mrrob-AM3_Amon','mon','land','subsurface_runoff_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Subsurface Runoff','Runoff is the liquid water which drains from land. If not specified, ''runoff'' refers to the sum of surface runoff and subsurface drainage. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','mrrob','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zg17uvgrid-AM3_Amon','mon','atmos','geopotential_height','m','time: mean','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface. Defined on uv grid','longitude latitude plev17 time','zg','real','','','','','','',''); -INSERT INTO cmorvar VALUES('huslev1-AUS2200_A10min','subhrPt','atmos','surface_specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude time1','hus','real','','','','','','',''); -INSERT INTO cmorvar VALUES('evspsblpot-AUS2200_A10min','subhrPt','land','water_potential_evaporation_flux','kg m-2 s-1','area: mean where land time: point','area: areacella','Potential Evapotranspiration','at surface; potential flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)','longitude latitude time1','evspsblpot','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ts-AUS2200_A10min','subhrPt','atmos','surface_temperature','K','area: mean time: point','area: areacella','Surface Temperature','Temperature of the lower boundary of the atmosphere','longitude latitude time1','ts','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zmla-AUS2200_A10min','subhrPt','atmos','atmosphere_boundary_layer_thickness','m','area: time: point','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time1','zmla','real','','','','','','',''); -INSERT INTO cmorvar VALUES('pslev1-AUS2200_A10min','subhrPt','atmos','air_pressure','Pa','area: mean time: point','area: areacella','Pressure at Model bottom level','Air pressure on model level 1','longitude latitude alevel1 time1','pslev1','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ps-AUS2200_A10min','subhrPt','atmos','surface_air_pressure','Pa','area: mean time: point','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time1','ps','real','','','','','','',''); -INSERT INTO cmorvar VALUES('uas-AUS2200_A10min','subhrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Near-Surface Wind','Eastward component of the near-surface (usually, 10 meters) wind','longitude latitude time1 height10m','uas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('vas-AUS2200_A10min','subhrPt','atmos','northward_wind','m s-1','area: mean time: point','area: areacella','Northward Near-Surface Wind','Northward component of the near surface wind','longitude latitude time1 height10m','vas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tas-AUS2200_A10min','subhrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Near-Surface Air Temperature','near-surface (for access 1.5 meter) air temperature','longitude latitude time1 height1.5m','tas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('huss-AUS2200_A10min','subhrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Near-Surface Specific Humidity','Near-surface (for access 1.5 meter) specific humidity.','longitude latitude time1 height1.5m','huss','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tdps-AUS2200_A10min','subhrPt','atmos','dew_point_temperature','K','area: time: point','area: areacella','1.5m Dewpoint Temperature','Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity.','longitude latitude height1.5m time1','tdps','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wsgmax10m-AUS2200_A10min','subhrPt','atmos','wind_speed_of_gust','m s-1','area: mean time: point','area: areacella','Maximum Wind Speed of Gust at 10m','Wind speed gust maximum at 10m above surface','longitude latitude time1 height10m','wsgmax10m','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wsgmax10m_max-AUS2200_A10min','subhr','atmos','wind_speed_of_gust','m s-1','area: mean time: maximum','area: areacella','Maximum Wind Speed of Gust at 10m','Wind speed gust maximum at 10m above surface','longitude latitude time height10m','wsgmax10m','real','','','','','','',''); -INSERT INTO cmorvar VALUES('reflmax-AUS2200_A10min','subhrPt','atmos','','dBZ','area: mean time: point','area: areacella','Maximum Radar Reflectivity in the grid column due to all hydrometeors','','longitude latitude time1','reflmax','real','','','','','','',''); -INSERT INTO cmorvar VALUES('pralsprof-AUS2200_A10min','subhr','atmos','stratiform_rainfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Rainfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsprof','real','','','','','','',''); -INSERT INTO cmorvar VALUES('pralsns-AUS2200_A10min','subhr','atmos','stratiform_snowfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Snowfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsns','real','','','','','','',''); -INSERT INTO cmorvar VALUES('cllow-AUS2200_A10min','subhrPt','atmos','low_type_cloud_area_fraction','1','area: time: point','area: areacella','Low Cloud Amount over column','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus.','longitude latitude time1','cllow','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clmed-AUS2200_A10min','subhrPt','atmos','medium_type_cloud_area_fraction','1','area: time: point','area: areacella','Medium Cloud Amount over column','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus.','longitude latitude time1','clmed','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clhigh-AUS2200_A10min','subhrPt','atmos','high_type_cloud_area_fraction','1','area: time: point','area: areacella','High Cloud Amount over column','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time1','clhigh','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clmxro-AUS2200_A10min','subhrPt','atmos','cloud_area_fraction','1','area: time: point','area: areacella','Cloud Area Fraction assuming maximum random overlap','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time1','clmxro','real','','','','','','',''); -INSERT INTO cmorvar VALUES('psl-AUS2200_A10min','subhrPt','atmos','air_pressure_at_mean_sea_level','Pa','area: time: point','area: areacella','Sea Level Pressure','Sea Level Pressure','longitude latitude time1','psl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('flashrate-AUS2200_A10min','subhrPt','atmos','frequency_of_lightning_flashes_per_unit_area','km-2 s-1','area: time: point','area: areacella','Lightning Flash Rate','units to be interpreted as counts km-2 s-1','longitude latitude time1','flashrate','real','','','','','','',''); -INSERT INTO cmorvar VALUES('storm-AUS2200_A10min','subhrPt','atmos','','1','area: time: point','area: areacella','Flag for location of Stormss','','longitude latitude time1','storm','real','','','','','','',''); -INSERT INTO cmorvar VALUES('nflash-AUS2200_A10min','subhr','atmos','','1','area: time: sum','area: areacella','Number of Lightning Flashes','','longitude latitude time','nflash','real','','','','','','',''); -INSERT INTO cmorvar VALUES('lwp-AUS2200_A10min','subhrPt','areosol','atmosphere_mass_content_of_cloud_liquid_water','kg m-2','area: time: point','area: areacella','Liquid Water Path','The total mass of liquid water in cloud per unit area.','longitude latitude time1','lwp','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clivi-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_content_of_cloud_ice','kg m-2','area: time: point','area: areacella','Ice Water Path','mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.','longitude latitude time1','clivi','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prw-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_content_of_water_vapor','kg m-2','area: time: point','area: areacella','Water Vapor Path','vertically integrated through the atmospheric column','longitude latitude time1','prw','real','','','','','','',''); -INSERT INTO cmorvar VALUES('amdry-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column dry mass of air','vertically integrated through the atmospheric column','longitude latitude time1','amdry','real','','','','','','',''); -INSERT INTO cmorvar VALUES('amwet-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column wet mass of air','vertically integrated through the atmospheric column','longitude latitude time1','amwet','real','','','','','','',''); -INSERT INTO cmorvar VALUES('snw-AUS2200_A1hr','1hrPt','land','surface_snow_amount','kg m-2','area: mean where land time: point','area: areacella','Surface Snow Amount','The mass of surface snow on the land portion of the grid cell divided by the land area in the grid cell; reported as missing where the land fraction is 0; excludes snow on vegetation canopy or on sea ice.','longitude latitude time1','snw','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ts-AUS2200_A1hr','1hrPt','atmos','surface_temperature','K','area: mean time: point','area: areacella','Surface Temperature','Temperature of the lower boundary of the atmosphere','longitude latitude time1','ts','real','','','','','','',''); -INSERT INTO cmorvar VALUES('siconca-AUS2200_A1hr','1hrPt','atmos','sea_ice_area_fraction','%','area: time: point','area: areacella','Sea-Ice Area Percentage (Atmospheric Grid)','Percentage of grid cell covered by sea ice','longitude latitude time1 typesi','siconca','real','','','','','','',''); -INSERT INTO cmorvar VALUES('rss-AUS2200_A1hr','1hr','atmos','surface_net_downward_shortwave_flux','W m-2','area: time: mean','area: areacella','Net Shortwave Surface Radiation','Net downward shortwave radiation at the surface','longitude latitude time','rss','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rss_Pt-AUS2200_A1hr','1hrPt','atmos','surface_net_downward_shortwave_flux','W m-2','area: time: point','area: areacella','Net Shortwave Surface Radiation','Net downward shortwave radiation at the surface','longitude latitude time1','rss','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rlut-AUS2200_A1hr','1hr','atmos','toa_outgoing_longwave_flux','W m-2','area: time: mean','area: areacella','TOA Outgoing Longwave Radiation','at the top of the atmosphere (to be compared with satellite measurements)','longitude latitude time','rlut','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('rlut_Pt-AUS2200_A1hr','1hrPt','atmos','toa_outgoing_longwave_flux','W m-2','area: time: point','area: areacella','TOA Outgoing Longwave Radiation','at the top of the atmosphere (to be compared with satellite measurements)','longitude latitude time1','rlut','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('rsdt-AUS2200_A1hr','1hr','atmos','toa_incoming_shortwave_flux','W m-2','area: time: mean','area: areacella','TOA Incident Shortwave Radiation','Shortwave radiation incident at the top of the atmosphere','longitude latitude time','rsdt','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rsdt_Pt-AUS2200_A1hr','1hrPt','atmos','toa_incoming_shortwave_flux','W m-2','area: time: point','area: areacella','TOA Incident Shortwave Radiation','Shortwave radiation incident at the top of the atmosphere','longitude latitude time1','rsdt','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rsut-AUS2200_A1hr','1hr','atmos','toa_outgoing_shortwave_flux','W m-2','area: time: mean','area: areacella','TOA Outgoing Shortwave Radiation','at the top of the atmosphere','longitude latitude time','rsut','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('rsds-AUS2200_A1hr','1hr','atmos','surface_downwelling_shortwave_flux_in_air','W m-2','area: time: mean','area: areacella','Surface Downwelling Shortwave Radiation','Surface solar irradiance for UV calculations.','longitude latitude time','rsds','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rsds_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_shortwave_flux_in_air','W m-2','area: time: point','area: areacella','Surface Downwelling Shortwave Radiation','Surface solar irradiance for UV calculations.','longitude latitude time1','rsds','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rls-AUS2200_A1hr','1hr','atmos','surface_net_downward_longwave_flux','W m-2','area: time: mean','area: areacella','Net Longwave Surface Radiation','Net longwave surface radiation','longitude latitude time','rls','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rls_Pt-AUS2200_A1hr','1hrPt','atmos','surface_net_downward_longwave_flux','W m-2','area: time: point','area: areacella','Net Longwave Surface Radiation','Net longwave surface radiation','longitude latitude time1','rls','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rlds-AUS2200_A1hr','1hr','atmos','surface_downwelling_longwave_flux_in_air','W m-2','area: time: mean','area: areacella','Surface Downwelling Longwave Radiation','The surface called ''surface'' means the lower boundary of the atmosphere. ''longwave'' means longwave radiation. Downwelling radiation is radiation from above. It does not mean ''net downward''. When thought of as being incident on a surface, a radiative flux is sometimes called ''irradiance''. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ''vector irradiance''. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','rlds','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rlds_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_longwave_flux_in_air','W m-2','area: time: point','area: areacella','Surface Downwelling Longwave Radiation','The surface called ''surface'' means the lower boundary of the atmosphere. ''longwave'' means longwave radiation. Downwelling radiation is radiation from above. It does not mean ''net downward''. When thought of as being incident on a surface, a radiative flux is sometimes called ''irradiance''. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ''vector irradiance''. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time1','rlds','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('hfss-AUS2200_A1hr','1hr','atmos','surface_upward_sensible_heat_flux','W m-2','area: time: mean','area: areacella','Surface Upward Sensible Heat Flux','The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.','longitude latitude time','hfss','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('hfss_Pt-AUS2200_A1hr','1hrPt','atmos','surface_upward_sensible_heat_flux','W m-2','area: time: point','area: areacella','Surface Upward Sensible Heat Flux','The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.','longitude latitude time1','hfss','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('uas-AUS2200_A1hr','1hr','atmos','eastward_wind','m s-1','area: mean time: mean','area: areacella','Eastward Near-Surface Wind','Eastward component of the near-surface (usually, 10 meters) wind','longitude latitude time height10m','uas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('vas-AUS2200_A1hr','1hr','atmos','northward_wind','m s-1','area: mean time: mean','area: areacella','Northward Near-Surface Wind','Northward component of the near surface wind','longitude latitude time height10m','vas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hfls-AUS2200_A1hr','1hr','atmos','surface_upward_latent_heat_flux','W m-2','area: time: mean','area: areacella','Surface Upward Latent Heat Flux','The surface called ''surface'' means the lower boundary of the atmosphere. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','hfls','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('hfls_Pt-AUS2200_A1hr','1hrPt','atmos','surface_upward_latent_heat_flux','W m-2','area: time: point','area: areacella','Surface Upward Latent Heat Flux','The surface called ''surface'' means the lower boundary of the atmosphere. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time1','hfls','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('tas-AUS2200_A1hr','1hr','atmos','air_temperature','K','area: mean time: mean','area: areacella','Near-Surface Air Temperature','near-surface (for access 1.5 meters) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tas_Pt-AUS2200_A1hr','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Near-Surface Air Temperature','near-surface (for access 1.5 meters) air temperature','longitude latitude time1 height1.5m','tas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hurs-AUS2200_A1hr','1hr','atmos','relative_humidity','%','area: time: mean','area: areacella','Near-Surface Relative Humidity','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hurs','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tdps-AUS2200_A1hr','1hr','atmos','dew_point_temperature','K','area: time: mean','area: areacella','2m Dewpoint Temperature','Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity.','longitude latitude time','tdps','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prlsprof-AUS2200_A1hr','1hrPt','atmos','stratiform_rainfall_flux','kg m-2 s-1','area: mean time: point','area: areacella','Stratiform Rainfall Flux','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud.','longitude latitude alevel time1','prlsprof','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prlsns-AUS2200_A1hr','1hrPt','atmos','stratiform_snowfall_flux','kg m-2 s-1','area: mean time: point','area: areacella','Stratiform Snowfall Flux','large-scale precipitation of all forms of water in the solid phase.','longitude latitude alevel time1','prlsns','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mrsol-AUS2200_A1hr','1hrPt','land','mass_content_of_water_in_soil_layer','kg m-2','area: mean time: point','area: areacella','Total Water Content of Soil Layer','in each soil layer, the mass of water in all phases, including ice. Reported as ''missing'' for grid cells occupied entirely by ''sea''','longitude latitude sdepth time1','mrsol','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tsl-AUS2200_A1hr','1hrPt','land','soil_temperature','K','area: mean where land time: point','area: areacella','Temperature of Soil','Temperature of soil. Reported as missing for grid cells with no land.','longitude latitude time1 sdepth1','tsl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('cllow_Pt-AUS2200_A1hr','1hrPt','atmos','low_type_cloud_area_fraction','1','area: time: point','area: areacella','Low Cloud Amount','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus.','longitude latitude time1','cllow','real','','','','','','',''); -INSERT INTO cmorvar VALUES('cllow-AUS2200_A1hr','1hr','atmos','low_type_cloud_area_fraction','1','area: time: mean','area: areacella','Low Cloud Amount mean','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus.','longitude latitude time','cllow','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clmed_Pt-AUS2200_A1hr','1hrPt','atmos','medium_type_cloud_area_fraction','1','area: time: point','area: areacella','Medium Cloud Amount','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus.','longitude latitude time1','clmed','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clmed-AUS2200_A1hr','1hr','atmos','medium_type_cloud_area_fraction','1','area: time: mean','area: areacella','Medium Cloud Amount mean','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus.','longitude latitude time','clmed','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clhigh_Pt-AUS2200_A1hr','1hrPt','atmos','high_type_cloud_area_fraction','1','area: time: point','area: areacella','High Cloud Amount','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time1','clhigh','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clhigh-AUS2200_A1hr','1hr','atmos','medium_type_cloud_area_fraction','1','area: time: mean','area: areacella','High Cloud Amount mean','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time','clhigh','real','','','','','','',''); -INSERT INTO cmorvar VALUES('psl-AUS2200_A1hr','1hr','atmos','air_pressure_at_mean_sea_level','Pa','area: time: mean','area: areacella','Sea Level Pressure','Sea Level Pressure','longitude latitude time','psl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('psl_Pt-AUS2200_A1hr','1hrPt','atmos','air_pressure_at_mean_sea_level','Pa','area: time: point','area: areacella','Sea Level Pressure','Sea Level Pressure','longitude latitude time1','psl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('nflash-AUS2200_A1hr','1hr','atmos','','1','area: time: mean','area: areacella','Number of Lightning Flashes','','longitude latitude time','nflash','real','','','','','','',''); -INSERT INTO cmorvar VALUES('cli-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_cloud_ice_in_air','kg kg-1','area: time: point','area: areacella','Mass Fraction of Cloud Ice','Includes both large-scale and convective cloud. This is calculated as the mass of cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. It includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.','longitude latitude alevel time1','cli','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clw-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_cloud_liquid_water_in_air','kg kg-1','area: time: point','area: areacella','Mass Fraction of Cloud Liquid Water','Includes both large-scale and convective cloud. Calculate as the mass of cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cells. Precipitating hydrometeors are included ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.','longitude latitude alevel time1','clw','real','','','','','','',''); -INSERT INTO cmorvar VALUES('cl-AUS2200_A1hr','1hrPt','atmos','cloud_area_fraction_in_atmosphere_layer','%','area: time: point','area: areacella','Percentage Cloud Cover','Percentage cloud cover, including both large-scale and convective cloud.','longitude latitude alevel time1','cl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clwvol-AUS2200_A1hr','1hrPt','atmos','','1','time: point','area: areacella','Liquid Cloud Volume Fraction in atmosphere layer','Includes both large-scale and convective cloud. This is calculated as the volume of cloud liquid water in the grid cell divided by the volume of the grid cell.','longitude latitude alevel time1','clwvol','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clivol-AUS2200_A1hr','1hrPt','atmos','','1','time: point','area: areacella','Ice Cloud Volume Fraction in atmosphere layer','Includes both large-scale and convective cloud. This is calculated as the volume of cloud ice in the grid cell divided by the volume of the grid cell.','longitude latitude alevel time1','clivol','real','','','','','','',''); -INSERT INTO cmorvar VALUES('rainmxrat-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_liquid_precipitation_in_air','1','area: mean time: point','area: areacella','Mass Fraction of Rain in Air','Rain mixing ratio','longitude latitude alevel time1','rainmxrat','real','','','','','','',''); -INSERT INTO cmorvar VALUES('grplmxrat-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_graupel_in_air','1','area: mean time: point','area: areacella','Graupel Mixing Ratio','Graupel mixing ratio','longitude latitude alevel time1','grplmxrat','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ua-AUS2200_A1hr','1hrPt','atmos','eastward_wind','m s-1','time: point','--OPT','Eastward Wind','Zonal wind (positive in a eastward direction).','longitude latitude alevel time1','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va-AUS2200_A1hr','1hrPt','atmos','northward_wind','m s-1','time: point','--OPT','Northward Wind','Meridional wind (positive in a northward direction).','longitude latitude alevel time1','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tke-AUS2200_A1hr','1hrPt','atmos','kinetic_energy_content_of_atmosphere_layer','J m-2','area: mean time: point','area: areacella','Turbulent Kinetic Energy','','longitude latitude alevel time1','tke','real','','','','','','',''); -INSERT INTO cmorvar VALUES('theta-AUS2200_A1hr','1hrPt','atmos','air_potential_temperature','K','area: mean time: point','area: areacella','Air Potential Temperature','Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure.','longitude latitude alevel time1','theta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hus-AUS2200_A1hr','1hrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude alevel time1','hus','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa-AUS2200_A1hr','1hrPt','atmos','upward_air_velocity','m s-1','area: time: point','area: areacella','Upward Air Velocity','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude alevel time1','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('phalf-AUS2200_A1hr','1hrPt','atmos','air_pressure','Pa','area: time: point','area: areacella','Pressure on Model Half-Levels','Air pressure on model half-levels','longitude latitude alevel time1','phalf','real','','','','','','',''); -INSERT INTO cmorvar VALUES('pfull-AUS2200_A1hr','1hrPt','atmos','air_pressure','Pa','area: mean time: point','area: areacella','Pressure at Model Full-Levels','Air pressure on model levels','longitude latitude alevel time1','pfull','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zfull-AUS2200_A1hr','1hrPt','atmos','height_above_reference_ellipsoid','m','area: mean time: point','area: areacella','Altitude of Model Full-Levels','Height of full model levels above a reference ellipsoid. A reference ellipsoid is a mathematical figure that approximates the geoid. The geoid is a surface of constant geopotential with which mean sea level would coincide if the ocean were at rest. The ellipsoid is an approximation because the geoid is an irregular shape. A number of reference ellipsoids are defined for use in the field of geodesy. To specify which reference ellipsoid is being used, a grid_mapping variable should be attached to the data variable as described in Chapter 5.6 of the CF Convention.','longitude latitude alevel time1','zfull','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zhalf-AUS2200_A1hr','1hrPt','atmos','height_above_reference_ellipsoid','m','area: mean time: point','area: areacella','Altitude of Model Half-Levels','Height of model half-levels above a reference ellipsoid. A reference ellipsoid is a mathematical figure that approximates the geoid. The geoid is a surface of constant geopotential with which mean sea level would coincide if the ocean were at rest. The ellipsoid is an approximation because the geoid is an irregular shape. A number of reference ellipsoids are defined for use in the field of geodesy. To specify which reference ellipsoid is being used, a grid_mapping variable should be attached to the data variable as described in Chapter 5.6 of the CF Convention.','longitude latitude alevhalf time1','zhalf','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta-AUS2200_A1hr','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude alevel time1','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zmla-AUS2200_A1hr','1hr','atmos','atmosphere_boundary_layer_thickness','m','area: time: mean','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time','zmla','real','','','','','','',''); -INSERT INTO cmorvar VALUES('orog-AUS2200_A1hr','1hrPt','land','surface_altitude','m','area: time: point','area: areacella','Surface Altitude','The surface called ''surface'' means the lower boundary of the atmosphere. Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level.','longitude latitude time1','orog','real','','','','','','',''); -INSERT INTO cmorvar VALUES('rsdsdiff-AUS2200_A1hr','1hr','atmos','surface_diffuse_downwelling_shortwave_flux_in_air','W m-2','area: time: mean','area: areacella','Surface Diffuse Downwelling Shortwave Radiation','Surface downwelling solar irradiance from diffuse radiation for UV calculations.','longitude latitude time','rsdsdiff','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('evspsbl-AUS2200_A1hr','1hr','land','water_evapotranspiration_flux','kg m-2 s-1','area: time: mean','area: areacella','Evaporation Including Sublimation and Transpiration','Evaporation at surface (also known as evapotranspiration): flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)','longitude latitude time','evspsbl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('evspsbl_Pt-AUS2200_A1hr','1hrPt','land','water_evapotranspiration_flux','kg m-2 s-1','area: time: point','area: areacella','Evaporation Including Sublimation and Transpiration','Evaporation at surface (also known as evapotranspiration): flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)','longitude latitude time1','evspsbl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('eow-AUS2200_A1hr','1hr','land','surface_water_evaporation_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Open Water Evaporation','Evaporation (conversion of liquid or solid into vapor) from open water. ','longitude latitude time','eow','real','','','','','','',''); -INSERT INTO cmorvar VALUES('estot-AUS2200_A1hr','1hr','land','','kg m-2','area: mean where land time: sum','area: areacella','Bare Soil Evaporation Amount','Water here means water in all phases. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called ''sublimation''.) Sum over timestep (1hr).','longitude latitude time','estot','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tasmin-AUS2200_A1hr','1hr','atmos','air_temperature','K','area: mean time: minimum','area: areacella','Hourly Minimum Near-Surface Air Temperature','minimum near-surface (for access 1.5 meter) air temperature (add cell_method attribute ''time: minimum'')','longitude latitude time height1.5m','tasmin','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tasmax-AUS2200_A1hr','1hr','atmos','air_temperature','K','area: mean time: maximum','area: areacella','Hourly Maximum Near-Surface Air Temperature','maximum near-surface (for access 1.5 meter) air temperature (add cell_method attribute ''time: maximum`'')','longitude latitude time height1.5m','tasmax','real','','','','','','',''); -INSERT INTO cmorvar VALUES('huss-AUS2200_A1hr','1hr','atmos','specific_humidity','1','area: mean time: mean','area: areacella','Near-Surface Specific Humidity','Near-surface (for access 1.5 meter) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tauu-AUS2200_A1hr','1hr','atmos','surface_downward_eastward_stress','Pa','area: time: mean','area: areacella','Surface Downward Eastward Wind Stress','Downward eastward wind stress at the surface','longitude latitude time','tauu','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('tauu_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downward_eastward_stress','Pa','area: time: point','area: areacella','Surface Downward Eastward Wind Stress','Downward eastward wind stress at the surface','longitude latitude time1','tauu','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('tauv-AUS2200_A1hr','1hr','atmos','surface_downward_northward_stress','Pa','area: time: mean','area: areacella','Surface Downward Northward Wind Stress','Downward northward wind stress at the surface','longitude latitude time','tauv','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('tauv_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downward_northward_stress','Pa','area: time: point','area: areacella','Surface Downward Northward Wind Stress','Downward northward wind stress at the surface','longitude latitude time1','tauv','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('wsgmax10m-AUS2200_A1hr','1hr','atmos','wind_speed_of_gust','m s-1','area: mean time: maximum','area: areacella','Maximum Wind Speed of Gust at 10m','Wind speed gust maximum at 10m above surface','longitude latitude time height10m','wsgmax10m','real','','','','','','',''); -INSERT INTO cmorvar VALUES('cw-AUS2200_A1hr','1hrPt','land','canopy_water_amount','kg m-2','area: mean where land time: point','area: areacella','Total Canopy Water Storage','''Amount'' means mass per unit area. ''Water'' means water in all phases, including frozen i.e. ice and snow. ''Canopy'' means the plant or vegetation canopy. The canopy water is the water on the canopy.','longitude latitude time1','cw','real','','','','','','',''); -INSERT INTO cmorvar VALUES('sifllatstop-AUS2200_A1hr','1hrPt','seaIce','surface_upward_latent_heat_flux','W m-2','area: time: point','area: areacella','Net Latent Heat Flux over Sea Ice','the net latent heat flux over sea ice where sea_ice (mask=siconca)','longitude latitude time1','sifllatstop','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('mrso-AUS2200_A1hr','1hrPt','land','mass_content_of_water_in_soil','kg m-2','area: mean where land time: point','area: areacella','Total Soil Moisture Content','the mass per unit area (summed over all soil layers) of water in all phases.','longitude latitude time1','mrso','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mrsos-AUS2200_A1hr','1hrPt','land','mass_content_of_water_in_soil_layer','kg m-2','area: mean where land time: point','area: areacella','Moisture in Upper Portion of Soil Column','The mass of water in all phases in the upper 10cm of the soil layer.','longitude latitude time1 sdepth1','mrsos','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ps-AUS2200_A1hr','1hrPt','atmos','surface_air_pressure','Pa','area: mean time: point','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time1','ps','real','','','','','','',''); -INSERT INTO cmorvar VALUES('refl-AUS2200_A1hr','1hrPt','atmos','','dBZ','area: mean time: point','area: areacella','Radar Reflectivity in the grid column due to all hydrometeors','','longitude latitude alevel time1','refl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clmxro-AUS2200_A1hr','1hr','atmos','cloud_area_fraction','1','area: time: mean','area: areacella','Cloud Area Fraction assuming maximum random overlap','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time','clmxro','real','','','','','','',''); -INSERT INTO cmorvar VALUES('z0-AUS2200_A1hr','1hrPt','atmos','surface_roughness_length_for_momentum_in_air','m','area: time: point','area: areacella','Surface Roughness Length','','longitude latitude time1','z0','real','','','','','','',''); -INSERT INTO cmorvar VALUES('rsdscs-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_shortwave_flux_in_air_assuming_clear_sky','W m-2','area: time: point','area: areacella','Surface Downwelling Clear-Sky Shortwave Radiation','Surface solar irradiance clear sky for UV calculations','longitude latitude time1','rsdscs','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rldscs-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_longwave_flux_in_air_assuming_clear_sky','W m-2','area: time: point','area: areacella','Surface Downwelling Clear-Sky Longwave Radiation','Surface downwelling clear-sky longwave radiation','longitude latitude time1','rldscs','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rsdsdir-AUS2200_A1hr','1hr','atmos','surface_direct_along_beam_shortwave_flux_in_air','W m-2','area: time: mean','area: areacella','Direct Surface Short Wave Flux : corrected','Corrected','longitude latitude time','rsdsdir','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('ua24-AUS2200_A1hrPlev','1hrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction).','longitude latitude plev24 time1','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va24-AUS2200_A1hrPlev','1hrPt','atmos','northward_wind','m s-1','area: mean time: point','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction).','longitude latitude plev24 time1','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hus24-AUS2200_A1hrPlev','1hrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude plev24 time1','hus','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa24-AUS2200_A1hrPlev','1hrPt','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev24 time1','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta24-AUS2200_A1hrPlev','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude plev24 time1','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ua3-AUS2200_A1hrPlev','1hrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction).','longitude latitude plev3 time1','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va3-AUS2200_A1hrPlev','1hrPt','atmos','northward_wind','m s-1','area: mean time: point','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction).','longitude latitude plev3 time1','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hus3-AUS2200_A1hrPlev','1hrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude plev3 time1','hus','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa3-AUS2200_A1hrPlev','1hrPt','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev3 time','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta3-AUS2200_A1hrPlev','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude plev3 time1','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('refl24-AUS2200_A1hrPlev','1hrPt','atmos','','dBZ','area: mean time: point','area: areacella','Radar Reflectivity in the grid column due to all hydrometeors','','longitude latitude plev24 time1','refl','real','','','','','','',''); -INSERT INTO cmorvar VALUES('theta24-AUS2200_A1hrPlev','1hrPt','atmos','air_potential_temperature','K','area: mean time: point','area: areacella','Air Potential Temperature','Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure.','longitude latitude plev24 time1','theta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zmla-AUS2200_A3hr','3hrPt','atmos','atmosphere_boundary_layer_thickness','m','area: time: point','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time1','zmla','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ps-AUS2200_A3hr','3hrPt','atmos','surface_air_pressure','Pa','area: mean time: point','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time1','ps','real','','','','','','',''); -INSERT INTO cmorvar VALUES('lwp-AUS2200_A3hr','3hrPt','areosol','atmosphere_mass_content_of_cloud_liquid_water','kg m-2','area: time: point','area: areacella','Liquid Water Path','The total mass of liquid water in cloud per unit area.','longitude latitude time1','lwp','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clivi-AUS2200_A3hr','3hrPt','atmos','atmosphere_mass_content_of_cloud_ice','kg m-2','area: time: point','area: areacella','Ice Water Path','mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.','longitude latitude time1','clivi','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prw-AUS2200_A3hr','3hrPt','atmos','atmosphere_mass_content_of_water_vapor','kg m-2','area: time: point','area: areacella','Water Vapor Path','vertically integrated through the atmospheric column','longitude latitude time1','prw','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zg16-AUS2200_A3hr','3hrPt','atmos','geopotential_height','m','area: mean time: point','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev16 time1','zg','real','','','','','','',''); -INSERT INTO cmorvar VALUES('orog-AUS2200_A6hr','6hrPt','land','surface_altitude','m','area: time: point','area: areacella','Surface Altitude','The surface called ''surface'' means the lower boundary of the atmosphere. Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level.','longitude latitude time1','orog','real','','','','','','',''); -INSERT INTO cmorvar VALUES('pralsprof-AUS2200_A6hr','6hr','atmos','stratiform_rainfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Rainfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsprof','real','','','','','','',''); -INSERT INTO cmorvar VALUES('pralsns-AUS2200_A6hr','6hr','atmos','stratiform_snowfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Snowfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsns','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ua16-AUS2200_A6hr','6hrPt','atmos','eastward_wind','m s-1','area: time: point','--OPT','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction).','longitude latitude plev16 time1','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va16-AUS2200_A6hr','6hrPt','atmos','northward_wind','m s-1','area: time: point','--OPT','Northward Wind on pressure levels','Meridional wind (positive in a northward direction).','longitude latitude plev16 time1','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa16-AUS2200_A6hr','6hrPt','atmos','upward_air_velocity','m s-1','area: mean time: point','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev16 time1','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wbptemp7h-AUS2200_A6hr','6hrPt','atmos','wet_bulb_potential_temperature','K','area: mean time: point','area: areacella','Wet Bulb Potential Temperature','Wet bulb potential temperature','longitude latitude plev7h time1','wbptemp','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zg16-AUS2200_A6hr','6hrPt','atmos','geopotential_height','m','area: mean time: point','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev16 time1','zg','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta16-AUS2200_A6hr','6hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature on pressure levels','Air Temperature','longitude latitude plev16 time1','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hur16-AUS2200_A6hr','6hrPt','atmos','relative_humidity','%','area: mean time: point','area: areacella','Relative Humidity on pressure levels','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude plev16 time1','hur','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zg24-AUS2200_A6hr','6hrPt','atmos','geopotential_height','m','area: mean time: point','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev24 time1','zg','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zmla-AUS2200_Aday','day','atmos','atmosphere_boundary_layer_thickness','m','area: time: mean','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time','zmla','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ps-AUS2200_Aday','day','atmos','surface_air_pressure','Pa','area: mean time: mean','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time','ps','real','','','','','','',''); -INSERT INTO cmorvar VALUES('lwp-AUS2200_Aday','day','aerosol','atmosphere_mass_content_of_cloud_liquid_water','kg m-2','area: time: mean','area: areacella','Liquid Water Path','The total mass of liquid water in cloud per unit area.','longitude latitude time','lwp','real','','','','','','',''); -INSERT INTO cmorvar VALUES('clivi-AUS2200_Aday','day','atmos','atmosphere_mass_content_of_cloud_ice','kg m-2','area: time: mean','area: areacella','Ice Water Path','mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.','longitude latitude time','clivi','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prw-AUS2200_Aday','day','atmos','atmosphere_mass_content_of_water_vapor','kg m-2','area: time: mean','area: areacella','Water Vapor Path','vertically integrated through the atmospheric column','longitude latitude time','prw','real','','','','','','',''); -INSERT INTO cmorvar VALUES('lmask-AUS2200_fx','fx','land','land_binary_mask','%','area: mean','area: areacella','Indicates if cell grid is Land (1) or sea (0)','1 = land, 0 = sea','longitude latitude','lmask','integer','','','','','','',''); -INSERT INTO cmorvar VALUES('huss-CM2_3hr','3hrPt','atmos','specific_humidity','1','area: time: point','area: areacella','Near-Surface Specific Humidity (1.5m)','Near-surface (1.5 m) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hurs-CM2_3hr','3hrPt','atmos','relative_humidity','%','area: mean time: point','area: areacella','Near-Surface Relative Humidity (1.5m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time1 height1.5m','hurs','real','','','','','','',''); -INSERT INTO cmorvar VALUES('rls-CM2_3hr','3hr','atmos','surface_net_downward_longwave_flux','W m-2','area: time: mean','area: areacella','Net Longwave Surface Radiation','Net longwave surface radiation','longitude latitude time','rls','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rss-CM2_3hr','3hr','atmos','surface_net_downward_shortwave_flux','W m-2','area: time: mean','area: areacella','Net Shortwave Surface Radiation','Net downward shortwave radiation at the surface','longitude latitude time','rss','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('tas-CM2_3hr','3hrPt','atmos','air_temperature','K','area: time: point','area: areacella','Near-Surface Air Temperature (1.5m)','near-surface (1.5m) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ua19-CM2_6hr','6hrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Wind','Zonal wind (positive in a eastward direction).','longitude latitude plev19 time1','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va19-CM2_6hr','6hrPt','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction). Defined on uv grid','longitude latitude plev19 time','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zg19-CM2_6hr','6hrPt','atmos','geopotential_height','m','time: point','area: areacella','Geopotential Height','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev19 time','zg','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tos-CM2_6hr','6hrPt','ocean','sea_surface_temperature','degC','area: mean where sea time: point','area: areacello','Sea Surface Temperature','Temperature of upper boundary of the liquid ocean, including temperatures below sea-ice and floating ice shelves.','longitude latitude time1','tos','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta19-CM2_6hr','6hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude plev19 time1','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prrsn-CM2_day','day','atmos','mass_fraction_of_rainfall_falling_onto_surface_snow','1','area: mean where land time: mean','area: areacella','Fraction of Rainfall on Snow','The fraction of the grid averaged rainfall which falls on the snow pack','longitude latitude time','prrsn','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prsnc-CM2_day','day','atmos','convective_snowfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Convective Snowfall Flux','convective precipitation of all forms of water in the solid phase.','longitude latitude time','prsnc','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prra-CM2_day','day','atmos','rainfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Rainfall Flux over Land','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','prra','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prsnsn-CM2_day','day','atmos','mass_fraction_of_solid_precipitation_falling_onto_surface_snow','1','area: mean where land time: mean','area: areacella','Fraction of Snowfall (Including Hail and Graupel) on Snow','The fraction of the snowfall which falls on the snow pack','longitude latitude time','prsnsn','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mrrob-CM2_day','day','land','subsurface_runoff_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Subsurface Runoff','Runoff is the liquid water which drains from land. If not specified, ''runoff'' refers to the sum of surface runoff and subsurface drainage. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','mrrob','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mrlqso-CM2_day','day','land','mass_fraction_of_unfrozen_water_in_soil_moisture','1','area: mean where land time: mean','area: areacella','Average Layer Fraction of Liquid Moisture','Fraction of soil moisture mass in the liquid phase in each user-defined soil layer (3D variable)','longitude latitude sdepth time','mrlqso','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hurs-CM2_day','day','atmos','relative_humidity','%','area: time: mean','area: areacella','Near-Surface Relative Humidity (1.5 m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hurs','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hursmax-CM2_day','day','atmos','relative_humidity','%','area: mean time: maximum','area: areacella','Daily Maximum Near-Surface Relative Humidity (1.5m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hursmax','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hursmin-CM2_day','day','atmos','relative_humidity','%','area: mean time: minimum','area: areacella','Daily Minimum Near-Surface Relative Humidity (1.5m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hursmin','real','','','','','','',''); -INSERT INTO cmorvar VALUES('huss-CM2_day','day','atmos','specific_humidity','1','area: time: mean','area: areacella','Near-Surface Specific Humidity (1.5m)','Near-surface (1.5 m) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tas-CM2_day','day','atmos','air_temperature','K','area: time: mean','area: areacella','Near-Surface Air Temperature (1.5m)','near-surface (1.5m) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tasmax-CM2_day','day','atmos','air_temperature','K','area: mean time: maximum','area: areacella','Daily Maximum Near-Surface Air Temperature (1.5m)','maximum near-surface (1.5m) air temperature (add cell_method attribute ''time: max'')','longitude latitude time height1.5m','tasmax','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tasmin-CM2_day','day','atmos','air_temperature','K','area: mean time: minimum','area: areacella','Daily Minimum Near-Surface Air Temperature (1.5m)','minimum near-surface (1.5m) air temperature (add cell_method attribute ''time: min'')','longitude latitude time height1.5m','tasmin','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mlotst-CM2_day','day','ocean','ocean_mixed_layer_thickness_defined_by_sigma_t','m','area: mean where sea time: mean','area: areacello','Ocean Mixed Layer Thickness Defined by Sigma T','Sigma T is potential density referenced to ocean surface.','longitude latitude time','mlotst','real','','','','','','',''); -INSERT INTO cmorvar VALUES('uo-CM2_day','day','ocean','sea_water_x_velocity','m s-1','time: mean','--OPT','Sea Water X Velocity','Prognostic x-ward velocity component resolved by the model.','longitude latitude olevel time','uo','real','','','','','','',''); -INSERT INTO cmorvar VALUES('vo-CM2_day','day','ocean','sea_water_y_velocity','m s-1','time: mean','--OPT','Sea Water Y Velocity','Prognostic y-ward velocity component resolved by the model.','longitude latitude olevel time','vo','real','','','','','','',''); -INSERT INTO cmorvar VALUES('so-CM2_day','day','ocean','sea_water_salinity','0.001','area: mean where sea time: mean','area: areacello volume: volcello','Sea Water Salinity','Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term ''salinity'' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. ','longitude latitude olevel time','so','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wo-CM2_day','day','ocean','upward_sea_water_velocity','m s-1','time: mean','--OPT','Sea Water Vertical Velocity','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward).','longitude latitude olevel time','wo','real','','','','','','',''); -INSERT INTO cmorvar VALUES('thetao-CM2_day','day','ocean','sea_water_potential_temperature','degC','area: mean where sea time: mean','area: areacello volume: volcello','Sea Water Potential Temperature','Diagnostic should be contributed even for models using conservative temperature as prognostic field.','longitude latitude olevel time','thetao','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hur19-CM2_day','day','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude plev19 time','hur','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prrc-CM2_mon','mon','atmos','convective_rainfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Convective Rainfall Rate','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','prrc','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prra-CM2_mon','mon','atmos','rainfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Rainfall Flux over Land','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','prra','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prsnc-CM2_mon','mon','atmos','convective_snowfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Convective Snowfall Flux','convective precipitation of all forms of water in the solid phase.','longitude latitude time','prsnc','real','','','','','','',''); -INSERT INTO cmorvar VALUES('eow-CM2_mon','mon','land','surface_water_evaporation_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Open Water Evaporation','Evaporation (conversion of liquid or solid into vapor) from open water. ','longitude latitude time','eow','real','','','','','','',''); -INSERT INTO cmorvar VALUES('pfull-CM2_mon','mon','atmos','air_pressure','Pa','area: mean time: mean','area: areacella','Pressure at Model Full-Levels','Air pressure on model levels','longitude latitude alevel time','pfull','real','','','','','','',''); -INSERT INTO cmorvar VALUES('theta-CM2_mon','mon','atmos','air_potential_temperature','K','area: mean time: mean','area: areacella','Air Potential Temperature','Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure.','longitude latitude alevel time','theta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hfssuo-CM2_mon','mon','atmos','surface_upward_sensible_heat_flux','W m-2','area: mean where ice_free_sea over sea time: mean','area: areacella','Net Upward Sensible Heat Flux over Open Sea','the net sensible heat flux over open sea','longitude latitude time','hfssuo','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('rssntds-CM2_mon','mon','ocean','surface_net_downward_shortwave_flux','W m-2','area: mean where ice_free_sea over sea time: mean','area: areacello','Net Downward Shortwave Radiation where open sea','This is defined as ''where ice_free_sea over sea''','longitude latitude time','rssntds','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('rlntds-CM2_mon','mon','ocean','surface_net_downward_longwave_flux','W m-2','area: mean where ice_free_sea over sea time: mean','area: areacello','Surface Net Downward Longwave Radiation','This is defined as ''where ice_free_sea over sea''','longitude latitude time','rlntds','real','down','','','','','',''); -INSERT INTO cmorvar VALUES('evspsblvegLut-CM2_mon','mon','land','water_evaporation_flux_from_canopy','kg m-2 s-1','area: time: mean where sector','area: areacella','Evaporation from Canopy over Land-Use tiles','The canopy evaporation and sublimation (if present in model); may include dew formation as a negative flux.','longitude latitude landUse time','evspsblvegLut','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mrfsofr-CM2_mon','mon','land','mass_fraction_of_frozen_water_in_soil_moisture','1','area: mean where land time: mean','area: areacella','Average Layer Fraction of Frozen Moisture','Fraction of soil moisture mass in the solid phase in each user-defined soil layer (3D variable)','longitude latitude sdepth time','mrfsofr','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prlsprof-CM2_mon','mon','atmos','stratiform_rainfall_flux','kg m-2 s-1','area: mean time: mean','area: areacella','Stratiform Rainfall Flux','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud.','longitude latitude time','prlsprof','real','','','','','','',''); -INSERT INTO cmorvar VALUES('prlsns-CM2_mon','mon','atmos','stratiform_snowfall_flux','kg m-2 s-1','area: mean time: mean','area: areacella','Stratiform Snowfall Flux','large-scale precipitation of all forms of water in the solid phase.','longitude latitude time','prlsns','real','','','','','','',''); -INSERT INTO cmorvar VALUES('cw-CM2_mon','mon','land','canopy_water_amount','kg m-2','area: mean where land time: mean','area: areacella','Total Canopy Water Storage','''Amount'' means mass per unit area. ''Water'' means water in all phases, including frozen i.e. ice and snow. ''Canopy'' means the plant or vegetation canopy. The canopy water is the water on the canopy.','longitude latitude time','cw','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa19-CM2_mon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev19 time','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wa19uvgrid-CM2_mon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention. Defined on uv grid','longitude latitude plev19 time','wa','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ua19uvgrid-CM2_mon','mon','atmos','eastward_wind','m s-1','time: mean','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction). Defined on uv grid','longitude latitude plev19 time','ua','real','','','','','','',''); -INSERT INTO cmorvar VALUES('va19uvgrid-CM2_mon','mon','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction). Defined on uv grid','longitude latitude plev19 time','va','real','','','','','','',''); -INSERT INTO cmorvar VALUES('ta19uvgrid-CM2_mon','mon','atmos','air_temperature','K','time: mean','area: areacella','Air Temperature on pressure levels','Air Temperature. Defined on uv grid','longitude latitude plev19 time','ta','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hur19uvgrid-CM2_mon','mon','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity on pressure levels','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C. Defined on uv grid','longitude latitude plev19 time','hur','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hus19uvgrid-CM2_mon','mon','atmos','specific_humidity','%','time: mean','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air. Defined on uv grid','longitude latitude plev19 time','hur','real','','','','','','',''); -INSERT INTO cmorvar VALUES('wap19uvgrid-CM2_mon','mon','atmos','lagrangian_tendency_of_air_pressure','Pa s-1','time: mean','area: areacella','Omega (=dp/dt) on pressure levels','Omega (vertical velocity in pressure coordinates, positive downwards). Defined on uv grid','longitude latitude plev19 time','wap','real','','','','','','',''); -INSERT INTO cmorvar VALUES('zg19uvgrid-CM2_mon','mon','atmos','geopotential_height','m','time: mean','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface. Defined on uv grid','longitude latitude plev19 time','zg','real','','','','','','',''); -INSERT INTO cmorvar VALUES('amdry-CM2_mon','mon','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column dry mass of air','vertically integrated through the atmospheric column','longitude latitude time','amdry','real','','','','','','',''); -INSERT INTO cmorvar VALUES('amwet-CM2_mon','mon','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column wet mass of air','vertically integrated through the atmospheric column','longitude latitude time','amwet','real','','','','','','',''); -INSERT INTO cmorvar VALUES('hurs-CM2_mon','mon','atmos','relative_humidity','%','area: time: mean','area: areacella','Near-Surface Relative Humidity (1.5 m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hurs','real','','','','','','',''); -INSERT INTO cmorvar VALUES('huss-CM2_mon','mon','atmos','specific_humidity','1','area: time: mean','area: areacella','Near-Surface Specific Humidity (1.5m)','Near-surface (1.5 m) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); -INSERT INTO cmorvar VALUES('mc-CM2_mon','mon','atmos','atmosphere_net_upward_convective_mass_flux','kg m-2 s-1','area: time: mean','area: areacella','Convective Mass Flux','The net mass flux should represent the difference between the updraft and downdraft components. The flux is computed as the mass divided by the area of the grid cell.','longitude latitude alevel time','mc','real','up','','','','','',''); -INSERT INTO cmorvar VALUES('tas-CM2_mon','mon','atmos','air_temperature','K','area: time: mean','area: areacella','Near-Surface Air Temperature (1.5m)','near-surface (1.5m) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); -INSERT INTO cmorvar VALUES('advectsweby-CM2_mon','mon','ocean','','W m-2','area: mean time: mean','area: areacello','Advect tendency from Sweby tracer advection scheme','This is defined as cp*rho*dzt*sweby advect tendency','longitude latitude olevel time','advectsweby','real','','','','','','',''); -INSERT INTO cmorvar VALUES('tendkpp-CM2_mon','mon','ocean','','W m-2','area: mean time: mean','area: areacello','non-local tendency arising from the KPP boundary layer parameterization','This is defined as cp*rho*dzt*nonlocal tendency from KPP','longitude latitude olevel time','tendkpp','real','','','','','','',''); -INSERT INTO cmorvar VALUES('omldamax-CM2_mon','mon','ocean','ocean_mixed_layer_thickness_defined_by_mixing_scheme','m','area: mean time: maximum','area: areacello','Mean Monthly Maximum Ocean Mixed Layer Thickness Defined by Mixing Scheme','The ocean mixed layer is the upper part of the ocean, regarded as being well-mixed. The base of the mixed layer defined by the mixing scheme is a diagnostic of ocean models. ''Thickness'' means the vertical extent of a layer.','longitude latitude time','omldamax','real','','','','','','',''); -INSERT INTO cmorvar VALUES('difvho-CM2_mon','mon','ocean','ocean_vertical_heat_diffusivity','m2 s-1','area: mean time: mean','area: areacello volume: volcello','Ocean Vertical Heat Diffusivity','Vertical/dianeutral diffusivity applied to prognostic temperature field.','longitude latitude olevel time','difvho','real','','','','','','',''); -INSERT INTO cmorvar VALUES('rho0-CM2_mon','mon','ocean','sea_water_potential_density','kg m-3','area: mean time: mean','area: areacello volume: volcello','Potential Density referenced to 0 dbar','','longitude latitude olevel time','rho0','real','','','','','','',''); INSERT INTO cmorvar VALUES('clt-CMIP6_3hr','3hr','atmos','cloud_area_fraction','%','area: time: mean','area: areacella','Total Cloud Cover Percentage','Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Includes both large-scale and convective cloud.','longitude latitude time','clt','real','','','','','','',''); INSERT INTO cmorvar VALUES('hfls-CMIP6_3hr','3hr','atmos','surface_upward_latent_heat_flux','W m-2','area: time: mean','area: areacella','Surface Upward Latent Heat Flux','The surface called ''surface'' means the lower boundary of the atmosphere. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','hfls','real','up','','','','','',''); INSERT INTO cmorvar VALUES('hfss-CMIP6_3hr','3hr','atmos','surface_upward_sensible_heat_flux','W m-2','area: time: mean','area: areacella','Surface Upward Sensible Heat Flux','The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.','longitude latitude time','hfss','real','up','','','','','',''); @@ -2318,10 +2082,246 @@ INSERT INTO cmorvar VALUES('sndmasssnf-CMIP6_SImon','mon','seaIce','snowfall_flu INSERT INTO cmorvar VALUES('sndmasssubl-CMIP6_SImon','mon','seaIce','tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice','kg m-2 s-1','area: time: mean where sea_ice (comment: mask=siconc)','area: areacello','Snow Mass Rate of Change Through Evaporation or Sublimation','the rate of change of snow mass through sublimation and evaporation divided by sea-ice area','longitude latitude time','sndmasssubl','real','','','','','','',''); INSERT INTO cmorvar VALUES('sndmasswindrif-CMIP6_SImon','mon','seaIce','tendency_of_surface_snow_amount_due_to_drifting_into_sea','kg m-2 s-1','area: time: mean where sea_ice (comment: mask=siconc)','area: areacello','Snow Mass Rate of Change Through Wind Drift of Snow','the rate of change of snow mass through wind drift of snow (from sea-ice into the sea) divided by sea-ice area','longitude latitude time','sndmasswindrif','real','','','','','','',''); INSERT INTO cmorvar VALUES('snmassacrossline-CMIP6_SImon','mon','seaIce','snow_transport_across_line_due_to_sea_ice_dynamics','kg s-1','time: mean','','Snow Mass Flux Through Straits','net (sum of transport in all directions) sea ice area transport through the following four passages, positive into the Arctic Ocean 1. Fram Strait = (11.5W,81.3N to (10.5E,79.6N) 2. Canadian Archipelago = (128.2W,70.6N) to (59.3W,82.1N) 3. Barents opening = (16.8E,76.5N) to (19.2E,70.2N) 4. Bering Strait = (171W,66.2N) to (166W,65N)','siline time','snmassacrossline','real','','','','','','',''); +INSERT INTO cmorvar VALUES('huslev1-AUS2200_A10min','subhrPt','atmos','surface_specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude time1','hus','real','','','','','','',''); +INSERT INTO cmorvar VALUES('evspsblpot-AUS2200_A10min','subhrPt','land','water_potential_evaporation_flux','kg m-2 s-1','area: mean where land time: point','area: areacella','Potential Evapotranspiration','at surface; potential flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)','longitude latitude time1','evspsblpot','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ts-AUS2200_A10min','subhrPt','atmos','surface_temperature','K','area: mean time: point','area: areacella','Surface Temperature','Temperature of the lower boundary of the atmosphere','longitude latitude time1','ts','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zmla-AUS2200_A10min','subhrPt','atmos','atmosphere_boundary_layer_thickness','m','area: time: point','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time1','zmla','real','','','','','','',''); +INSERT INTO cmorvar VALUES('pslev1-AUS2200_A10min','subhrPt','atmos','air_pressure','Pa','area: mean time: point','area: areacella','Pressure at Model bottom level','Air pressure on model level 1','longitude latitude alevel1 time1','pslev1','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ps-AUS2200_A10min','subhrPt','atmos','surface_air_pressure','Pa','area: mean time: point','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time1','ps','real','','','','','','',''); +INSERT INTO cmorvar VALUES('uas-AUS2200_A10min','subhrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Near-Surface Wind','Eastward component of the near-surface (usually, 10 meters) wind','longitude latitude time1 height10m','uas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('vas-AUS2200_A10min','subhrPt','atmos','northward_wind','m s-1','area: mean time: point','area: areacella','Northward Near-Surface Wind','Northward component of the near surface wind','longitude latitude time1 height10m','vas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tas-AUS2200_A10min','subhrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Near-Surface Air Temperature','near-surface (for access 1.5 meter) air temperature','longitude latitude time1 height1.5m','tas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('huss-AUS2200_A10min','subhrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Near-Surface Specific Humidity','Near-surface (for access 1.5 meter) specific humidity.','longitude latitude time1 height1.5m','huss','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tdps-AUS2200_A10min','subhrPt','atmos','dew_point_temperature','K','area: time: point','area: areacella','1.5m Dewpoint Temperature','Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity.','longitude latitude height1.5m time1','tdps','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wsgmax10m-AUS2200_A10min','subhrPt','atmos','wind_speed_of_gust','m s-1','area: mean time: point','area: areacella','Maximum Wind Speed of Gust at 10m','Wind speed gust maximum at 10m above surface','longitude latitude time1 height10m','wsgmax10m','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wsgmax10m_max-AUS2200_A10min','subhr','atmos','wind_speed_of_gust','m s-1','area: mean time: maximum','area: areacella','Maximum Wind Speed of Gust at 10m','Wind speed gust maximum at 10m above surface','longitude latitude time height10m','wsgmax10m','real','','','','','','',''); +INSERT INTO cmorvar VALUES('reflmax-AUS2200_A10min','subhrPt','atmos','','dBZ','area: mean time: point','area: areacella','Maximum Radar Reflectivity in the grid column due to all hydrometeors','','longitude latitude time1','reflmax','real','','','','','','',''); +INSERT INTO cmorvar VALUES('pralsprof-AUS2200_A10min','subhr','atmos','stratiform_rainfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Rainfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsprof','real','','','','','','',''); +INSERT INTO cmorvar VALUES('pralsns-AUS2200_A10min','subhr','atmos','stratiform_snowfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Snowfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsns','real','','','','','','',''); +INSERT INTO cmorvar VALUES('cllow-AUS2200_A10min','subhrPt','atmos','low_type_cloud_area_fraction','1','area: time: point','area: areacella','Low Cloud Amount over column','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus.','longitude latitude time1','cllow','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clmed-AUS2200_A10min','subhrPt','atmos','medium_type_cloud_area_fraction','1','area: time: point','area: areacella','Medium Cloud Amount over column','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus.','longitude latitude time1','clmed','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clhigh-AUS2200_A10min','subhrPt','atmos','high_type_cloud_area_fraction','1','area: time: point','area: areacella','High Cloud Amount over column','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time1','clhigh','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clmxro-AUS2200_A10min','subhrPt','atmos','cloud_area_fraction','1','area: time: point','area: areacella','Cloud Area Fraction assuming maximum random overlap','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time1','clmxro','real','','','','','','',''); +INSERT INTO cmorvar VALUES('psl-AUS2200_A10min','subhrPt','atmos','air_pressure_at_mean_sea_level','Pa','area: time: point','area: areacella','Sea Level Pressure','Sea Level Pressure','longitude latitude time1','psl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('flashrate-AUS2200_A10min','subhrPt','atmos','frequency_of_lightning_flashes_per_unit_area','km-2 s-1','area: time: point','area: areacella','Lightning Flash Rate','units to be interpreted as counts km-2 s-1','longitude latitude time1','flashrate','real','','','','','','',''); +INSERT INTO cmorvar VALUES('storm-AUS2200_A10min','subhrPt','atmos','','1','area: time: point','area: areacella','Flag for location of Stormss','','longitude latitude time1','storm','real','','','','','','',''); +INSERT INTO cmorvar VALUES('nflash-AUS2200_A10min','subhr','atmos','','1','area: time: sum','area: areacella','Number of Lightning Flashes','','longitude latitude time','nflash','real','','','','','','',''); +INSERT INTO cmorvar VALUES('lwp-AUS2200_A10min','subhrPt','areosol','atmosphere_mass_content_of_cloud_liquid_water','kg m-2','area: time: point','area: areacella','Liquid Water Path','The total mass of liquid water in cloud per unit area.','longitude latitude time1','lwp','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clivi-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_content_of_cloud_ice','kg m-2','area: time: point','area: areacella','Ice Water Path','mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.','longitude latitude time1','clivi','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prw-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_content_of_water_vapor','kg m-2','area: time: point','area: areacella','Water Vapor Path','vertically integrated through the atmospheric column','longitude latitude time1','prw','real','','','','','','',''); +INSERT INTO cmorvar VALUES('amdry-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column dry mass of air','vertically integrated through the atmospheric column','longitude latitude time1','amdry','real','','','','','','',''); +INSERT INTO cmorvar VALUES('amwet-AUS2200_A10min','subhrPt','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column wet mass of air','vertically integrated through the atmospheric column','longitude latitude time1','amwet','real','','','','','','',''); +INSERT INTO cmorvar VALUES('snw-AUS2200_A1hr','1hrPt','land','surface_snow_amount','kg m-2','area: mean where land time: point','area: areacella','Surface Snow Amount','The mass of surface snow on the land portion of the grid cell divided by the land area in the grid cell; reported as missing where the land fraction is 0; excludes snow on vegetation canopy or on sea ice.','longitude latitude time1','snw','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ts-AUS2200_A1hr','1hrPt','atmos','surface_temperature','K','area: mean time: point','area: areacella','Surface Temperature','Temperature of the lower boundary of the atmosphere','longitude latitude time1','ts','real','','','','','','',''); +INSERT INTO cmorvar VALUES('siconca-AUS2200_A1hr','1hrPt','atmos','sea_ice_area_fraction','%','area: time: point','area: areacella','Sea-Ice Area Percentage (Atmospheric Grid)','Percentage of grid cell covered by sea ice','longitude latitude time1 typesi','siconca','real','','','','','','',''); +INSERT INTO cmorvar VALUES('rss-AUS2200_A1hr','1hr','atmos','surface_net_downward_shortwave_flux','W m-2','area: time: mean','area: areacella','Net Shortwave Surface Radiation','Net downward shortwave radiation at the surface','longitude latitude time','rss','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rss_Pt-AUS2200_A1hr','1hrPt','atmos','surface_net_downward_shortwave_flux','W m-2','area: time: point','area: areacella','Net Shortwave Surface Radiation','Net downward shortwave radiation at the surface','longitude latitude time1','rss','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rlut-AUS2200_A1hr','1hr','atmos','toa_outgoing_longwave_flux','W m-2','area: time: mean','area: areacella','TOA Outgoing Longwave Radiation','at the top of the atmosphere (to be compared with satellite measurements)','longitude latitude time','rlut','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('rlut_Pt-AUS2200_A1hr','1hrPt','atmos','toa_outgoing_longwave_flux','W m-2','area: time: point','area: areacella','TOA Outgoing Longwave Radiation','at the top of the atmosphere (to be compared with satellite measurements)','longitude latitude time1','rlut','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('rsdt-AUS2200_A1hr','1hr','atmos','toa_incoming_shortwave_flux','W m-2','area: time: mean','area: areacella','TOA Incident Shortwave Radiation','Shortwave radiation incident at the top of the atmosphere','longitude latitude time','rsdt','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rsdt_Pt-AUS2200_A1hr','1hrPt','atmos','toa_incoming_shortwave_flux','W m-2','area: time: point','area: areacella','TOA Incident Shortwave Radiation','Shortwave radiation incident at the top of the atmosphere','longitude latitude time1','rsdt','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rsut-AUS2200_A1hr','1hr','atmos','toa_outgoing_shortwave_flux','W m-2','area: time: mean','area: areacella','TOA Outgoing Shortwave Radiation','at the top of the atmosphere','longitude latitude time','rsut','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('rsds-AUS2200_A1hr','1hr','atmos','surface_downwelling_shortwave_flux_in_air','W m-2','area: time: mean','area: areacella','Surface Downwelling Shortwave Radiation','Surface solar irradiance for UV calculations.','longitude latitude time','rsds','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rsds_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_shortwave_flux_in_air','W m-2','area: time: point','area: areacella','Surface Downwelling Shortwave Radiation','Surface solar irradiance for UV calculations.','longitude latitude time1','rsds','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rls-AUS2200_A1hr','1hr','atmos','surface_net_downward_longwave_flux','W m-2','area: time: mean','area: areacella','Net Longwave Surface Radiation','Net longwave surface radiation','longitude latitude time','rls','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rls_Pt-AUS2200_A1hr','1hrPt','atmos','surface_net_downward_longwave_flux','W m-2','area: time: point','area: areacella','Net Longwave Surface Radiation','Net longwave surface radiation','longitude latitude time1','rls','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rlds-AUS2200_A1hr','1hr','atmos','surface_downwelling_longwave_flux_in_air','W m-2','area: time: mean','area: areacella','Surface Downwelling Longwave Radiation','The surface called ''surface'' means the lower boundary of the atmosphere. ''longwave'' means longwave radiation. Downwelling radiation is radiation from above. It does not mean ''net downward''. When thought of as being incident on a surface, a radiative flux is sometimes called ''irradiance''. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ''vector irradiance''. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','rlds','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rlds_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_longwave_flux_in_air','W m-2','area: time: point','area: areacella','Surface Downwelling Longwave Radiation','The surface called ''surface'' means the lower boundary of the atmosphere. ''longwave'' means longwave radiation. Downwelling radiation is radiation from above. It does not mean ''net downward''. When thought of as being incident on a surface, a radiative flux is sometimes called ''irradiance''. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ''vector irradiance''. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time1','rlds','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('hfss-AUS2200_A1hr','1hr','atmos','surface_upward_sensible_heat_flux','W m-2','area: time: mean','area: areacella','Surface Upward Sensible Heat Flux','The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.','longitude latitude time','hfss','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('hfss_Pt-AUS2200_A1hr','1hrPt','atmos','surface_upward_sensible_heat_flux','W m-2','area: time: point','area: areacella','Surface Upward Sensible Heat Flux','The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.','longitude latitude time1','hfss','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('uas-AUS2200_A1hr','1hr','atmos','eastward_wind','m s-1','area: mean time: mean','area: areacella','Eastward Near-Surface Wind','Eastward component of the near-surface (usually, 10 meters) wind','longitude latitude time height10m','uas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('vas-AUS2200_A1hr','1hr','atmos','northward_wind','m s-1','area: mean time: mean','area: areacella','Northward Near-Surface Wind','Northward component of the near surface wind','longitude latitude time height10m','vas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hfls-AUS2200_A1hr','1hr','atmos','surface_upward_latent_heat_flux','W m-2','area: time: mean','area: areacella','Surface Upward Latent Heat Flux','The surface called ''surface'' means the lower boundary of the atmosphere. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','hfls','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('hfls_Pt-AUS2200_A1hr','1hrPt','atmos','surface_upward_latent_heat_flux','W m-2','area: time: point','area: areacella','Surface Upward Latent Heat Flux','The surface called ''surface'' means the lower boundary of the atmosphere. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time1','hfls','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('tas-AUS2200_A1hr','1hr','atmos','air_temperature','K','area: mean time: mean','area: areacella','Near-Surface Air Temperature','near-surface (for access 1.5 meters) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tas_Pt-AUS2200_A1hr','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Near-Surface Air Temperature','near-surface (for access 1.5 meters) air temperature','longitude latitude time1 height1.5m','tas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hurs-AUS2200_A1hr','1hr','atmos','relative_humidity','%','area: time: mean','area: areacella','Near-Surface Relative Humidity','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hurs','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tdps-AUS2200_A1hr','1hr','atmos','dew_point_temperature','K','area: time: mean','area: areacella','2m Dewpoint Temperature','Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity.','longitude latitude time','tdps','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prlsprof-AUS2200_A1hr','1hrPt','atmos','stratiform_rainfall_flux','kg m-2 s-1','area: mean time: point','area: areacella','Stratiform Rainfall Flux','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud.','longitude latitude alevel time1','prlsprof','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prlsns-AUS2200_A1hr','1hrPt','atmos','stratiform_snowfall_flux','kg m-2 s-1','area: mean time: point','area: areacella','Stratiform Snowfall Flux','large-scale precipitation of all forms of water in the solid phase.','longitude latitude alevel time1','prlsns','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mrsol-AUS2200_A1hr','1hrPt','land','mass_content_of_water_in_soil_layer','kg m-2','area: mean time: point','area: areacella','Total Water Content of Soil Layer','in each soil layer, the mass of water in all phases, including ice. Reported as ''missing'' for grid cells occupied entirely by ''sea''','longitude latitude sdepth time1','mrsol','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tsl-AUS2200_A1hr','1hrPt','land','soil_temperature','K','area: mean where land time: point','area: areacella','Temperature of Soil','Temperature of soil. Reported as missing for grid cells with no land.','longitude latitude time1 sdepth1','tsl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('cllow_Pt-AUS2200_A1hr','1hrPt','atmos','low_type_cloud_area_fraction','1','area: time: point','area: areacella','Low Cloud Amount','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus.','longitude latitude time1','cllow','real','','','','','','',''); +INSERT INTO cmorvar VALUES('cllow-AUS2200_A1hr','1hr','atmos','low_type_cloud_area_fraction','1','area: time: mean','area: areacella','Low Cloud Amount mean','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus.','longitude latitude time','cllow','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clmed_Pt-AUS2200_A1hr','1hrPt','atmos','medium_type_cloud_area_fraction','1','area: time: point','area: areacella','Medium Cloud Amount','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus.','longitude latitude time1','clmed','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clmed-AUS2200_A1hr','1hr','atmos','medium_type_cloud_area_fraction','1','area: time: mean','area: areacella','Medium Cloud Amount mean','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus.','longitude latitude time','clmed','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clhigh_Pt-AUS2200_A1hr','1hrPt','atmos','high_type_cloud_area_fraction','1','area: time: point','area: areacella','High Cloud Amount','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time1','clhigh','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clhigh-AUS2200_A1hr','1hr','atmos','medium_type_cloud_area_fraction','1','area: time: mean','area: areacella','High Cloud Amount mean','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time','clhigh','real','','','','','','',''); +INSERT INTO cmorvar VALUES('psl-AUS2200_A1hr','1hr','atmos','air_pressure_at_mean_sea_level','Pa','area: time: mean','area: areacella','Sea Level Pressure','Sea Level Pressure','longitude latitude time','psl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('psl_Pt-AUS2200_A1hr','1hrPt','atmos','air_pressure_at_mean_sea_level','Pa','area: time: point','area: areacella','Sea Level Pressure','Sea Level Pressure','longitude latitude time1','psl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('nflash-AUS2200_A1hr','1hr','atmos','','1','area: time: mean','area: areacella','Number of Lightning Flashes','','longitude latitude time','nflash','real','','','','','','',''); +INSERT INTO cmorvar VALUES('cli-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_cloud_ice_in_air','kg kg-1','area: time: point','area: areacella','Mass Fraction of Cloud Ice','Includes both large-scale and convective cloud. This is calculated as the mass of cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. It includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.','longitude latitude alevel time1','cli','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clw-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_cloud_liquid_water_in_air','kg kg-1','area: time: point','area: areacella','Mass Fraction of Cloud Liquid Water','Includes both large-scale and convective cloud. Calculate as the mass of cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cells. Precipitating hydrometeors are included ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.','longitude latitude alevel time1','clw','real','','','','','','',''); +INSERT INTO cmorvar VALUES('cl-AUS2200_A1hr','1hrPt','atmos','cloud_area_fraction_in_atmosphere_layer','%','area: time: point','area: areacella','Percentage Cloud Cover','Percentage cloud cover, including both large-scale and convective cloud.','longitude latitude alevel time1','cl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clwvol-AUS2200_A1hr','1hrPt','atmos','','1','time: point','area: areacella','Liquid Cloud Volume Fraction in atmosphere layer','Includes both large-scale and convective cloud. This is calculated as the volume of cloud liquid water in the grid cell divided by the volume of the grid cell.','longitude latitude alevel time1','clwvol','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clivol-AUS2200_A1hr','1hrPt','atmos','','1','time: point','area: areacella','Ice Cloud Volume Fraction in atmosphere layer','Includes both large-scale and convective cloud. This is calculated as the volume of cloud ice in the grid cell divided by the volume of the grid cell.','longitude latitude alevel time1','clivol','real','','','','','','',''); +INSERT INTO cmorvar VALUES('rainmxrat-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_liquid_precipitation_in_air','1','area: mean time: point','area: areacella','Mass Fraction of Rain in Air','Rain mixing ratio','longitude latitude alevel time1','rainmxrat','real','','','','','','',''); +INSERT INTO cmorvar VALUES('grplmxrat-AUS2200_A1hr','1hrPt','atmos','mass_fraction_of_graupel_in_air','1','area: mean time: point','area: areacella','Graupel Mixing Ratio','Graupel mixing ratio','longitude latitude alevel time1','grplmxrat','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ua-AUS2200_A1hr','1hrPt','atmos','eastward_wind','m s-1','time: point','--OPT','Eastward Wind','Zonal wind (positive in a eastward direction).','longitude latitude alevel time1','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va-AUS2200_A1hr','1hrPt','atmos','northward_wind','m s-1','time: point','--OPT','Northward Wind','Meridional wind (positive in a northward direction).','longitude latitude alevel time1','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tke-AUS2200_A1hr','1hrPt','atmos','kinetic_energy_content_of_atmosphere_layer','J m-2','area: mean time: point','area: areacella','Turbulent Kinetic Energy','','longitude latitude alevel time1','tke','real','','','','','','',''); +INSERT INTO cmorvar VALUES('theta-AUS2200_A1hr','1hrPt','atmos','air_potential_temperature','K','area: mean time: point','area: areacella','Air Potential Temperature','Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure.','longitude latitude alevel time1','theta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hus-AUS2200_A1hr','1hrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude alevel time1','hus','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa-AUS2200_A1hr','1hrPt','atmos','upward_air_velocity','m s-1','area: time: point','area: areacella','Upward Air Velocity','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude alevel time1','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('phalf-AUS2200_A1hr','1hrPt','atmos','air_pressure','Pa','area: time: point','area: areacella','Pressure on Model Half-Levels','Air pressure on model half-levels','longitude latitude alevel time1','phalf','real','','','','','','',''); +INSERT INTO cmorvar VALUES('pfull-AUS2200_A1hr','1hrPt','atmos','air_pressure','Pa','area: mean time: point','area: areacella','Pressure at Model Full-Levels','Air pressure on model levels','longitude latitude alevel time1','pfull','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zfull-AUS2200_A1hr','1hrPt','atmos','height_above_reference_ellipsoid','m','area: mean time: point','area: areacella','Altitude of Model Full-Levels','Height of full model levels above a reference ellipsoid. A reference ellipsoid is a mathematical figure that approximates the geoid. The geoid is a surface of constant geopotential with which mean sea level would coincide if the ocean were at rest. The ellipsoid is an approximation because the geoid is an irregular shape. A number of reference ellipsoids are defined for use in the field of geodesy. To specify which reference ellipsoid is being used, a grid_mapping variable should be attached to the data variable as described in Chapter 5.6 of the CF Convention.','longitude latitude alevel time1','zfull','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zhalf-AUS2200_A1hr','1hrPt','atmos','height_above_reference_ellipsoid','m','area: mean time: point','area: areacella','Altitude of Model Half-Levels','Height of model half-levels above a reference ellipsoid. A reference ellipsoid is a mathematical figure that approximates the geoid. The geoid is a surface of constant geopotential with which mean sea level would coincide if the ocean were at rest. The ellipsoid is an approximation because the geoid is an irregular shape. A number of reference ellipsoids are defined for use in the field of geodesy. To specify which reference ellipsoid is being used, a grid_mapping variable should be attached to the data variable as described in Chapter 5.6 of the CF Convention.','longitude latitude alevhalf time1','zhalf','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta-AUS2200_A1hr','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude alevel time1','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zmla-AUS2200_A1hr','1hr','atmos','atmosphere_boundary_layer_thickness','m','area: time: mean','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time','zmla','real','','','','','','',''); +INSERT INTO cmorvar VALUES('orog-AUS2200_A1hr','1hrPt','land','surface_altitude','m','area: time: point','area: areacella','Surface Altitude','The surface called ''surface'' means the lower boundary of the atmosphere. Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level.','longitude latitude time1','orog','real','','','','','','',''); +INSERT INTO cmorvar VALUES('rsdsdiff-AUS2200_A1hr','1hr','atmos','surface_diffuse_downwelling_shortwave_flux_in_air','W m-2','area: time: mean','area: areacella','Surface Diffuse Downwelling Shortwave Radiation','Surface downwelling solar irradiance from diffuse radiation for UV calculations.','longitude latitude time','rsdsdiff','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('evspsbl-AUS2200_A1hr','1hr','land','water_evapotranspiration_flux','kg m-2 s-1','area: time: mean','area: areacella','Evaporation Including Sublimation and Transpiration','Evaporation at surface (also known as evapotranspiration): flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)','longitude latitude time','evspsbl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('evspsbl_Pt-AUS2200_A1hr','1hrPt','land','water_evapotranspiration_flux','kg m-2 s-1','area: time: point','area: areacella','Evaporation Including Sublimation and Transpiration','Evaporation at surface (also known as evapotranspiration): flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)','longitude latitude time1','evspsbl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('eow-AUS2200_A1hr','1hr','land','surface_water_evaporation_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Open Water Evaporation','Evaporation (conversion of liquid or solid into vapor) from open water. ','longitude latitude time','eow','real','','','','','','',''); +INSERT INTO cmorvar VALUES('estot-AUS2200_A1hr','1hr','land','','kg m-2','area: mean where land time: sum','area: areacella','Bare Soil Evaporation Amount','Water here means water in all phases. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called ''sublimation''.) Sum over timestep (1hr).','longitude latitude time','estot','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tasmin-AUS2200_A1hr','1hr','atmos','air_temperature','K','area: mean time: minimum','area: areacella','Hourly Minimum Near-Surface Air Temperature','minimum near-surface (for access 1.5 meter) air temperature (add cell_method attribute ''time: minimum'')','longitude latitude time height1.5m','tasmin','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tasmax-AUS2200_A1hr','1hr','atmos','air_temperature','K','area: mean time: maximum','area: areacella','Hourly Maximum Near-Surface Air Temperature','maximum near-surface (for access 1.5 meter) air temperature (add cell_method attribute ''time: maximum`'')','longitude latitude time height1.5m','tasmax','real','','','','','','',''); +INSERT INTO cmorvar VALUES('huss-AUS2200_A1hr','1hr','atmos','specific_humidity','1','area: mean time: mean','area: areacella','Near-Surface Specific Humidity','Near-surface (for access 1.5 meter) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tauu-AUS2200_A1hr','1hr','atmos','surface_downward_eastward_stress','Pa','area: time: mean','area: areacella','Surface Downward Eastward Wind Stress','Downward eastward wind stress at the surface','longitude latitude time','tauu','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('tauu_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downward_eastward_stress','Pa','area: time: point','area: areacella','Surface Downward Eastward Wind Stress','Downward eastward wind stress at the surface','longitude latitude time1','tauu','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('tauv-AUS2200_A1hr','1hr','atmos','surface_downward_northward_stress','Pa','area: time: mean','area: areacella','Surface Downward Northward Wind Stress','Downward northward wind stress at the surface','longitude latitude time','tauv','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('tauv_Pt-AUS2200_A1hr','1hrPt','atmos','surface_downward_northward_stress','Pa','area: time: point','area: areacella','Surface Downward Northward Wind Stress','Downward northward wind stress at the surface','longitude latitude time1','tauv','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('wsgmax10m-AUS2200_A1hr','1hr','atmos','wind_speed_of_gust','m s-1','area: mean time: maximum','area: areacella','Maximum Wind Speed of Gust at 10m','Wind speed gust maximum at 10m above surface','longitude latitude time height10m','wsgmax10m','real','','','','','','',''); +INSERT INTO cmorvar VALUES('cw-AUS2200_A1hr','1hrPt','land','canopy_water_amount','kg m-2','area: mean where land time: point','area: areacella','Total Canopy Water Storage','''Amount'' means mass per unit area. ''Water'' means water in all phases, including frozen i.e. ice and snow. ''Canopy'' means the plant or vegetation canopy. The canopy water is the water on the canopy.','longitude latitude time1','cw','real','','','','','','',''); +INSERT INTO cmorvar VALUES('sifllatstop-AUS2200_A1hr','1hrPt','seaIce','surface_upward_latent_heat_flux','W m-2','area: time: point','area: areacella','Net Latent Heat Flux over Sea Ice','the net latent heat flux over sea ice where sea_ice (mask=siconca)','longitude latitude time1','sifllatstop','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('mrso-AUS2200_A1hr','1hrPt','land','mass_content_of_water_in_soil','kg m-2','area: mean where land time: point','area: areacella','Total Soil Moisture Content','the mass per unit area (summed over all soil layers) of water in all phases.','longitude latitude time1','mrso','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mrsos-AUS2200_A1hr','1hrPt','land','mass_content_of_water_in_soil_layer','kg m-2','area: mean where land time: point','area: areacella','Moisture in Upper Portion of Soil Column','The mass of water in all phases in the upper 10cm of the soil layer.','longitude latitude time1 sdepth1','mrsos','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ps-AUS2200_A1hr','1hrPt','atmos','surface_air_pressure','Pa','area: mean time: point','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time1','ps','real','','','','','','',''); +INSERT INTO cmorvar VALUES('refl-AUS2200_A1hr','1hrPt','atmos','','dBZ','area: mean time: point','area: areacella','Radar Reflectivity in the grid column due to all hydrometeors','','longitude latitude alevel time1','refl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clmxro-AUS2200_A1hr','1hr','atmos','cloud_area_fraction','1','area: time: mean','area: areacella','Cloud Area Fraction assuming maximum random overlap','Area fraction is the fraction of a grid cell''s horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus.','longitude latitude time','clmxro','real','','','','','','',''); +INSERT INTO cmorvar VALUES('z0-AUS2200_A1hr','1hrPt','atmos','surface_roughness_length_for_momentum_in_air','m','area: time: point','area: areacella','Surface Roughness Length','','longitude latitude time1','z0','real','','','','','','',''); +INSERT INTO cmorvar VALUES('rsdscs-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_shortwave_flux_in_air_assuming_clear_sky','W m-2','area: time: point','area: areacella','Surface Downwelling Clear-Sky Shortwave Radiation','Surface solar irradiance clear sky for UV calculations','longitude latitude time1','rsdscs','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rldscs-AUS2200_A1hr','1hrPt','atmos','surface_downwelling_longwave_flux_in_air_assuming_clear_sky','W m-2','area: time: point','area: areacella','Surface Downwelling Clear-Sky Longwave Radiation','Surface downwelling clear-sky longwave radiation','longitude latitude time1','rldscs','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rsdsdir-AUS2200_A1hr','1hr','atmos','surface_direct_along_beam_shortwave_flux_in_air','W m-2','area: time: mean','area: areacella','Direct Surface Short Wave Flux : corrected','Corrected','longitude latitude time','rsdsdir','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('ua24-AUS2200_A1hrPlev','1hrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction).','longitude latitude plev24 time1','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va24-AUS2200_A1hrPlev','1hrPt','atmos','northward_wind','m s-1','area: mean time: point','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction).','longitude latitude plev24 time1','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hus24-AUS2200_A1hrPlev','1hrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude plev24 time1','hus','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa24-AUS2200_A1hrPlev','1hrPt','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev24 time1','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta24-AUS2200_A1hrPlev','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude plev24 time1','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ua3-AUS2200_A1hrPlev','1hrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction).','longitude latitude plev3 time1','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va3-AUS2200_A1hrPlev','1hrPt','atmos','northward_wind','m s-1','area: mean time: point','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction).','longitude latitude plev3 time1','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hus3-AUS2200_A1hrPlev','1hrPt','atmos','specific_humidity','1','area: mean time: point','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude plev3 time1','hus','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa3-AUS2200_A1hrPlev','1hrPt','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev3 time','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta3-AUS2200_A1hrPlev','1hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude plev3 time1','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('refl24-AUS2200_A1hrPlev','1hrPt','atmos','','dBZ','area: mean time: point','area: areacella','Radar Reflectivity in the grid column due to all hydrometeors','','longitude latitude plev24 time1','refl','real','','','','','','',''); +INSERT INTO cmorvar VALUES('theta24-AUS2200_A1hrPlev','1hrPt','atmos','air_potential_temperature','K','area: mean time: point','area: areacella','Air Potential Temperature','Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure.','longitude latitude plev24 time1','theta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zmla-AUS2200_A3hr','3hrPt','atmos','atmosphere_boundary_layer_thickness','m','area: time: point','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time1','zmla','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ps-AUS2200_A3hr','3hrPt','atmos','surface_air_pressure','Pa','area: mean time: point','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time1','ps','real','','','','','','',''); +INSERT INTO cmorvar VALUES('lwp-AUS2200_A3hr','3hrPt','areosol','atmosphere_mass_content_of_cloud_liquid_water','kg m-2','area: time: point','area: areacella','Liquid Water Path','The total mass of liquid water in cloud per unit area.','longitude latitude time1','lwp','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clivi-AUS2200_A3hr','3hrPt','atmos','atmosphere_mass_content_of_cloud_ice','kg m-2','area: time: point','area: areacella','Ice Water Path','mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.','longitude latitude time1','clivi','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prw-AUS2200_A3hr','3hrPt','atmos','atmosphere_mass_content_of_water_vapor','kg m-2','area: time: point','area: areacella','Water Vapor Path','vertically integrated through the atmospheric column','longitude latitude time1','prw','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zg16-AUS2200_A3hr','3hrPt','atmos','geopotential_height','m','area: mean time: point','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev16 time1','zg','real','','','','','','',''); +INSERT INTO cmorvar VALUES('orog-AUS2200_A6hr','6hrPt','land','surface_altitude','m','area: time: point','area: areacella','Surface Altitude','The surface called ''surface'' means the lower boundary of the atmosphere. Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level.','longitude latitude time1','orog','real','','','','','','',''); +INSERT INTO cmorvar VALUES('pralsprof-AUS2200_A6hr','6hr','atmos','stratiform_rainfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Rainfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsprof','real','','','','','','',''); +INSERT INTO cmorvar VALUES('pralsns-AUS2200_A6hr','6hr','atmos','stratiform_snowfall_amount','kg m-2','area: mean time: sum','area: areacella','Stratiform Snowfall Amount over the column','Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. ''Amount'' means mass per unit area.','longitude latitude time','pralsns','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ua16-AUS2200_A6hr','6hrPt','atmos','eastward_wind','m s-1','area: time: point','--OPT','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction).','longitude latitude plev16 time1','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va16-AUS2200_A6hr','6hrPt','atmos','northward_wind','m s-1','area: time: point','--OPT','Northward Wind on pressure levels','Meridional wind (positive in a northward direction).','longitude latitude plev16 time1','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa16-AUS2200_A6hr','6hrPt','atmos','upward_air_velocity','m s-1','area: mean time: point','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev16 time1','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wbptemp7h-AUS2200_A6hr','6hrPt','atmos','wet_bulb_potential_temperature','K','area: mean time: point','area: areacella','Wet Bulb Potential Temperature','Wet bulb potential temperature','longitude latitude plev7h time1','wbptemp','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zg16-AUS2200_A6hr','6hrPt','atmos','geopotential_height','m','area: mean time: point','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev16 time1','zg','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta16-AUS2200_A6hr','6hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature on pressure levels','Air Temperature','longitude latitude plev16 time1','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hur16-AUS2200_A6hr','6hrPt','atmos','relative_humidity','%','area: mean time: point','area: areacella','Relative Humidity on pressure levels','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude plev16 time1','hur','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zg24-AUS2200_A6hr','6hrPt','atmos','geopotential_height','m','area: mean time: point','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev24 time1','zg','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zmla-AUS2200_Aday','day','atmos','atmosphere_boundary_layer_thickness','m','area: time: mean','area: areacella','Height of Boundary Layer','The atmosphere boundary layer thickness is the ''depth'' or ''height'' of the (atmosphere) planetary boundary layer.','longitude latitude time','zmla','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ps-AUS2200_Aday','day','atmos','surface_air_pressure','Pa','area: mean time: mean','area: areacella','Surface Air Pressure','surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates','longitude latitude time','ps','real','','','','','','',''); +INSERT INTO cmorvar VALUES('lwp-AUS2200_Aday','day','aerosol','atmosphere_mass_content_of_cloud_liquid_water','kg m-2','area: time: mean','area: areacella','Liquid Water Path','The total mass of liquid water in cloud per unit area.','longitude latitude time','lwp','real','','','','','','',''); +INSERT INTO cmorvar VALUES('clivi-AUS2200_Aday','day','atmos','atmosphere_mass_content_of_cloud_ice','kg m-2','area: time: mean','area: areacella','Ice Water Path','mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.','longitude latitude time','clivi','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prw-AUS2200_Aday','day','atmos','atmosphere_mass_content_of_water_vapor','kg m-2','area: time: mean','area: areacella','Water Vapor Path','vertically integrated through the atmospheric column','longitude latitude time','prw','real','','','','','','',''); +INSERT INTO cmorvar VALUES('lmask-AUS2200_fx','fx','land','land_binary_mask','%','area: mean','area: areacella','Indicates if cell grid is Land (1) or sea (0)','1 = land, 0 = sea','longitude latitude','lmask','integer','','','','','','',''); +INSERT INTO cmorvar VALUES('tas-AM3_A1hrClimMon','1hrCM','atmos','air_temperature','K','area: mean time: mean within days time: mean over days','area: areacella','Air Temperature','Monthly Air Temperature averaged by hour of day','longitude latitude time3','tas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('co217-AM3_Amon','mon','atmos','mole_fraction_of_carbon_dioxide_in_air','mol mol-1','time: mean','area: areacella','Mole Fraction of CO2','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time','co2','real','','','','','','',''); +INSERT INTO cmorvar VALUES('co2Clim17-AM3_Amon','monC','atmos','mole_fraction_of_carbon_dioxide_in_air','mol mol-1','area: mean time: mean within years time: mean over years','area: areacella','Mole Fraction of CO2','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time2','co2','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hur17-AM3_Amon','mon','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude plev17 time','hur','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hus17-AM3_Amon','mon','atmos','specific_humidity','1','time: mean','area: areacella','Specific Humidity','Specific humidity is the mass fraction of water vapor in (moist) air.','longitude latitude plev17 time','hus','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hus17uvgrid-AM3_Amon','mon','atmos','specific_humidity','%','time: mean','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air. Defined on uv grid','longitude latitude plev17 time','hur','real','','','','','','',''); +INSERT INTO cmorvar VALUES('n2o17-AM3_Amon','mon','atmos atmosChem','mole_fraction_of_nitrous_oxide_in_air','mol mol-1','time: mean','area: areacella','Mole Fraction of N2O','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.','longitude latitude plev17 time','n2o','real','','','','','','',''); +INSERT INTO cmorvar VALUES('n2oClim17-AM3_Amon','monC','atmos atmosChem','mole_fraction_of_nitrous_oxide_in_air','mol mol-1','area: mean time: mean within years time: mean over years','area: areacella','Mole Fraction of N2O','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.','longitude latitude plev17 time2','n2o','real','','','','','','',''); +INSERT INTO cmorvar VALUES('o317-AM3_Amon','mon','atmos atmosChem','mole_fraction_of_ozone_in_air','mol mol-1','time: mean','area: areacella','Mole Fraction of O3','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time','o3','real','','','','','','',''); +INSERT INTO cmorvar VALUES('o3Clim17-AM3_Amon','monC','atmos atmosChem','mole_fraction_of_ozone_in_air','mol mol-1','area: mean time: mean within years time: mean over years','area: areacella','Mole Fraction of O3','Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.','longitude latitude plev17 time2','o3','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta17-AM3_Amon','mon','atmos','air_temperature','K','time: mean','area: areacella','Air Temperature','Air Temperature','longitude latitude plev17 time','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ua17-AM3_Amon','mon','atmos','eastward_wind','m s-1','time: mean','area: areacella','Eastward Wind','Zonal wind (positive in a eastward direction).','longitude latitude plev17 time','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va17-AM3_Amon','mon','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind','Meridional wind (positive in a northward direction).','longitude latitude plev17 time','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wap17-AM3_Amon','mon','atmos','lagrangian_tendency_of_air_pressure','Pa s-1','time: mean','area: areacella','Omega (=dp/dt)','Omega (vertical velocity in pressure coordinates, positive downwards)','longitude latitude plev17 time','wap','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zg17-AM3_Amon','mon','atmos','geopotential_height','m','time: mean','area: areacella','Geopotential Height','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev17 time','zg','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa17-AM3_Amon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev17 time','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa17uvgrid-AM3_Amon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention. Defined on uv grid','longitude latitude plev17 time','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ua17uvgrid-AM3_Amon','mon','atmos','eastward_wind','m s-1','time: mean','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction). Defined on uv grid','longitude latitude plev17 time','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va17uvgrid-AM3_Amon','mon','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction). Defined on uv grid','longitude latitude plev17 time','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta17uvgrid-AM3_Amon','mon','atmos','air_temperature','K','time: mean','area: areacella','Air Temperature on pressure levels','Air Temperature. Defined on uv grid','longitude latitude plev17 time','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hur17uvgrid-AM3_Amon','mon','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity on pressure levels','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C. Defined on uv grid','longitude latitude plev17 time','hur','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wap17uvgrid-AM3_Amon','mon','atmos','lagrangian_tendency_of_air_pressure','Pa s-1','time: mean','area: areacella','Omega (=dp/dt) on pressure levels','Omega (vertical velocity in pressure coordinates, positive downwards). Defined on uv grid','longitude latitude plev17 time','wap','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mrlqso-AM3_Amon','mon','land','mass_fraction_of_unfrozen_water_in_soil_moisture','1','area: mean where land time: mean','area: areacella','Average Layer Fraction of Liquid Moisture','Fraction of soil moisture mass in the liquid phase in each user-defined soil layer (3D variable)','longitude latitude sdepth time','mrlqso','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mrrob-AM3_Amon','mon','land','subsurface_runoff_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Subsurface Runoff','Runoff is the liquid water which drains from land. If not specified, ''runoff'' refers to the sum of surface runoff and subsurface drainage. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','mrrob','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zg17uvgrid-AM3_Amon','mon','atmos','geopotential_height','m','time: mean','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface. Defined on uv grid','longitude latitude plev17 time','zg','real','','','','','','',''); +INSERT INTO cmorvar VALUES('huss-CM2_3hr','3hrPt','atmos','specific_humidity','1','area: time: point','area: areacella','Near-Surface Specific Humidity (1.5m)','Near-surface (1.5 m) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hurs-CM2_3hr','3hrPt','atmos','relative_humidity','%','area: mean time: point','area: areacella','Near-Surface Relative Humidity (1.5m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time1 height1.5m','hurs','real','','','','','','',''); +INSERT INTO cmorvar VALUES('rls-CM2_3hr','3hr','atmos','surface_net_downward_longwave_flux','W m-2','area: time: mean','area: areacella','Net Longwave Surface Radiation','Net longwave surface radiation','longitude latitude time','rls','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rss-CM2_3hr','3hr','atmos','surface_net_downward_shortwave_flux','W m-2','area: time: mean','area: areacella','Net Shortwave Surface Radiation','Net downward shortwave radiation at the surface','longitude latitude time','rss','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('tas-CM2_3hr','3hrPt','atmos','air_temperature','K','area: time: point','area: areacella','Near-Surface Air Temperature (1.5m)','near-surface (1.5m) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ua19-CM2_6hr','6hrPt','atmos','eastward_wind','m s-1','area: mean time: point','area: areacella','Eastward Wind','Zonal wind (positive in a eastward direction).','longitude latitude plev19 time1','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va19-CM2_6hr','6hrPt','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction). Defined on uv grid','longitude latitude plev19 time','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zg19-CM2_6hr','6hrPt','atmos','geopotential_height','m','time: point','area: areacella','Geopotential Height','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.','longitude latitude plev19 time','zg','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tos-CM2_6hr','6hrPt','ocean','sea_surface_temperature','degC','area: mean where sea time: point','area: areacello','Sea Surface Temperature','Temperature of upper boundary of the liquid ocean, including temperatures below sea-ice and floating ice shelves.','longitude latitude time1','tos','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta19-CM2_6hr','6hrPt','atmos','air_temperature','K','area: mean time: point','area: areacella','Air Temperature','Air Temperature','longitude latitude plev19 time1','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prrsn-CM2_day','day','atmos','mass_fraction_of_rainfall_falling_onto_surface_snow','1','area: mean where land time: mean','area: areacella','Fraction of Rainfall on Snow','The fraction of the grid averaged rainfall which falls on the snow pack','longitude latitude time','prrsn','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prsnc-CM2_day','day','atmos','convective_snowfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Convective Snowfall Flux','convective precipitation of all forms of water in the solid phase.','longitude latitude time','prsnc','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prra-CM2_day','day','atmos','rainfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Rainfall Flux over Land','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','prra','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prsnsn-CM2_day','day','atmos','mass_fraction_of_solid_precipitation_falling_onto_surface_snow','1','area: mean where land time: mean','area: areacella','Fraction of Snowfall (Including Hail and Graupel) on Snow','The fraction of the snowfall which falls on the snow pack','longitude latitude time','prsnsn','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mrrob-CM2_day','day','land','subsurface_runoff_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Subsurface Runoff','Runoff is the liquid water which drains from land. If not specified, ''runoff'' refers to the sum of surface runoff and subsurface drainage. In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','mrrob','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mrlqso-CM2_day','day','land','mass_fraction_of_unfrozen_water_in_soil_moisture','1','area: mean where land time: mean','area: areacella','Average Layer Fraction of Liquid Moisture','Fraction of soil moisture mass in the liquid phase in each user-defined soil layer (3D variable)','longitude latitude sdepth time','mrlqso','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hurs-CM2_day','day','atmos','relative_humidity','%','area: time: mean','area: areacella','Near-Surface Relative Humidity (1.5 m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hurs','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hursmax-CM2_day','day','atmos','relative_humidity','%','area: mean time: maximum','area: areacella','Daily Maximum Near-Surface Relative Humidity (1.5m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hursmax','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hursmin-CM2_day','day','atmos','relative_humidity','%','area: mean time: minimum','area: areacella','Daily Minimum Near-Surface Relative Humidity (1.5m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hursmin','real','','','','','','',''); +INSERT INTO cmorvar VALUES('huss-CM2_day','day','atmos','specific_humidity','1','area: time: mean','area: areacella','Near-Surface Specific Humidity (1.5m)','Near-surface (1.5 m) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tas-CM2_day','day','atmos','air_temperature','K','area: time: mean','area: areacella','Near-Surface Air Temperature (1.5m)','near-surface (1.5m) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tasmax-CM2_day','day','atmos','air_temperature','K','area: mean time: maximum','area: areacella','Daily Maximum Near-Surface Air Temperature (1.5m)','maximum near-surface (1.5m) air temperature (add cell_method attribute ''time: max'')','longitude latitude time height1.5m','tasmax','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tasmin-CM2_day','day','atmos','air_temperature','K','area: mean time: minimum','area: areacella','Daily Minimum Near-Surface Air Temperature (1.5m)','minimum near-surface (1.5m) air temperature (add cell_method attribute ''time: min'')','longitude latitude time height1.5m','tasmin','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mlotst-CM2_day','day','ocean','ocean_mixed_layer_thickness_defined_by_sigma_t','m','area: mean where sea time: mean','area: areacello','Ocean Mixed Layer Thickness Defined by Sigma T','Sigma T is potential density referenced to ocean surface.','longitude latitude time','mlotst','real','','','','','','',''); +INSERT INTO cmorvar VALUES('uo-CM2_day','day','ocean','sea_water_x_velocity','m s-1','time: mean','--OPT','Sea Water X Velocity','Prognostic x-ward velocity component resolved by the model.','longitude latitude olevel time','uo','real','','','','','','',''); +INSERT INTO cmorvar VALUES('vo-CM2_day','day','ocean','sea_water_y_velocity','m s-1','time: mean','--OPT','Sea Water Y Velocity','Prognostic y-ward velocity component resolved by the model.','longitude latitude olevel time','vo','real','','','','','','',''); +INSERT INTO cmorvar VALUES('so-CM2_day','day','ocean','sea_water_salinity','0.001','area: mean where sea time: mean','area: areacello volume: volcello','Sea Water Salinity','Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term ''salinity'' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. ','longitude latitude olevel time','so','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wo-CM2_day','day','ocean','upward_sea_water_velocity','m s-1','time: mean','--OPT','Sea Water Vertical Velocity','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward).','longitude latitude olevel time','wo','real','','','','','','',''); +INSERT INTO cmorvar VALUES('thetao-CM2_day','day','ocean','sea_water_potential_temperature','degC','area: mean where sea time: mean','area: areacello volume: volcello','Sea Water Potential Temperature','Diagnostic should be contributed even for models using conservative temperature as prognostic field.','longitude latitude olevel time','thetao','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hur19-CM2_day','day','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude plev19 time','hur','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prrc-CM2_mon','mon','atmos','convective_rainfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Convective Rainfall Rate','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','prrc','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prra-CM2_mon','mon','atmos','rainfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Rainfall Flux over Land','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics.','longitude latitude time','prra','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prsnc-CM2_mon','mon','atmos','convective_snowfall_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Convective Snowfall Flux','convective precipitation of all forms of water in the solid phase.','longitude latitude time','prsnc','real','','','','','','',''); +INSERT INTO cmorvar VALUES('eow-CM2_mon','mon','land','surface_water_evaporation_flux','kg m-2 s-1','area: mean where land time: mean','area: areacella','Open Water Evaporation','Evaporation (conversion of liquid or solid into vapor) from open water. ','longitude latitude time','eow','real','','','','','','',''); +INSERT INTO cmorvar VALUES('pfull-CM2_mon','mon','atmos','air_pressure','Pa','area: mean time: mean','area: areacella','Pressure at Model Full-Levels','Air pressure on model levels','longitude latitude alevel time','pfull','real','','','','','','',''); INSERT INTO cmorvar VALUES('phalf-CM2_mon','mon','atmos','air_pressure','Pa','area: time: mean','area: areacella','Pressure on Model Half-Levels','Air pressure on model half-levels','longitude latitude alevel time','phalf','real','','','','','','',''); +INSERT INTO cmorvar VALUES('theta-CM2_mon','mon','atmos','air_potential_temperature','K','area: mean time: mean','area: areacella','Air Potential Temperature','Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure.','longitude latitude alevel time','theta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hfssuo-CM2_mon','mon','atmos','surface_upward_sensible_heat_flux','W m-2','area: mean where ice_free_sea over sea time: mean','area: areacella','Net Upward Sensible Heat Flux over Open Sea','the net sensible heat flux over open sea','longitude latitude time','hfssuo','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('rssntds-CM2_mon','mon','ocean','surface_net_downward_shortwave_flux','W m-2','area: mean where ice_free_sea over sea time: mean','area: areacello','Net Downward Shortwave Radiation where open sea','This is defined as ''where ice_free_sea over sea''','longitude latitude time','rssntds','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('rlntds-CM2_mon','mon','ocean','surface_net_downward_longwave_flux','W m-2','area: mean where ice_free_sea over sea time: mean','area: areacello','Surface Net Downward Longwave Radiation','This is defined as ''where ice_free_sea over sea''','longitude latitude time','rlntds','real','down','','','','','',''); +INSERT INTO cmorvar VALUES('evspsblvegLut-CM2_mon','mon','land','water_evaporation_flux_from_canopy','kg m-2 s-1','area: time: mean where sector','area: areacella','Evaporation from Canopy over Land-Use tiles','The canopy evaporation and sublimation (if present in model); may include dew formation as a negative flux.','longitude latitude landUse time','evspsblvegLut','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mrfsofr-CM2_mon','mon','land','mass_fraction_of_frozen_water_in_soil_moisture','1','area: mean where land time: mean','area: areacella','Average Layer Fraction of Frozen Moisture','Fraction of soil moisture mass in the solid phase in each user-defined soil layer (3D variable)','longitude latitude sdepth time','mrfsofr','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prlsprof-CM2_mon','mon','atmos','stratiform_rainfall_flux','kg m-2 s-1','area: mean time: mean','area: areacella','Stratiform Rainfall Flux','In accordance with common usage in geophysical disciplines, ''flux'' implies per unit area, called ''flux density'' in physics. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud.','longitude latitude time','prlsprof','real','','','','','','',''); +INSERT INTO cmorvar VALUES('prlsns-CM2_mon','mon','atmos','stratiform_snowfall_flux','kg m-2 s-1','area: mean time: mean','area: areacella','Stratiform Snowfall Flux','large-scale precipitation of all forms of water in the solid phase.','longitude latitude time','prlsns','real','','','','','','',''); +INSERT INTO cmorvar VALUES('cw-CM2_mon','mon','land','canopy_water_amount','kg m-2','area: mean where land time: mean','area: areacella','Total Canopy Water Storage','''Amount'' means mass per unit area. ''Water'' means water in all phases, including frozen i.e. ice and snow. ''Canopy'' means the plant or vegetation canopy. The canopy water is the water on the canopy.','longitude latitude time','cw','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa19-CM2_mon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention.','longitude latitude plev19 time','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wa19uvgrid-CM2_mon','mon','atmos','upward_air_velocity','m s-1','area: time: mean','area: areacella','Upward Air Velocity on pressure levels','A velocity is a vector quantity. ''Upward'' indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. The standard name downward_air_velocity may be used for a vector component with the opposite sign convention. Defined on uv grid','longitude latitude plev19 time','wa','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ua19uvgrid-CM2_mon','mon','atmos','eastward_wind','m s-1','time: mean','area: areacella','Eastward Wind on pressure levels','Zonal wind (positive in a eastward direction). Defined on uv grid','longitude latitude plev19 time','ua','real','','','','','','',''); +INSERT INTO cmorvar VALUES('va19uvgrid-CM2_mon','mon','atmos','northward_wind','m s-1','time: mean','area: areacella','Northward Wind on pressure levels','Meridional wind (positive in a northward direction). Defined on uv grid','longitude latitude plev19 time','va','real','','','','','','',''); +INSERT INTO cmorvar VALUES('ta19uvgrid-CM2_mon','mon','atmos','air_temperature','K','time: mean','area: areacella','Air Temperature on pressure levels','Air Temperature. Defined on uv grid','longitude latitude plev19 time','ta','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hur19uvgrid-CM2_mon','mon','atmos','relative_humidity','%','time: mean','area: areacella','Relative Humidity on pressure levels','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C. Defined on uv grid','longitude latitude plev19 time','hur','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hus19uvgrid-CM2_mon','mon','atmos','specific_humidity','%','time: mean','area: areacella','Specific Humidity on pressure levels','Specific humidity is the mass fraction of water vapor in (moist) air. Defined on uv grid','longitude latitude plev19 time','hur','real','','','','','','',''); +INSERT INTO cmorvar VALUES('wap19uvgrid-CM2_mon','mon','atmos','lagrangian_tendency_of_air_pressure','Pa s-1','time: mean','area: areacella','Omega (=dp/dt) on pressure levels','Omega (vertical velocity in pressure coordinates, positive downwards). Defined on uv grid','longitude latitude plev19 time','wap','real','','','','','','',''); +INSERT INTO cmorvar VALUES('zg19uvgrid-CM2_mon','mon','atmos','geopotential_height','m','time: mean','area: areacella','Geopotential Height on pressure levels','Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface. Defined on uv grid','longitude latitude plev19 time','zg','real','','','','','','',''); +INSERT INTO cmorvar VALUES('amdry-CM2_mon','mon','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column dry mass of air','vertically integrated through the atmospheric column','longitude latitude time','amdry','real','','','','','','',''); +INSERT INTO cmorvar VALUES('amwet-CM2_mon','mon','atmos','atmosphere_mass_per_unit_area','kg m-2','area: time: point','area: areacella','Total column wet mass of air','vertically integrated through the atmospheric column','longitude latitude time','amwet','real','','','','','','',''); +INSERT INTO cmorvar VALUES('hurs-CM2_mon','mon','atmos','relative_humidity','%','area: time: mean','area: areacella','Near-Surface Relative Humidity (1.5 m)','The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.','longitude latitude time height1.5m','hurs','real','','','','','','',''); +INSERT INTO cmorvar VALUES('huss-CM2_mon','mon','atmos','specific_humidity','1','area: time: mean','area: areacella','Near-Surface Specific Humidity (1.5m)','Near-surface (1.5 m) specific humidity.','longitude latitude time height1.5m','huss','real','','','','','','',''); +INSERT INTO cmorvar VALUES('mc-CM2_mon','mon','atmos','atmosphere_net_upward_convective_mass_flux','kg m-2 s-1','area: time: mean','area: areacella','Convective Mass Flux','The net mass flux should represent the difference between the updraft and downdraft components. The flux is computed as the mass divided by the area of the grid cell.','longitude latitude alevel time','mc','real','up','','','','','',''); +INSERT INTO cmorvar VALUES('tas-CM2_mon','mon','atmos','air_temperature','K','area: time: mean','area: areacella','Near-Surface Air Temperature (1.5m)','near-surface (1.5m) air temperature','longitude latitude time height1.5m','tas','real','','','','','','',''); INSERT INTO cmorvar VALUES('tasmax-CM2_mon','mon','atmos','air_temperature','K','area: mean time: maximum within days time: mean over days','area: areacella','Daily Maximum Near-Surface Air Temperature','maximum near-surface (1.5 meter) air temperature (add cell_method attribute ''time: max'')','longitude latitude time height1.5m','tasmax','real','','','','','','',''); INSERT INTO cmorvar VALUES('tasmin-CM2_mon','mon','atmos','air_temperature','K','area: mean time: minimum within days time: mean over days','area: areacella','Daily Minimum Near-Surface Air Temperature','minimum near-surface (1.5 meter) air temperature (add cell_method attribute ''time: min'')','longitude latitude time height1.5m','tasmin','real','','','','','','',''); +INSERT INTO cmorvar VALUES('advectsweby-CM2_mon','mon','ocean','','W m-2','area: mean time: mean','area: areacello','Advect tendency from Sweby tracer advection scheme','This is defined as cp*rho*dzt*sweby advect tendency','longitude latitude olevel time','advectsweby','real','','','','','','',''); +INSERT INTO cmorvar VALUES('tendkpp-CM2_mon','mon','ocean','','W m-2','area: mean time: mean','area: areacello','non-local tendency arising from the KPP boundary layer parameterization','This is defined as cp*rho*dzt*nonlocal tendency from KPP','longitude latitude olevel time','tendkpp','real','','','','','','',''); +INSERT INTO cmorvar VALUES('omldamax-CM2_mon','mon','ocean','ocean_mixed_layer_thickness_defined_by_mixing_scheme','m','area: mean time: maximum','area: areacello','Mean Monthly Maximum Ocean Mixed Layer Thickness Defined by Mixing Scheme','The ocean mixed layer is the upper part of the ocean, regarded as being well-mixed. The base of the mixed layer defined by the mixing scheme is a diagnostic of ocean models. ''Thickness'' means the vertical extent of a layer.','longitude latitude time','omldamax','real','','','','','','',''); +INSERT INTO cmorvar VALUES('difvho-CM2_mon','mon','ocean','ocean_vertical_heat_diffusivity','m2 s-1','area: mean time: mean','area: areacello volume: volcello','Ocean Vertical Heat Diffusivity','Vertical/dianeutral diffusivity applied to prognostic temperature field.','longitude latitude olevel time','difvho','real','','','','','','',''); INSERT INTO cmorvar VALUES('sidivvel-CM2_mon','mon','seaIce','divergence_of_sea_ice_velocity','s-1','area: mean where sea_ice (comment: mask=siconc) time: mean','area: areacello','Divergence of the Sea-Ice Velocity Field','Divergence of sea-ice velocity field (first shear strain invariant)','longitude latitude time','sidivvel','real','','','','','','',''); +INSERT INTO cmorvar VALUES('rho0-CM2_mon','mon','ocean','sea_water_potential_density','kg m-3','area: mean time: mean','area: areacello volume: volcello','Potential Density referenced to 0 dbar','','longitude latitude olevel time','rho0','real','','','','','','',''); CREATE TABLE mapping ( cmor_var TEXT, input_vars TEXT, @@ -2641,6 +2641,7 @@ INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2' INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2','time depth lat lon','longitude latitude time sdepth1','mon','land','area: mean where land time: mean','','CMIP6_Lmon','CM2','mass_content_of_water_in_soil_layer','map_land_CM2.csv'); INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2','time depth lat lon','longitude latitude time sdepth1','mon','land','area: mean where land time: mean','','CMIP6_Lmon','ESM1.5','mass_content_of_water_in_soil_layer','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('mrsos','fld_s08i223','calc_topsoil(var[0])','kg m-2','time depth lat lon','longitude latitude time sdepth1','day','land','area: time: mean','','CMIP6_day','CM2','mass_content_of_water_in_soil_layer','map_land_CM2.csv'); +INSERT INTO mapping VALUES('msftbarot','psiu','','kg/s','time yt_ocean xu_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','CM2','ocean_barotropic_mass_streamfunction','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('msftmrho','ty_trans_rho ty_trans_rho_gm','calc_overt(var)','kg s-1','time potrho grid_yu_ocean grid_xt_ocean','latitude rho basin time','mon','ocean','longitude: sum depth: sum time: mean','','CMIP6_Omon','CM2','ocean_meridional_overturning_mass_streamfunction','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('msftmrho','ty_trans_rho ty_trans_rho_gm','calc_overt(var)','kg s-1','time potrho grid_yu_ocean grid_xt_ocean','latitude rho basin time','mon','ocean','longitude: sum depth: sum time: mean','','CMIP6_Omon','ESM1.5','ocean_meridional_overturning_mass_streamfunction','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('msftmrho','ty_trans_rho ty_trans_rho_gm','calc_overt(var)','kg s-1','time potrho grid_yu_ocean grid_xt_ocean','latitude rho basin time','mon','ocean','longitude: sum depth: sum time: mean','','CMIP6_Omon','OM2','ocean_meridional_overturning_mass_streamfunction','map_ocean_OM2.csv'); @@ -2693,12 +2694,12 @@ INSERT INTO mapping VALUES('od550lt1aer','fld_s02i300 fld_s02i301 fld_s02i303',' INSERT INTO mapping VALUES('omldamax','hblt_max','','m','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: max','','CM2_mon','CM2','ocean_mixed_layer_thickness_defined_by_mixing_scheme','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('omldamax','hblt_max','','m','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: max','','CM2_mon','ESM1.5','ocean_mixed_layer_thickness_defined_by_mixing_scheme','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('omldamax','hblt_max','','m','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: max','','CM2_mon','OM2','ocean_mixed_layer_thickness_defined_by_mixing_scheme','map_ocean_OM2.csv'); -INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','mon','land','area: time: mean','','CMIP6_fx','AM3','surface_altitude','map_land_AM3.csv'); +INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','fx','land','area: time: mean','','CMIP6_fx','AM3','surface_altitude','map_land_AM3.csv'); INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time_1 lat lon','longitude latitude','fx','land','area: time: point','','CMIP6_fx','AUS2200','surface_altitude','map_AUS2200.csv'); -INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','fx','land','area: time: mean','','CMIP6_fx','CM2','surface_altitude','map_atmos_CM2.csv'); -INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','fx','land','area: time: mean','','CMIP6_fx','ESM1.5','surface_altitude','map_atmos_ESM1.5.csv'); -INSERT INTO mapping VALUES('orog','surface_altitude','','m','time lat lon','longitude latitude','mon','land','area: time: mean','','CMIP6_fx','CM2','surface_altitude','map_land_CM2.csv'); -INSERT INTO mapping VALUES('orog','surface_altitude','','m','time lat lon','longitude latitude','mon','land','area: time: mean','','CMIP6_fx','ESM1.5','surface_altitude','map_land_ESM1.5.csv'); +INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','fx','land','area: mean','','CMIP6_fx','CM2','surface_altitude','map_land_CM2.csv'); +INSERT INTO mapping VALUES('orog','fld_s00i033','var[0].isel(time=0)','m','time lat lon','longitude latitude','fx','land','area: mean','','CMIP6_fx','ESM1.5','surface_altitude','map_land_ESM1.5.csv'); +INSERT INTO mapping VALUES('orog','surface_altitude','','m','time lat lon','longitude latitude','fx','land','area: time: mean','','CMIP6_fx','CM2','surface_altitude','map_land_CM2.csv'); +INSERT INTO mapping VALUES('orog','surface_altitude','','m','time lat lon','longitude latitude','fx','land','area: time: mean','','CMIP6_fx','ESM1.5','surface_altitude','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('osaltdiff','salt_vdiffuse_diff_cbt','','kg m-2 -s','time st_ocean yt_ocean xt_ocean','longitude latitude olevel time','mon','ocean','area: time: mean','','CMIP6_Emon','CM2','tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('osaltdiff','salt_vdiffuse_diff_cbt','','kg m-2 -s','time st_ocean yt_ocean xt_ocean','longitude latitude olevel time','mon','ocean','area: time: mean','','CMIP6_Emon','ESM1.5','tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('osaltdiff','salt_vdiffuse_diff_cbt','','kg m-2 -s','time st_ocean yt_ocean xt_ocean','longitude latitude olevel time','mon','ocean','area: time: mean','','CMIP6_Emon','OM2','tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing','map_ocean_OM2.csv'); @@ -2960,44 +2961,48 @@ INSERT INTO mapping VALUES('sftlf','fld_s03i395','','1','time lat lon','longitud INSERT INTO mapping VALUES('shrubFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],[5,8],landfrac=var[1],lev=''typeshrub'')','1','time lat lon','longitude latitude time typeshrub','mon','land','','','CMIP6_Lmon','CM2','area_fraction','map_land_CM2.csv'); INSERT INTO mapping VALUES('shrubFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],[5,8],landfrac=var[1],lev=''typeshrub'')','1','time lat lon','longitude latitude time typeshrub','mon','land','','','CMIP6_Lmon','ESM1.5','area_fraction','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('siage','siage','','s','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','age_of_sea_ice','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siareaacrossline','aice uvel vvel','icearealineTransports(var[0],var[1],var[2])','m2 s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_area_transport_across_line','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siareaacrossline','aice uvel vvel','icearealineTransports(var[0],var[1],var[2])','m2 s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','SImon','CM2','sea_ice_area_transport_across_line','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siarean','aice tarea','calc_hemi_seaice(var[0],var[1],''north'')','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_area','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siareas','aice tarea','calc_hemi_seaice(var[0],var[1],''south'')','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_area','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siarean','aice tarea','calc_hemi_seaice(var[0],var[1],''north'')','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_area','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siareas','aice tarea','calc_hemi_seaice(var[0],var[1],''south'')','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_area','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sicompstren','sicompstren','','N m-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','compressive_strength_of_sea_ice','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siconc','aice','','1','time nj ni','longitude latitude time typesi','day','seaIce','area: time: mean','','CMIP6_SIday','CM2','sea_ice_area_fraction','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siconc','aice','','1','time nj ni','longitude latitude time typesi','day','seaIce','area: time: mean','','SIday','CM2','sea_ice_area_fraction','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siconca','fld_s00i031','','1','time lat lon','longitude latitude time1 typesi','1hrPt','atmos','area: time: point','','AUS2200_A1hr','AUS2200','sea_ice_area_fraction','map_AUS2200.csv'); +INSERT INTO mapping VALUES('siconca','fld_s00i031','','1','time lat lon','time lat lon','mon','atmos','area: time: mean','','CMIP6_SImon','CM2','sea_ice_area_fraction','map_atmos_CM2.csv'); +INSERT INTO mapping VALUES('siconca','fld_s00i031','','1','time lat lon','time lat lon','mon','atmos','area: time: mean','','CMIP6_SImon','ESM1.5','sea_ice_area_fraction','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('sidconcdyn','sidconcdyn','var[0]*100','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_area_fraction_due_to_dynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidconcth','sidconcth','var[0]*100','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_area_fraction_due_to_thermodynamics','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sidivvel','sidivvel','','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','','','divergence_of_sea_ice_velocity','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidivvel','sidivvel','','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CM2_mon','CM2','divergence_of_sea_ice_velocity','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassdyn','sidmassdyn','','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassevapsubl','sidmassevapsubl','var[0]*-1','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','water_evapotranspiration_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassgrowthbot','sidmassgrowthbot','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_congelation_ice_accumulation','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassgrowthwat','sidmassgrowthwat','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_frazil_ice_accumulation_in_leads','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmasslat','sidmasslat','var[0]/-1800.','kg m-2 s-1','longitude latitude time','time nj ni','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_lateral_melting','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sidmassmeltbot','sidmassmeltbot','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_basal_melting','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sidmassmelttop','sidmassmelttop','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_surface_melting','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sidmassmeltbot','sidmassmeltbot','var[0]/-1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_basal_melting','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sidmassmelttop','sidmassmelttop','var[0]/-1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_surface_melting','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmasssi','sidmasssi','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassth','sidmassth','','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_sea_ice_thermodynamics','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sidmasstranx','sidmasstranx','','kg/s','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_x_transport','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sidmasstrany','sidmasstrany','','kg/s','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_y_transport','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siextentn','aice tarea','calc_hemi_seaice(var[0],var[1],''north'',extent=True)','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_extent','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siextents','aice tarea','calc_hemi_seaice(var[0],var[1],''south'',extent=True)','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_extent','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sidmasstranx','sidmasstranx','','kg s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_x_transport','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sidmasstrany','sidmasstrany','','kg s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_y_transport','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siextentn','aice tarea','calc_hemi_seaice(var[0],var[1],''north'',extent=True)','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_extent','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siextents','aice tarea','calc_hemi_seaice(var[0],var[1],''south'',extent=True)','m2','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_extent','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sifb','sifb','','m','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_freeboard','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siflcondbot','siflcondbot','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','basal_downward_heat_flux_in_sea_ice','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siflcondtop','siflcondtop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','surface_downward_sensible_heat_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siflfwbot','siflfwbot','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','water_flux_into_sea_water_due_to_sea_ice_thermodynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sifllatstop','fld_s03i234 fld_s00i031','maskSeaIce(var[0],var[1])','W m-2','time lat lon','longitude latitude time1','1hrPt','seaIce','area: time: point','up','AUS2200_A1hr','AUS2200','','map_AUS2200.csv'); +INSERT INTO mapping VALUES('sifllatstop','fld_s03i234 fld_s00i031','maskSeaIce(var[0],var[1])','W m-2','time lat lon','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','surface_upward_latent_heat_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sifllatstop','sifllatstop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','surface_upward_latent_heat_flux','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sifllwdtop','fld_s02i501 fld_s00i031','var[0]/var[1]','W m-2','time lat lon','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','surface_downwelling_longwave_flux_in_air','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sifllwdtop','sifllwdtop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','surface_downwelling_longwave_flux_in_air','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sifllwutop','fld_s03i531 fld_s00i031','var[0]/var[1]','W m-2','time lat lon','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','surface_upwelling_longwave_flux_in_air','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sifllwutop','sifllwutop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','surface_upwelling_longwave_flux_in_air','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siflsenstop','fld_s03i533 fld_s00i031','var[0]/var[1]','W m-2','time lat lon','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','surface_upward_sensible_heat_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siflsenstop','siflsenstop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','surface_upward_sensible_heat_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siflsensupbot','siflsensupbot','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','upward_sea_ice_basal_heat_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siflswdbot','siflswdbot','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','downwelling_shortwave_flux_in_sea_water_at_sea_ice_base','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siflswdtop','siflswdtop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','down shortwave flux over sea ice','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siflswutop','siflswutop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','upward shortwave flux over sea ice','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siflswdtop','fld_s01i501 fld_s00i031','var[0]/var[1]','W m-2','time lat lon','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','surface_downwelling_shortwave_flux_in_air','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siflswdtop','siflswdtop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','surface_downwelling_shortwave_flux_in_air','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siflswutop','fld_s01i503 fld_s00i031','var[0]/var[1]','W m-2','time lat lon','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','surface_upwelling_shortwave_flux_in_air','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('siflswutop','siflswutop','','W m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','surface_upwelling_shortwave_flux_in_air','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siforcecoriolx','siforcecoriolx','','N m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_x_force_per_unit_area_due_to_coriolis_effect','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siforcecorioly','siforcecorioly','','N m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_y_force_per_unit_area_due_to_coriolis_effect','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siforceintstrx','siforceintstrx','','N m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_x_internal_stress','map_seaice_CM2.csv'); @@ -3005,18 +3010,12 @@ INSERT INTO mapping VALUES('siforceintstry','siforceintstry','','N m-2','time nj INSERT INTO mapping VALUES('siforcetiltx','siforcetiltx','','N m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_x_force_per_unit_area_due_to_sea_surface_tilt','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siforcetilty','siforcetilty','','N m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_y_force_per_unit_area_due_to_sea_surface_tilt','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sihc','sihc','','J m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_temperature_expressed_as_heat_content','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siitdsnconc','snowfracn','','1','time nc nj ni','longitude latitude iceband time','mon','seaIce','area: time: mean','','','','surface_snow_area_fraction','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siitdsnthick','vsnon','','m','time nc nj ni','longitude latitude iceband time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','surface_snow_thickness','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('siitdthick','vicen','','m','time nc nj ni','longitude latitude iceband time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_thickness','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('simass','hi hs','var[0]*917+var[1]*330','kg m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_amount','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('simassacrossline','hi uvel vvel','icelineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_transport_across_line','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('simassacrossline','hi uvel vvel','icelineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','SImon','CM2','sea_ice_transport_across_line','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('simass','hi hs','var[0]*917+var[1]*330','kg m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_amount','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('simpconc','apond_ai aice','maskSeaIce(var[0],var[1])','1','time nj ni','longitude latitude time typemp','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','area_fraction','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sipr','sipr','','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','rainfall_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sisaltmass','sisaltmass','','kg m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_mass_content_of_salt','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sisnconc','sisnconc','','%','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','surface_snow_area_fraction','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sisnhc','sisnhc','maskSeaIce(var[0],var[1])','J m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','thermal_energy_content_of_surface_snow','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sisnmass','hs aice','maskSeaIce(var[0]*330,var[1])','m','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','liquid_water_content_of_surface_snow','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sisnthick','sisnthick','','m','time nj ni','longitude latitude time','day','seaIce','area: time: mean','','CMIP6_SIday','CM2','surface_snow_thickness','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sispeed','sispeed','','m s-1','time nj ni','longitude latitude time','day','seaIce','area: time: mean','','CMIP6_SIday','CM2','sea_ice_speed','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sistrxdtop','sistrxdtop','','N m-2','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','down','CMIP6_SImon','CM2','surface_downward_x_stress','map_seaice_CM2.csv'); @@ -3031,20 +3030,16 @@ INSERT INTO mapping VALUES('siu','siu','','m s-1','time nj ni','longitude latitu INSERT INTO mapping VALUES('siu','uvel','','m s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_x_velocity','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siv','siv','','m s-1','time nj ni','longitude latitude time','day','seaIce','area: time: mean','','CMIP6_SIday','CM2','sea_ice_y_velocity','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('siv','vvel','','m s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_y_velocity','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sivol','hi','','m','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_thickness','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sivoln','hi tarea','calc_hemi_seaice(var[0],var[1],''north'')','m3','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_volume','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sivols','hi tarea','calc_hemi_seaice_area_vol(var[0],var[1],''south'')','m3','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SIMon','CM2','sea_ice_volume','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sndmassdyn','dvsdtd aice','maskSeaIce((var[0]*330/8.64e6),var[1])',' kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_surface_snow_amount_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sivol','hi','','m','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_thickness','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sivoln','hi tarea','calc_hemi_seaice(var[0],var[1],''north'')','m3','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_volume','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sivols','hi tarea','calc_hemi_seaice_area_vol(var[0],var[1],''south'')','m3','time nj ni','time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','sea_ice_volume','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sndmassmelt','sndmassmelt','var[0]*-1/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','surface_snow_melt_flux','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sndmasssi','sidmasssi','(var[0]*-1*330)/(1800*917)','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_surface_snow_amount_due_to_conversion_of_snow_to_sea_ice','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sndmasssnf','sndmasssnf','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','snowfall_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('snm','fld_s08i231','','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','AM3','surface_snow_melt_flux_where_land','map_land_AM3.csv'); INSERT INTO mapping VALUES('snm','fld_s08i231','','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','CM2','surface_snow_melt_flux_where_land','map_land_CM2.csv'); INSERT INTO mapping VALUES('snm','fld_s08i231','','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','ESM1.5','surface_snow_melt_flux_where_land','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('snm','fld_s08i237 fld_s03i317','average_tile(var[0],tilefrac=var[1],lfrac=0)','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','CM2','surface_snow_melt_flux_where_land','map_land_CM2.csv'); INSERT INTO mapping VALUES('snm','fld_s08i237 fld_s03i317','average_tile(var[0],tilefrac=var[1],lfrac=0)','kg m-2 s-1','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','ESM1.5','surface_snow_melt_flux_where_land','map_land_ESM1.5.csv'); -INSERT INTO mapping VALUES('snmassacrossline','hs uvel vvel','snowlineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','snow_transport_across_line_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('snmassacrossline','hs uvel vvel','snowlineTransports(var[0],var[1],var[2])','kg s-1','time nj ni','siline time','mon','seaIce','area: time: mean','','SImon','CM2','snow_transport_across_line_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('snw','fld_s00i023','','kg m-2','time lat lon','longitude latitude time1','1hrPt','land','area: time: point','','AUS2200_A1hr','AUS2200','surface_snow_amount','map_AUS2200.csv'); INSERT INTO mapping VALUES('snw','fld_s08i023','','kg m-2','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','AM3','surface_snow_amount','map_land_AM3.csv'); INSERT INTO mapping VALUES('snw','fld_s08i023','','kg m-2','time lat lon','longitude latitude time','mon','landIce land','area: time: mean','','CMIP6_LImon','CM2','surface_snow_amount','map_land_CM2.csv'); diff --git a/src/mopdb/mopdb.py b/src/mopdb/mopdb.py index c55307e..dd26405 100644 --- a/src/mopdb/mopdb.py +++ b/src/mopdb/mopdb.py @@ -488,6 +488,7 @@ def model_vars(ctx, fpath, dbname, version, alias): dbname = import_files('mopdata').joinpath('access.db') conn = db_connect(dbname, logname='mopdb_log') #mopdb_log = logging.getLogger('mopdb_log') + fpath = Path(fpath) fname, vobjs, fobjs = write_varlist(conn, fpath, version, alias) conn.close() return None diff --git a/src/mopdb/mopdb_map.py b/src/mopdb/mopdb_map.py index 658a87c..7afbb2a 100644 --- a/src/mopdb/mopdb_map.py +++ b/src/mopdb/mopdb_map.py @@ -158,10 +158,10 @@ def write_varlist(conn, indir, version, alias): fwriter.writerow(["name", "cmor_var", "units", "dimensions", "frequency", "realm", "cell_methods", "cmor_table", "vtype", "size", "nsteps", "fpattern", "long_name", "standard_name"]) - patterns = identify_patterns(files) + patterns, patpaths = identify_patterns(files) #for fpath in files: - for fpattern in patterns: - fobj = FPattern(fpattern, indir) + for n,fpattern in enumerate(patterns): + fobj = FPattern(fpattern, patpaths[n]) nfiles = len(fobj.files) mopdb_log.debug(f"File pattern, number of files: {fpattern}, {nfiles}") # get attributes for the file variables diff --git a/src/mopdb/mopdb_utils.py b/src/mopdb/mopdb_utils.py index 763a550..c506376 100644 --- a/src/mopdb/mopdb_utils.py +++ b/src/mopdb/mopdb_utils.py @@ -431,11 +431,14 @@ def identify_patterns(files): ------- patterns : list(str) List of individuated patterns + patpaths : list(str) + List of root path for individuated patterns """ mopdb_log = logging.getLogger('mopdb_log') last_pattern = "thisistostart" patterns = [] + patpaths = [] n = 0 while n < len(files): if files[n].name.startswith(last_pattern): @@ -443,8 +446,10 @@ def identify_patterns(files): # if this is the last file it means there's only one so just add the all file elif n == (len(files) - 1): patterns.append(files[n].name) + patpaths.append(files[n].parent) else: mopdb_log.debug(f"identify_patterns: found new {files[n]}") + fpath = files[n].parent first = files[n].name.replace('.nc','') fnext = files[n+1].name # should be possible to eventually removing this @@ -470,6 +475,7 @@ def identify_patterns(files): else: last_pattern = first[:i+1] patterns.append(last_pattern) + patpaths.append(fpath) mopdb_log.debug(f"identify_patterns: last identified {last_pattern}") n+=1 - return patterns + return patterns, patpaths From 327b5d4046ddc08cdd905433ec2c9e6cf73f99f8 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Tue, 3 Dec 2024 15:01:43 +1100 Subject: [PATCH 12/17] updated calc_zostoga, removed misspelling in calc_hemi_seaice, fixed some seaice mappings solved issues #212 #182 --- mappings/map_ocean_CM2.csv | 1 + mappings/map_ocean_ESM1.5.csv | 1 + mappings/map_ocean_OM2.csv | 1 + mappings/map_seaice_CM2.csv | 2 +- src/mopdata/access.db | Bin 1200128 -> 1200128 bytes src/mopdata/access_dump.sql | 5 +++- src/mopdata/update_db.py.txt | 22 ++++++++-------- src/mopdb/mopdb_class.py | 28 +++++++++++++++++++++ src/mopdb/mopdb_map.py | 2 +- src/mopper/calc_ocean.py | 46 ++++++++++++++++++++++++++++++++-- src/mopper/calc_seaice.py | 4 +-- src/mopper/mop_setup.py | 20 +++++++-------- src/mopper/mopper.py | 6 ++--- tests/test_mopdb_utils.py | 40 ++++++++++++++++------------- 14 files changed, 130 insertions(+), 48 deletions(-) diff --git a/mappings/map_ocean_CM2.csv b/mappings/map_ocean_CM2.csv index 23a0753..67dd422 100644 --- a/mappings/map_ocean_CM2.csv +++ b/mappings/map_ocean_CM2.csv @@ -81,3 +81,4 @@ wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;mon; wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;day;ocean;area: time: mean;;CM2_day;CM2;float32;21600000;708;ocean_daily.nc-;dia-surface velocity T-points;upward_sea_water_velocity zos;sea_level;;m;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;708;ocean_month.nc-;effective sea level (eta_t + patm/(rho0*g)) on T cells;sea_surface_height_above_geoid zossq;sea_level_sq;;m2;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;708;ocean_month.nc-;square of effective sea level (eta_t + patm/(rho0*g)) on T cells;square_of_sea_surface_height_above_geoid +zostoga;pot_temp;calc_zostoga(var[0]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;CM2;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change diff --git a/mappings/map_ocean_ESM1.5.csv b/mappings/map_ocean_ESM1.5.csv index 631f968..7bae65b 100644 --- a/mappings/map_ocean_ESM1.5.csv +++ b/mappings/map_ocean_ESM1.5.csv @@ -80,3 +80,4 @@ wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;mon; wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;day;ocean;area: time: mean;;CM2_day;ESM1.5;float32;21600000;708;ocean_daily.nc-;dia-surface velocity T-points;upward_sea_water_velocity zos;sea_level;;m;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;ESM1.5;float32;432000;708;ocean_month.nc-;effective sea level (eta_t + patm/(rho0*g)) on T cells;sea_surface_height_above_geoid zossq;sea_level_sq;;m2;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;ESM1.5;float32;432000;708;ocean_month.nc-;square of effective sea level (eta_t + patm/(rho0*g)) on T cells;square_of_sea_surface_height_above_geoid +zostoga;pot_temp;calc_zostoga(var[0]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;ESM1.5;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change diff --git a/mappings/map_ocean_OM2.csv b/mappings/map_ocean_OM2.csv index add7919..1a0683d 100644 --- a/mappings/map_ocean_OM2.csv +++ b/mappings/map_ocean_OM2.csv @@ -80,3 +80,4 @@ wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;mon; wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;day;ocean;area: time: mean;;CM2_day;OM2;float32;21600000;708;ocean_daily.nc-;dia-surface velocity T-points;upward_sea_water_velocity zos;sea_level;;m;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;OM2;float32;432000;708;ocean_month.nc-;effective sea level (eta_t + patm/(rho0*g)) on T cells;sea_surface_height_above_geoid zossq;sea_level_sq;;m2;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;OM2;float32;432000;708;ocean_month.nc-;square of effective sea level (eta_t + patm/(rho0*g)) on T cells;square_of_sea_surface_height_above_geoid +zostoga;pot_temp;calc_zostoga(var[0]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;OM2;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change diff --git a/mappings/map_seaice_CM2.csv b/mappings/map_seaice_CM2.csv index 7c41eab..55f5631 100644 --- a/mappings/map_seaice_CM2.csv +++ b/mappings/map_seaice_CM2.csv @@ -15,7 +15,7 @@ sidconcth;sidconcth;var[0]*100;s-1;time nj ni;longitude latitude time;mon;seaIce sidmassdyn;sidmassdyn;;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from dynamics;tendency_of_sea_ice_amount_due_to_sea_ice_dynamics sidmassth;sidmassth;;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from thermodynamics;tendency_of_sea_ice_amount_due_to_sea_ice_thermodynamics sidmasslat;sidmasslat;var[0]/-1800.;kg m-2 s-1;longitude latitude time;time nj ni;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from lateral ice melt;tendency_of_sea_ice_amount_due_to_lateral_melting -sidmassevapsubl;sidmassevapsubl;var[0]*-1;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from evaporation and sublimation;water_evapotranspiration_flux +sidmassevapsubl;sidmassevapsubl;var[0]*-1;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;up;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from evaporation and sublimation;water_evapotranspiration_flux sidmassgrowthbot;sidmassgrowthbot;var[0]/1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from bottom growth;tendency_of_sea_ice_amount_due_to_congelation_ice_accumulation sidmassgrowthwat;sidmassgrowthwat;var[0]/1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from frazil growth;tendency_of_sea_ice_amount_due_to_frazil_ice_accumulation_in_leads sidmassmeltbot;sidmassmeltbot;var[0]/-1800;kg m-2 s-1;time nj ni;longitude latitude time;mon;seaIce;area: time: mean;;CMIP6_SImon;CM2;float32;432000;1200;iceh_m.;sea ice mass change from bottom ice melt;tendency_of_sea_ice_amount_due_to_basal_melting diff --git a/src/mopdata/access.db b/src/mopdata/access.db index 3dc3acc98988f204d3e0d3fa24953303f957867e..22b71665dda4c167bd71e31ff28a4982435bab45 100644 GIT binary patch delta 2823 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 DT4`S` delta 2423 zcmYjSeN@#&8lIWo_xHTN%SC|;LPCfjUb9Z+Ct6u1D3qEVQ7@2fwH=K-*@qPu^`5ma zL)rGNT~yp61Wj+aHCdcQt8L5OHafdoS*w(mp}Ur56jAQ}E}he9{+K^z-kIl__j%rT z;;pmet+SglnfJ5h^!W2H{IwK*?3 z7MI4oa{M&zb<4rA%Yvng#nwizZbboANQlfMY=OJVxznz(t~I;NLZij7^ar$lZL!*> z^pkmb;a6S}whee=aMGCo%v(V#_fCkHQ*8Lk`z@~j+A9$5*WOAQPoD8^$GgAtp1|sF zy~l(#=nbe@%p;t%OKLaEP!=0k(K^+XPLg){DgB`*BK#4&$lyh|rWfYp9)n+oH&eb> z){?};!x}FXlNevEq-cNGJR$ziRB$);X}m+6Hh3uAb2pO_q>ea8D0TAerGn@3xwcqU z!Y^jHw1lUN9i{w6TEI?`Fli&q_OjiD&ck-Mb_@e5AsHo#&3LPnwR{nbjb7S<%=4dnr_m%n`qH{ODfo26@o^&FZX~K%!S~VBWm#DH4P1hUc0n8V zg?$-I2SCNe<9(BcMPEClrJ~4=K)`23^IN=Lr6Hlb%YWz6$fg-1QF)&i;=4uu{dmJs z-s#boNE)e;UYLXg$Vj zA|9O+9N$Uk_vUTJ>tyE>KKub6wxLzFOyY@o6z9$|Cy3C~U zjJ}!NgOOaQ76XF+Ghwt-Z2gJ&WIvH6vn|#KWWRmC6QN6-x7}L$qo}wOfH9fk##GisVUU8IKzhqjIM+qWMzf? z4-vfsnui_RnQ|X*uss7=f*&To-H=yho8f?}c#9T>;wLlK4J%NazA#u)NXsTb-U7HPSnrIby6YyjC2H$ z4~a|Pe%5Lq42pDuIC0||Q|m#GzEY!4KuOtu6> zJxvyi-iBRDp-(!AU1{x7ZZ2|AuEp zWiPZ_j8&%!V-druqp;Tu(^6)H-70feP>e9rH-7LIYU|bGYPr&73>bC#+X3qVQThqA zXw13~qe(s+!~JkV=!Y~i-XKoorY<6!B|J^ke+xT@8{W)7kZBZy*jg<6AB4p<-@~g)PBn2R+D}=7R;~Gl zIo@d2@7I>8FS0i2oSH$aU&!|_qbX}XgI8I=1!w+2i&9b3s5jA{K8Hq{@pnLB0nrfPw@Tt U@S{2Y2E1UdpDQve{Lk6{0p_;Y;{X5v diff --git a/src/mopdata/access_dump.sql b/src/mopdata/access_dump.sql index e0a45cd..98bc0b5 100644 --- a/src/mopdata/access_dump.sql +++ b/src/mopdata/access_dump.sql @@ -2972,7 +2972,7 @@ INSERT INTO mapping VALUES('sidconcdyn','sidconcdyn','var[0]*100','s-1','time nj INSERT INTO mapping VALUES('sidconcth','sidconcth','var[0]*100','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_area_fraction_due_to_thermodynamics','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidivvel','sidivvel','','s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CM2_mon','CM2','divergence_of_sea_ice_velocity','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassdyn','sidmassdyn','','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_sea_ice_dynamics','map_seaice_CM2.csv'); -INSERT INTO mapping VALUES('sidmassevapsubl','sidmassevapsubl','var[0]*-1','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','water_evapotranspiration_flux','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sidmassevapsubl','sidmassevapsubl','var[0]*-1','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','up','CMIP6_SImon','CM2','water_evapotranspiration_flux','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassgrowthbot','sidmassgrowthbot','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_congelation_ice_accumulation','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmassgrowthwat','sidmassgrowthwat','var[0]/1800','kg m-2 s-1','time nj ni','longitude latitude time','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_frazil_ice_accumulation_in_leads','map_seaice_CM2.csv'); INSERT INTO mapping VALUES('sidmasslat','sidmasslat','var[0]/-1800.','kg m-2 s-1','longitude latitude time','time nj ni','mon','seaIce','area: time: mean','','CMIP6_SImon','CM2','tendency_of_sea_ice_amount_due_to_lateral_melting','map_seaice_CM2.csv'); @@ -3296,5 +3296,8 @@ INSERT INTO mapping VALUES('zos','sea_level','','m','time yt_ocean xt_ocean','lo INSERT INTO mapping VALUES('zossq','sea_level_sq','','m2','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','CM2','square_of_sea_surface_height_above_geoid','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('zossq','sea_level_sq','','m2','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','ESM1.5','square_of_sea_surface_height_above_geoid','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('zossq','sea_level_sq','','m2','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','OM2','square_of_sea_surface_height_above_geoid','map_ocean_OM2.csv'); +INSERT INTO mapping VALUES('zostoga','pot_temp','calc_zostoga(var[0])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','CM2','global_average_thermosteric_sea_level_change','map_ocean_CM2.csv'); +INSERT INTO mapping VALUES('zostoga','pot_temp','calc_zostoga(var[0])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','ESM1.5','global_average_thermosteric_sea_level_change','map_ocean_ESM1.5.csv'); +INSERT INTO mapping VALUES('zostoga','pot_temp','calc_zostoga(var[0])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','OM2','global_average_thermosteric_sea_level_change','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('ztp','fld_s30i453','','m','time lat lon','longitude latitude time','mon','aerosol','area: time: mean','','CMIP6_AERmon','CM2','tropopause_altitude','map_aerosol_CM2.csv'); COMMIT; diff --git a/src/mopdata/update_db.py.txt b/src/mopdata/update_db.py.txt index caed2bc..05f7d16 100644 --- a/src/mopdata/update_db.py.txt +++ b/src/mopdata/update_db.py.txt @@ -170,17 +170,6 @@ def bulk_update(conn, unprocessed=False): failed = [] suc_count = 0 fail_count = 0 - if os.path.isfile('success.csv') is True: - with open('success.csv', 'r') as f: - reader = csv.reader(f, delimiter=',') - for row in reader: - success.append((row[1], row[0], row[2])) - for f in success: - st = update_file(conn,f[0],f[1],f[2],'processed') - suc_count += st - print(f"{len(success)} successful files and {suc_count} updated\n") - else: - print("no success.csv file\n") if os.path.isfile('failed.csv') is True: with open('failed.csv', 'r') as f: reader = csv.reader(f, delimiter=',') @@ -192,6 +181,17 @@ def bulk_update(conn, unprocessed=False): print(f"{len(failed)} failed files and {fail_count} updated\n") else: print("no failed.csv file\n") + if os.path.isfile('success.csv') is True: + with open('success.csv', 'r') as f: + reader = csv.reader(f, delimiter=',') + for row in reader: + success.append((row[1], row[0], row[2])) + for f in success: + st = update_file(conn,f[0],f[1],f[2],'processed') + suc_count += st + print(f"{len(success)} successful files and {suc_count} updated\n") + else: + print("no success.csv file\n") return exp = sys.argv[1] diff --git a/src/mopdb/mopdb_class.py b/src/mopdb/mopdb_class.py index 22361b2..b4bcb0f 100644 --- a/src/mopdb/mopdb_class.py +++ b/src/mopdb/mopdb_class.py @@ -19,6 +19,7 @@ # last updated 03/10/2024 from pathlib import Path +from operator import itemgetter class FPattern(): """This class represent a file pattern with a set list of variables @@ -77,6 +78,33 @@ def list_files(indir, match): files = [x for x in Path(indir).rglob(f"*{match}*") if x.is_file() and '.nc' in str(x)] files.sort(key=lambda x:x.name) + # if files use month labels sort by month + files = FPattern.order_months(files, match) + return files + + + @staticmethod + def order_months(files, match): + """If files use month labels sort by month. This can be removed + once using only sensible dates. + + Check first file after removing pattern (match). Then build dict + assigning a numeric month version to each file. Finally sort by + these values and save as list. + """ + mlabels = {'jan': '01', 'feb': '02', 'mar': '03', 'apr': '04', + 'may': '05', 'jun': '06', 'jul': '07', 'aug': '08', + 'sep': '09', 'oct': '10', 'nov': '11', 'dec': '12'} + first = files[0].name.replace(match,'') + basedir = files[0].parent + if any(x in first for x in mlabels.keys()): + newlist = {} + for f in [x.name for x in files]: + for k,v in mlabels.items(): + if k in f: + newlist[f] = f.replace(k,v) + sorted_list = sorted(newlist.items(), key=itemgetter(1)) + files = [basedir/Path(x[0]) for x in sorted_list] return files diff --git a/src/mopdb/mopdb_map.py b/src/mopdb/mopdb_map.py index 7afbb2a..753391e 100644 --- a/src/mopdb/mopdb_map.py +++ b/src/mopdb/mopdb_map.py @@ -175,7 +175,7 @@ def write_varlist(conn, indir, version, alias): if len(fobj.files) == 1: fnext = None else: - fnext = str(fobj.files[1]) + fnext = fobj.files[1] if fobj.frequency == 'NAfrq' or fobj.realm == 'atmos': frq_dict = get_file_frq(ds, fnext, int2frq) # if only one frequency detected empty dict diff --git a/src/mopper/calc_ocean.py b/src/mopper/calc_ocean.py index 515ab87..a25a5f6 100644 --- a/src/mopper/calc_ocean.py +++ b/src/mopper/calc_ocean.py @@ -37,6 +37,8 @@ import numpy as np import dask import logging +import gsw + from importlib.resources import files as import_files from mopdb.utils import read_yaml, MopException @@ -207,8 +209,6 @@ def calc_overt(ctx, varlist, sv=False): sv: bool If True units are sverdrup and they are converted to kg/s (default is False) - varlist: list( DataArray ) - transport components to use to calculate streamfunction Returns ------- @@ -247,6 +247,48 @@ def calc_overt(ctx, varlist, sv=False): return overt +@click.pass_context +def calc_zostoga(ctx, ptemp): + """Returns Global Average Thermosteric Sea Level Change + + See https://github.com/ACCESS-Community-Hub/ACCESS-MOPPeR/issues/182 + for details. + NB. no one tested if this gives correct results yet!!! + + Parameters + ---------- + ctx : click context + Includes obj dict with 'cmor' settings, exp attributes + ptemp: DataArray + Potential temperature + + Returns + ------- + zostoga: DataArray + Global Average Thermosteric Sea Level Change (time) variable + + """ + var_log = logging.getLogger(ctx.obj['var_log']) + t, d, la, lo = ptemp.dims + depth = ptemp[d] + lat = ptemp[la] + areacello = get_areacello() + # press is absolute pressure minus 10.1325 dbar + press = gsw.conversions.p_from_z(depth, lat) + # constant salinity 35.00 + cso35 = xr.full_like(ptemp, 35.00) + # constant temperature 4.00 + ctemp4 = xr.full_like(ptemp, 4.00) + rho = gsw.density.rho(cso35, ptemp, press) + rho4 = gsw.density.rho(cso35, ctemp4, press) + tmp = ((1. - rho35/rho4) * depth).sum(dim=d) + # reindex to avoid small differences in coordinates values + areacello = areacello.reindex_like(tmp, method='nearest') + zostoga = ((tmp * areacello).sum(dim=[la, lo]) / + areacello.sum(dim=[la, lo], skipna=True)) + return zostoga + + @click.pass_context def get_areacello(ctx, area_t=None): """Returns areacello diff --git a/src/mopper/calc_seaice.py b/src/mopper/calc_seaice.py index fc20567..9f4a1e3 100644 --- a/src/mopper/calc_seaice.py +++ b/src/mopper/calc_seaice.py @@ -514,7 +514,7 @@ def __del__(self): self.gridfile.close() -def calc_hemi_seaice(invar, carea, hemi, extent=False): +def calc_hemi_seaice(invar, tarea, hemi, extent=False): """Calculate seaice properties (volume, area and extent) over hemisphere. @@ -522,7 +522,7 @@ def calc_hemi_seaice(invar, carea, hemi, extent=False): ---------- invar : Xarray DataArray Variable to process, either fraction (aice) or volume (hi) - carea : Xarray DataArray + tarea : Xarray DataArray Grid cell area hemi : str Assigning the hemisphere to calculate, either 'north' or'south'. diff --git a/src/mopper/mop_setup.py b/src/mopper/mop_setup.py index 29e499a..2f36dff 100755 --- a/src/mopper/mop_setup.py +++ b/src/mopper/mop_setup.py @@ -37,7 +37,7 @@ from mopdb.utils import read_yaml, write_yaml, MopException -def find_matches(table, var, realm, frequency, varlist): +def find_matches(table, var, realm, frequency, mappings): """Finds variable matching constraints given by table and config settings and returns a dictionary with the variable specifications. @@ -58,7 +58,7 @@ def find_matches(table, var, realm, frequency, varlist): Variable realm to match frequency : str Variable frequency to match - varlist : list + mappings : list List of variables, each represented by a dictionary with mappings used to find a match to "var" passed Returns @@ -73,13 +73,13 @@ def find_matches(table, var, realm, frequency, varlist): found = False match = None mop_log.debug(f"Looking for: {var}, {frequency}, {realm}") - for v in varlist: + for v in mappings: mop_log.debug(f"{v['cmor_var']}, {v['frequency']}, {v['realm']}") if v['cmor_var'].startswith('#'): pass elif (v['cmor_var'] == var and v['realm'] in realm.split() and v['frequency'] == frequency): - match = v + match = v.copy() found = True elif (v['cmor_var'].replace('_Pt','') == var and v['realm'] in realm.split()): @@ -87,7 +87,7 @@ def find_matches(table, var, realm, frequency, varlist): if found is False and frequency != 'fx': v = find_nearest(near_matches, frequency) if v is not None: - match = v + match = v.copy() found = True else: mop_log.info(f"could not find match for {table}-{var}" + @@ -158,10 +158,10 @@ def find_nearest(varlist, frequency): vfrq = v['frequency'].replace('Pt','').replace('C','') mop_log.debug(f"Var: {v}, var frq: {vfrq}") if vfrq == frq: - v['resample'] = resample_frq[freq] - v['nsteps'] = adjust_nsteps(v, freq) + var = v.copy() + var['resample'] = resample_frq[freq] + var['nsteps'] = adjust_nsteps(var, freq) found = True - var = v break if found: break @@ -250,7 +250,7 @@ def setup_env(ctx): # if we can read dreq as any other variable list # and change year start end according to experiment @click.pass_context -def var_map(ctx, activity_id=None): +def variable_mapping(ctx, activity_id=None): """Compares list of variables request by user to ones available in mappings file, call functions to define corresponding files. @@ -322,7 +322,7 @@ def create_var_map(ctx, table, mappings, varsel, activity_id=None, selection=None): """Create a mapping file for this specific experiment based on model ouptut mappings, variables listed in table/s passed by config. - Called by var_map + Called by variable_mappings Parameters ---------- diff --git a/src/mopper/mopper.py b/src/mopper/mopper.py index ad7004b..bceba70 100644 --- a/src/mopper/mopper.py +++ b/src/mopper/mopper.py @@ -39,7 +39,7 @@ load_data, get_cmorname, create_axis, hybrid_axis, ij_axis, ll_axis, define_grid, get_coords, get_axis_dim, require_bounds, get_bounds, get_attrs, extract_var, define_attrs) -from mopper.mop_setup import setup_env, var_map, manage_env +from mopper.mop_setup import setup_env, variable_mapping, manage_env from mopper.setup_utils import (create_exp_json, write_config, populate_db, count_rows, sum_file_sizes, filelist_sql, write_job) from mopdb.utils import db_connect, create_table, query, MopException @@ -191,9 +191,9 @@ def mop_setup(ctx, cfile, debug, update): ctx.obj['json_file_path'] = fname if ctx.obj['mode'] == 'cmip6': edit_json_cv(json_cv, ctx.obj['attrs']) - ctx = var_map(ctx.obj['attrs']['activity_id']) + ctx = variable_mapping(ctx.obj['attrs']['activity_id']) else: - ctx = var_map() + ctx = variable_mapping() # setup database table database = ctx.obj['database'] mop_log.info(f"creating & using database: {database}") diff --git a/tests/test_mopdb_utils.py b/tests/test_mopdb_utils.py index 851f916..06514e5 100644 --- a/tests/test_mopdb_utils.py +++ b/tests/test_mopdb_utils.py @@ -47,45 +47,51 @@ def test_get_date_pattern(caplog): def test_identify_patterns(caplog): # test CM2 style run with p7/p8 files - files = ['cw323a.pm095103_mon.nc', 'cw323a.pm095106_mon.nc', 'cw323a.pm095109_mon.nc', - 'cw323a.pm095112_mon.nc', 'ocean_month.nc-09961231', 'cw323a.p7095103_mon.nc', - 'cw323a.p8095103_mon.nc', 'cw323a.pd095106_dai.nc', - 'ocean_daily.nc-09981231', 'ocean_daily.nc-10001231', 'ocean_month.nc-09971231', - 'ocean_scalar.nc-09991231', 'ocean_scalar.nc-09991231', - 'iceh_d.1000-01.nc', 'iceh_m.1000-01.nc', 'iceh_d.0999-12.nc', 'iceh_m.0999-12.nc' - 'iceh_d.1000-02.nc', 'iceh_m.1000-02.nc', 'iceh_d.0999-11.nc', 'iceh_m.0999-11.nc'] + files = ['/atm/cw323a.pm095103_mon.nc', '/atm/cw323a.pm095106_mon.nc', '/atm/cw323a.pm095109_mon.nc', + '/atm/cw323a.pm095112_mon.nc', '/ocn/ocean_month.nc-09961231', '/atm/cw323a.p7095103_mon.nc', + '/atm/cw323a.p8095103_mon.nc', '/atm/cw323a.pd095106_dai.nc', + '/ocn/ocean_daily.nc-09981231', '/ocn/ocean_daily.nc-10001231', '/ocn/ocean_month.nc-09971231', + '/ocn/ocean_scalar.nc-09991231', '/ocn/ocean_scalar.nc-09991231', + '/ice/iceh_d.1000-01.nc', '/ice/iceh_m.1000-01.nc', '/ice/iceh_d.0999-12.nc', '/ice/iceh_m.0999-12.nc', + '/ice/iceh_d.1000-02.nc', '/ice/iceh_m.1000-02.nc', '/ice/iceh_d.0999-11.nc', '/ice/iceh_m.0999-11.nc'] paths = [Path(x) for x in sorted(files)] - patterns = identify_patterns(paths) + patterns, patpaths = identify_patterns(paths) assert patterns == ['cw323a.p7', 'cw323a.p8', 'cw323a.pd', 'cw323a.pm', 'iceh_d.', 'iceh_m.', 'ocean_daily', 'ocean_month', 'ocean_scalar'] + assert patpaths == [Path(x) for x in ['/atm', '/atm', '/atm', '/atm', '/ice', '/ice', '/ocn', + '/ocn', '/ocn']] # test CM2 style ocean & ice run with only 1 file - files = ['ocean_daily.nc-09981231', 'ocean_month.nc-09971231', - 'ocean_scalar.nc-09991231', 'iceh_d.1000-01.nc', 'iceh_m.1000-01.nc'] + files = ['/ocn/ocean_daily.nc-09981231', '/ocn/ocean_month.nc-09971231', + '/ocn/ocean_scalar.nc-09991231', '/ice/iceh_d.1000-01.nc', '/ice/iceh_m.1000-01.nc'] paths = [Path(x) for x in sorted(files)] - patterns = identify_patterns(paths) + patterns, patpaths = identify_patterns(paths) assert patterns == ['iceh_d', 'iceh_m.1000-01.nc', 'ocean_d', 'ocean_m', 'ocean_scalar.nc-09991231'] + assert patpaths == [Path(x) for x in ['/ice', '/ice', '/ocn', '/ocn', '/ocn']] # test AUS2200 style files - files = ['umnsa_cldrad_20220222T0000.nc', 'umnsa_mdl_20220222T0200.nc', + files = ["/atm/"+x for x in ['umnsa_cldrad_20220222T0000.nc', 'umnsa_mdl_20220222T0200.nc', 'umnsa_slv_20220222T0400.nc', 'umnsaa_pa000.nc', 'umnsa_cldrad_20220222T0100.nc', 'umnsa_mdl_20220222T0300.nc', 'umnsa_slv_20220222T0500.nc', 'umnsaa_pvera000.nc', 'umnsa_cldrad_20220222T0200.nc', 'umnsa_mdl_20220222T0400.nc', 'umnsa_spec_20220222T0000.nc', 'umnsaa_pverb000.nc', 'umnsa_spec_20220222T0100.nc', 'umnsaa_pverc000.nc', 'umnsaa_pverd000.nc', 'umnsa_cldrad_20220222T0500.nc', - 'umnsa_mdl_20220222T0100.nc', 'umnsa_slv_20220222T0300.nc', 'umnsa_spec_20220222T0500.nc'] + 'umnsa_mdl_20220222T0100.nc', 'umnsa_slv_20220222T0300.nc', 'umnsa_spec_20220222T0500.nc']] paths = [Path(x) for x in sorted(files)] - patterns = identify_patterns(paths) + patterns, patpaths = identify_patterns(paths) assert patterns == ['umnsa_cldrad_', 'umnsa_mdl_', 'umnsa_slv_', 'umnsa_spec_', 'umnsaa_pa', 'umnsaa_pvera', 'umnsaa_pverb', 'umnsaa_pverc', 'umnsaa_pverd000.nc'] + assert patpaths == 9*[Path('/atm')] # test patterns with jan, feb labels - files = ['br565Wa.pd0989apr.nc', 'br565Wa.pd0989aug.nc', 'br565Wa.pd0988apr.nc', 'br565Wa.pd0988aug.nc'] + files = ['/a/br565Wa.pd0989apr.nc', '/a/br565Wa.pd0989aug.nc', '/a/br565Wa.pd0988apr.nc', '/a/br565Wa.pd0988aug.nc'] paths = [Path(x) for x in sorted(files)] - patterns = identify_patterns(paths) + patterns, patpaths = identify_patterns(paths) assert patterns == ['br565Wa.pd'] + assert patpaths == [Path('/a')] # test patterns with T and/or "-' in stem works files = ['b56Ta-so.pd0989apr.nc', 'b56Ta-so.pd0989aug.nc', 'b56Ta-so.pd0988apr.nc', 'b56Ta-so.pd0988aug.nc'] paths = [Path(x) for x in sorted(files)] - patterns = identify_patterns(paths) + patterns, patpaths = identify_patterns(paths) assert patterns == ['b56Ta-so.pd'] + assert patpaths == [Path('')] From d89381142000a1f39c7edc4965d467e49cecd4f5 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Fri, 6 Dec 2024 16:08:12 +1100 Subject: [PATCH 13/17] completed calc_zostoga #182, update to get_coords #215, #216, #212 --- ACDD_conf.yaml | 6 ++++- CMIP6_conf.yaml | 6 ++++- mappings/map_ocean_CM2.csv | 2 +- mappings/map_ocean_ESM1.5.csv | 2 +- mappings/map_ocean_OM2.csv | 2 +- src/mopdata/access.db | Bin 1200128 -> 1204224 bytes src/mopdata/access_dump.sql | 12 ++++----- src/mopdb/mopdb.py | 4 +-- src/mopdb/mopdb_class.py | 26 +++++++++++-------- src/mopper/calc_ocean.py | 31 ++++++++++++++-------- src/mopper/calc_seaice.py | 24 ++++++++++++----- src/mopper/calc_utils.py | 47 ++++++++++++++++++++++++++++++++++ src/mopper/mop_utils.py | 20 +++++++-------- src/mopper/mopper.py | 10 +++++--- 14 files changed, 138 insertions(+), 54 deletions(-) diff --git a/ACDD_conf.yaml b/ACDD_conf.yaml index 986aef8..8ed17f3 100755 --- a/ACDD_conf.yaml +++ b/ACDD_conf.yaml @@ -76,7 +76,11 @@ cmor: # you can usually leave these empty if processing only atmos # ancillary files relative path to or fullpath ancils_path: "localdata/ancils" - grid_ocean: "" + # grid ocean is the auscom grid file t retrieve lat/lon and their vertices + # example is for om2, cm2, esm1.5 versions + grid_ocean: "grid_spec.auscom.20110618.nc" + # grid om is the om2_grid file used in get_areacello + grid_om: "om2_grid.nc" grid_seaIce: "" mask_ocean: "" # to supply land area fraction if not available in output diff --git a/CMIP6_conf.yaml b/CMIP6_conf.yaml index 3cfea7c..d65267f 100755 --- a/CMIP6_conf.yaml +++ b/CMIP6_conf.yaml @@ -69,7 +69,11 @@ cmor: # you can usually leave these empty if processing only atmos # ancillary files relative path to or fullpath ancils_path: "localdata/ancils" - grid_ocean: "" + # grid ocean is the auscom grid file t retrieve lat/lon and their vertices + # example is for om2, cm2, esm1.5 versions + grid_ocean: "grid_spec.auscom.20110618.nc" + # grid om is the om2_grid file used in get_areacello + grid_om: "om2_grid.nc" grid_seaIce: "" mask_ocean: "" # to supply land area fraction if not available in output diff --git a/mappings/map_ocean_CM2.csv b/mappings/map_ocean_CM2.csv index 67dd422..3eb7c45 100644 --- a/mappings/map_ocean_CM2.csv +++ b/mappings/map_ocean_CM2.csv @@ -81,4 +81,4 @@ wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;mon; wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;day;ocean;area: time: mean;;CM2_day;CM2;float32;21600000;708;ocean_daily.nc-;dia-surface velocity T-points;upward_sea_water_velocity zos;sea_level;;m;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;708;ocean_month.nc-;effective sea level (eta_t + patm/(rho0*g)) on T cells;sea_surface_height_above_geoid zossq;sea_level_sq;;m2;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;CM2;float32;432000;708;ocean_month.nc-;square of effective sea level (eta_t + patm/(rho0*g)) on T cells;square_of_sea_surface_height_above_geoid -zostoga;pot_temp;calc_zostoga(var[0]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;CM2;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change +zostoga;pot_temp dht;calc_zostoga(var[0], var[1]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;CM2;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change diff --git a/mappings/map_ocean_ESM1.5.csv b/mappings/map_ocean_ESM1.5.csv index 7bae65b..89a9f0a 100644 --- a/mappings/map_ocean_ESM1.5.csv +++ b/mappings/map_ocean_ESM1.5.csv @@ -80,4 +80,4 @@ wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;mon; wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;day;ocean;area: time: mean;;CM2_day;ESM1.5;float32;21600000;708;ocean_daily.nc-;dia-surface velocity T-points;upward_sea_water_velocity zos;sea_level;;m;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;ESM1.5;float32;432000;708;ocean_month.nc-;effective sea level (eta_t + patm/(rho0*g)) on T cells;sea_surface_height_above_geoid zossq;sea_level_sq;;m2;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;ESM1.5;float32;432000;708;ocean_month.nc-;square of effective sea level (eta_t + patm/(rho0*g)) on T cells;square_of_sea_surface_height_above_geoid -zostoga;pot_temp;calc_zostoga(var[0]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;ESM1.5;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change +zostoga;pot_temp dht;calc_zostoga(var[0], var[1]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;ESM1.5;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change diff --git a/mappings/map_ocean_OM2.csv b/mappings/map_ocean_OM2.csv index 1a0683d..e66a272 100644 --- a/mappings/map_ocean_OM2.csv +++ b/mappings/map_ocean_OM2.csv @@ -80,4 +80,4 @@ wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;mon; wo;wt;;m/sec;time sw_ocean yt_ocean xt_ocean;longitude latitude olevel time;day;ocean;area: time: mean;;CM2_day;OM2;float32;21600000;708;ocean_daily.nc-;dia-surface velocity T-points;upward_sea_water_velocity zos;sea_level;;m;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;OM2;float32;432000;708;ocean_month.nc-;effective sea level (eta_t + patm/(rho0*g)) on T cells;sea_surface_height_above_geoid zossq;sea_level_sq;;m2;time yt_ocean xt_ocean;longitude latitude time;mon;ocean;area: time: mean;;CMIP6_Omon;OM2;float32;432000;708;ocean_month.nc-;square of effective sea level (eta_t + patm/(rho0*g)) on T cells;square_of_sea_surface_height_above_geoid -zostoga;pot_temp;calc_zostoga(var[0]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;OM2;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change +zostoga;pot_temp dht;calc_zostoga(var[0], var[1]);m;time st_ocean yt_ocean xt_ocean;time;mon;ocean;area: mean where sea time: mean;;CMIP6_Omon;OM2;float32;21600000;708;ocean_month.nc-;Global Average Thermosteric Sea Level Change;global_average_thermosteric_sea_level_change diff --git a/src/mopdata/access.db b/src/mopdata/access.db index 22b71665dda4c167bd71e31ff28a4982435bab45..779971cc818f3119bf36a7921fcd30a7bdec6805 100644 GIT binary patch delta 2472 zcmZWq32+rv7JaX~f3Ls0-|Y}0A=_t5fbdCBq{J|1~d5K;Ic;8KFgNCe9%;fL^R z009#tT#4T2FSio(1PI5ktgs_uGymve95 zd)|HF%CX_bv8C~jYZF5I+w>!d&e}?FNsH<_>1;QwD#Cwrd1iQH)cRfS&UC-SfLcXj zs7Ivf&LaC2f1WkY+;65D6^5mKtuLV;YY$?NYwokbZ5y6L9zq1W963dPJ#32y(Z^i_1B zYRc_opR!Rq{b2%oM^lVJB(ZE*HymWJqu8pkJ@lyXJH)RVET$`1TS*+rCw2#=_QU=~ z)tX7-)xj9z4v(D~=$`e;4hBhf1J1+NB%#+Zpa=CP}%(qt&vA)LVZ=OGnno;^fn^ z!}~R|fs!OEIO_zfHr21leR6Q+&ul5>YyQHfOHrV4qJ(24+MTy;h2d04Xe_@x9J*6p zc8V3M1B8i3ZxDB;Q)3^unLpRsZC*Er8*BB8dO&+#-R0Y$ER%;xTj&is6+gWRu{h#W zHs?TQc$z526;_SaeZ5qk{slWsxzNN>Uj8`)%CUt}A8tR(dZX3C*5X%}ST7D|*>ZV9 zB`CX;R+hrz$Ud3uv)ZlE^ha}-acez;&Cwpz@L3dI)Maz4XxLKcA-qF9z#I$Kt0G_V zV7modahnO-ah~fjJksA=M+sl;hZ0%)Njhd+S03eE7^F&yGLWngH3;)#9u!i)mPq^p zb{ik(lgh1~=czN4awC-GuB7&y5H zEWz19(0Kj;kSL#(4my>@uVrMjTV>fkwK&U->zRz#53m4V6NFd6mM#-U&JmfCbM!o# zSrA_y$QXb*S+G!0+T*vMa0SqbEHDL7PoYajkxeK6VFXzIRFAX~(k9=L^Zc*T61#^p zR|?oCe50h}u5QgYCm2KY1Wof{AmkjzrBlU0cs%I6hI!Kz0*cR-3XhQ?J*4(&nkJ`|6a-$_ROztVz$&(=pMd9V^UJP&*DQXV9s?`1)SoT%(y&p|b=jeeHQg?b$R0vwF)dPk4->Vt(qS*CnQ zaDE(d8k~6hRsR?MN38YcRr4vMLN@gn{fO2_>Z^|S&86d%Qepa}bVhXc0m`8m8Yx~~ z340aYCe0$bbG&o~ydkUZ%)6wlSOtA?*|#toue>Enajh60$8js6if>*8M|{!KxLY{w z@J!!+F`I`;ZcrOSh8aWE0(4p-fd^Y*g-_A{O8zL!8gSiJIE7;x*xxbfpRh+U1Ef&M z7hvqy&`#?ykfPV}v+b~4#*+qIz_JxE02hW~M-P*>5t}p-DTXv@tIFAX86%fVf0JDL5SgQnjnYytp5}J%9f%o;rI+CW zC1u_VMY#Jiq-g0Wi}PNYm5H}6K}r9~69)zJ7cDN%joNk_>5h+$i5qXvAN+d3qN0N5 z^9l=!<`m6eSa{d_Odp7iy{|}%Vq`q~zgW2GrfX@x4tnL%{|9{&r(S`*IH6e(Bl`^0 z@!AV8h8hkh#@(rav<1qs`z5HtJ7?g1yi&|Gob(w~;Fhz3S|y)DJAbDIiYUf?0X3*y zfSuU>8Fb)+^H38lXN{=tPAqJ675v9J*t8+U6z2ID@i9F^D^)wy*}lVEFNL2Joc^sq z@D{rANe6I7o29qh3sscOCE1tcf_!+zf9(E+xTS4m#bqR~rXRCK8B;>R5?3j+EN z#8f+}xE+$*x%wEj)BmG?v{PsPU{25~jatLcA;WD}C8}coDQpK;_4UN1L@lh@%W4&? zlKep+?#Ekc-ex|bpErZjT|!VL(L}604!y7--CHI(G5lJ(*IUe{3ZZ;Yq8hg4vpPO^ zp!Ysgt+Avl%|k8AOIB%~f39_gr)PPCDF!BaN!a<6Hx+-L=*4Rz?lFdcH_V%1M9aNW kfUUS^)ja9G6*{9l9p9YjCGzkDFDysXAMPB;3jc}z2X@f^8UO$Q delta 2615 zcma)8X>=7u7Ov{<_j>QH+b_!ymgIpU0b&-M=#j-F69gkf!YCjhUUAu5ZkQAbCCg8@W95vCsC5C3?kepJ6c)phH; z_xtL*ueL3(c4c0Doa1iXzsqA)~f|OLx213{$)Y$U{VZ#D5r#0=IxaRN&6@WBD*Q8CQ&VtFUAz zTh5&a-SZff#))sAAmjcVvFsMRyp*<{#YW`P@rx zqw1)gw8C%5C&`=2OZvbqJ=hDXqCG{@8-nR6{<@$_dVcR@62Ayr}Nx>M6$L(Li8pD}GZjjpz2fYO8ScbrP>UK6#q2CGQ zXXu3pamXZT0`X`|WM`uGsCpZ+HWn+tCo8;v8%vWUWj;>Y#ag)Y9-BvX{})6TXb9np z|G~yfvQ|w{NUK1i-T9qeFoYUn?Z&y$*tre{Vg6s?FkiBpRr%BCMB1pk2`*VAs^|<+=3C4IGeGMd6eNFYbk`1Thgl+@ zca+VSdE#uD+PBkb9AuN`2%h=g~Fbl=7c9jv7>+f~*n zoh-qM7Fdi`^hfigIc!-JG&N+`Zr~FsJgniESK&C`W5Q~@qC+!2AgIDuEU*!MUKzSJ zL}9iG8jh7c#>K)cS?!W`>SvWS9>pL@QhY1OLUCj*-|0aWMKLGg-XyOayA)H$t_;=< zzl(w$mfDk8ky1tmeZYiA)fX#`06i;88B3 zSQO7ELWFj5{XXzXDWFmOXP+CJv+%AypkwC%c+6jy?Z)CE2$2VMRcQv!r7^UB#^-xvcY2~1ZGoE76{m_fA8UuI8@(xld zaw+G-$HD;>cTI*~m^~ThM_kg0)bhrti*W;iV4z=gaBv{@R(o(pO=Wd;bq%&Zz`83X zrDeI8F@)WMtwSM3DlNiQJMAbOGQ{)v)G4r*rjn<$9BIDujQ=#f)BajrMvvNqtp@Xi zIl`E%FLl$ji~f1|D1m)jtAMf$se?q3EaJT7 z#M!g0gVvqqGUJRfOkb{@aUaxdwJ+`RkMK>Upw!FTNS4%r!4+_V-&+T5G(zux1-LKq z$#>ZyUcV3?m+|dI@CBL+U;|(NlrVf0b3c4`Amn4~F;~NDZ!sNTUIf9$5K|OO+e3I% zCtOh?ZR1}u-}4RJp$0`=jIYy#MEwKvB_5K<1x2CGb82NgGZ@$zd52sh{IOR(^ zS{vn#v3HVMXOWIUW{lSA^4;z|gWWQ5NC*55>r)^aD>}fD`c+_ijvJ33?t>y+yqcMq z_bF_|sVAT>t~&^i;(Lcg;S&yt^2Qy5^NQL|{8)GbR$=*Pa0;E{Vs-Zsctf!+ki`P~ zli2Wy;OE{0uoT%5Na6Dj!#xydABARq=~MADQrScy`XC-T0BdtbL|_Fn-I39O*pYT= z+Mg?{Ybwi%sw!&=Yf3Asa`W>FZZ8~NQ8_a=e_(OZjN-zZA0*Eynl&kX@-OiJ@-a;R z|6_@k@*A;4DW>CBAH&~L4Z&dy$&pBo9_>75beJoAj@@EwRvAsD`<0pU2XegDOPXy2 z-Erzdo>~tJeSFH-P$6Obi|~e|U%~WNmKW(GC+Ur(=e@;RdB@AJK&C@6Sg#Gjsz&$# z=PZTfUrQ+wSEe#mGn8(G(b=MRc0o`kq-k?TZ63vf3y_I>*9)8NjP?{v{Q>-Z!Z}!P zOZ3_@)eDNpmj2#;ia+T9IKc55`C7@l)udg5qtm?2@p2$ue~}p4Wx)sS~bz4>2A#gitikZ4cb z&cH6#Y+^f=Er$|6usRX19OD}s2OS1iMV|=8;3s^uykIM<~6ZM|BIpL zP|fz@{pMk7s+q@Avb{_yKrG?say-%MI!1a+ll<2$%8tEZQJERl5sRw+l~~eK)6?;h oEOAK0sRE@%3DvV_O)DxcO{gxKF@5Irnn&?$Zx-Oiqr4{he|aG?DF6Tf diff --git a/src/mopdata/access_dump.sql b/src/mopdata/access_dump.sql index 98bc0b5..0bd0981 100644 --- a/src/mopdata/access_dump.sql +++ b/src/mopdata/access_dump.sql @@ -2405,7 +2405,7 @@ INSERT INTO mapping VALUES('clw','fld_s00i254','level_to_height(var[0],levs=(0,6 INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','CM2','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_CM2.csv'); INSERT INTO mapping VALUES('clw','fld_s02i308','level_to_height(var[0])','1','time model_theta_level_number lat lon','longitude latitude alevel time','mon','atmos','area: time: mean','','CMIP6_Amon','ESM1.5','mass_fraction_of_stratiform_cloud_liquid_water_in_air','map_atmos_ESM1.5.csv'); INSERT INTO mapping VALUES('clwvol','fld_s00i267','level_to_height(var[0],levs=(0,66))','1','time model_theta_level_number lat lon','longitude latitude alevel time1','1hrPt','atmos','area: time: point','','AUS2200_A1hr','AUS2200','liquid_cloud_volume_fraction_in_atmosphere_layer','map_AUS2200.csv'); -INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('cmor_var','input_vars','calculation','units','dimensions','axes','frequency','realm','cell_methods','positive','cmor_table','version','standard_name','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','CM2','area_fraction','map_land_CM2.csv'); INSERT INTO mapping VALUES('cropFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typecrop'')','1','time lat lon','longitude latitude time typecrop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Lmon','ESM1.5','area_fraction','map_land_ESM1.5.csv'); INSERT INTO mapping VALUES('cropFracC3','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],9,landfrac=var[1],lev=''typec3crop'')','1','time pseudo_level_1 lat lon','longitude latitude time typec3crop','mon','land','area: mean where land over all_area_types time: mean','','CMIP6_Emon','CM2','area_fraction','map_land_CM2.csv'); @@ -3058,7 +3058,7 @@ INSERT INTO mapping VALUES('sob','bottom_salt','','psu','time yt_ocean xt_ocean' INSERT INTO mapping VALUES('sos','sss','','psu','time yt_ocean xt_ocean','longitude latitude time','day','ocean','area: time: mean','','CMIP6_Oday','CM2','sea_surface_salinity','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('sos','sss','','psu','time yt_ocean xt_ocean','longitude latitude time','day','ocean','area: time: mean','','CMIP6_Oday','ESM1.5','sea_surface_salinity','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('sos','sss','','psu','time yt_ocean xt_ocean','longitude latitude time','day','ocean','area: time: mean','','CMIP6_Oday','OM2','sea_surface_salinity','map_ocean_OM2.csv'); -INSERT INTO mapping VALUES('sos','sss','','0.001','time nj ni','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','CM2','sea surface salinity','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('sos','sss','','psu','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','CM2','sea_surface_salinity','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('sos','sss','','psu','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','ESM1.5','sea_surface_salinity','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('sos','sss','','psu','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','OM2','sea_surface_salinity','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('storm','fld_s21i101','','1','time lat lon','longitude latitude time1','10minPt','atmos','area: time: point','','AUS2200_A10min','AUS2200','flag_for_location_of_storms','map_AUS2200.csv'); @@ -3144,7 +3144,7 @@ INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','K','time yt_ocean xt_oc INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','K','time yt_ocean xt_ocean','longitude latitude time','day','ocean','area: time: mean','','CMIP6_Oday','CM2','sea_surface_temperature','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','K','time yt_ocean xt_ocean','longitude latitude time','day','ocean','area: time: mean','','CMIP6_Oday','ESM1.5','sea_surface_temperature','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','K','time yt_ocean xt_ocean','longitude latitude time','day','ocean','area: time: mean','','CMIP6_Oday','OM2','sea_surface_temperature','map_ocean_OM2.csv'); -INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','degC','time nj ni','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','CM2','sea surface temperature','map_seaice_CM2.csv'); +INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','K','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','CM2','sea_surface_temperature','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','K','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','ESM1.5','sea_surface_temperature','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('tos','sst','K_degC(var[0])','K','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','OM2','sea_surface_temperature','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('treeFrac','fld_s03i317 fld_s03i395','extract_tilefrac(var[0],[1,2,3,4],landfrac=var[1],lev=''typetree'')','%','time pseudo_level_0 lat lon','longitude latitude time typetree','mon','land','area: time: mean','','CMIP6_Lmon','AM3','SURFACE TILE FRACTIONS','map_land_AM3.csv'); @@ -3296,8 +3296,8 @@ INSERT INTO mapping VALUES('zos','sea_level','','m','time yt_ocean xt_ocean','lo INSERT INTO mapping VALUES('zossq','sea_level_sq','','m2','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','CM2','square_of_sea_surface_height_above_geoid','map_ocean_CM2.csv'); INSERT INTO mapping VALUES('zossq','sea_level_sq','','m2','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','ESM1.5','square_of_sea_surface_height_above_geoid','map_ocean_ESM1.5.csv'); INSERT INTO mapping VALUES('zossq','sea_level_sq','','m2','time yt_ocean xt_ocean','longitude latitude time','mon','ocean','area: time: mean','','CMIP6_Omon','OM2','square_of_sea_surface_height_above_geoid','map_ocean_OM2.csv'); -INSERT INTO mapping VALUES('zostoga','pot_temp','calc_zostoga(var[0])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','CM2','global_average_thermosteric_sea_level_change','map_ocean_CM2.csv'); -INSERT INTO mapping VALUES('zostoga','pot_temp','calc_zostoga(var[0])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','ESM1.5','global_average_thermosteric_sea_level_change','map_ocean_ESM1.5.csv'); -INSERT INTO mapping VALUES('zostoga','pot_temp','calc_zostoga(var[0])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','OM2','global_average_thermosteric_sea_level_change','map_ocean_OM2.csv'); +INSERT INTO mapping VALUES('zostoga','pot_temp dht','calc_zostoga(var[0], var[1])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','CM2','global_average_thermosteric_sea_level_change','map_ocean_CM2.csv'); +INSERT INTO mapping VALUES('zostoga','pot_temp dht','calc_zostoga(var[0], var[1])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','ESM1.5','global_average_thermosteric_sea_level_change','map_ocean_ESM1.5.csv'); +INSERT INTO mapping VALUES('zostoga','pot_temp dht','calc_zostoga(var[0], var[1])','m','time st_ocean yt_ocean xt_ocean','time','mon','ocean','area: mean where sea time: mean','','CMIP6_Omon','OM2','global_average_thermosteric_sea_level_change','map_ocean_OM2.csv'); INSERT INTO mapping VALUES('ztp','fld_s30i453','','m','time lat lon','longitude latitude time','mon','aerosol','area: time: mean','','CMIP6_AERmon','CM2','tropopause_altitude','map_aerosol_CM2.csv'); COMMIT; diff --git a/src/mopdb/mopdb.py b/src/mopdb/mopdb.py index dd26405..c57a8ad 100644 --- a/src/mopdb/mopdb.py +++ b/src/mopdb/mopdb.py @@ -497,7 +497,8 @@ def model_vars(ctx, fpath, dbname, version, alias): @mopdb.command(name='del') @click.option('--dbname', type=click.Path(exists=True), required=True, help='Database relative path') -@click.option('--table', '-t', type=str, required=True, +@click.option('--table', '-t', required=True, + type=click.Choice(['cmorvar', 'mapping']), help='DB table to remove records from') @click.option('--pair', '-p', type=(str, str), required=True, multiple=True, @@ -527,7 +528,6 @@ def remove_record(ctx, dbname, table, pair): if dbname == dbcentral: mopdb_log.error("The package database cannot be updated") raise MopException("The package database cannot be updated") - conn = db_connect(dbname) conn = db_connect(dbname, logname='mopdb_log') # set which columns to show based on table if table == 'cmorvar': diff --git a/src/mopdb/mopdb_class.py b/src/mopdb/mopdb_class.py index b4bcb0f..dc023bd 100644 --- a/src/mopdb/mopdb_class.py +++ b/src/mopdb/mopdb_class.py @@ -20,6 +20,7 @@ from pathlib import Path from operator import itemgetter +import re class FPattern(): """This class represent a file pattern with a set list of variables @@ -95,16 +96,21 @@ def order_months(files, match): mlabels = {'jan': '01', 'feb': '02', 'mar': '03', 'apr': '04', 'may': '05', 'jun': '06', 'jul': '07', 'aug': '08', 'sep': '09', 'oct': '10', 'nov': '11', 'dec': '12'} - first = files[0].name.replace(match,'') - basedir = files[0].parent - if any(x in first for x in mlabels.keys()): - newlist = {} - for f in [x.name for x in files]: - for k,v in mlabels.items(): - if k in f: - newlist[f] = f.replace(k,v) - sorted_list = sorted(newlist.items(), key=itemgetter(1)) - files = [basedir/Path(x[0]) for x in sorted_list] + newlist = {} + for f in files: + short = f.name.replace(match,'') + basedir = f.parent + res = re.search('|'.join(mlabels.keys()), short) + if res is not None: + mon = res.group(0) + #if any(x in short for x in mlabels.keys()): + # for k,v in mlabels.items(): + # if k in short: + newlist[f] = str(f).replace(mon,mlabels[mon]) + else: + newlist[f] = str(f) + sorted_list = sorted(newlist.items(), key=itemgetter(1)) + files = [Path(x[0]) for x in sorted_list] return files diff --git a/src/mopper/calc_ocean.py b/src/mopper/calc_ocean.py index a25a5f6..240407d 100644 --- a/src/mopper/calc_ocean.py +++ b/src/mopper/calc_ocean.py @@ -42,7 +42,7 @@ from importlib.resources import files as import_files from mopdb.utils import read_yaml, MopException -#from mopper.calc_utils import +from mopper.calc_utils import get_coords # Global Variables #---------------------------------------------------------------------- @@ -248,7 +248,7 @@ def calc_overt(ctx, varlist, sv=False): @click.pass_context -def calc_zostoga(ctx, ptemp): +def calc_zostoga(ctx, ptemp, dht): """Returns Global Average Thermosteric Sea Level Change See https://github.com/ACCESS-Community-Hub/ACCESS-MOPPeR/issues/182 @@ -260,7 +260,9 @@ def calc_zostoga(ctx, ptemp): ctx : click context Includes obj dict with 'cmor' settings, exp attributes ptemp: DataArray - Potential temperature + Potential temperature in degrees Celsius + dht: DataArray + Model level thickness Returns ------- @@ -269,9 +271,17 @@ def calc_zostoga(ctx, ptemp): """ var_log = logging.getLogger(ctx.obj['var_log']) - t, d, la, lo = ptemp.dims - depth = ptemp[d] - lat = ptemp[la] + t, dep, la, lo = ptemp.dims + # gsw p_from_z expect negative depths + depth = -1*ptemp[dep] + # get latitude from grid ancil file + coords = ptemp.encoding['coordinates'] + lat, dum1, dum2, dum3 = get_coords(coords) + # rename latitude index dimensions so they are the same as output + ptemp_lalo = [la, lo] + if any(x not in ptemp_lalo for x in lat.dims): + for i,d in enumerate(lat.dims): + lat = lat.rename({d: ptemp_lalo[i]}) areacello = get_areacello() # press is absolute pressure minus 10.1325 dbar press = gsw.conversions.p_from_z(depth, lat) @@ -279,12 +289,13 @@ def calc_zostoga(ctx, ptemp): cso35 = xr.full_like(ptemp, 35.00) # constant temperature 4.00 ctemp4 = xr.full_like(ptemp, 4.00) + # calculate density with potential T and at constant 4 deg T rho = gsw.density.rho(cso35, ptemp, press) rho4 = gsw.density.rho(cso35, ctemp4, press) - tmp = ((1. - rho35/rho4) * depth).sum(dim=d) + tmp = ((1. - rho35/rho4) * dht).sum(dim=dep, skipna=True) # reindex to avoid small differences in coordinates values - areacello = areacello.reindex_like(tmp, method='nearest') - zostoga = ((tmp * areacello).sum(dim=[la, lo]) / + areacello = areacello.reindex_like(tmp.isel(time=0), method='nearest') + zostoga = ((tmp * areacello).sum(dim=[la, lo], skipna=True) / areacello.sum(dim=[la, lo], skipna=True)) return zostoga @@ -306,7 +317,7 @@ def get_areacello(ctx, area_t=None): areacello variable """ - fname = f"{ctx.obj['ancils_path']}/{ctx.obj['grid_ocean']}" + fname = f"{ctx.obj['ancils_path']}/{ctx.obj['grid_om']}" ds = xr.open_dataset(fname) if area_t is None: area_t = ds.area_t diff --git a/src/mopper/calc_seaice.py b/src/mopper/calc_seaice.py index 9f4a1e3..8f09627 100644 --- a/src/mopper/calc_seaice.py +++ b/src/mopper/calc_seaice.py @@ -41,6 +41,7 @@ from importlib.resources import files as import_files from mopdb.utils import read_yaml, MopException +from mopper.calc_utils import get_coords # Global Variables #---------------------------------------------------------------------- @@ -514,7 +515,8 @@ def __del__(self): self.gridfile.close() -def calc_hemi_seaice(invar, tarea, hemi, extent=False): +@click.pass_context +def calc_hemi_seaice(ctx, invar, tarea, hemi, extent=False): """Calculate seaice properties (volume, area and extent) over hemisphere. @@ -535,21 +537,29 @@ def calc_hemi_seaice(invar, tarea, hemi, extent=False): Sum of property over selected hemisphere """ - vlat = invar.dims[1] + var_log = logging.getLogger(ctx.obj['var_log']) + coords = invar.encoding['coordinates'].split() + lat, dum1, dum2, dum3 = get_coords(coords) + # ancillary files uses different indices as dimensions!!! + invar_dims = invar.dims[1:] + if any(x not in invar_dims for x in lat.dims): + for i,d in enumerate(lat.dims): + lat = lat.rename({d: invar_dims[i]}) # if calculating extent sum carea and aice is used as filter # with volume and area invar is multiplied by carea first if extent: - var = tarea.where(invar <= 1. and invar >= 0.15, drop=True) + var = tarea.where(invar >= 0.15).where(invar <= 1.) else: var = invar * tarea if hemi == 'north': - var = var.sel(vlat >= 0.) + var = var.where(lat >= 0.) elif hemi == 'south': - var = var.sel(vlat < 0.) + var = var.where(lat < 0.) else: - mop_log.error(f"invalid hemisphere: {hemi}") + var_log.error(f"invalid hemisphere: {hemi}") raise MopException(f"invalid hemisphere: {hemi}") - vout = var.sum() + # sum over latitude and longitude + vout = var.sum(dim=var.dims[1:], skipna=True) return vout diff --git a/src/mopper/calc_utils.py b/src/mopper/calc_utils.py index 4d1948f..914393f 100644 --- a/src/mopper/calc_utils.py +++ b/src/mopper/calc_utils.py @@ -30,10 +30,13 @@ import xarray as xr import os import json +import yaml import numpy as np import dask import logging + from importlib.resources import files as import_files +from pathlib import Path from mopdb.utils import read_yaml, MopException @@ -270,3 +273,47 @@ def K_degC(ctx, var, inverse=False): var_log.info("temp in degC, converting to K") vout = var + 273.15 return vout + +@click.pass_context +def get_coords(ctx, coords): + """Get lat/lon and their boundaries from ancil file + + ctx : click context + Includes obj dict with 'cmor' settings, exp attributes + coords : list + List of coordinates retrieved from variable encoding + """ + var_log = logging.getLogger(ctx.obj['var_log']) + # open ancil grid file to read vertices + #PP be careful this is currently hardcoded which is not ok! + ancil_dir = ctx.obj.get('ancils_path', '') + ancil_file = ancil_dir + "/" + ctx.obj.get(f"grid_{ctx.obj['realm']}", '') + if (ancil_file == '' or not Path(ancil_file).exists() or + f"grid_{ctx.obj['realm']}" not in ctx.obj.keys()): + var_log.error(f"Ancil file {ancil_file} not set or inexistent") + raise MopException(f"Ancil file {ancil_file} not set or inexistent") + var_log.debug(f"getting lat/lon and bnds from ancil file: {ancil_file}") + ds = xr.open_dataset(ancil_file) + var_log.debug(f"ancil ds: {ds}") + # read lat/lon and vertices mapping + cfile = import_files('mopdata').joinpath('latlon_vertices.yaml') + with open(cfile, 'r') as yfile: + data = yaml.safe_load(yfile) + ll_dict = data[ctx.obj['realm']] + #ensure longitudes are in the 0-360 range. + # first two coordinates should be lon,lat + for c in coords[:2]: + var_log.debug(f"ancil coord: {c}") + coord = ds[ll_dict[c][0]] + var_log.debug(f"bnds name: {ll_dict[c]}") + bnds = ds[ll_dict[c][1]] + # num of vertices should be last dimension + if bnds.shape[-1] > bnds.shape[0]: + bnds = bnds.transpose(*(list(bnds.dims[1:]) + [bnds.dims[0]])) + if 'lon' in c.lower(): + lon = np.mod(coord, 360) + lon_bnds = np.mod(bnds, 360) + elif 'lat' in c.lower(): + lat = coord + lat_bnds = bnds + return lat, lat_bnds, lon, lon_bnds diff --git a/src/mopper/mop_utils.py b/src/mopper/mop_utils.py index 0734c25..51e89b4 100755 --- a/src/mopper/mop_utils.py +++ b/src/mopper/mop_utils.py @@ -41,8 +41,10 @@ from mopper.calc_land import * from mopper.calc_atmos import * from mopper.calc_utils import * -from mopper.calc_seaice import * -from mopper.calc_ocean import * +from mopper.calc_seaice import (calc_hemi_seaice, maskSeaIce, sithick, + sisnconc) +from mopper.calc_ocean import (calc_zostoga, ocean_floor, calc_overt, + get_areacello) from mopdb.utils import read_yaml, MopException from importlib.resources import files as import_files @@ -714,13 +716,11 @@ def define_grid(ctx, j_id, i_id, lat, lat_bnds, lon, lon_bnds): @click.pass_context -def get_coords(ctx, ovar, coords): +def get_coords(ctx, coords): """Get lat/lon and their boundaries from ancil file ctx : click context Includes obj dict with 'cmor' settings, exp attributes - ovar : Xarray DataArray - the variable to process coords : list List of coordinates retrieved from variable encoding """ @@ -752,12 +752,12 @@ def get_coords(ctx, ovar, coords): if bnds.shape[-1] > bnds.shape[0]: bnds = bnds.transpose(*(list(bnds.dims[1:]) + [bnds.dims[0]])) if 'lon' in c.lower(): - lon_vals = np.mod(coord.values, 360) - lon_bnds = np.mod(bnds.values, 360) + lon = np.mod(coord, 360) + lon_bnds = np.mod(bnds, 360) elif 'lat' in c.lower(): - lat_vals = coord.values - lat_bnds = bnds.values - return lat_vals, lat_bnds, lon_vals, lon_bnds + lat = coord + lat_bnds = bnds + return lat, lat_bnds, lon, lon_bnds @click.pass_context diff --git a/src/mopper/mopper.py b/src/mopper/mopper.py index bceba70..7ed9222 100644 --- a/src/mopper/mopper.py +++ b/src/mopper/mopper.py @@ -37,13 +37,14 @@ from mopper.mop_utils import (config_log, config_varlog, get_files, load_data, get_cmorname, create_axis, hybrid_axis, - ij_axis, ll_axis, define_grid, get_coords, get_axis_dim, - require_bounds, get_bounds, get_attrs, extract_var, define_attrs) + ij_axis, ll_axis, define_grid, get_axis_dim, require_bounds, + get_bounds, get_attrs, extract_var, define_attrs) from mopper.mop_setup import setup_env, variable_mapping, manage_env from mopper.setup_utils import (create_exp_json, write_config, populate_db, count_rows, sum_file_sizes, filelist_sql, write_job) from mopdb.utils import db_connect, create_table, query, MopException from mopper.cmip_utils import edit_json_cv +from mopper.calc_utils import get_coords warnings.simplefilter(action='ignore', category=FutureWarning) warnings.simplefilter(action='ignore', category=UserWarning) @@ -349,8 +350,9 @@ def mop_process(ctx): axes['lon_ax'] = axes['i_ax'] # Define the spatial grid if non-cartesian grid if setgrid: - lat, lat_bnds, lon, lon_bnds = get_coords(ovar, coords) - grid_id = define_grid(j_id, i_id, lat, lat_bnds, lon, lon_bnds) + lat, lat_bnds, lon, lon_bnds = get_coords(coords) + grid_id = define_grid(j_id, i_id, lat.values, lat_bnds.values, + lon.values, lon_bnds.values) else: if axes['glat_ax'] is not None: lat_id = ll_axis(axes['glat_ax'], 'gridlat', dsin[var1], From 4692e0dda51259732a5ca88cfe5af7e987f25c60 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Mon, 9 Dec 2024 12:44:09 +1100 Subject: [PATCH 14/17] fixed calc_zostoga and calc_areacello, improved resample --- ACDD_conf.yaml | 2 -- CMIP6_conf.yaml | 2 -- src/mopper/calc_ocean.py | 27 ++++++++++++++++++++------- src/mopper/calc_utils.py | 14 +++++++++----- src/mopper/mop_setup.py | 4 ++-- src/mopper/mop_utils.py | 19 +++++++++++++------ src/mopper/setup_utils.py | 16 ++++++++++++++-- tests/test_setup_utils.py | 15 ++++++++++----- 8 files changed, 68 insertions(+), 31 deletions(-) diff --git a/ACDD_conf.yaml b/ACDD_conf.yaml index 8ed17f3..98c1457 100755 --- a/ACDD_conf.yaml +++ b/ACDD_conf.yaml @@ -79,8 +79,6 @@ cmor: # grid ocean is the auscom grid file t retrieve lat/lon and their vertices # example is for om2, cm2, esm1.5 versions grid_ocean: "grid_spec.auscom.20110618.nc" - # grid om is the om2_grid file used in get_areacello - grid_om: "om2_grid.nc" grid_seaIce: "" mask_ocean: "" # to supply land area fraction if not available in output diff --git a/CMIP6_conf.yaml b/CMIP6_conf.yaml index d65267f..9fd9335 100755 --- a/CMIP6_conf.yaml +++ b/CMIP6_conf.yaml @@ -72,8 +72,6 @@ cmor: # grid ocean is the auscom grid file t retrieve lat/lon and their vertices # example is for om2, cm2, esm1.5 versions grid_ocean: "grid_spec.auscom.20110618.nc" - # grid om is the om2_grid file used in get_areacello - grid_om: "om2_grid.nc" grid_seaIce: "" mask_ocean: "" # to supply land area fraction if not available in output diff --git a/src/mopper/calc_ocean.py b/src/mopper/calc_ocean.py index 240407d..f962d86 100644 --- a/src/mopper/calc_ocean.py +++ b/src/mopper/calc_ocean.py @@ -275,7 +275,7 @@ def calc_zostoga(ctx, ptemp, dht): # gsw p_from_z expect negative depths depth = -1*ptemp[dep] # get latitude from grid ancil file - coords = ptemp.encoding['coordinates'] + coords = ptemp.encoding['coordinates'].split() lat, dum1, dum2, dum3 = get_coords(coords) # rename latitude index dimensions so they are the same as output ptemp_lalo = [la, lo] @@ -292,9 +292,13 @@ def calc_zostoga(ctx, ptemp, dht): # calculate density with potential T and at constant 4 deg T rho = gsw.density.rho(cso35, ptemp, press) rho4 = gsw.density.rho(cso35, ctemp4, press) - tmp = ((1. - rho35/rho4) * dht).sum(dim=dep, skipna=True) - # reindex to avoid small differences in coordinates values - areacello = areacello.reindex_like(tmp.isel(time=0), method='nearest') + tmp = ((1. - rho/rho4) * dht).sum(dim=dep, skipna=True) + # rename reindex coordinates to avoid differences + if any(x not in ptemp_lalo for x in areacello.dims): + for i,d in enumerate(areacello.dims): + areacello = areacello.rename({d: ptemp_lalo[i]}) + areacello = areacello.reindex_like(tmp.isel(time=0), + method='nearest') zostoga = ((tmp * areacello).sum(dim=[la, lo], skipna=True) / areacello.sum(dim=[la, lo], skipna=True)) return zostoga @@ -317,11 +321,20 @@ def get_areacello(ctx, area_t=None): areacello variable """ - fname = f"{ctx.obj['ancils_path']}/{ctx.obj['grid_om']}" + var_log = logging.getLogger(ctx.obj['var_log']) + fname = f"{ctx.obj['ancils_path']}/{ctx.obj['grid_ocean']}" ds = xr.open_dataset(fname) if area_t is None: - area_t = ds.area_t - areacello = xr.where(ds.ht.isnull(), 0, ds.area_t) + if 'area_t' in ds.variables: + area_t = ds.area_t + ht = ds.ht + elif 'area_T' in ds.variables: + area_t = ds.area_T + ht = ds.ds_10_12_T + else: + var_log.error(f"Neither area_t or area_T in ancil {fname}") + raise MopException(f"Cannot retrieve T cell area in {fname}") + areacello = xr.where(ht.isnull(), 0, area_t) return areacello diff --git a/src/mopper/calc_utils.py b/src/mopper/calc_utils.py index 914393f..24f7435 100644 --- a/src/mopper/calc_utils.py +++ b/src/mopper/calc_utils.py @@ -55,7 +55,7 @@ @click.pass_context -def time_resample(ctx, var, rfrq, tdim, sample='down', stats='mean'): +def time_resample(ctx, var, rfrq, tdim, orig_tshot, sample='down', stats='mean'): """ Resamples the input variable to the specified frequency using specified statistic. @@ -65,7 +65,7 @@ def time_resample(ctx, var, rfrq, tdim, sample='down', stats='mean'): closed = 'right' This puts the time label to the start of the interval and offset is applied to get a centered time label. - The `rfrq` valid lables are described here: + The `rfrq` valid labels are described here: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#period-aliases Parameters @@ -78,6 +78,8 @@ def time_resample(ctx, var, rfrq, tdim, sample='down', stats='mean'): Resample frequency see above for valid inputs. tdim: str The name of the time dimension + orig_tshot: str + original timeshot of input variable sample : str The type of resampling to perform. Valid inputs are 'up' for upsampling or 'down' for downsampling. (default down) @@ -115,9 +117,11 @@ def time_resample(ctx, var, rfrq, tdim, sample='down', stats='mean'): closed="right") method = getattr(vout, stats) vout = method() - half, tunit = offset[rfrq][:] - vout = vout.assign_coords({tdim: - xr.CFTimeIndex(vout[tdim].values).shift(half, tunit)}) + # apply negative offset if original timeshot is point + if orig_tshot != 'point': + half, tunit = offset[rfrq][:] + vout = vout.assign_coords({tdim: + xr.CFTimeIndex(vout[tdim].values).shift(half, tunit)}) except Exception as e: var_log.error(f"Resample error: {e}") raise MopException(f"{e}") diff --git a/src/mopper/mop_setup.py b/src/mopper/mop_setup.py index 2f36dff..01f5ffb 100755 --- a/src/mopper/mop_setup.py +++ b/src/mopper/mop_setup.py @@ -94,9 +94,9 @@ def find_matches(table, var, realm, frequency, mappings): f"-{frequency} check variables defined in mappings") if found is True: resample = match.get('resample', '') - timeshot, frequency = define_timeshot(frequency, resample, + timeshot, frequency, orig_timeshot = define_timeshot(frequency, resample, match['cell_methods']) - match['resample'] = resample + match['resample'] = f"{resample} {orig_timeshot}" match['timeshot'] = timeshot match['table'] = table match['frequency'] = frequency diff --git a/src/mopper/mop_utils.py b/src/mopper/mop_utils.py index 51e89b4..a004282 100755 --- a/src/mopper/mop_utils.py +++ b/src/mopper/mop_utils.py @@ -488,15 +488,17 @@ def load_data(ctx, path_vars): in_units, in_missing, positive, coords = get_attrs(dsin, first) dsin = xr.decode_cf(dsin, use_cftime=True) - if tdim is not None and 'fx' not in ctx.obj['frequency']: - var_log.debug(f"load_data: slicing time {tdim}") + if (tdim is not None and 'fx' not in ctx.obj['frequency'] and + ctx.obj['resample'] == '') : + var_log.debug(f"load_data: slicing time {tdim}, {ctx.obj['tstart']}, {ctx.obj['tend']}") dsin = dsin.sel({tdim: slice(ctx.obj['tstart'], ctx.obj['tend'])}) + var_log.debug(f"load_data: slicing time {dsin[tdim].values}") for field in v['vars']: var_log.debug(f"load_data, var & path: {field}, {v['vars']}") input_ds[field] = dsin return input_ds, in_units, in_missing, positive, coords - + @click.pass_context def generic_name(ctx, aname, orig, cnames): @@ -1118,10 +1120,13 @@ def extract_var(ctx, input_ds, in_missing): tdim = tdims[0] else: tdim = None + orig_tshot = '' if ctx.obj['resample'] != '': - array = time_resample(array, ctx.obj['resample'], tdim, + # resample passes frequency to resample to and if input var was point timeshot + newfrq, orig_tshot = ctx.obj['resample'].split() + array = time_resample(array, newfrq, tdim, orig_tshot, stats=ctx.obj['timeshot']) - var_log.debug(f"Variable after resample: {array}") + var_log.debug(f"Variable after resample: {array[tdim].values}") # STill need to check if this is needed, it probably is need for integer values but the others? if array.dtype.kind == 'i': @@ -1133,7 +1138,9 @@ def extract_var(ctx, input_ds, in_missing): array = array.fillna(in_missing) var_log.debug(f"Variable after fillna: {array}") # Some ops (e.g., resample) might introduce extra tstep: select time range - if tdim is not None and 'fx' not in ctx.obj['frequency']: + # skip slicing if resample has changed timeshot from point to mean + if ((tdim is not None and 'fx' not in ctx.obj['frequency']) and + not(orig_tshot == 'point')): var_log.debug(f"{ctx.obj['tstart']}, {ctx.obj['tend']}") # add some tolerance to slice to avoid missing steps at higher frequencies tol = relativedelta(minutes=2) diff --git a/src/mopper/setup_utils.py b/src/mopper/setup_utils.py index d1a03bf..2b235c2 100755 --- a/src/mopper/setup_utils.py +++ b/src/mopper/setup_utils.py @@ -80,12 +80,13 @@ def define_timeshot(frequency, resample, cell_methods): # if timeshot is maximum/minimum/sum then leave it unalterated # otherwise resampled values is mean # for maximum, minimum pass timeshot as the resample method + orig_timeshot = timeshot if resample != '': if timeshot in ['mean', 'point', '']: timeshot = 'mean' elif timeshot in ['maximum', 'minimum']: timeshot = timeshot[:3] - return timeshot, frequency + return timeshot, frequency, orig_timeshot def adjust_nsteps(v, frq): @@ -122,6 +123,7 @@ def adjust_nsteps(v, frq): new_nsteps = tot_days * nstep_day[frq] return new_nsteps + @click.pass_context def write_config(ctx, fname='exp_config.yaml'): """Write data to a yaml file @@ -431,7 +433,15 @@ def add_row(values, cursor, update): def adjust_size(opts, insize): - """ + """Adjust grid size stored in mappings and based on input variable size + when a calculation modifies the dimensions in the output variables. + As grid size is used to decided how many timesteps each file should contain + together with maximum file size, if a correction is not applied too small or + too big files could be created. + This needs to balance with memory used by process. For example calc_zostoga() + will process a lot of data to come down to 1 float per timestep. So while output + can easily be stored in one file, it's possible that trying to do so will need + more memory than what is usually allocated to one file. Returns ------- @@ -675,6 +685,7 @@ def add_files(ctx, cursor, opts, mp): start = newtime return + def define_file(opts, start, finish, delta, tstep, half_tstep): """ """ @@ -704,6 +715,7 @@ def define_file(opts, start, finish, delta, tstep, half_tstep): opts['sel_end'] = (tend + tstep).strftime('%4Y%m%d%H%M') return opts, newtime + def count_rows(conn, exp): """Returns number of files to process """ diff --git a/tests/test_setup_utils.py b/tests/test_setup_utils.py index cbfae40..b5b4676 100644 --- a/tests/test_setup_utils.py +++ b/tests/test_setup_utils.py @@ -77,33 +77,38 @@ def test_define_timeshot(): resample = "" cell_methods = 'time: mean' #cell_methods = f"area: time: {tshot}" - timeshot, frequency = define_timeshot(frq, resample, cell_methods) + timeshot, frequency, origts = define_timeshot(frq, resample, cell_methods) assert frequency == frq assert timeshot == "mean" + assert origts == "mean" # test that timeshot is updated from point to mean with resample cell_methods = "area: mean time: point" resample = "D" - timeshot, frequency = define_timeshot(frq, resample, cell_methods) + timeshot, frequency, origts = define_timeshot(frq, resample, cell_methods) assert frequency == "day" assert timeshot == "mean" + assert origts == "point" # test that timeshot is updated from maximum to max with resample cell_methods = "area: mean time: maximum" resample = "D" - timeshot, frequency = define_timeshot(frq, resample, cell_methods) + timeshot, frequency, origts = define_timeshot(frq, resample, cell_methods) assert frequency == "day" assert timeshot == "max" + assert origts == "maximum" # test that timeshot stays sum with resample cell_methods = "area: mean time: sum" resample = "D" - timeshot, frequency = define_timeshot(frq, resample, cell_methods) + timeshot, frequency, origts = define_timeshot(frq, resample, cell_methods) assert frequency == "day" assert timeshot == "sum" + assert origts == "sum" # test timeshot point if Pt in frequency resample = "" frq = "1hrPt" - timeshot, frequency = define_timeshot(frq, resample, cell_methods) + timeshot, frequency, origts = define_timeshot(frq, resample, cell_methods) assert frequency == "1hr" assert timeshot == "point" + assert origts == "point" def test_build_filename(): From b3ec1538291b234157873d1f79bdd003da7d2a0c Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Mon, 9 Dec 2024 13:39:28 +1100 Subject: [PATCH 15/17] updated version --- ACDD_conf.yaml | 2 +- CMIP6_conf.yaml | 2 +- conda/meta.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ACDD_conf.yaml b/ACDD_conf.yaml index 98c1457..e245ff8 100755 --- a/ACDD_conf.yaml +++ b/ACDD_conf.yaml @@ -193,4 +193,4 @@ attrs: parent: !!bool false # CMOR will add a tracking_id if you want to define a prefix add here tracking_id_prefix: - comment: "post-processed using ACCESS-MOPPeR v1.1.1 https://doi.org/10.5281/zenodo.14010850" + comment: "post-processed using ACCESS-MOPPeR v1.2.0 https://doi.org/10.5281/zenodo.14322348" diff --git a/CMIP6_conf.yaml b/CMIP6_conf.yaml index 9fd9335..dae7dd9 100755 --- a/CMIP6_conf.yaml +++ b/CMIP6_conf.yaml @@ -184,4 +184,4 @@ attrs: #CMOR will add a tracking_id if you want to define a prefix add here tracking_id_prefix: Conventions: "CF-1.7 CMIP-6.2" - comment: "post-processed using ACCESS-MOPPeR v1.1.1 https://doi.org/10.5281/zenodo.14010850" + comment: "post-processed using ACCESS-MOPPeR v1.2.0 https://doi.org/10.5281/zenodo.14322348" diff --git a/conda/meta.yaml b/conda/meta.yaml index 4f8f24c..32ab0bb 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -1,14 +1,14 @@ package: name: mopper #version: "{{ environ.get('GIT_DESCRIBE_TAG', '1.0') }}" - version: '1.1.1' + version: '1.2.0' #source: # path: ../. source: #url: https://github.com/ACCESS-Hive/ACCESS-MOPPeR/archive/refs/tags/{{ environ.get('RELEASE_VERSION') }}.tar.gz git_url: https://github.com/ACCESS-Hive/ACCESS-MOPPeR.git - git_tag: "1.1.1" + git_tag: "1.2.0" #git_rev: "1.1.0" #git_depth: 1 # (Defaults to -1/not shallow) From dfc9ab10f9557dac8ae2084c6a11c27841959488 Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Mon, 9 Dec 2024 13:42:25 +1100 Subject: [PATCH 16/17] updated readme --- README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 00de0a1..d10646a 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,31 @@ # [ACCESS Model Output Post-Processor (MOPPeR)](https://access-mopper.readthedocs.io/en/latest) [![Read the docs](https://readthedocs.org/projects/access-mopper/badge/?version=latest)](https://access-mopper.readthedocs.io/en/latest/) -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14010850.svg)](https://doi.org/10.5281/zenodo.14010850) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14322348.svg)](https://doi.org/10.5281/zenodo.14322348) This code is derived from the [APP4](https://doi.org/10.5281/zenodo.7703469), initially created by Peter Uhe for CMIP5, and further developed for CMIP6-era by Chloe Mackallah from CSIRO, O&A Aspendale. +--- +# ACCESS-NRI Support for ACCESS-MOPPeR + +With the conclusion of the ARC Centre of Excellence for Climate Extremes (CLEX), support for ACCESS-MOPPeR is transitioning to ACCESS-NRI. + +ACCESS-NRI is committed to providing continuity and will maintain the current version of ACCESS-MOPPeR, ensuring that it remains up to date and usable. Current support will include: + +- Bug fixes +- Documentation +- An up-to-date dependency stack +- As time allows, development of new documentation and training examples for users + +Community contributions are encouraged, including bug reports, pull requests, and suggestions for new features. + +While no new development is currently planned, ACCESS-NRI recognises the value of ACCESS-MOPPeR, particularly for future CMIP7 submissions, and will be actively working with the community to prioritise future work (and resourcing). + +ACCESS-NRI acknowledges the outstanding contributions made by the CLEX CMS team in developing and supporting this tool, from the original APP4 (Chloe Mackallah @chloemackallah ) to MOPPeR (Paola Petrelli @Paola-CMS and Sam Green @sam.green). Their work has laid a solid foundation for ACCESS-MOPPeR's continued success. + +ACCESS-NRI remains dedicated to making data standardisation easier for users, ensuring that the tool continues to meet the evolving needs of the ACCESS community. + +For any questions or support requests, please see [ACCESS-Support](https://aus01.safelinks.protection.outlook.com/?url=https%3A%2F%2Faccess-hive.org.au%2Fabout%2Fuser_support%2F&data=05%7C02%7Cromain.beucher%40anu.edu.au%7C3180d100195141b372b908dd101292ad%7Ce37d725cab5c46249ae5f0533e486437%7C0%7C0%7C638684394182362350%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=6TSq%2Fs88OQOXOgvCjDRFuX1NHC1QQj2OUBLmMWQ5O2s%3D&reserved=0) + --- The MOPPeR is a CMORisation tool designed to post-process [ACCESS](https://research.csiro.au/access/) model output. The original APP4 main use was to produce [ESGF](https://esgf-node.llnl.gov/)-compliant formats, primarily for publication to [CMIP6](https://www.wcrp-climate.org/wgcm-cmip/wgcm-cmip6). The code was originally built for CMIP5, and was further developed for CMIP6-era activities. From 42f57b0e1caea522c28872ec5364ffcef69f2cca Mon Sep 17 00:00:00 2001 From: Paola Petrelli Date: Mon, 9 Dec 2024 13:55:33 +1100 Subject: [PATCH 17/17] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d10646a..2f1f679 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This code is derived from the [APP4](https://doi.org/10.5281/zenodo.7703469), initially created by Peter Uhe for CMIP5, and further developed for CMIP6-era by Chloe Mackallah from CSIRO, O&A Aspendale. --- -# ACCESS-NRI Support for ACCESS-MOPPeR +## ACCESS-NRI Support for ACCESS-MOPPeR With the conclusion of the ARC Centre of Excellence for Climate Extremes (CLEX), support for ACCESS-MOPPeR is transitioning to ACCESS-NRI. @@ -27,7 +27,7 @@ ACCESS-NRI remains dedicated to making data standardisation easier for users, en For any questions or support requests, please see [ACCESS-Support](https://aus01.safelinks.protection.outlook.com/?url=https%3A%2F%2Faccess-hive.org.au%2Fabout%2Fuser_support%2F&data=05%7C02%7Cromain.beucher%40anu.edu.au%7C3180d100195141b372b908dd101292ad%7Ce37d725cab5c46249ae5f0533e486437%7C0%7C0%7C638684394182362350%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=6TSq%2Fs88OQOXOgvCjDRFuX1NHC1QQj2OUBLmMWQ5O2s%3D&reserved=0) --- - +## What is MOPPeR? The MOPPeR is a CMORisation tool designed to post-process [ACCESS](https://research.csiro.au/access/) model output. The original APP4 main use was to produce [ESGF](https://esgf-node.llnl.gov/)-compliant formats, primarily for publication to [CMIP6](https://www.wcrp-climate.org/wgcm-cmip/wgcm-cmip6). The code was originally built for CMIP5, and was further developed for CMIP6-era activities. It used [CMOR3](https://cmor.llnl.gov/) and files created with the [CMIP6 data request](https://github.com/cmip6dr/dreqPy) to generate CF-compliant files according to the [CMIP6 data standards](https://docs.google.com/document/d/1os9rZ11U0ajY7F8FWtgU4B49KcB59aFlBVGfLC4ahXs/edit).The APP4 also had a custom mode option to allow users to post-process output without strict adherence to the ESGF standards. MOPPeR was developed to extend the custom mode as much as it is allowed by the CMOR tool, it can be used to produce CMIP6 compliant data but other standards can also be defined.