diff --git a/.github/workflows/general-ci-tests.yml b/.github/workflows/general-ci-tests.yml index 474ba587..ebdd8d16 100644 --- a/.github/workflows/general-ci-tests.yml +++ b/.github/workflows/general-ci-tests.yml @@ -118,10 +118,7 @@ jobs: # Run the test - name: Run the check_input_data_repo script - run: | - sudo apt-get update && sudo apt-get install -y subversion - pip install 'svn>=1,<1.1' - python tests/check_input_data_repo.py + run: python tests/check_input_data_repo.py # Job to run the black formatter for cime_config, see black documentation for more info check_black_format_for_cime_config: diff --git a/param_templates/MOM_input.yaml b/param_templates/MOM_input.yaml index ccb92443..0126e379 100644 --- a/param_templates/MOM_input.yaml +++ b/param_templates/MOM_input.yaml @@ -115,6 +115,15 @@ Global: units: Boolean value: $OCN_GRID == "tx2_3v2": False + HREF_FOR_MLD: + description: | + "[m] default = 0.0 + Reference depth used to calculate the potential density used to find the mixed + layer depth based on a delta rho = 0.03 kg/m3." + datatype: real + units: m + value: + $OCN_GRID == "tx2_3v2": 10.0 USE_REGRIDDING: description: | "[Boolean] default = False @@ -281,6 +290,12 @@ Global: value: $OCN_GRID == "tx2_3v2": False $OCN_GRID == "tx0.25v1": False + EQN_OF_STATE: + description: | + "default = WRIGHT_FULL + EQN_OF_STATE determines which ocean equation of state should be used." + datatype: string + value: "WRIGHT_FULL" DTFREEZE_DP: description: | "[deg C Pa-1] default = 0.0 @@ -529,6 +544,13 @@ Global: value: $OCN_GRID == "tx2_3v2": False $OCN_GRID == "tx0.25v1": False + RAD_EARTH: + description: | + "[m] default = 6.378E+06 + The radius of the Earth." + datatype: real + units: m + value: 6.37122E+06 TOPO_CONFIG: description: | "This specifies how bathymetry is specified: @@ -745,7 +767,7 @@ Global: datatype: real units: nondim value: - $OCN_GRID == "tx2_3v2": 250.0 + $OCN_GRID == "tx2_3v2": 500.0 KHTR_SLOPE_CFF: description: | "[nondim] default = 0.0 @@ -810,7 +832,7 @@ Global: datatype: logical units: Boolean value: - $OCN_GRID == "tx2_3v2": True + $OCN_GRID == "tx2_3v2": False ETA_TOLERANCE: description: | "[m] default = 3.15E-09 @@ -932,7 +954,7 @@ Global: value: $MOM6_VERTICAL_GRID == "zstar_75L": '"FILE:zstar_75layer_2.5m_248.4m-2024-03-29.nc,dz"' $MOM6_VERTICAL_GRID == "zstar_65L": '"FILE:vgrid_65L_20200626.nc,dz"' - $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID != "tx0.25v1": '"HYBRID:hybrid_75layer_zstar2.50m-2020-11-23.nc,sigma2,dz"' + $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID != "tx0.25v1": '"HYBRID:hybrid_75layer_zstar_2.50m-2025-09-12.nc,sigma2,dz"' $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID == "tx0.25v1": '"HYBRID:hycom1_75_800m.nc,sigma2,FNC1:2,4000,4.5,.01"' REGRID_COMPRESSIBILITY_FRACTION: description: | @@ -958,7 +980,9 @@ Global: The list of maximum depths for each interface." datatype: string value: - $MOM6_VERTICAL_GRID == "hycom1": '"FNC1:5,8000.0,1.0,.01"' + $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID in ["tx2_3v2"]: | + '"FILE:${DIN_LOC_ROOT}/ocn/mom/tx2_3v2/lev-2025-09-12.nc,Z"' + $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID == "tx0.25v1": '"FNC1:5,8000.0,1.0,.01"' MAX_LAYER_THICKNESS_CONFIG: description: | "default = 'NONE' @@ -974,7 +998,7 @@ Global: datatype: string value: $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID in ["tx2_3v2"]: | - '"FILE:${DIN_LOC_ROOT}/ocn/mom/grid_indpt/dz_max_90th_quantile.nc,dz"' + '"FILE:${DIN_LOC_ROOT}/ocn/mom/tx2_3v2/dz_max-2025-09-12.nc,dz"' else: '"FNC1:400,31000.0,0.1,.01"' BOUND_CORIOLIS: description: | @@ -987,6 +1011,16 @@ Global: datatype: logical units: Boolean value: True + RHO_PGF_REF_BUG: + description: | + "[Boolean] default = True + If true, recover a bug that RHO_0 (the mean seawater density in Boussinesq + mode) and RHO_PGF_REF (the subtracted reference density in finite volume + pressure gradient forces) are incorrectly interchanged in several instances in + Boussinesq mode." + datatype: logical + units: Boolean + value: False MASS_WEIGHT_IN_PRESSURE_GRADIENT: description: | "[Boolean] default = False @@ -1010,6 +1044,22 @@ Global: datatype: logical units: Boolean value: True + SMAGORINSKY_KH: + description: | + "[Boolean] default = False + If true, use a Smagorinsky nonlinear eddy viscosity." + datatype: logical + units: Boolean + value: + $OCN_GRID == "tx2_3v2": True + SMAG_LAP_CONST: + description: | + "[nondim] default = 0.0 + The nondimensional Laplacian Smagorinsky constant, often 0.15." + datatype: real + units: nondim + value: + $OCN_GRID == "tx2_3v2": 0.15 KH: description: | "[m2 s-1] default = 0.0 @@ -1505,7 +1555,7 @@ Global: datatype: logical units: Boolean value: - $OCN_GRID == "tx2_3v2": True + $OCN_GRID == "tx2_3v2": False MIXEDLAYER_RESTRAT: description: | "[Boolean] default = False @@ -1816,6 +1866,23 @@ Global: units: Boolean value: $OCN_GRID == "tx2_3v2": True + NU_ZERO: + description: | + "[m2 s-1] default = 0.005 + Leading coefficient in KPP shear mixing." + datatype: real + units: m2 s-1 + value: + $OCN_GRID == "tx2_3v2": 0.0025 + RI_ZERO: + description: | + "[nondim] default = 0.8 + Critical Richardson for KPP shear mixing, NOTE this the internal mixing and + this is not for setting the boundary layer depth." + datatype: real + units: nondim + value: + $OCN_GRID == "tx2_3v2": 0.5 N_SMOOTH_RI: description: | "default = 0 @@ -2224,7 +2291,13 @@ Global: value: $OCN_GRID == "tx2_3v2" and $COMP_ATM == "datm": True # for C and G compsets on tx2_3v2 else: False - + WIND_STAGGER: + description: | + "default = 'C' + A case-insensitive character string to indicate the staggering of the input + wind stress field. Valid values are 'A', 'B', or 'C'." + datatype: string + value: "A" ENTHALPY_FROM_COUPLER: description: | "[Boolean] default = False @@ -2233,7 +2306,6 @@ Global: datatype: logical units: Boolean value: True - FLUXCONST: description: | "[m day-1] @@ -2359,7 +2431,7 @@ Global: units: nondim value: $OCN_GRID == "tx0.25v1": 1.0 - $OCN_GRID == "tx2_3v2": 1.0 + $OCN_GRID == "tx2_3v2": 0.25 MEKE_BGSRC: description: | "[W kg-1] default = 0.0 @@ -2496,7 +2568,7 @@ Global: datatype: real units: nondim value: - $OCN_GRID == "tx2_3v2": 0.09 + $OCN_GRID == "tx2_3v2": 0.06 MEKE_KHTH_FAC: description: | "[nondim] default = 0.0 @@ -2795,7 +2867,7 @@ Global: datatype: real units: nondim value: - $COMP_WAV == "ww3" and $MOM6_WW3_CPL_METHOD == "most": 2.0 + $COMP_WAV == "ww3" and $MOM6_WW3_CPL_METHOD == "most": 3.5 VISC_REM_BUG: description: | "[Boolean] default = True @@ -3689,18 +3761,6 @@ Global: datatype: string value: "${CASE}.mom6.h.ocean_geometry.nc" - SKEB_NPASS: - description: | - "default = 3 - number of passes of a 9-point smoother of the dissipation estimate." - datatype: integer - value: 10 - SKEB_GM_COEF: - description: | - "[nondim] default = 0.0 - Fraction of GM work that is added to backscatter rate." - datatype: real - value: 0.75 RESTART_CHECKSUMS_REQUIRED: description: | "[Boolean] default = True @@ -3719,6 +3779,16 @@ Global: added to the end of the file name. This parameter is ignored for non-ensemble runs." datatype: string value: ".mom6" +CVMix_CONVECTION: + BV_SQR_CONV: + description: | + "[1/s^2] default = 0.0 + Threshold for squared buoyancy frequency needed to trigger Brunt-Vaisala + parameterization." + datatype: real + units: 1/s^2 + value: + $OCN_GRID == "tx2_3v2": -1.0E-08 KPP: N_SMOOTH: description: | @@ -3800,18 +3870,25 @@ KPP: datatype: real units: nondim value: - $OCN_GRID == "tx2_3v2": 1.0 + $OCN_GRID == "tx2_3v2": 1.8 + ENHANCE_DIFFUSION: + description: | + "default = True + If True, adds enhanced diffusion at the based of the boundary layer." + datatype: logical + value: + $OCN_GRID == "tx2_3v2": False STOKES_MOST: description: | - default = False - If True, use Stokes Similarity package. + "default = False + If True, use Stokes Similarity package." datatype: logical value: $COMP_WAV == "ww3" and $MOM6_WW3_CPL_METHOD == "most": True COMPUTE_MONIN_OBUKHOV: description: | - default = False - If True, limit the OBL depth to be no deeper than Monin-Obukhov depth. + "default = False + If True, limit the OBL depth to be no deeper than Monin-Obukhov depth." datatype: logical units: Boolean value: @@ -3824,6 +3901,45 @@ KPP: datatype: real value: $OCN_GRID == "tx2_3v2": 5.0 + DO_SKEB: + description: | + "default = False + If true, then stochastically perturb the currents using the stochastic kinetic + energy backscatter scheme." + datatype: logical + units: Boolean + value: + $OCN_GRID == "tx2_3v2": True + SKEB_USE_FRICT: + description: | + "default = False + If true, adds horizontal friction dissipation rate to the SKEBS amplitude." + datatype: logical + units: Boolean + value: + $OCN_GRID == "tx2_3v2": True + SKEB_USE_GM: + description: | + "default = False + If true, adds GM work rate to the SKEBS amplitude." + datatype: logical + units: Boolean + value: + $OCN_GRID == "tx2_3v2": True + SKEB_NPASS: + description: | + "[nondim] default = 0 + number of passes of a 9-point smoother of the dissipation estimate." + datatype: integer + value: + $OCN_GRID == "tx2_3v2": 8 + SKEB_GM_COEF: + description: | + "[nondim] default = 0.0 + Fraction of GM work that is added to backscatter rate." + datatype: real + value: + $OCN_GRID == "tx2_3v2": 0.75 MLE: USE_BODNER23: description: | @@ -3834,6 +3950,14 @@ MLE: units: Boolean value: $OCN_GRID == "tx2_3v2": True + CR: + description: | + "[nondim] default = 0.0 + The efficiency coefficient in eq 27 of Bodner et al., 2023." + datatype: real + units: nondim + value: + $OCN_GRID == "tx2_3v2": 0.01 USE_CR_GRID: description: | "[Boolean] default = False @@ -3847,7 +3971,15 @@ MLE: "The path to the file containing the Cr fields." datatype: string value: - $OCN_GRID == "tx2_3v2": "mle-cr-tx2_3v2-v10_20250426.nc" + $OCN_GRID == "tx2_3v2": "mle-cr-mask_20250627.nc" + WAVE_ENHANCED_USTAR: + description: | + "default = False + If true, enhance ustar using surface waves, following Eq. 28 in Bodner23." + datatype: logical + units: Boolean + value: + $OCN_GRID == "tx2_3v2": True MIN_WSTAR2: description: | "[m2 s-2] default = 1.0E-24 diff --git a/param_templates/diag_table.yaml b/param_templates/diag_table.yaml index 82a0773b..cc10f228 100644 --- a/param_templates/diag_table.yaml +++ b/param_templates/diag_table.yaml @@ -26,6 +26,8 @@ FieldLists: - &kpp_diags ["KPP_OBLdepth:oml", "KPP_OBLdepth:oml_min:min", "KPP_OBLdepth:oml_max:max"] + - &stochastic_diags ["skeb_amp"] + - &forcing_flds ["tauuo", "tauvo", "friver", "prsn", "prlq", "evs", "hfsso", "rlntds", "hfsnthermds", "sfdsi", "rsntds", "hfds", "ustar", "hfsifrazil", "wfo", "vprec", "ficeberg", "fsitherm", @@ -47,7 +49,8 @@ FieldLists: - &static_flds ["geolon", "geolat", "geolon_c", "geolat_c", "geolon_u", "geolat_u", "geolon_v", "geolat_v", "deptho", "wet", "wet_c", "wet_u", "wet_v", "Coriolis", "areacello", "areacello_cu", "areacello_cv", - "areacello_bu", "sin_rot", "cos_rot", "C_P", "Rho_0"] + "areacello_bu", "sin_rot", "cos_rot", "C_P", "Rho_0", "skeb_taper_v", + "skeb_taper_u"] - &transports ["volcello", "vmo", "vhGM", "vhml", "umo", "uhGM", "uhml"] @@ -125,6 +128,7 @@ Files: $OCN_DIAG_MODE not in ["spinup", "none"]: [ *prognostic, *kpp_diags, + *stochastic_diags, *forcing_flds, *enthalpy_flds, *surface_flds_common, diff --git a/param_templates/input_data_list.yaml b/param_templates/input_data_list.yaml index 1095bfdf..569db308 100644 --- a/param_templates/input_data_list.yaml +++ b/param_templates/input_data_list.yaml @@ -7,9 +7,13 @@ mom.input_data_list: ALE_COORDINATE_CONFIG: $MOM6_VERTICAL_GRID == "zstar_75L": "${INPUTDIR}/zstar_75layer_2.5m_248.4m-2024-03-29.nc" $MOM6_VERTICAL_GRID == "zstar_65L": "${INPUTDIR}/vgrid_65L_20200626.nc" - $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID != "tx0.25v1": "${INPUTDIR}/hybrid_75layer_zstar2.50m-2020-11-23.nc" + $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID != "tx0.25v1": "${INPUTDIR}/hybrid_75layer_zstar_2.50m-2025-09-12.nc" $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID == "tx0.25v1": "${INPUTDIR}/hycom1_75_800m.nc" $OCN_GRID == "tx0.25v1": "${INPUTDIR}/hycom1_75_800m.nc" + MAXIMUM_INT_DEPTH_CONFIG: + $OCN_GRID == "tx2_3v2": "${INPUTDIR}/lev-2025-09-12.nc" + MAX_LAYER_THICKNESS_CONFIG: + $OCN_GRID == "tx2_3v2": "${INPUTDIR}/dz_max-2025-09-12.nc" DIAG_COORD_DEF_Z: $OCN_GRID == "tx0.25v1": "${INPUTDIR}/interpolate_zgrid_40L.nc" COORD_FILE: @@ -26,7 +30,7 @@ mom.input_data_list: "${INPUTDIR}/${TEMP_SALT_Z_INIT_FILE}" MAX_LAYER_THICKNESS_CONFIG: $MOM6_VERTICAL_GRID == "hycom1" and $OCN_GRID in ["tx2_3v2"]: - "${DIN_LOC_ROOT}/ocn/mom/grid_indpt/dz_max_90th_quantile.nc" + "${DIN_LOC_ROOT}/ocn/mom/tx2_3v2/dz_max-2025-09-12.nc" SURFACE_PRESSURE_FILE: $OCN_GRID == "MISOMIP": "${INPUTDIR}/MISOMIP_181108.nc" SALT_RESTORE_FILE: @@ -44,7 +48,7 @@ mom.input_data_list: $OCN_GRID == "tx0.25v1": "${INPUTDIR}/seawifs-clim-1997-2010.1440x1080.v20180328.nc" $OCN_GRID == "tx2_3v2": "${INPUTDIR}/seawifs-clim-1997-2010-tx2_3v2.230416.nc" CR_FILE: - $OCN_GRID == "tx2_3v2": "${INPUTDIR}/mle-cr-tx2_3v2-v10_20250426.nc" + $OCN_GRID == "tx2_3v2": "${INPUTDIR}/mle-cr-mask_20250627.nc" CFC_BC_FILE: "${DIN_LOC_ROOT}/ocn/mom/grid_indpt/cfc_atm_20230310.nc" DIAG_COORD_DEF_RHO2: $OCN_GRID == "tx2_3v2": "${INPUTDIR}/ocean_rho2_190917.nc" diff --git a/param_templates/input_nml.yaml b/param_templates/input_nml.yaml index 17c374fa..d5a950bf 100644 --- a/param_templates/input_nml.yaml +++ b/param_templates/input_nml.yaml @@ -67,9 +67,11 @@ nam_stochy: OCNSKEB: values: 1.0 OCNSKEB_LSCALE: - values: 200e3 + values: 300e3 OCNSKEB_TAU: values: 21600 ISEED_OCNSKEB: values: 20 + ntrunc: + values: 192 ... diff --git a/param_templates/json/MOM_input.json b/param_templates/json/MOM_input.json index 66a68259..c637b054 100644 --- a/param_templates/json/MOM_input.json +++ b/param_templates/json/MOM_input.json @@ -68,6 +68,14 @@ "$OCN_GRID == \"tx2_3v2\"": false } }, + "HREF_FOR_MLD": { + "description": "\"[m] default = 0.0\nReference depth used to calculate the potential density used to find the mixed\nlayer depth based on a delta rho = 0.03 kg/m3.\"\n", + "datatype": "real", + "units": "m", + "value": { + "$OCN_GRID == \"tx2_3v2\"": 10.0 + } + }, "USE_REGRIDDING": { "description": "\"[Boolean] default = False\nIf True, use the ALE algorithm (regridding/remapping).\nIf False, use the layered isopycnal algorithm.\"\n", "datatype": "logical", @@ -191,6 +199,13 @@ "$OCN_GRID == \"tx0.25v1\"": false } }, + "EQN_OF_STATE": { + "description": "\"default = 'WRIGHT'\nEQN_OF_STATE determines which ocean equation of state\nshould be used. Currently, the valid choices are\n'LINEAR', 'UNESCO', and 'WRIGHT'.\nThis is only used if USE_EOS is true.\"\n", + "datatype": "string", + "value": { + "$OCN_GRID == \"MISOMIP\"": "LINEAR" + } + }, "DTFREEZE_DP": { "description": "\"[deg C Pa-1] default = 0.0\nWhen TFREEZE_FORM=LINEAR,\nthis is the derivative of the freezing potential\ntemperature with pressure.\"\n", "datatype": "real", @@ -413,6 +428,12 @@ "$OCN_GRID == \"tx0.25v1\"": false } }, + "RAD_EARTH": { + "description": "\"[m] default = 6.378E+06\nThe radius of the Earth.\"\n", + "datatype": "real", + "units": "m", + "value": 6371220.0 + }, "TOPO_CONFIG": { "description": "\"This specifies how bathymetry is specified:\nfile - read bathymetric information from the file\nspecified by (TOPO_FILE).\nflat - flat bottom set to MAXIMUM_DEPTH.\nbowl - an analytically specified bowl-shaped basin\nranging between MAXIMUM_DEPTH and MINIMUM_DEPTH.\nspoon - a similar shape to 'bowl', but with an vertical\nwall at the southern face.\nhalfpipe - a zonally uniform channel with a half-sine\nprofile in the meridional direction.\nbenchmark - use the benchmark test case topography.\nDOME - use a slope and channel configuration for the\nDOME sill-overflow test case.\nDOME2D - use a shelf and slope configuration for the\nDOME2D gravity current/overflow test case.\nseamount - Gaussian bump for spontaneous motion test case.\nUSER - call a user modified routine.\"\n", "datatype": "string", @@ -572,7 +593,7 @@ "datatype": "real", "units": "nondim", "value": { - "$OCN_GRID == \"tx2_3v2\"": 250.0 + "$OCN_GRID == \"tx2_3v2\"": 500.0 } }, "KHTR_SLOPE_CFF": { @@ -628,7 +649,7 @@ "datatype": "logical", "units": "Boolean", "value": { - "$OCN_GRID == \"tx2_3v2\"": true + "$OCN_GRID == \"tx2_3v2\"": false } }, "ETA_TOLERANCE": { @@ -712,7 +733,7 @@ "value": { "$MOM6_VERTICAL_GRID == \"zstar_75L\"": "\"FILE:zstar_75layer_2.5m_248.4m-2024-03-29.nc,dz\"", "$MOM6_VERTICAL_GRID == \"zstar_65L\"": "\"FILE:vgrid_65L_20200626.nc,dz\"", - "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID != \"tx0.25v1\"": "\"HYBRID:hybrid_75layer_zstar2.50m-2020-11-23.nc,sigma2,dz\"", + "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID != \"tx0.25v1\"": "\"HYBRID:hybrid_75layer_zstar_2.50m-2025-09-12.nc,sigma2,dz\"", "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID == \"tx0.25v1\"": "\"HYBRID:hycom1_75_800m.nc,sigma2,FNC1:2,4000,4.5,.01\"" } }, @@ -728,14 +749,15 @@ "description": "\"default = 'NONE'\nDetermines how to specify the maximum interface depths.\nValid options are:\nNONE - there are no maximum interface depths\nPARAM - use the vector-parameter MAXIMUM_INTERFACE_DEPTHS\nFILE:string - read from a file. The string specifies\nthe filename and variable name, separated\nby a comma or space, e.g. FILE:lev.nc,Z\nFNC1:string - FNC1:dz_min,H_total,power,precision\nThe list of maximum depths for each interface.\"\n", "datatype": "string", "value": { - "$MOM6_VERTICAL_GRID == \"hycom1\"": "\"FNC1:5,8000.0,1.0,.01\"" + "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID in [\"tx2_3v2\"]": "'\"FILE:${DIN_LOC_ROOT}/ocn/mom/tx2_3v2/lev-2025-09-12.nc,Z\"'\n", + "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID == \"tx0.25v1\"": "\"FNC1:5,8000.0,1.0,.01\"" } }, "MAX_LAYER_THICKNESS_CONFIG": { "description": "\"default = 'NONE'\nDetermines how to specify the maximum layer thicknesses.\nValid options are:\nNONE - there are no maximum layer thicknesses\nPARAM - use the vector-parameter MAX_LAYER_THICKNESS\nFILE:string - read from a file. The string specifies\nthe filename and variable name, separated\nby a comma or space, e.g. FILE:lev.nc,Z\nFNC1:string - FNC1:dz_min,H_total,power,precision\nThe list of maximum thickness for each layer.\"\n", "datatype": "string", "value": { - "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID in [\"tx2_3v2\"]": "'\"FILE:${DIN_LOC_ROOT}/ocn/mom/grid_indpt/dz_max_90th_quantile.nc,dz\"'\n", + "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID in [\"tx2_3v2\"]": "'\"FILE:${DIN_LOC_ROOT}/ocn/mom/tx2_3v2/dz_max-2025-09-12.nc,dz\"'\n", "else": "\"FNC1:400,31000.0,0.1,.01\"" } }, @@ -745,6 +767,12 @@ "units": "Boolean", "value": true }, + "RHO_PGF_REF_BUG": { + "description": "\"[Boolean] default = True\nIf true, recover a bug that RHO_0 (the mean seawater density in Boussinesq\nmode) and RHO_PGF_REF (the subtracted reference density in finite volume\npressure gradient forces) are incorrectly interchanged in several instances in\nBoussinesq mode.\"\n", + "datatype": "logical", + "units": "Boolean", + "value": false + }, "MASS_WEIGHT_IN_PRESSURE_GRADIENT": { "description": "\"[Boolean] default = False\nIf true, use mass weighting when interpolation T/S for\ntop/bottom integrals in AFV pressure gradient calculation.\"\n", "datatype": "logical", @@ -765,6 +793,22 @@ "units": "Boolean", "value": true }, + "SMAGORINSKY_KH": { + "description": "\"[Boolean] default = False\nIf true, use a Smagorinsky nonlinear eddy viscosity.\"\n", + "datatype": "logical", + "units": "Boolean", + "value": { + "$OCN_GRID == \"tx2_3v2\"": true + } + }, + "SMAG_LAP_CONST": { + "description": "\"[nondim] default = 0.0\nThe nondimensional Laplacian Smagorinsky constant, often 0.15.\"\n", + "datatype": "real", + "units": "nondim", + "value": { + "$OCN_GRID == \"tx2_3v2\"": 0.15 + } + }, "KH": { "description": "\"[m2 s-1] default = 0.0\nThe background Laplacian horizontal viscosity.\"\n", "datatype": "real", @@ -1140,7 +1184,7 @@ "datatype": "logical", "units": "Boolean", "value": { - "$OCN_GRID == \"tx2_3v2\"": true + "$OCN_GRID == \"tx2_3v2\"": false } }, "MIXEDLAYER_RESTRAT": { @@ -1399,6 +1443,22 @@ "$OCN_GRID == \"tx2_3v2\"": true } }, + "NU_ZERO": { + "description": "\"[m2 s-1] default = 0.005\nLeading coefficient in KPP shear mixing.\"\n", + "datatype": "real", + "units": "m2 s-1", + "value": { + "$OCN_GRID == \"tx2_3v2\"": 0.0025 + } + }, + "RI_ZERO": { + "description": "\"[nondim] default = 0.8\nCritical Richardson for KPP shear mixing, NOTE this the internal mixing and\nthis is not for setting the boundary layer depth.\"\n", + "datatype": "real", + "units": "nondim", + "value": { + "$OCN_GRID == \"tx2_3v2\"": 0.5 + } + }, "N_SMOOTH_RI": { "description": "\"default = 0\nIf > 0, vertically smooth the Richardson number by applying a 1-2-1 filter\nN_SMOOTH_RI times.\"\n", "datatype": "integer", @@ -1746,6 +1806,11 @@ "else": false } }, + "WIND_STAGGER": { + "description": "\"default = 'C'\nA case-insensitive character string to indicate the staggering of the input\nwind stress field. Valid values are 'A', 'B', or 'C'.\"\n", + "datatype": "string", + "value": "A" + }, "ENTHALPY_FROM_COUPLER": { "description": "\"[Boolean] default = False\nIf True, the heat (enthalpy) associated with mass entering/leaving\nthe ocean is provided via coupler.\"\n", "datatype": "logical", @@ -1855,7 +1920,7 @@ "units": "nondim", "value": { "$OCN_GRID == \"tx0.25v1\"": 1.0, - "$OCN_GRID == \"tx2_3v2\"": 1.0 + "$OCN_GRID == \"tx2_3v2\"": 0.25 } }, "MEKE_BGSRC": { @@ -1977,7 +2042,7 @@ "datatype": "real", "units": "nondim", "value": { - "$OCN_GRID == \"tx2_3v2\"": 0.09 + "$OCN_GRID == \"tx2_3v2\"": 0.06 } }, "MEKE_KHTH_FAC": { @@ -2223,7 +2288,7 @@ "datatype": "real", "units": "nondim", "value": { - "$COMP_WAV == \"ww3\" and $MOM6_WW3_CPL_METHOD == \"most\"": 2.0 + "$COMP_WAV == \"ww3\" and $MOM6_WW3_CPL_METHOD == \"most\"": 3.5 } }, "VISC_REM_BUG": { @@ -2293,13 +2358,6 @@ "$OCN_GRID == \"MISOMIP\"": 1.0 } }, - "EQN_OF_STATE": { - "description": "\"default = 'WRIGHT'\nEQN_OF_STATE determines which ocean equation of state\nshould be used. Currently, the valid choices are\n'LINEAR', 'UNESCO', and 'WRIGHT'.\nThis is only used if USE_EOS is true.\"\n", - "datatype": "string", - "value": { - "$OCN_GRID == \"MISOMIP\"": "LINEAR" - } - }, "RHO_T0_S0": { "description": "\"[kg m-3] default = 1000.0\nWhen EQN_OF_STATE=LINEAR,\nthis is the density at T=0, S=0.\"\n", "datatype": "real", @@ -2990,16 +3048,6 @@ "datatype": "string", "value": "${CASE}.mom6.h.ocean_geometry.nc" }, - "SKEB_NPASS": { - "description": "\"default = 3\nnumber of passes of a 9-point smoother of the dissipation estimate.\"\n", - "datatype": "integer", - "value": 10 - }, - "SKEB_GM_COEF": { - "description": "\"[nondim] default = 0.0\nFraction of GM work that is added to backscatter rate.\"\n", - "datatype": "real", - "value": 0.75 - }, "RESTART_CHECKSUMS_REQUIRED": { "description": "\"[Boolean] default = True\nIf true, require the restart checksums to match and error out otherwise. Users\nmay want to avoid this comparison if for example the restarts are made from a\nrun with a different mask_table than the current run, in which case the\nchecksums will not match and cause crash.\n", "datatype": "logical", @@ -3011,6 +3059,16 @@ "value": ".mom6" } }, + "CVMix_CONVECTION": { + "BV_SQR_CONV": { + "description": "\"[1/s^2] default = 0.0\nThreshold for squared buoyancy frequency needed to trigger Brunt-Vaisala\nparameterization.\"\n", + "datatype": "real", + "units": "1/s^2", + "value": { + "$OCN_GRID == \"tx2_3v2\"": -1e-08 + } + } + }, "KPP": { "N_SMOOTH": { "description": "\"default = 0\nThe number of times the 1-1-4-1-1 Laplacian filter is applied on\nOBL depth purely for diagnostic purposes.\"\n", @@ -3076,18 +3134,25 @@ "datatype": "real", "units": "nondim", "value": { - "$OCN_GRID == \"tx2_3v2\"": 1.0 + "$OCN_GRID == \"tx2_3v2\"": 1.8 + } + }, + "ENHANCE_DIFFUSION": { + "description": "\"default = True\nIf True, adds enhanced diffusion at the based of the boundary layer.\"\n", + "datatype": "logical", + "value": { + "$OCN_GRID == \"tx2_3v2\"": false } }, "STOKES_MOST": { - "description": "default = False\nIf True, use Stokes Similarity package.\n", + "description": "\"default = False\nIf True, use Stokes Similarity package.\"\n", "datatype": "logical", "value": { "$COMP_WAV == \"ww3\" and $MOM6_WW3_CPL_METHOD == \"most\"": true } }, "COMPUTE_MONIN_OBUKHOV": { - "description": "default = False\nIf True, limit the OBL depth to be no deeper than Monin-Obukhov depth.\n", + "description": "\"default = False\nIf True, limit the OBL depth to be no deeper than Monin-Obukhov depth.\"\n", "datatype": "logical", "units": "Boolean", "value": { @@ -3100,6 +3165,44 @@ "value": { "$OCN_GRID == \"tx2_3v2\"": 5.0 } + }, + "DO_SKEB": { + "description": "\"default = False\nIf true, then stochastically perturb the currents using the stochastic kinetic\nenergy backscatter scheme.\"\n", + "datatype": "logical", + "units": "Boolean", + "value": { + "$OCN_GRID == \"tx2_3v2\"": true + } + }, + "SKEB_USE_FRICT": { + "description": "\"default = False\nIf true, adds horizontal friction dissipation rate to the SKEBS amplitude.\"\n", + "datatype": "logical", + "units": "Boolean", + "value": { + "$OCN_GRID == \"tx2_3v2\"": true + } + }, + "SKEB_USE_GM": { + "description": "\"default = False\nIf true, adds GM work rate to the SKEBS amplitude.\"\n", + "datatype": "logical", + "units": "Boolean", + "value": { + "$OCN_GRID == \"tx2_3v2\"": true + } + }, + "SKEB_NPASS": { + "description": "\"[nondim] default = 0\n number of passes of a 9-point smoother of the dissipation estimate.\"\n", + "datatype": "integer", + "value": { + "$OCN_GRID == \"tx2_3v2\"": 8 + } + }, + "SKEB_GM_COEF": { + "description": "\"[nondim] default = 0.0\nFraction of GM work that is added to backscatter rate.\"\n", + "datatype": "real", + "value": { + "$OCN_GRID == \"tx2_3v2\"": 0.75 + } } }, "MLE": { @@ -3111,6 +3214,14 @@ "$OCN_GRID == \"tx2_3v2\"": true } }, + "CR": { + "description": "\"[nondim] default = 0.0\nThe efficiency coefficient in eq 27 of Bodner et al., 2023.\"\n", + "datatype": "real", + "units": "nondim", + "value": { + "$OCN_GRID == \"tx2_3v2\"": 0.01 + } + }, "USE_CR_GRID": { "description": "\"[Boolean] default = False\ntrue, read in a spatially varying Cr field.\"\n", "datatype": "logical", @@ -3123,7 +3234,15 @@ "description": "\"The path to the file containing the Cr fields.\"\n", "datatype": "string", "value": { - "$OCN_GRID == \"tx2_3v2\"": "mle-cr-tx2_3v2-v10_20250426.nc" + "$OCN_GRID == \"tx2_3v2\"": "mle-cr-mask_20250627.nc" + } + }, + "WAVE_ENHANCED_USTAR": { + "description": "\"default = False\nIf true, enhance ustar using surface waves, following Eq. 28 in Bodner23.\"\n", + "datatype": "logical", + "units": "Boolean", + "value": { + "$OCN_GRID == \"tx2_3v2\"": true } }, "MIN_WSTAR2": { diff --git a/param_templates/json/diag_table.json b/param_templates/json/diag_table.json index eb0149b5..6dd945d6 100644 --- a/param_templates/json/diag_table.json +++ b/param_templates/json/diag_table.json @@ -89,6 +89,9 @@ "KPP_OBLdepth:oml_min:min", "KPP_OBLdepth:oml_max:max" ], + [ + "skeb_amp" + ], [ "tauuo", "tauvo", @@ -168,7 +171,9 @@ "sin_rot", "cos_rot", "C_P", - "Rho_0" + "Rho_0", + "skeb_taper_v", + "skeb_taper_u" ], [ "volcello", @@ -352,6 +357,9 @@ "KPP_OBLdepth:oml_min:min", "KPP_OBLdepth:oml_max:max" ], + [ + "skeb_amp" + ], [ "tauuo", "tauvo", @@ -691,7 +699,9 @@ "sin_rot", "cos_rot", "C_P", - "Rho_0" + "Rho_0", + "skeb_taper_v", + "skeb_taper_u" ] ], "lists2": { diff --git a/param_templates/json/input_data_list.json b/param_templates/json/input_data_list.json index ccee78c0..f8494ef4 100644 --- a/param_templates/json/input_data_list.json +++ b/param_templates/json/input_data_list.json @@ -7,10 +7,16 @@ "ALE_COORDINATE_CONFIG": { "$MOM6_VERTICAL_GRID == \"zstar_75L\"": "${INPUTDIR}/zstar_75layer_2.5m_248.4m-2024-03-29.nc", "$MOM6_VERTICAL_GRID == \"zstar_65L\"": "${INPUTDIR}/vgrid_65L_20200626.nc", - "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID != \"tx0.25v1\"": "${INPUTDIR}/hybrid_75layer_zstar2.50m-2020-11-23.nc", + "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID != \"tx0.25v1\"": "${INPUTDIR}/hybrid_75layer_zstar_2.50m-2025-09-12.nc", "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID == \"tx0.25v1\"": "${INPUTDIR}/hycom1_75_800m.nc", "$OCN_GRID == \"tx0.25v1\"": "${INPUTDIR}/hycom1_75_800m.nc" }, + "MAXIMUM_INT_DEPTH_CONFIG": { + "$OCN_GRID == \"tx2_3v2\"": "${INPUTDIR}/lev-2025-09-12.nc" + }, + "MAX_LAYER_THICKNESS_CONFIG": { + "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID in [\"tx2_3v2\"]": "${DIN_LOC_ROOT}/ocn/mom/tx2_3v2/dz_max-2025-09-12.nc" + }, "DIAG_COORD_DEF_Z": { "$OCN_GRID == \"tx0.25v1\"": "${INPUTDIR}/interpolate_zgrid_40L.nc" }, @@ -30,9 +36,6 @@ "$INIT_LAYERS_FROM_Z_FILE == \"True\"": "${INPUTDIR}/${TEMP_SALT_Z_INIT_FILE}" } }, - "MAX_LAYER_THICKNESS_CONFIG": { - "$MOM6_VERTICAL_GRID == \"hycom1\" and $OCN_GRID in [\"tx2_3v2\"]": "${DIN_LOC_ROOT}/ocn/mom/grid_indpt/dz_max_90th_quantile.nc" - }, "SURFACE_PRESSURE_FILE": { "$OCN_GRID == \"MISOMIP\"": "${INPUTDIR}/MISOMIP_181108.nc" }, @@ -56,7 +59,7 @@ "$OCN_GRID == \"tx2_3v2\"": "${INPUTDIR}/seawifs-clim-1997-2010-tx2_3v2.230416.nc" }, "CR_FILE": { - "$OCN_GRID == \"tx2_3v2\"": "${INPUTDIR}/mle-cr-tx2_3v2-v10_20250426.nc" + "$OCN_GRID == \"tx2_3v2\"": "${INPUTDIR}/mle-cr-mask_20250627.nc" }, "CFC_BC_FILE": "${DIN_LOC_ROOT}/ocn/mom/grid_indpt/cfc_atm_20230310.nc", "DIAG_COORD_DEF_RHO2": { diff --git a/param_templates/json/input_nml.json b/param_templates/json/input_nml.json index 18882363..fe795a5e 100644 --- a/param_templates/json/input_nml.json +++ b/param_templates/json/input_nml.json @@ -83,13 +83,16 @@ "values": 1.0 }, "OCNSKEB_LSCALE": { - "values": "200e3" + "values": "300e3" }, "OCNSKEB_TAU": { "values": 21600 }, "ISEED_OCNSKEB": { "values": 20 + }, + "ntrunc": { + "values": 192 } } } \ No newline at end of file diff --git a/tests/check_input_data_repo.py b/tests/check_input_data_repo.py index 2b2529ce..be8d7d42 100755 --- a/tests/check_input_data_repo.py +++ b/tests/check_input_data_repo.py @@ -1,12 +1,116 @@ #!/usr/bin/env python import yaml -import svn.remote as sr +import subprocess from check_input_data_list import ( get_input_files_in_MOM_input, get_input_data_list_files, ) + +def get_repo_files_with_curl(base_url): + """ + Get file list from repository using curl and HTML parsing instead of SVN. + + The server provides HTML directory listings that we can parse to find files. + This function recursively traverses directories to find all files. + + Parameters + ---------- + base_url : str + The base URL of the repository + + Returns + ------- + set + Set of file names found in the repository + """ + import re + + def parse_html_directory_listing(html_content, current_url): + """Parse HTML directory listing to find files and directories.""" + files = [] + directories = [] + + # Look for href links in the HTML + href_pattern = r']*>([^<]+)' + matches = re.findall(href_pattern, html_content) + + for href, text in matches: + # Skip parent directory links and external URLs + if href.startswith('..') or href.startswith('http'): + continue + + if href.endswith('/'): + # This is a directory + directories.append(href.rstrip('/')) + else: + # This is a file - include ALL files (no filtering) + files.append(href) + + return files, directories + + def get_directory_content(url): + """Get HTML content from a directory URL.""" + try: + result = subprocess.run( + ["curl", "-s", "-L", url], + capture_output=True, + text=True, + timeout=20 + ) + if result.returncode == 0: + return result.stdout + else: + print(f"Error fetching {url}: {result.stderr}") + return None + except Exception as e: + print(f"Error fetching {url}: {e}") + return None + + try: + all_files = set() + directories_to_visit = [base_url.rstrip('/')] + visited_dirs = set() + + # Process directories with full recursive discovery + while directories_to_visit: + current_dir = directories_to_visit.pop(0) + if current_dir in visited_dirs: + continue + + visited_dirs.add(current_dir) + html_content = get_directory_content(current_dir) + if not html_content: + continue + + files, subdirs = parse_html_directory_listing(html_content, current_dir) + + # Add ALL files to our collection (no filtering) + for file in files: + filename = file.split('/')[-1] # Extract just the filename + all_files.add(filename) + + # Add all discovered subdirectories to visit list + for subdir in subdirs: + if subdir.startswith('/'): + # Absolute path - construct full URL + full_subdir_url = f"https://osdf-director.osg-htc.org{subdir}/" + else: + # Relative path + full_subdir_url = f"{current_dir.rstrip('/')}/{subdir}/" + + if full_subdir_url not in visited_dirs: + directories_to_visit.append(full_subdir_url) + + print(f"Found {len(all_files)} files total in repository") + return all_files + + except Exception as e: + print(f"Unexpected error getting repository files: {e}") + return set() + + if __name__ == "__main__": # Read in the MOM_input.yaml file and extract all input file names @@ -21,13 +125,17 @@ input_data_list_yaml, MOM_input_files ) - # all mom input file names in svn inputdata repository - r = sr.RemoteClient( - "https://svn-ccsm-inputdata.cgd.ucar.edu/trunk/inputdata/ocn/mom/" - ) - repo_files = {f["name"] for relpath, f in r.list_recursive() if f["kind"] == "file"} + # all mom input file names in gdex inputdata repository + repo_url = "https://osdf-data.gdex.ucar.edu/ncar/gdex/d651077/cesmdata/inputdata/ocn/mom/" + repo_files = get_repo_files_with_curl(repo_url) + + if not repo_files: + print("WARNING: Could not retrieve file list from repository.") + print("This may be due to connectivity issues or changes in repository structure.") + print("Repository validation will be skipped.") + exit(0) # Exit successfully since this is likely an infrastructure issue - # File names missing in the svn repository + # File names missing in the repository missing_files = ( set( filename @@ -39,10 +147,10 @@ if missing_files: raise ValueError( "Below file names are listed in input_data_list.yaml but are missing " - "in the svn inputdata repository. If these files are not needed, " + "in the inputdata repository. If these files are not needed, " "please remove them from input_data_list.yaml. If they are needed, " - "please import them to the svn repository.\n\n " + "please import them to the gdex repository.\n\n " + "\n ".join(missing_files) ) else: - print("All files in input_data_list.yaml are present in the svn repository.") + print("All files in input_data_list.yaml are present in the gdex repository.")