diff --git a/demos/README.md b/demos/README.md new file mode 100644 index 00000000..e69de29b diff --git a/demos/model-forced.ipynb b/demos/access_om2-forced.ipynb similarity index 96% rename from demos/model-forced.ipynb rename to demos/access_om2-forced.ipynb index bb468940..d9c31fb2 100644 --- a/demos/model-forced.ipynb +++ b/demos/access_om2-forced.ipynb @@ -4,9 +4,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Forcing with model output\n", + "# Example for NCI users: Regional Tasmania JRA-55 and ACCESS-OM2\n", "\n", - "### This example is most useful for people with access to Australia's National Computational Infrastructure facility, because the model output being used is hosted here. For others, the 'reanalysis-forced' example will be more helpful as it relies only on open source data." + "**Before you begin, make sure you have access to the relevent projects to access the data listed below**\n", + "\n", + "## What does this notebook do?\n", + "This notebook is designed to set you up with a working MOM6 regional configuration. First, try and get it running with our default Tasmania case, then you can clone the notebook and modify for your region of interest. \n", + "\n", + "Input Type | Source | Location on NCI\n", + "---|---|---\n", + "Surface | [JRA55 surface forcing](https://climatedataguide.ucar.edu/climate-data/jra-55) | `/g/data/ik11`\n", + "Ocean | [ACCESS-OM2-01](https://data.marine.copernicus.eu/product/GLOBAL_MULTIYEAR_PHY_001_030/description) | `/g/data/ik11` \n", + "Bathymetry | [GEBCO](https://www.gebco.net/data_and_products/gridded_bathymetry_data/) | `/g/data/ik11`\n", + "\n", + "Additionally, you'll need access to `/g/data/x77/` if you want to use the same executable using the latest FMS build (a good idea for troubleshooting)." ] }, { @@ -332,27 +343,13 @@ } ], "source": [ - "import numpy as np\n", - "from itertools import cycle\n", + "## To simply use Ashley's version of this package, uncomment the following:\n", "import os\n", - "import dask.array as da\n", - "import dask.bag as db\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import xarray as xr\n", - "import xesmf as xe\n", - "import subprocess\n", - "from scipy.ndimage import binary_fill_holes\n", - "from importlib import reload\n", - "\n", - "\n", - "## For NCI users, uncomment the following line if you just want to import from my copy of the code and sidestep the installation process\n", - "## In this case just use the latest version of the analysis env. HOWEVER! Note that without the latest version of xesmf which is not yet\n", - "## available on analysis3, the regridding will only work in serial and won't be suitable for large domains\n", - "\n", "# os.chdir(\"/home/149/ab8992/cosima_regional/regional-mom6/\")\n", - "\n", + "#IMPORTANT: As of Nov 2023 you need to use analysis-unstable to get the latest version of xESMF or bathymetry regridding won't work\n", + "import xarray as xr\n", "import regional_mom6 as rm\n", + "from pathlib import Path\n", "from dask.distributed import Client\n", "client = Client()\n", "client" @@ -364,7 +361,7 @@ "source": [ "## What does this package do?\n", "\n", - "Setting up a regional model in MOM6 is a pain. The goal of this package is that users should spend their debugging time fixing a model that's running and doing weird things, rather than puzzling over a model that won't even start.\n", + "Setting up a regional model in MOM6 can be a pain. The goal of this package is that users should spend their debugging time fixing a model that's running and doing weird things, rather than puzzling over a model that won't even start.\n", "\n", "In running this notebook, you'll hopefully have a running MOM6 regional model. There will still be a lot of fiddling to do with the MOM_input file to make sure that the parameters are set up right for your domain, and you might want to manually edit some of the input files. BUT, this package should help you bypass most of the woes of regridding, encoding and understanding the arcane arts of the MOM6 boundary segment files. \n" ] @@ -440,13 +437,12 @@ "## Directory where fre tools are stored\n", "toolpath = \"/home/157/ahg157/repos/mom5/src/tools/\" ## Compiled tools needed for construction of mask tables\n", "\n", - "## Directory where raw downloads go before processing\n", + "## Directory where ocean model cut-outs go before processing\n", "tmpdir = f\"{scratch}/regional_tmp/{expt_name}\"\n", "\n", "for i in [rundir,tmpdir,inputdir]:\n", " if not os.path.exists(i):\n", - " subprocess.run(f\"mkdir {i} -p\",shell=True)\n", - "\n", + " os.makedirs(str(i))\n", "\n" ] }, @@ -464,11 +460,7 @@ "metadata": {}, "source": [ "\n", - "If you have access to where it's located on Gadi, you can execute the following cell to cut out and save your segments and use these instead. The default I've set it at below is to cut out 3 months. To cut out a year, uncomment the code above which concatenates several input files together. Keep in mind that these input files are HUGE and they'll take a while to open and processes. To do a whole year, you'll want to run with a whole node and go make yourself a cup of coffee (and maybe read the paper for a bit). \n", - "\n", - "The advantage of doing this though is that the input files that the pipeline has to deal with are a lot smaller, making subsequent computation a lot quicker. An older iteration of the boundary brushcutter was to read data directly from the huge datasets, but this required some very careful chunking to not break your kernel. \n", - "\n", - "**NOTE: I haven't automated this properly and it's hardcoded for the year of 1990, which corresponds to files 1077 - 1082. Could maybe use COSIMA cookbook for this step instead?**" + "**NOTE: this is hardcoded for the year of 1990, which corresponds to files 1077 - 1082. If you want to modify, you'll need to choose the right path to the year of your choice, or use the COSIMA cookbook to locate your data files**" ] }, { @@ -478,20 +470,13 @@ "outputs": [], "source": [ "\n", - "########## TWO OPTIONS: ############################\n", "\n", - "## Use this if you want to do a quick test for up to 3 months\n", + "## Cut out 3 months of forcing from 1990\n", "om2_input = xr.open_mfdataset(f\"/g/data/ik11/outputs/access-om2-01/01deg_jra55v13_ryf9091/output1077/ocean/ocean_daily*\",parallel=True,chunks='auto')[[\"u\",\"v\",\"salt\",\"temp\",\"eta_t\"]].sel( \n", " yu_ocean = slice(yextent[0] - 0.2,yextent[1] + 0.2),\n", " yt_ocean = slice(yextent[0] - 0.2,yextent[1] + 0.2)\n", ").isel(time = slice(0,5))\n", - "## Use this to cut out entire year \n", - "# om2_input = xr.concat(\n", - "# [xr.open_mfdataset(f\"/g/data/ik11/outputs/access-om2-01/01deg_jra55v13_ryf9091/output{i}/ocean/ocean_daily*\",decode_times = False,parallel=True,chunks='auto') for i in range(1077,1082)],\n", - "# \"time\"\n", - "# )\n", - "#! for i in range(1077,1082) is hardcoded to choose the year of 1990 Jan -> Dec 31. \n", - "#######################################################\n", + "\n", "\n", "# Cut out initial condition and save\n", "ic = om2_input.isel(time = 0)\n", @@ -527,22 +512,7 @@ "## Step 3: Make experiment object\n", "This object keeps track of your domain basics, as well as generating the hgrid, vgrid and setting up the folder structures. \n", "\n", - "After running you can have a look at your grids by calling `expt.hgrid` and `expt.vgrid`\n", - "\n", - "Plotting vgrid with marker = '.' option lets you see the spacing, or plotting \n", - "```python\n", - "np.diff(expt.hgrid.zl).plot(marker = '.')\n", - "```\n", - " shows you the vertical spacing profile.\n", - "\n", - "### Modular workflow!\n", - "\n", - "After constructing your expt object, if you don't like my lazy default hgrid and vgrid you can simply modify and overwrite them. However, you'll also need to save them to disk again as I've not automated this just yet. For example:\n", - "\n", - "```python\n", - "expt.hgrid = custom_hgrid\n", - "expt.hgrid.to_netcdf(f\"{inputdir}/hgrid.nc\")\n", - "```" + "\n" ] }, { @@ -564,12 +534,11 @@ } ], "source": [ - "reload(rm)\n", "expt = rm.experiment(\n", " xextent,\n", " yextent,\n", " daterange,\n", - " 0.05, # Resolution\n", + " 0.05, # Horizontal Resolution\n", " 75, # Number of vertical layers\n", " 10, # Ratio of largest to smallest vertical layer. Select 1 for linear, negative number for higher resolution at bottom\n", " 4500, # Depth of simulation\n", @@ -579,13 +548,41 @@ ")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After running you can have a look at your grids by calling `expt.hgrid` and `expt.vgrid`\n", + "\n", + "Plotting vgrid with marker = '.' option lets you see the spacing, or plotting \n", + "```python\n", + "np.diff(expt.vgrid.zl).plot(marker = '.')\n", + "```\n", + " shows you the vertical spacing profile.\n", + "\n", + " ### Modular workflow!\n", + "\n", + "After constructing your expt object, if you don't like the default hgrid and vgrids you can simply modify and overwrite them. However, you'll then also need to save them to disk again. For example:\n", + "\n", + "```python\n", + "new_hgrid = xr.open_dataset(inputdir / \"hgrid.nc\")\n", + "```\n", + "Modify `new_hgrid`, ensuring that metadata is retained to keep MOM6 happy. Then, save your changes\n", + "\n", + "```python\n", + "expt.hgrid = new_hgrid\n", + "\n", + "expt.hgrid.to_netcdf(inputdir / \"hgrid.nc\")\n", + "```" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 4: Set up bathymetry\n", "\n", - "Similarly to ocean forcing, we point our 'bathymetry' method at the location of the file of choice, and pass it a dictionary mapping variable names. This time we don't need to preprocess the topography since it's just a 2D field and easier to deal with. Afterwards you can run `expt.topog` and have a look at your domain. After running this cell, your input directory will contain other topography - adjacent things like the ocean mosaic and mask table too. This defaults to a 10x10 layout which can be updated later." + "Similarly to ocean forcing, we point our 'bathymetry' method at the location of the file of choice, and pass it a dictionary mapping variable names. This time we don't need to preprocess the topography since it's just a 2D field and easier to deal with. Afterwards you can run `expt.topog` and have a look at your domain. " ] }, { @@ -713,7 +710,7 @@ " {\"xh\":\"lon\",\n", " \"yh\":\"lat\",\n", " \"elevation\":\"elevation\"}, ## Again this dictionary just maps mom6 variable names to what they are in your topog.\n", - " minimum_layers = 1\n", + " minimum_layers = 1 ## Minimum number of layers allowed. Any areas with fewer layers are marked as land\n", " )" ] }, @@ -762,7 +759,7 @@ "\n", "This cuts out and interpolates the initial condition as well as all boundaries (unless you don't pass it boundaries).\n", "\n", - "The dictionary maps the MOM6 variable names to what they're called in your ocean input file. Notice how the horizontal dimensions are x and y, vs xh, yh, xq, yq. This is because ACCESS-OM2-01 is on a `B` grid, so we need to differentiate between `q` and `t` points. \n", + "The dictionary maps the MOM6 variable names to what they're called in your ocean input file. Notice how the horizontal dimensions are x and y in the GLORYS reanalysis example, vs xh, yh, xq, yq. This is because ACCESS-OM2-01 is on a `B` grid, so we need to differentiate between `q` and `t` points. \n", "\n", "If one of your segments is land, you can delete its string from the 'boundaries' list. You'll need to update MOM_input to reflect this though so it knows how many segments to look for, and their orientations. \n" ] @@ -773,7 +770,6 @@ "metadata": {}, "outputs": [], "source": [ - "## FOR ACCESS OM2: \n", "expt.ocean_forcing(\n", " tmpdir, ## Path to ocean foring files\n", " {\"time\":\"time\",\n", @@ -815,7 +811,7 @@ "source": [ "## Step 7: Modify the default input directory to make a (hopefully) runnable configuration out of the box\n", "\n", - "This cell just copies a default run directory and modifies it to match your configuration.\n", + "This step copies the default directory, and modifies the `MOM_input` and `SIS_input` files to match your experiment. If you use Payu to run mom6, set the `using_payu` flag to `True` and an example `config.yaml` file will be copied to your run directory. This still needs to be modified manually to work with your projects, executable etc.\n", "\n" ] }, @@ -833,101 +829,7 @@ } ], "source": [ - "subprocess.run(f\"cp default_rundir/jra_surface/* {rundir} -r\",shell = True)\n", - "subprocess.run(f\"ln -s {inputdir} {rundir}/inputdir\",shell=True)\n", - "\n", - "hgrid = xr.open_dataset(f\"{inputdir}/hgrid.nc\")\n", - "\n", - "## Get mask table information\n", - "ncpus = 10\n", - "mask_table = None\n", - "for i in os.listdir(f\"{inputdir}\"):\n", - " if \"mask_table\" in i:\n", - " mask_table = i\n", - " a = mask_table.split(\".\")[1]\n", - " b = mask_table.split(\".\")[2].split(\"x\")\n", - " ncpus = int(b[0]) * int(b[1]) - int(a)\n", - "\n", - "\n", - "## Modify MOM_input\n", - "inputfile = open(f\"{rundir}/MOM_input\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"MASKTABLE\" in lines[i]:\n", - " if mask_table != None:\n", - " lines[i] = f'MASKTABLE = \"{mask_table}\"\\n'\n", - " else:\n", - " lines[i] = \"# MASKTABLE = no mask table\"\n", - " if \"LAYOUT =\" in lines[i] and \"IO\" not in lines[i]:\n", - " lines[i] = f'LAYOUT = {expt.layout[1]},{expt.layout[0]}\\n'\n", - "\n", - " if \"NIGLOBAL\" in lines[i]: \n", - " # lines[i] = f\"NIGLOBAL = {str(x_indices_centre[1] - x_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NIGLOBAL = {hgrid.nx.shape[0]//2}\\n\"\n", - "\n", - " \n", - " if \"NJGLOBAL\" in lines[i]:\n", - " # lines[i] = f\"NJGLOBAL = {str(y_indices_centre[1] - y_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NJGLOBAL = {hgrid.ny.shape[0]//2}\\n\"\n", - "\n", - " \n", - "inputfile = open(f\"{rundir}/MOM_input\",'w')\n", - "\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n", - "\n", - "## Modify SIS_input\n", - "inputfile = open(f\"{rundir}/SIS_input\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"MASKTABLE\" in lines[i]:\n", - " lines[i] = f'MASKTABLE = \"{mask_table}\"\\n'\n", - " if \"NIGLOBAL\" in lines[i]:\n", - " # lines[i] = f\"NIGLOBAL = {str(x_indices_centre[1] - x_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NIGLOBAL = {hgrid.nx.shape[0]//2}\\n\"\n", - " if \"LAYOUT =\" in lines[i] and \"IO\" not in lines[i]:\n", - " lines[i] = f'LAYOUT = {expt.layout[1]},{expt.layout[0]}\\n'\n", - " if \"NJGLOBAL\" in lines[i]:\n", - " # lines[i] = f\"NJGLOBAL = {str(y_indices_centre[1] - y_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NJGLOBAL = {hgrid.ny.shape[0]//2}\\n\"\n", - " \n", - "inputfile = open(f\"{rundir}/SIS_input\",'w')\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n", - "\n", - "## Modify config.yaml \n", - "inputfile = open(f\"{rundir}/config.yaml\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"ncpus\" in lines[i]:\n", - " lines[i] = f'ncpus: {str(ncpus)}\\n'\n", - " if \"jobname\" in lines[i]:\n", - " lines[i] = f\"jobname: mom6_{expt_name}\\n\"\n", - " \n", - " if \"input:\" in lines[i]:\n", - " lines[i + 1] = f\" - {inputdir}\\n\"\n", - "\n", - "inputfile = open(f\"{rundir}/config.yaml\",'w')\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n", - "\n", - "\n", - "# Modify input.nml \n", - "inputfile = open(f\"{rundir}/input.nml\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"current_date\" in lines[i]:\n", - " tmp = daterange[0].split(\" \")[0].split(\"-\")\n", - " lines[i] = f\"{lines[i].split(' = ')[0]} = {int(tmp[0])},{int(tmp[1])},{int(tmp[2])},0,0,0,\\n\"\n", - "\n", - " \n", - "inputfile = open(f\"{rundir}/input.nml\",'w')\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n" + "expt.setup_run_directory(surface_forcing = \"jra\",using_payu = True)" ] }, { diff --git a/demos/premade_run_directories/README.md b/demos/premade_run_directories/README.md new file mode 100644 index 00000000..18b5da0c --- /dev/null +++ b/demos/premade_run_directories/README.md @@ -0,0 +1,6 @@ + +## Premade Run Directories + +These folders are used for the demo notebooks, and can be used as templates for setting up a new experiment. The difference in the choices is the surface forcing, affecting the `data_table`. + +The `common_files` folder contains all of the required files for a regional MOM6 run, including a `data_table` with constant surface forcing as a placeholder. If you call `.setup_rundir` and specify `jra` \ No newline at end of file diff --git a/demos/premade_run_directories/common_files/MOM_input b/demos/premade_run_directories/common_files/MOM_input new file mode 100755 index 00000000..b1beab7c --- /dev/null +++ b/demos/premade_run_directories/common_files/MOM_input @@ -0,0 +1,592 @@ +! MOM_input based on that of North West Atlantic experiment https://github.com/jsimkins2/nwa25/blob/main/run/sim1.0/MOM_input credit to jsimkins for the tuning and troubleshooting that went into choices of some of these parameters. + +! === module MOM === +USE_REGRIDDING = True ! [Boolean] default = False + ! If True, use the ALE algorithm (regridding/remapping). If False, use the + ! layered isopycnal algorithm. +DT = 600.0 ! [s] + ! The (baroclinic) dynamics time step. The time-step that is actually used will + ! be an integer fraction of the forcing time-step (DT_FORCING in ocean-only mode + ! or the coupling timestep in coupled mode.) +DT_THERM = 1800.0 ! [s] default = 600.0 + ! The thermodynamic and tracer advection time step. Ideally DT_THERM should be + ! an integer multiple of DT and less than the forcing or coupling time-step, + ! unless THERMO_SPANS_COUPLING is true, in which case DT_THERM can be an integer + ! multiple of the coupling timestep. By default DT_THERM is set to DT. +FRAZIL = True ! [Boolean] default = False + ! If true, water freezes if it gets too cold, and the accumulated heat deficit + ! is returned in the surface state. FRAZIL is only used if + ! ENABLE_THERMODYNAMICS is true. +BOUND_SALINITY = True ! [Boolean] default = False + ! If true, limit salinity to being positive. (The sea-ice model may ask for more + ! salt than is available and drive the salinity negative otherwise.) +C_P = 3992.0 ! [J kg-1 K-1] default = 3991.86795711963 + ! The heat capacity of sea water, approximated as a constant. This is only used + ! if ENABLE_THERMODYNAMICS is true. The default value is from the TEOS-10 + ! definition of conservative temperature. +CHECK_BAD_SURFACE_VALS = True ! [Boolean] default = False + ! If true, check the surface state for ridiculous values. +BAD_VAL_SST_MIN = -3.0 ! [deg C] default = -2.1 + ! The value of SST below which a bad value message is triggered, if + ! CHECK_BAD_SURFACE_VALS is true. + +! === module MOM_fixed_initialization === +INPUTDIR = "INPUT" ! default = "." + ! The directory in which input files are found. + +! === module MOM_grid_init === +GRID_CONFIG = "mosaic" ! + ! A character string that determines the method for defining the horizontal + ! grid. Current options are: + ! mosaic - read the grid from a mosaic (supergrid) + ! file set by GRID_FILE. + ! cartesian - use a (flat) Cartesian grid. + ! spherical - use a simple spherical grid. + ! mercator - use a Mercator spherical grid. +GRID_FILE = "hgrid.nc" ! + ! Name of the file from which to read horizontal grid data. +TOPO_CONFIG = "file" ! + ! This specifies how bathymetry is specified: + ! file - read bathymetric information from the file + ! specified by (TOPO_FILE). + ! flat - flat bottom set to MAXIMUM_DEPTH. + ! bowl - an analytically specified bowl-shaped basin + ! ranging between MAXIMUM_DEPTH and MINIMUM_DEPTH. + ! spoon - a similar shape to 'bowl', but with an vertical + ! wall at the southern face. + ! halfpipe - a zonally uniform channel with a half-sine + ! profile in the meridional direction. + ! bbuilder - build topography from list of functions. + ! benchmark - use the benchmark test case topography. + ! Neverworld - use the Neverworld test case topography. + ! DOME - use a slope and channel configuration for the + ! DOME sill-overflow test case. + ! ISOMIP - use a slope and channel configuration for the + ! ISOMIP test case. + ! DOME2D - use a shelf and slope configuration for the + ! DOME2D gravity current/overflow test case. + ! Kelvin - flat but with rotated land mask. + ! seamount - Gaussian bump for spontaneous motion test case. + ! dumbbell - Sloshing channel with reservoirs on both ends. + ! shelfwave - exponential slope for shelfwave test case. + ! Phillips - ACC-like idealized topography used in the Phillips config. + ! dense - Denmark Strait-like dense water formation and overflow. + ! USER - call a user modified routine. +MINIMUM_DEPTH = 4.5 ! [m] default = 0.0 + ! If MASKING_DEPTH is unspecified, then anything shallower than MINIMUM_DEPTH is + ! assumed to be land and all fluxes are masked out. If MASKING_DEPTH is + ! specified, then all depths shallower than MINIMUM_DEPTH but deeper than + ! MASKING_DEPTH are rounded to MINIMUM_DEPTH. +MAXIMUM_DEPTH = 6000.0 ! [m] + ! The maximum depth of the ocean. + +! === module MOM_open_boundary === +! Controls where open boundaries are located, what kind of boundary condition to impose, and what data to apply, +! if any. +OBC_NUMBER_OF_SEGMENTS = 4 ! default = 0 + ! The number of open boundary segments. +OBC_FREESLIP_VORTICITY = False ! [Boolean] default = True + ! If true, sets the normal gradient of tangential velocity to zero in the + ! relative vorticity on open boundaries. This cannot be true if another + ! OBC_XXX_VORTICITY option is True. +OBC_COMPUTED_VORTICITY = True ! [Boolean] default = False + ! If true, uses the external values of tangential velocity in the relative + ! vorticity on open boundaries. This cannot be true if another OBC_XXX_VORTICITY + ! option is True. +OBC_FREESLIP_STRAIN = False ! [Boolean] default = True + ! If true, sets the normal gradient of tangential velocity to zero in the strain + ! use in the stress tensor on open boundaries. This cannot be true if another + ! OBC_XXX_STRAIN option is True. +OBC_COMPUTED_STRAIN = True ! [Boolean] default = False + ! If true, sets the normal gradient of tangential velocity to zero in the strain + ! use in the stress tensor on open boundaries. This cannot be true if another + ! OBC_XXX_STRAIN option is True. +OBC_ZERO_BIHARMONIC = True ! [Boolean] default = False + ! If true, zeros the Laplacian of flow on open boundaries in the biharmonic + ! viscosity term. +OBC_TIDE_N_CONSTITUENTS = 0 ! default = 0 + ! Number of tidal constituents being added to the open boundary. +OBC_SEGMENT_001 = "J=0,I=0:N,FLATHER,ORLANSKI,NUDGED,ORLANSKI_TAN,NUDGED_TAN" ! + ! Documentation needs to be dynamic????? +OBC_SEGMENT_001_VELOCITY_NUDGING_TIMESCALES = 0.3, 360.0 ! [days] default = 0.0 + ! Timescales in days for nudging along a segment, for inflow, then outflow. + ! Setting both to zero should behave like SIMPLE obcs for the baroclinic + ! velocities. +OBC_SEGMENT_002 = "J=N,I=N:0,FLATHER,ORLANSKI,NUDGED,ORLANSKI_TAN,NUDGED_TAN" ! + ! Documentation needs to be dynamic????? +OBC_SEGMENT_002_VELOCITY_NUDGING_TIMESCALES = 0.3, 360.0 ! [days] default = 0.0 + ! Timescales in days for nudging along a segment, for inflow, then outflow. + ! Setting both to zero should behave like SIMPLE obcs for the baroclinic + ! velocities. +OBC_SEGMENT_003 = "I=0,J=N:0,FLATHER,ORLANSKI,NUDGED,ORLANSKI_TAN,NUDGED_TAN" ! + ! Documentation needs to be dynamic????? +OBC_SEGMENT_003_VELOCITY_NUDGING_TIMESCALES = 0.3, 360.0 ! [days] default = 0.0 + ! Timescales in days for nudging along a segment, for inflow, then outflow. + ! Setting both to zero should behave like SIMPLE obcs for the baroclinic + ! velocities. +OBC_SEGMENT_004 = "I=N,J=0:N,FLATHER,ORLANSKI,NUDGED,ORLANSKI_TAN,NUDGED_TAN" ! + ! Documentation needs to be dynamic????? +OBC_SEGMENT_004_VELOCITY_NUDGING_TIMESCALES = 0.3, 360.0 ! [days] default = 0.0 + ! Timescales in days for nudging along a segment, for inflow, then outflow. + ! Setting both to zero should behave like SIMPLE obcs for the baroclinic + ! velocities. +OBC_TRACER_RESERVOIR_LENGTH_SCALE_OUT = 3.0E+04 ! [m] default = 0.0 + ! An effective length scale for restoring the tracer concentration at the + ! boundaries to externally imposed values when the flow is exiting the domain. +OBC_TRACER_RESERVOIR_LENGTH_SCALE_IN = 3000.0 ! [m] default = 0.0 + ! An effective length scale for restoring the tracer concentration at the + ! boundaries to values from the interior when the flow is entering the domain. +BRUSHCUTTER_MODE = True ! [Boolean] default = False + ! If true, read external OBC data on the supergrid. +OBC_TIDE_CONSTITUENTS = "M2" ! + ! Names of tidal constituents being added to the open boundaries. +OBC_TIDE_ADD_EQ_PHASE = True ! [Boolean] default = False + ! If true, add the equilibrium phase argument to the specified tidal phases. +OBC_TIDE_REF_DATE = 1995, 1, 1 ! + ! Reference date to use for tidal calculations and equilibrium phase. + +! === module MOM_verticalGrid === +! Parameters providing information about the vertical grid. +NK = 75 ! [nondim] + ! The number of model layers. + +! === module MOM_EOS === + +! === module MOM_restart === +RESTART_CHECKSUMS_REQUIRED = False ! [Boolean] default = True + ! If true, require the restart checksums to match and error out otherwise. Users + ! may want to avoid this comparison if for example the restarts are made from a + ! run with a different mask_table than the current run, in which case the + ! checksums will not match and cause crash. +PARALLEL_RESTARTFILES = True ! [Boolean] default = False + ! If true, the IO layout is used to group processors that write to the same + ! restart file or each processor writes its own (numbered) restart file. If + ! false, a single restart file is generated combining output from all PEs. +! === module MOM_tracer_flow_control === + +! === module MOM_boundary_update === + +! === module segment_tracer_registry_init === + +! === module MOM_coord_initialization === +COORD_CONFIG = "ALE" ! default = "none" + ! This specifies how layers are to be defined: + ! ALE or none - used to avoid defining layers in ALE mode + ! file - read coordinate information from the file + ! specified by (COORD_FILE). + ! BFB - Custom coords for buoyancy-forced basin case + ! based on SST_S, T_BOT and DRHO_DT. + ! linear - linear based on interfaces not layers + ! layer_ref - linear based on layer densities + ! ts_ref - use reference temperature and salinity + ! ts_range - use range of temperature and salinity + ! (T_REF and S_REF) to determine surface density + ! and GINT calculate internal densities. + ! gprime - use reference density (RHO_0) for surface + ! density and GINT calculate internal densities. + ! ts_profile - use temperature and salinity profiles + ! (read from COORD_FILE) to set layer densities. + ! USER - call a user modified routine. +REGRIDDING_COORDINATE_MODE = "ZSTAR" ! default = "LAYER" + ! Coordinate mode for vertical regridding. Choose among the following + ! possibilities: LAYER - Isopycnal or stacked shallow water layers + ! ZSTAR, Z* - stretched geopotential z* + ! SIGMA_SHELF_ZSTAR - stretched geopotential z* ignoring shelf + ! SIGMA - terrain following coordinates + ! RHO - continuous isopycnal + ! HYCOM1 - HyCOM-like hybrid coordinate + ! HYBGEN - Hybrid coordinate from the Hycom hybgen code + ! ADAPTIVE - optimize for smooth neutral density surfaces +ALE_COORDINATE_CONFIG = "FILE:vcoord.nc,interfaces=zi" ! default = "UNIFORM" + ! Determines how to specify the coordinate resolution. Valid options are: + ! PARAM - use the vector-parameter ALE_RESOLUTION + ! UNIFORM[:N] - uniformly distributed + ! FILE:string - read from a file. The string specifies + ! the filename and variable name, separated + ! by a comma or space, e.g. FILE:lev.nc,dz + ! or FILE:lev.nc,interfaces=zw + ! WOA09[:N] - the WOA09 vertical grid (approximately) + ! FNC1:string - FNC1:dz_min,H_total,power,precision + ! HYBRID:string - read from a file. The string specifies + ! the filename and two variable names, separated + ! by a comma or space, for sigma-2 and dz. e.g. + ! HYBRID:vgrid.nc,sigma2,dz +!ALE_RESOLUTION = 5.407506020722602, 5.436748154364873, 5.46984360620371, 5.507297000531434, 5.549678163639875, 5.597630300112868, 5.651879124244772, 5.713243038028118, 5.7826444498427065, 5.8611223285762435, 5.949846085539647, 6.050130870088353, 6.163454352909142, 6.291475051710037, 6.4360522253704175, 6.5992673218064795, 6.783446908680816, 6.991186940863969, 7.225378119884397, 7.489231973597498, 7.786307123675783, 8.120535008849856, 8.496244087992778, 8.918181255018851, 9.391528855058738, 9.921915299810308, 10.515416846031968, 11.178547639275024, 11.918234660232827, 12.741773782464065, 13.65676281371762, 14.671007224204715, 15.79239435993992, 17.02873241208607, 18.38755139003888, 19.87586495105154, 21.49989427380592, 23.26475827597983, 25.174138325402055, 27.22993001076844, 29.431899188770103, 31.777363900058504, 34.260927176835935, 36.87428748285072, 39.606152781849005, 42.44228044729459, 45.36565817902613, 48.35683105775922, 51.39436769875476, 54.455445544554436, 57.51652339035422, 60.55406003134965, 63.54523291008286, 66.4686106418144, 69.30473830725987, 72.03660360625827, 74.64996391227305, 77.13352718905048, 79.47899190033877, 81.68096107834049, 83.73675276370682, 85.64613281312904, 87.41099681530295, 89.035026138 +REMAPPING_SCHEME = "PPM_H4" ! default = "PLM" + ! This sets the reconstruction scheme used for vertical remapping for all + ! variables. It can be one of the following schemes: + ! PCM (1st-order accurate) + ! PLM (2nd-order accurate) + ! PLM_HYBGEN (2nd-order accurate) + ! PPM_H4 (3rd-order accurate) + ! PPM_IH4 (3rd-order accurate) + ! PPM_HYBGEN (3rd-order accurate) + ! WENO_HYBGEN (3rd-order accurate) + ! PQM_IH4IH3 (4th-order accurate) + ! PQM_IH6IH5 (5th-order accurate) + +! === module MOM_state_initialization === +INIT_LAYERS_FROM_Z_FILE = True ! [Boolean] default = False + ! If true, initialize the layer thicknesses, temperatures, and salinities from a + ! Z-space file on a latitude-longitude grid. + +! === module MOM_initialize_layers_from_Z === +TEMP_SALT_Z_INIT_FILE = "forcing/init_tracers.nc" ! default = "temp_salt_z.nc" + ! The name of the z-space input file used to initialize temperatures (T) and + ! salinities (S). If T and S are not in the same file, TEMP_Z_INIT_FILE and + ! SALT_Z_INIT_FILE must be set. +Z_INIT_FILE_PTEMP_VAR = "temp" ! default = "ptemp" + ! The name of the potential temperature variable in TEMP_Z_INIT_FILE. +Z_INIT_ALE_REMAPPING = True ! [Boolean] default = False + ! If True, then remap straight to model coordinate from file. +TEMP_SALT_INIT_VERTICAL_REMAP_ONLY = True ! [Boolean] default = False + ! If true, initial conditions are on the model horizontal grid. Extrapolation + ! over missing ocean values is done using an ICE-9 procedure with vertical ALE + ! remapping . +DEPRESS_INITIAL_SURFACE = True ! [Boolean] default = False + ! If true, depress the initial surface to avoid huge tsunamis when a large + ! surface pressure is applied. +SURFACE_HEIGHT_IC_FILE = "forcing/init_eta.nc" ! + ! The initial condition file for the surface height. +SURFACE_HEIGHT_IC_VAR = "eta_t" ! default = "SSH" + ! The initial condition variable for the surface height. +VELOCITY_CONFIG = "file" ! default = "zero" + ! A string that determines how the initial velocities are specified for a new + ! run: + ! file - read velocities from the file specified + ! by (VELOCITY_FILE). + ! zero - the fluid is initially at rest. + ! uniform - the flow is uniform (determined by + ! parameters INITIAL_U_CONST and INITIAL_V_CONST). + ! rossby_front - a mixed layer front in thermal wind balance. + ! soliton - Equatorial Rossby soliton. + ! USER - call a user modified routine. +VELOCITY_FILE = "forcing/init_vel.nc" ! + ! The name of the velocity initial condition file. +OBC_SEGMENT_001_DATA = "U=file:forcing/forcing_obc_segment_001.nc(u),V=file:forcing/forcing_obc_segment_001.nc(v),SSH=file:forcing/forcing_obc_segment_001.nc(eta),TEMP=file:forcing/forcing_obc_segment_001.nc(temp),SALT=file:forcing/forcing_obc_segment_001.nc(salt)" ! + ! OBC segment docs +OBC_SEGMENT_002_DATA = "U=file:forcing/forcing_obc_segment_002.nc(u),V=file:forcing/forcing_obc_segment_002.nc(v),SSH=file:forcing/forcing_obc_segment_002.nc(eta),TEMP=file:forcing/forcing_obc_segment_002.nc(temp),SALT=file:forcing/forcing_obc_segment_002.nc(salt)" ! + ! OBC segment docs +OBC_SEGMENT_003_DATA = "U=file:forcing/forcing_obc_segment_003.nc(u),V=file:forcing/forcing_obc_segment_003.nc(v),SSH=file:forcing/forcing_obc_segment_003.nc(eta),TEMP=file:forcing/forcing_obc_segment_003.nc(temp),SALT=file:forcing/forcing_obc_segment_003.nc(salt)" ! + ! OBC segment docs +OBC_SEGMENT_004_DATA = "U=file:forcing/forcing_obc_segment_004.nc(u),V=file:forcing/forcing_obc_segment_004.nc(v),SSH=file:forcing/forcing_obc_segment_004.nc(eta),TEMP=file:forcing/forcing_obc_segment_004.nc(temp),SALT=file:forcing/forcing_obc_segment_004.nc(salt)" ! + ! OBC segment docs + +! === module MOM_diag_mediator === +NUM_DIAG_COORDS = 1 ! default = 1 + ! The number of diagnostic vertical coordinates to use. For each coordinate, an + ! entry in DIAG_COORDS must be provided. +DIAG_COORDS = "z Z ZSTAR" ! + ! A list of string tuples associating diag_table modules to a coordinate + ! definition used for diagnostics. Each string is of the form + ! "MODULE_SUFFIX,PARAMETER_SUFFIX,COORDINATE_NAME". +DIAG_COORD_DEF_Z = "FILE:vcoord.nc,interfaces=zi" ! default = "WOA09" + ! Determines how to specify the coordinate resolution. Valid options are: + ! PARAM - use the vector-parameter DIAG_COORD_RES_Z + ! UNIFORM[:N] - uniformly distributed + ! FILE:string - read from a file. The string specifies + ! the filename and variable name, separated + ! by a comma or space, e.g. FILE:lev.nc,dz + ! or FILE:lev.nc,interfaces=zw + ! WOA09[:N] - the WOA09 vertical grid (approximately) + ! FNC1:string - FNC1:dz_min,H_total,power,precision + ! HYBRID:string - read from a file. The string specifies + ! the filename and two variable names, separated + ! by a comma or space, for sigma-2 and dz. e.g. + ! HYBRID:vgrid.nc,sigma2,dz + +! === module MOM_lateral_mixing_coeffs === + +! === module MOM_set_visc === +CHANNEL_DRAG = True ! [Boolean] default = False + ! If true, the bottom drag is exerted directly on each layer proportional to the + ! fraction of the bottom it overlies. +PRANDTL_TURB = 1.25 ! [nondim] default = 1.0 + ! The turbulent Prandtl number applied to shear instability. +HBBL = 10.0 ! [m] + ! The thickness of a bottom boundary layer with a viscosity increased by + ! KV_EXTRA_BBL if BOTTOMDRAGLAW is not defined, or the thickness over which + ! near-bottom velocities are averaged for the drag law if BOTTOMDRAGLAW is + ! defined but LINEAR_DRAG is not. +DRAG_BG_VEL = 0.001 ! [m s-1] default = 0.0 + ! DRAG_BG_VEL is either the assumed bottom velocity (with LINEAR_DRAG) or an + ! unresolved velocity that is combined with the resolved velocity to estimate + ! the velocity magnitude. DRAG_BG_VEL is only used when BOTTOMDRAGLAW is + ! defined. +BBL_THICK_MIN = 0.1 ! [m] default = 0.0 + ! The minimum bottom boundary layer thickness that can be used with + ! BOTTOMDRAGLAW. This might be Kv/(cdrag*drag_bg_vel) to give Kv as the minimum + ! near-bottom viscosity. +KV = 1.0E-05 ! [m2 s-1] + ! The background kinematic viscosity in the interior. The molecular value, ~1e-6 + ! m2 s-1, may be used. + +! === module MOM_thickness_diffuse === +KHTH_MAX_CFL = 0.1 ! [nondimensional] default = 0.8 + ! The maximum value of the local diffusive CFL ratio that is permitted for the + ! thickness diffusivity. 1.0 is the marginally unstable value in a pure layered + ! model, but much smaller numbers (e.g. 0.1) seem to work better for ALE-based + ! models. + +! === module MOM_porous_barriers === + +! === module MOM_dynamics_split_RK2 === +TIDES = False ! [Boolean] default = False + ! If true, apply tidal momentum forcing. +! === module MOM_continuity === + +! === module MOM_continuity_PPM === +ETA_TOLERANCE = 1.0E-06 ! [m] default = 5.0E-09 + ! The tolerance for the differences between the barotropic and baroclinic + ! estimates of the sea surface height due to the fluxes through each face. The + ! total tolerance for SSH is 4 times this value. The default is + ! 0.5*NK*ANGSTROM, and this should not be set less than about + ! 10^-15*MAXIMUM_DEPTH. + +! === module MOM_CoriolisAdv === +CORIOLIS_SCHEME = "SADOURNY75_ENSTRO" ! default = "SADOURNY75_ENERGY" + ! CORIOLIS_SCHEME selects the discretization for the Coriolis terms. Valid + ! values are: + ! SADOURNY75_ENERGY - Sadourny, 1975; energy cons. + ! ARAKAWA_HSU90 - Arakawa & Hsu, 1990 + ! SADOURNY75_ENSTRO - Sadourny, 1975; enstrophy cons. + ! ARAKAWA_LAMB81 - Arakawa & Lamb, 1981; En. + Enst. + ! ARAKAWA_LAMB_BLEND - A blend of Arakawa & Lamb with + ! Arakawa & Hsu and Sadourny energy +BOUND_CORIOLIS = True ! [Boolean] default = False + ! If true, the Coriolis terms at u-points are bounded by the four estimates of + ! (f+rv)v from the four neighboring v-points, and similarly at v-points. This + ! option would have no effect on the SADOURNY Coriolis scheme if it were + ! possible to use centered difference thickness fluxes. +! === module MOM_tidal_forcing === +TIDE_M2 = True ! [Boolean] default = False + ! If true, apply tidal momentum forcing at the M2 frequency. This is only used + ! if TIDES is true. +TIDE_SAL_SCALAR_VALUE = 0.094 ! [m m-1] + ! The constant of proportionality between sea surface height (really it should + ! be bottom pressure) anomalies and bottom geopotential anomalies. This is only + ! used if TIDES and TIDE_USE_SAL_SCALAR are true. +TIDE_REF_DATE = 2010, 1, 1 ! default = 0 + ! Year,month,day to use as reference date for tidal forcing. If not specified, + ! defaults to 0. +TIDE_USE_EQ_PHASE = True ! [Boolean] default = False + ! Correct phases by calculating equilibrium phase arguments for TIDE_REF_DATE. +! === module MOM_PressureForce === + +! === module MOM_PressureForce_FV === +MASS_WEIGHT_IN_PRESSURE_GRADIENT = True ! [Boolean] default = False + ! If true, use mass weighting when interpolating T/S for integrals near the + ! bathymetry in FV pressure gradient calculations. + +! === module MOM_Zanna_Bolton === + +! === module MOM_hor_visc === +LAPLACIAN = False ! [Boolean] default = False + ! If true, use a Laplacian horizontal viscosity. +BIHARMONIC = True ! [Boolean] default = True + ! If true, use a biharmonic horizontal viscosity. BIHARMONIC may be used with + ! LAPLACIAN. +KH = 25.0 +AH = 0.0 ! [m4 s-1] default = 0.0 + ! The background biharmonic horizontal viscosity. +AH_VEL_SCALE = 0.0 ! [m s-1] default = 0.0 + ! The velocity scale which is multiplied by the cube of the grid spacing to + ! calculate the biharmonic viscosity. The final viscosity is the largest of this + ! scaled viscosity, the Smagorinsky and Leith viscosities, and AH. +AH_TIME_SCALE = 0.0 ! [s] default = 0.0 + ! A time scale whose inverse is multiplied by the fourth power of the grid + ! spacing to calculate biharmonic viscosity. The final viscosity is the largest + ! of all viscosity formulations in use. 0.0 means that it's not used. + +SMAGORINSKY_AH = True + +SMAG_BI_CONST = 0.060 +SMAG_LAP_CONST = 2.0 ! [nondim] default = 0.0 +SMAGORINSKY_KH = False ! [Boolean] default = False + ! If true, use a Smagorinsky nonlinear eddy viscosity. +! === module MOM_vert_friction === +HMIX_FIXED = 0.5 ! [m] + ! The prescribed depth over which the near-surface viscosity and diffusivity are + ! elevated when the bulk mixed layer is not used. +MAXVEL = 6.0 ! [m s-1] default = 3.0E+08 + ! The maximum velocity allowed before the velocity components are truncated. +! === module MOM_barotropic === +BOUND_BT_CORRECTION = True ! [Boolean] default = False + ! If true, the corrective pseudo mass-fluxes into the barotropic solver are + ! limited to values that require less than maxCFL_BT_cont to be accommodated. +BT_PROJECT_VELOCITY = True ! [Boolean] default = False + ! If true, step the barotropic velocity first and project out the velocity + ! tendency by 1+BEBT when calculating the transport. The default (false) is to + ! use a predictor continuity step to find the pressure field, and then to do a + ! corrector continuity step using a weighted average of the old and new + ! velocities, with weights of (1-BEBT) and BEBT. +DYNAMIC_SURFACE_PRESSURE = True ! [Boolean] default = False + ! If true, add a dynamic pressure due to a viscous ice shelf, for instance. +BEBT = 0.2 ! [nondim] default = 0.1 + ! BEBT determines whether the barotropic time stepping uses the forward-backward + ! time-stepping scheme or a backward Euler scheme. BEBT is valid in the range + ! from 0 (for a forward-backward treatment of nonrotating gravity waves) to 1 + ! (for a backward Euler treatment). In practice, BEBT must be greater than about + ! 0.05. +DTBT = -0.9 ! [s or nondim] default = -0.98 + ! The barotropic time step, in s. DTBT is only used with the split explicit time + ! stepping. To set the time step automatically based the maximum stable value + ! use 0, or a negative value gives the fraction of the stable value. Setting + ! DTBT to 0 is the same as setting it to -0.98. The value of DTBT that will + ! actually be used is an integer fraction of DT, rounding down. + +! === module MOM_mixed_layer_restrat === +MIXEDLAYER_RESTRAT = True ! [Boolean] default = False + ! If true, a density-gradient dependent re-stratifying flow is imposed in the + ! mixed layer. Can be used in ALE mode without restriction but in layer mode can + ! only be used if BULKMIXEDLAYER is true. +MLE% +%MLE +FOX_KEMPER_ML_RESTRAT_COEF = 1.0 ! [nondim] default = 0.0 + ! A nondimensional coefficient that is proportional to the ratio of the + ! deformation radius to the dominant lengthscale of the submesoscale mixed layer + ! instabilities, times the minimum of the ratio of the mesoscale eddy kinetic + ! energy to the large-scale geostrophic kinetic energy or 1 plus the square of + ! the grid spacing over the deformation radius, as detailed by Fox-Kemper et al. + ! (2010) +MLE_FRONT_LENGTH = 5000.0 ! [m] default = 0.0 + ! If non-zero, is the frontal-length scale used to calculate the upscaling of + ! buoyancy gradients that is otherwise represented by the parameter + ! FOX_KEMPER_ML_RESTRAT_COEF. If MLE_FRONT_LENGTH is non-zero, it is recommended + ! to set FOX_KEMPER_ML_RESTRAT_COEF=1.0. +MLE_USE_PBL_MLD = True ! [Boolean] default = False + ! If true, the MLE parameterization will use the mixed-layer depth provided by + ! the active PBL parameterization. If false, MLE will estimate a MLD based on a + ! density difference with the surface using the parameter MLE_DENSITY_DIFF. +MLE_MLD_DECAY_TIME = 2.592E+06 ! [s] default = 0.0 + ! The time-scale for a running-mean filter applied to the mixed-layer depth used + ! in the MLE restratification parameterization. When the MLD deepens below the + ! current running-mean the running-mean is instantaneously set to the current + ! MLD. + +! === module MOM_diagnostics === + +! === module MOM_diabatic_driver === +! The following parameters are used for diabatic processes. +ENERGETICS_SFC_PBL = True ! [Boolean] default = False + ! If true, use an implied energetics planetary boundary layer scheme to + ! determine the diffusivity and viscosity in the surface boundary layer. +EPBL_IS_ADDITIVE = False ! [Boolean] default = True + ! If true, the diffusivity from ePBL is added to all other diffusivities. + ! Otherwise, the larger of kappa-shear and ePBL diffusivities are used. + +! === module MOM_set_diffusivity === + + +! === module MOM_bkgnd_mixing === +! Adding static vertical background mixing coefficients +KD = 1.0E-05 ! [m2 s-1] default = 0.0 + ! The background diapycnal diffusivity of density in the interior. Zero or the + ! molecular value, ~1e-7 m2 s-1, may be used. +HENYEY_IGW_BACKGROUND = True ! [Boolean] default = False + ! If true, use a latitude-dependent scaling for the near surface background + ! diffusivity, as described in Harrison & Hallberg, JPO 2008. + +! === module MOM_kappa_shear === +! Parameterization of shear-driven turbulence following Jackson, Hallberg and Legg, JPO 2008 +USE_JACKSON_PARAM = True ! [Boolean] default = False + ! If true, use the Jackson-Hallberg-Legg (JPO 2008) shear mixing + ! parameterization. + +! === module MOM_diabatic_aux === +! The following parameters are used for auxiliary diabatic processes. + +! === module MOM_energetic_PBL === +ML_OMEGA_FRAC = 0.001 ! [nondim] default = 0.0 + ! When setting the decay scale for turbulence, use this fraction of the absolute + ! rotation rate blended with the local value of f, as sqrt((1-of)*f^2 + + ! of*4*omega^2). +TKE_DECAY = 0.01 ! [nondim] default = 2.5 + ! TKE_DECAY relates the vertical rate of decay of the TKE available for + ! mechanical entrainment to the natural Ekman depth. +EPBL_MSTAR_SCHEME = "REICHL_H18"! default = "CONSTANT" + ! EPBL_MSTAR_SCHEME selects the method for setting mstar. Valid values are: + ! CONSTANT - Use a fixed mstar given by MSTAR + ! OM4 - Use L_Ekman/L_Obukhov in the stabilizing limit, as in OM4 + ! REICHL_H18 - Use the scheme documented in Reichl & Hallberg, 2018. +MSTAR_CAP = 10.0 ! [nondim] default = -1.0 + ! If this value is positive, it sets the maximum value of mstar allowed in ePBL. + ! (This is not used if EPBL_MSTAR_SCHEME = CONSTANT). +RH18_MSTAR_CN3 = -6.0 ! [nondim] default = -5.0 + ! MSTAR_N coefficient 3 (exponential decay coefficient). The value of -5.0 is + ! given in RH18. Increasing this increases how quickly the value of MSTAR + ! decreases as Hf/ust increases. +NSTAR = 0.06 ! [nondim] default = 0.2 + ! The portion of the buoyant potential energy imparted by surface fluxes that is + ! available to drive entrainment at the base of mixed layer when that energy is + ! positive. +MSTAR_CONV_ADJ = 0.667 ! [nondim] default = 0.0 + ! Coefficient used for reducing mstar during convection due to reduction of + ! stable density gradient. +EPBL_TRANSITION_SCALE = 0.01 ! [nondim] default = 0.1 + ! A scale for the mixing length in the transition layer at the edge of the + ! boundary layer as a fraction of the boundary layer thickness. +MIX_LEN_EXPONENT = 1.0 ! [nondim] default = 2.0 + ! The exponent applied to the ratio of the distance to the MLD and the MLD depth + ! which determines the shape of the mixing length. This is only used if + ! USE_MLD_ITERATION is True. +USE_LA_LI2016 = True ! [Boolean] default = False + ! A logical to use the Li et al. 2016 (submitted) formula to determine the + ! Langmuir number. +EPBL_LANGMUIR_SCHEME = "ADDITIVE" ! default = "NONE" + ! EPBL_LANGMUIR_SCHEME selects the method for including Langmuir turbulence. + ! Valid values are: + ! NONE - Do not do any extra mixing due to Langmuir turbulence + ! RESCALE - Use a multiplicative rescaling of mstar to account for Langmuir + ! turbulence + ! ADDITIVE - Add a Langmuir turblence contribution to mstar to other + ! contributions +LT_ENHANCE_COEF = 0.044 ! [nondim] default = 0.447 + ! Coefficient for Langmuir enhancement of mstar +LT_ENHANCE_EXP = -1.5 ! [nondim] default = -1.33 + ! Exponent for Langmuir enhancementt of mstar +LT_MOD_LAC1 = 0.0 ! [nondim] default = -0.87 + ! Coefficient for modification of Langmuir number due to MLD approaching Ekman + ! depth. + +! === module MOM_opacity === + +! === module MOM_tracer_advect === +TRACER_ADVECTION_SCHEME = "PPM:H3" ! default = "PLM" + ! The horizontal transport scheme for tracers: + ! PLM - Piecewise Linear Method + ! PPM:H3 - Piecewise Parabolic Method (Huyhn 3rd order) + ! PPM - Piecewise Parabolic Method (Colella-Woodward) + +! === module MOM_tracer_hor_diff === +CHECK_DIFFUSIVE_CFL = True ! [Boolean] default = False + ! If true, use enough iterations the diffusion to ensure that the diffusive + ! equivalent of the CFL limit is not violated. If false, always use the greater + ! of 1 or MAX_TR_DIFFUSION_CFL iteration. + +! === module MOM_sum_output === +CALCULATE_APE = True ! [Boolean] default = True + ! If true, calculate the available potential energy of the interfaces. Setting + ! this to false reduces the memory footprint of high-PE-count models + ! dramatically. +MAXTRUNC = 100000 ! [truncations save_interval-1] default = 0 + ! The run will be stopped, and the day set to a very large value if the velocity + ! is truncated more than MAXTRUNC times between energy saves. Set MAXTRUNC to 0 + ! to stop if there is any truncation of velocities. + +! === module ocean_stochastics_init === + +! === module ocean_model_init === + +! === module MOM_surface_forcing === + +CD_TIDES = 0.0018 ! [nondim] default = 1.0E-04 + ! The drag coefficient that applies to the tides. +USE_RIGID_SEA_ICE = True ! [Boolean] default = False + ! If true, sea-ice is rigid enough to exert a nonhydrostatic pressure that + ! resist vertical motion. +SEA_ICE_RIGID_MASS = 100.0 ! [kg m-2] default = 1000.0 + ! The mass of sea-ice per unit area at which the sea-ice starts to exhibit + ! rigidity + +! === module MOM_restart === diff --git a/demos/premade_run_directories/common_files/MOM_layout b/demos/premade_run_directories/common_files/MOM_layout new file mode 100644 index 00000000..cc2f2052 --- /dev/null +++ b/demos/premade_run_directories/common_files/MOM_layout @@ -0,0 +1,27 @@ +! === module MOM_domains === +REENTRANT_X = False ! [Boolean] default = True + ! If true, the domain is zonally reentrant. +NIGLOBAL = 3040 ! + ! The total number of thickness grid points in the x-direction in the physical + ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time. +NJGLOBAL = 3180 ! + ! The total number of thickness grid points in the y-direction in the physical + ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time. +MASKTABLE = "mask_table.766.80x80" ! default = "MOM_mask_table" + ! A text file to specify n_mask, layout and mask_list. This feature masks out + ! processors that contain only land points. The first line of mask_table is the + ! number of regions to be masked out. The second line is the layout of the model + ! and must be consistent with the actual model layout. The following (n_mask) + ! lines give the logical positions of the processors that are masked out. The + ! mask_table can be created by tools like check_mask. The following example of + ! mask_table masks out 2 processors, (1,2) and (3,6), out of the 24 in a 4x6 + ! layout: + ! 2 + ! 4,6 + ! 1,2 + ! 3,6 +LAYOUT = 80, 80 ! + ! The processor layout that was actually used. +IO_LAYOUT = 1, 1 ! default = 1 + ! The processor layout to be used, or 0,0 to automatically set the io_layout to + ! be the same as the layout. diff --git a/demos/premade_run_directories/common_files/MOM_override b/demos/premade_run_directories/common_files/MOM_override new file mode 100644 index 00000000..4e0afb5c --- /dev/null +++ b/demos/premade_run_directories/common_files/MOM_override @@ -0,0 +1,9 @@ +## Add override files here + +!#override OBC_SEGMENT_001 = "J=0,I=0:N,ORLANSKI" ! +!#override OBC_SEGMENT_002 = "J=0,I=0:N,ORLANSKI" ! +!#override OBC_SEGMENT_003 = "J=0,I=0:N,ORLANSKI" ! +!#override OBC_SEGMENT_004 = "J=0,I=0:N,ORLANSKI" ! + +#override DT=50 +#override DT_THERM=300 diff --git a/regional_mom6/default_rundir/era5_surface/SIS_input b/demos/premade_run_directories/common_files/SIS_input similarity index 94% rename from regional_mom6/default_rundir/era5_surface/SIS_input rename to demos/premade_run_directories/common_files/SIS_input index 37231a83..e3841d33 100755 --- a/regional_mom6/default_rundir/era5_surface/SIS_input +++ b/demos/premade_run_directories/common_files/SIS_input @@ -12,11 +12,6 @@ DO_ICEBERGS = False ! time between writes of global ice diags and conservation ICE_STATS_INTERVAL = 0.25 -NIGLOBAL = 80 -NJGLOBAL = 129 -LAYOUT = 10,10 -MASKTABLE = "mask_table.18.10x10" - GRID_CONFIG = "mosaic" GRID_FILE = "hgrid.nc" INPUTDIR = "INPUT" diff --git a/demos/premade_run_directories/common_files/config.yaml b/demos/premade_run_directories/common_files/config.yaml new file mode 100755 index 00000000..cee0fde2 --- /dev/null +++ b/demos/premade_run_directories/common_files/config.yaml @@ -0,0 +1,24 @@ +project: x77 +queue: normal +walltime: 05:00:00 +jobname: jobname +ncpus: 1234 +jobfs: 10GB +shortpath: /scratch/nm03 + +model: mom6 +input: + - path_to_input_files + +exe: /g/data/v45/ab8992/mom_executables/dec-23-build +collate: false +#runlog: true +storage: + gdata: + - ua8 + - x77 + - ik11 + +mpi: + module: openmpi/4.1.2 + diff --git a/demos/premade_run_directories/common_files/data_table b/demos/premade_run_directories/common_files/data_table new file mode 100755 index 00000000..e7bc87b1 --- /dev/null +++ b/demos/premade_run_directories/common_files/data_table @@ -0,0 +1,22 @@ + +"ATM", "p_surf", "", "", "bilinear", 100410.25 +"ATM", "p_bot", "", "", "bilinear", 100410.25 +"ATM", "t_bot", "", "", "bilinear", 289.9 +"ATM", "sphum_bot", "", "", "bilinear", 0.0083 +"ATM", "u_bot", "", "", "bicubic", 0.0 +"ATM", "v_bot", "", "", "bicubic", 0.0 +"ATM", "z_bot", "", "", "bilinear", 10.0 +"ATM", "gust", "", "", "bilinear", 1.0e-4 +"ICE", "lw_flux_dn", "", "", "bilinear", 1.0 +"ICE", "sw_flux_vis_dir_dn", "", "", "bilinear", 0.0 +"ICE", "sw_flux_vis_dif_dn", "", "", "bilinear", 0.0 +"ICE", "sw_flux_nir_dir_dn", "", "", "bilinear", 0.0 +"ICE", "sw_flux_nir_dif_dn", "", "", "bilinear", 0.0 +"ICE", "lprec", "", "", "bilinear", 0.0 +"ICE", "fprec", "", "", "bilinear", 0.0 +"ICE", "runoff", "", "", "none", 0.0 +"ICE", "dhdt", "", "", "none", 80.0 +"ICE", "dedt", "", "", "none", 2.0e-6 +"ICE", "drdt", "", "", "none", 10.0 +"LND", "rough_mom", "", "", "none", 0.01 +"LND", "rough_heat", "", "", "none", 0.1 diff --git a/regional_mom6/default_rundir/era5_surface/diag_table b/demos/premade_run_directories/common_files/diag_table similarity index 99% rename from regional_mom6/default_rundir/era5_surface/diag_table rename to demos/premade_run_directories/common_files/diag_table index d6d95b72..dcca42a7 100755 --- a/regional_mom6/default_rundir/era5_surface/diag_table +++ b/demos/premade_run_directories/common_files/diag_table @@ -1,6 +1,3 @@ -eac -1991 1 1 0 0 0 - "ocean_daily", 1, "days", 1, "days", "time" "ocean_month", 1, "months", 1, "days", "time" "ocean_month_z", 1, "months", 1, "days", "time" @@ -87,4 +84,4 @@ eac "ice_model", "siconc", "siconc", "ice_month", "all", "mean", "none", 2 "ice_model", "siconc", "siconc", "ice_daily", "all", "mean", "none", 2 "ice_model", "sithick", "sithick", "ice_month", "all", "mean", "none", 2 -"ice_model", "sithick", "sithick", "ice_daily", "all", "mean", "none", 2 +"ice_model", "sithick", "sithick", "ice_daily", "all", "mean", "none", 2 \ No newline at end of file diff --git a/regional_mom6/default_rundir/era5_surface/field_table b/demos/premade_run_directories/common_files/field_table similarity index 100% rename from regional_mom6/default_rundir/era5_surface/field_table rename to demos/premade_run_directories/common_files/field_table diff --git a/regional_mom6/default_rundir/era5_surface/input.nml b/demos/premade_run_directories/common_files/input.nml similarity index 87% rename from regional_mom6/default_rundir/era5_surface/input.nml rename to demos/premade_run_directories/common_files/input.nml index 1641422a..aca30c7f 100755 --- a/regional_mom6/default_rundir/era5_surface/input.nml +++ b/demos/premade_run_directories/common_files/input.nml @@ -3,7 +3,7 @@ input_filename = 'n', restart_input_dir = 'INPUT', restart_output_dir = 'RESTART', - parameter_filename = 'MOM_input', 'MOM_override' + parameter_filename = 'MOM_input', 'MOM_layout', 'MOM_override' / &SIS_input_nml @@ -11,7 +11,7 @@ input_filename = 'n', restart_input_dir = 'INPUT', restart_output_dir = 'RESTART', - parameter_filename = 'SIS_input' + parameter_filename = 'SIS_input','MOM_layout' / &fms_nml @@ -28,10 +28,10 @@ &coupler_nml months = 0, - days = 5, + days = 1, hours = 0, - current_date = 1991,1,1,0,0,0, - calendar = 'NOLEAP', + current_date = 2015,1,1,0,0,0, + calendar = 'JULIAN', dt_cpld = 3600, dt_atmos = 3600, do_atmos = .false., diff --git a/demos/premade_run_directories/era5_surface/data_table b/demos/premade_run_directories/era5_surface/data_table new file mode 100755 index 00000000..d0fac2d6 --- /dev/null +++ b/demos/premade_run_directories/era5_surface/data_table @@ -0,0 +1,22 @@ +"ATM", "p_surf", "sp", "./INPUT/forcing/sp_ERA5.nc", "bilinear", 1.0 +"ATM", "p_bot", "sp", "./INPUT/forcing/sp_ERA5.nc", "bilinear", 1.0 +"ATM", "t_bot", "t2m", "./INPUT/forcing/2t_ERA5.nc", "bilinear", 1.0 +"ATM", "sphum_bot", "q", "./INPUT/forcing/q_ERA5.nc", "bilinear", 1.0 +"ATM", "u_bot", "u10", "./INPUT/forcing/10u_ERA5.nc", "bicubic", 1.0 +"ATM", "v_bot", "v10", "./INPUT/forcing/10v_ERA5.nc", "bicubic", 1.0 +"ATM", "z_bot", "", "", "bilinear", 10.0 +"ATM", "gust", "", "", "bilinear", 1.0e-4 +"ICE", "lw_flux_dn", "", "", "bilinear", 1.0 +"ICE", "sw_flux_vis_dir_dn", "", "", "bilinear", 0.0 +"ICE", "sw_flux_vis_dif_dn", "", "", "bilinear", 0.0 +"ICE", "sw_flux_nir_dir_dn", "", "", "bilinear", 0.0 +"ICE", "sw_flux_nir_dif_dn", "", "", "bilinear", 0.0 +"ICE", "lprec", "", "", "bilinear", 0.0 +"ICE", "fprec", "", "", "bilinear", 0.0 +"ICE", "runoff", "", "", "none", 0.0 +"ICE", "dhdt", "", "", "none", 80.0 +"ICE", "dedt", "", "", "none", 2.0e-6 +"ICE", "drdt", "", "", "none", 10.0 +"LND", "rough_mom", "", "", "none", 0.01 +"LND", "rough_heat", "", "", "none", 0.1 + diff --git a/regional_mom6/default_rundir/jra_surface/input.nml b/demos/premade_run_directories/era5_surface/input.nml similarity index 81% rename from regional_mom6/default_rundir/jra_surface/input.nml rename to demos/premade_run_directories/era5_surface/input.nml index 1641422a..28361052 100755 --- a/regional_mom6/default_rundir/jra_surface/input.nml +++ b/demos/premade_run_directories/era5_surface/input.nml @@ -3,7 +3,7 @@ input_filename = 'n', restart_input_dir = 'INPUT', restart_output_dir = 'RESTART', - parameter_filename = 'MOM_input', 'MOM_override' + parameter_filename = 'MOM_input', 'MOM_layout', 'MOM_override' / &SIS_input_nml @@ -11,7 +11,7 @@ input_filename = 'n', restart_input_dir = 'INPUT', restart_output_dir = 'RESTART', - parameter_filename = 'SIS_input' + parameter_filename = 'SIS_input','MOM_layout' / &fms_nml @@ -28,10 +28,10 @@ &coupler_nml months = 0, - days = 5, + days = 1, hours = 0, - current_date = 1991,1,1,0,0,0, - calendar = 'NOLEAP', + current_date = 2015,1,1,0,0,0, + calendar = 'JULIAN', dt_cpld = 3600, dt_atmos = 3600, do_atmos = .false., @@ -73,9 +73,10 @@ / &surface_flux_nml - ncar_ocean_flux = .true., - raoult_sat_vap = .true. -/ + ncar_ocean_flux_multilevel = .true. + bulk_zu = 10. + bulk_zt = 2. + bulk_zq = 2. &xgrid_nml make_exchange_reproduce = .false., diff --git a/regional_mom6/default_rundir/era5_surface/config.yaml b/demos/premade_run_directories/jra_surface/config.yaml similarity index 69% rename from regional_mom6/default_rundir/era5_surface/config.yaml rename to demos/premade_run_directories/jra_surface/config.yaml index a6b79176..f714f2cb 100755 --- a/regional_mom6/default_rundir/era5_surface/config.yaml +++ b/demos/premade_run_directories/jra_surface/config.yaml @@ -1,7 +1,9 @@ +## Example of a config.yaml file for running mom6 via payu + project: x77 queue: normal walltime: 02:00:00 -jobname: mom6_GIPPSLAND +jobname: mom6_regional ncpus: 82 jobfs: 10GB @@ -10,15 +12,11 @@ shortpath: /scratch/x77 model: mom6 input: - /scratch/v45/ab8992/mom6/regional_configs/gippsland -# - /g/data/ua8/JRA55-do/RYF/v1-3/ - /g/data/ik11/inputs/JRA-55/RYF/v1-3/ -# release exe exe: /g/data/x77/ahg157/exes/MOM6_SIS2/symmetric_FMS2-e7d09b7 -# debug exe -#exe: /g/data/x77/ahg157/exes/MOM6_SIS2/symmetric_FMS2-9bc3419a + collate: false -#runlog: true storage: gdata: - ua8 diff --git a/regional_mom6/default_rundir/jra_surface/data_table b/demos/premade_run_directories/jra_surface/data_table similarity index 100% rename from regional_mom6/default_rundir/jra_surface/data_table rename to demos/premade_run_directories/jra_surface/data_table diff --git a/demos/reanalysis-forced.ipynb b/demos/reanalysis-forced.ipynb index ec44edb2..c390475e 100644 --- a/demos/reanalysis-forced.ipynb +++ b/demos/reanalysis-forced.ipynb @@ -4,367 +4,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Forcing with a reanalysis dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - "

Client

\n", - "

Client-42ab73fe-5753-11ee-8b2f-0000076bfe80

\n", - " \n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", - " Dashboard: /proxy/44739/status\n", - "
\n", - "\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "

Cluster Info

\n", - "
\n", - "
\n", - "
\n", - "
\n", - "

LocalCluster

\n", - "

a6df0577

\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - "
\n", - " Dashboard: /proxy/44739/status\n", - " \n", - " Workers: 4\n", - "
\n", - " Total threads: 16\n", - " \n", - " Total memory: 64.00 GiB\n", - "
Status: runningUsing processes: True
\n", - "\n", - "
\n", - " \n", - "

Scheduler Info

\n", - "
\n", - "\n", - "
\n", - "
\n", - "
\n", - "
\n", - "

Scheduler

\n", - "

Scheduler-03233fab-1e0e-4db4-8d02-5f4b7bd9c35a

\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " Comm: tcp://127.0.0.1:45817\n", - " \n", - " Workers: 4\n", - "
\n", - " Dashboard: /proxy/44739/status\n", - " \n", - " Total threads: 16\n", - "
\n", - " Started: Just now\n", - " \n", - " Total memory: 64.00 GiB\n", - "
\n", - "
\n", - "
\n", - "\n", - "
\n", - " \n", - "

Workers

\n", - "
\n", - "\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "

Worker: 0

\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "
\n", - " Comm: tcp://127.0.0.1:38687\n", - " \n", - " Total threads: 4\n", - "
\n", - " Dashboard: /proxy/41735/status\n", - " \n", - " Memory: 16.00 GiB\n", - "
\n", - " Nanny: tcp://127.0.0.1:41549\n", - "
\n", - " Local directory: /jobfs/95589519.gadi-pbs/dask-scratch-space/worker-hn9y5hob\n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "

Worker: 1

\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "
\n", - " Comm: tcp://127.0.0.1:35617\n", - " \n", - " Total threads: 4\n", - "
\n", - " Dashboard: /proxy/36911/status\n", - " \n", - " Memory: 16.00 GiB\n", - "
\n", - " Nanny: tcp://127.0.0.1:36389\n", - "
\n", - " Local directory: /jobfs/95589519.gadi-pbs/dask-scratch-space/worker-_lj8t8bo\n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "

Worker: 2

\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "
\n", - " Comm: tcp://127.0.0.1:43353\n", - " \n", - " Total threads: 4\n", - "
\n", - " Dashboard: /proxy/38847/status\n", - " \n", - " Memory: 16.00 GiB\n", - "
\n", - " Nanny: tcp://127.0.0.1:33113\n", - "
\n", - " Local directory: /jobfs/95589519.gadi-pbs/dask-scratch-space/worker-hanya5z3\n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "

Worker: 3

\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "
\n", - " Comm: tcp://127.0.0.1:33149\n", - " \n", - " Total threads: 4\n", - "
\n", - " Dashboard: /proxy/40965/status\n", - " \n", - " Memory: 16.00 GiB\n", - "
\n", - " Nanny: tcp://127.0.0.1:42157\n", - "
\n", - " Local directory: /jobfs/95589519.gadi-pbs/dask-scratch-space/worker-ubamd8wz\n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "\n", - "
\n", - "
\n", - "\n", - "
\n", - "
\n", - "
\n", - "
\n", - " \n", - "\n", - "
\n", - "
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "from itertools import cycle\n", - "import os\n", - "import dask.array as da\n", - "import dask.bag as db\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import xarray as xr\n", - "import xesmf as xe\n", - "import subprocess\n", - "from scipy.ndimage import binary_fill_holes\n", - "from importlib import reload\n", - "\n", - "## For NCI users, uncomment the following line if you just want to import from my copy of the code and sidestep the installation process\n", - "## In this case just use the latest version of the analysis env. HOWEVER! Note that without the latest version of xesmf which is not yet\n", - "## available on analysis3, the regridding will only work in serial and won't be suitable for large domains\n", + "# Example: Regional Tasmania forced by Reanalysis dataset and ERA5\n", "\n", - "# os.chdir(\"/home/149/ab8992/cosima_regional/regional-mom6/regional_mom6/\")\n", - "\n", - "\n", - "import regional_mom6 as rm\n", - "from dask.distributed import Client\n", - "client = Client()\n", - "client" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## What does this package do?\n", + "**Before you begin, make sure you've downloaded and installed the package, and have set up your FRE-NC tools as outlined in the package README**\n", "\n", - "Setting up a regional model in MOM6 is a pain. The goal of this package is that users should spend their debugging time fixing a model that's running and doing weird things, rather than puzzling over a model that won't even start.\n", + "In addition, for this example you'll need a copy of the [GEBCO bathymetry](https://www.gebco.net/data_and_products/gridded_bathymetry_data/), access to the [GLORYs ocean reanalysis data](https://data.marine.copernicus.eu/product/GLOBAL_MULTIYEAR_PHY_001_030/description), and [ERA5 surface forcing for 2003](https://www.ecmwf.int/en/forecasts/dataset/ecmwf-reanalysis-v5). \n", "\n", - "In running this notebook, you'll hopefully have a running MOM6 regional model. There will still be a lot of fiddling to do with the MOM_input file to make sure that the parameters are set up right for your domain, and you might want to manually edit some of the input files. BUT, this package should help you bypass most of the woes of regridding, encoding and understanding the arcane arts of the MOM6 boundary segment files. \n" + "This script is designed to read in the entire global extent of ERA5 and GEBCO, so you don't need to worry about cutting it down to size. " ] }, { @@ -372,24 +18,13 @@ "metadata": {}, "source": [ "## What does this notebook do?\n", - "This notebook is designed to showcase where we're up to so far. By the end you should have a running MOM6 experiment on the domain of your choice. To make a stable test case:\n", + "This notebook is designed to set you up with a working MOM6 regional configuration. First, try and get it running with our default Tasmania case, then you can clone the notebook and modify for your region of interest. \n", "\n", - "* Avoid any regions with ice\n", - "* Avoid regions near the north pole\n", - "* Although the default configuration is meant to be RYF, I've not fixed up the calendar and encoding to run longer than a year just yet\n", - "\n", - "Input Type | Source\n", - "---|---\n", - "Surface | ERA5\n", - "Ocean | GLORYS reanalysis product\n", - "Bathymetry | Gebco" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step 0: Your personal environment variables" + "Input Type | Source | Subsets required\n", + "---|---|---\n", + "Surface | [ERA5 surface forcing](https://www.ecmwf.int/en/forecasts/dataset/ecmwf-reanalysis-v5) | Data from 2003, whole globe or subset around domain\n", + "Ocean | [GLORYs reanalysis product](https://data.marine.copernicus.eu/product/GLOBAL_MULTIYEAR_PHY_001_030/description) | Boundary segments & initial condition. See section 2 for details. \n", + "Bathymetry | [GEBCO](https://www.gebco.net/data_and_products/gridded_bathymetry_data/) | whole globe or subset around domain" ] }, { @@ -398,9 +33,12 @@ "metadata": {}, "outputs": [], "source": [ - "scratch = \"/scratch/v45/ab8992\"\n", - "home = \"/home/149/ab8992\"\n", - "## If using GLORYs, you'll need an email and password to access their database. make an account here: https://www.copernicus.eu/en/user/login?\n" + "import os\n", + "import regional_mom6 as rm\n", + "from pathlib import Path\n", + "from dask.distributed import Client\n", + "client = Client()\n", + "client" ] }, { @@ -428,21 +66,21 @@ "\n", "daterange = [\"2003-01-01 00:00:00\", \"2003-01-05 00:00:00\"] ## 2003 is a good compimise for GLORYs and JRA forcing as they overlap. JRA ends in 2012, GLORYS starts in 1993\n", "\n", - "## Place where all your input files go\n", - "inputdir = f\"{scratch}/regional_mom6_configs/{expt_name}/\"\n", + "## Place where all your input files go \n", + "inputdir = Path(f\"YOUR_PATH/mom6_inputdirs/{expt_name}/\")\n", "\n", "## Directory where you'll run the experiment from\n", - "rundir = f\"{home}/mom6_rundirs/{expt_name}/\"\n", + "rundir = Path(f\"YOUR_PATH/mom6_rundirs/{expt_name}/\")\n", "\n", - "## Directory where fre tools are stored\n", - "toolpath = \"/home/157/ahg157/repos/mom5/src/tools/\" ## Compiled tools needed for construction of mask tables\n", + "## Directory where fre tools are stored \n", + "toolpath = Path(\"PATH_TO_COMPILED_FRE_TOOLS\") ## Compiled tools needed for construction of mask tables\n", "\n", - "## Directory where raw downloads go before processing\n", - "tmpdir = f\"{scratch}/regional_tmp/{expt_name}\"\n", + "## Path to where your raw ocean forcing files are stored\n", + "glorys_path = Path(\"PATH_TO_GLORYS_DATA\" )\n", "\n", - "for i in [rundir,tmpdir,inputdir]:\n", - " if not os.path.exists(i):\n", - " subprocess.run(f\"mkdir {i} -p\",shell=True)\n", + "for i in [rundir,glorys_path,inputdir]:\n", + " if not os.path.exists(str(i)):\n", + " os.makedirs(str(i))\n", "\n", "\n" ] @@ -453,116 +91,78 @@ "source": [ "## Step 2: Prepare ocean forcing data\n", "\n", - "We need to cut out our ocean forcing. The pipeline expects an initial condition and one time-dependent segment per non-land boundary. Naming convention is \"east_unprocessed\" and \"ic_unprocessed\" for initial condition. If you're an NCI user you can execute the following cell to use my already downloaded boundaries for the test domain, OR make an account with copernicus to download forcing files of your choosing using the second cell" + "We need to cut out our ocean forcing. The package expects an initial condition and one time-dependent segment per non-land boundary. Naming convention is \"east_unprocessed\" for segments and \"ic_unprocessed\" for the initial condition.\n", + "\n", + "Data can be downloaded directly from the [Copernicus Marine data store](https://data.marine.copernicus.eu/product/GLOBAL_MULTIYEAR_PHY_001_030/download) via their GUI (once you're logged in). Unfortunately their old client `motuclient` is no longer working and they're currently in the process of replacing it. Until this is restored, and this notebook is updated with their new client, users will need to download each segment manually\n", + "\n", + "1. Using the GUI, select an area matching your xextent and yextent for the first day in your daterange. Download and label `ic_unprocessed`, then store it in your `glorys_path` folder.\n", + "2. Using the GUI Select the Eastern boundary of your domain (if you have one that contains ocean). Give a buffer of ~0.5 degrees in all directions, and download for your full daterange. Download and label `east_unprocessed`\n", + "3. Repeat for your other sections" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### For default 'Tassie' domain:\n", - "You can just read in the boundaries I've already downloaded. Overwrite your tmpdir and continue with the notebook without generating ocean forcing files" + "## Step 3: Make experiment object\n", + "This object keeps track of your domain basics, as well as generating the hgrid, vgrid and setting up the folder structures. \n", + "\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "tmpdir = \"/g/data/v45/ab8992/tassie-glorys\"" + "expt = rm.experiment(\n", + " xextent,\n", + " yextent,\n", + " daterange,\n", + " 0.05, # Horizontal Resolution\n", + " 75, # Number of vertical layers\n", + " 10, # Ratio of largest to smallest vertical layer. Select 1 for linear, negative number for higher resolution at bottom\n", + " 4500, # Depth of simulation\n", + " rundir,\n", + " inputdir,\n", + " toolpath\n", + ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### OR download your own ocean forcing\n", - "The following cell generates a bash script in your designated 'temporary directory'. This should be on scratch somewhere and just a container for your raw downloads.\n", - "\n", - "To do this you'll need to register with the Copernicus data centre to get a username and password. Fill these in below.\n", + "After running you can have a look at your grids by calling `expt.hgrid` and `expt.vgrid`\n", "\n", - "After executing, navigate to this directory in your terminal and double check that all the files are there! Sometimes the data centre hangs and only retrieves a couple of files. In thise case, comment out the completed segments in `get_oceanfiles.sh` and run it again from terminal." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pwd = \"YOUR COPERNICUS PASSWORD\" \n", - "usr = \"YOUR COPERNICUS USERNAME\" \n", - "file = open(f\"{tmpdir}/get_oceanfiles.sh\",\"w\")\n", - "file.write(\n", - " rm.motu_requests(xextent, yextent, daterange, tmpdir, usr, pwd,[\"north\",\"south\",\"east\",\"west\"])\n", - ")\n", - "file.close()\n", - "\n", - "### NOTE!! This will only work as a subprocess if your kernel has internet access. If not, you'll need to navigate to your tmpdir in a login node terminal and run bash get_oceanfiles.sh\n", - "subprocess.run(\n", - " f\"bash {tmpdir}/get_oceanfiles.sh\",shell=True\n", - ")\n" + "Plotting vgrid with marker = '.' option lets you see the spacing, or plotting \n", + "```python\n", + "np.diff(expt.vgrid.zl).plot(marker = '.')\n", + "```\n", + " shows you the vertical spacing profile." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Step 3: Make experiment object\n", - "This object keeps track of your domain basics, as well as generating the hgrid, vgrid and setting up the folder structures. \n", + "### Modular workflow!\n", "\n", - "After running you can have a look at your grids by calling `expt.hgrid` and `expt.vgrid`\n", + "After constructing your expt object, if you don't like the default hgrid and vgrids you can simply modify and overwrite them. However, you'll then also need to save them to disk again. For example:\n", "\n", - "Plotting vgrid with marker = '.' option lets you see the spacing, or plotting \n", "```python\n", - "np.diff(expt.hgrid.zl).plot(marker = '.')\n", + "new_hgrid = xr.open_dataset(inputdir / \"hgrid.nc\")\n", "```\n", - " shows you the vertical spacing profile.\n", - "\n", - "### Modular workflow!\n", - "\n", - "After constructing your expt object, if you don't like my lazy default hgrid and vgrid you can simply modify and overwrite them. However, you'll also need to save them to disk again as I've not automated this just yet. For example:\n", + "Modify `new_hgrid`, ensuring that metadata is retained to keep MOM6 happy. Then, save your changes\n", "\n", "```python\n", - "expt.hgrid = custom_hgrid\n", - "expt.hgrid.to_netcdf(f\"{inputdir}/hgrid.nc\")\n", + "expt.hgrid = new_hgrid\n", + "\n", + "expt.hgrid.to_netcdf(inputdir / \"hgrid.nc\")\n", "```" ] }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NOTE from make_solo_mosaic: there are 0 contacts (align-contact)\n", - "congradulation: You have successfully run make_solo_mosaic\n", - "FRE TOOLS: Make solo mosaic\n", - "\n", - "\n", - "CompletedProcess(args=['/home/157/ahg157/repos/mom5/src/tools/make_solo_mosaic/make_solo_mosaic', '--num_tiles', '1', '--dir', '.', '--mosaic_name', 'ocean_mosaic', '--tile_file', 'hgrid.nc'], returncode=0)\n" - ] - } - ], - "source": [ - "expt = rm.experiment(\n", - " xextent,\n", - " yextent,\n", - " daterange,\n", - " 0.05, # Resolution\n", - " 75, # Number of vertical layers\n", - " 10, # Ratio of largest to smallest vertical layer. Select 1 for linear, negative number for higher resolution at bottom\n", - " 4500, # Depth of simulation\n", - " rundir,\n", - " inputdir,\n", - " toolpath\n", - ")" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -574,130 +174,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Starting weight generation with these inputs: \n", - " Source File: bathy_original.nc\n", - " Destination File: topog_raw.nc\n", - " Source variable names: elevation\n", - " Destination variable names: elevation\n", - " Souce Grid has a mask, using missingvalue 1.0000000000000000E+020\n", - " Source File is in GRIDSPEC format with coordinate names lon lat\n", - " Source Grid is a regional grid\n", - " Destination File is in GRIDSPEC format with coordinate names lon lat\n", - " Destination Grid is a regional grid\n", - " Regrid Method: bilinear\n", - " Pole option: NONE\n", - "\n", - " Completed file regrid successfully.\n", - "\n", - "NOTE from make_solo_mosaic: there are 0 contacts (align-contact)\n", - "congradulation: You have successfully run make_solo_mosaic\n", - "MAKE SOLO MOSAIC\n", - "\n", - "CompletedProcess(args='/home/157/ahg157/repos/mom5/src/tools/make_solo_mosaic/make_solo_mosaic --num_tiles 1 --dir . --mosaic_name ocean_mosaic --tile_file hgrid.nc', returncode=0)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "cp: './ocean_mosaic.nc' and 'ocean_mosaic.nc' are the same file\n", - "cp: './hgrid.nc' and 'hgrid.nc' are the same file\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cp ./hgrid.nc hgrid.nc \n", - "\n", - "NOTE from make_coupler_mosaic: the ocean land/sea mask will be determined by field depth from file topog.nc\n", - "mosaic_file is grid_spec.nc\n", - "\n", - "***** Congratulation! You have successfully run make_quick_mosaic\n", - "QUICK MOSAIC\n", - "\n", - "CompletedProcess(args='/home/157/ahg157/repos/mom5/src/tools/make_quick_mosaic/make_quick_mosaic --input_mosaic ocean_mosaic.nc --mosaic_name grid_spec --ocean_topog topog.nc', returncode=0)\n", - "\n", - " ===>NOTE from check_mask: when layout is specified, min_pe and max_pe is set to layout(1)*layout(2)=100\n", - "\n", - " ===>NOTE from check_mask: Below is the list of command line arguments.\n", - "\n", - "grid_file = ocean_mosaic.nc\n", - "topog_file = topog.nc\n", - "min_pe = 100\n", - "max_pe = 100\n", - "layout = 10, 10\n", - "halo = 4\n", - "sea_level = 0\n", - "show_valid_only is not set\n", - "nobc = 0\n", - "\n", - " ===>NOTE from check_mask: End of command line arguments.\n", - "\n", - " ===>NOTE from check_mask: the grid file is version 2 (mosaic grid) grid which contains field gridfiles\n", - "\n", - "==>NOTE from get_boundary_type: x_boundary_type is solid_walls\n", - "\n", - "==>NOTE from get_boundary_type: y_boundary_type is solid_walls\n", - "\n", - "==>NOTE from check_mask: Checking for possible masking:\n", - "==>NOTE from check_mask: Assume 4 halo rows\n", - "==>NOTE from check_mask: Total domain size is 140, 249\n", - "\n", - "_______________________________________________________________________\n", - "\n", - "NOTE from check_mask: The following is for using model source code with version older than siena_201207,\n", - "Possible setting to mask out all-land points region, for use in coupler_nmlTotal number of domains = 100\n", - "Number of tasks (excluded all-land region) to be used is 98\n", - "Number of regions to be masked out = 2\n", - "The layout is 10, 10\n", - "Masked and used tasks, 1: used, 0: masked\n", - "1111111111\n", - "1111111111\n", - "1111111111\n", - "1111001111\n", - "1111111111\n", - "1111111111\n", - "1111111111\n", - "1111111111\n", - "1111111111\n", - "1111111111\n", - " domain decomposition\n", - " 14 14 14 14 14 14 14 14 14 14\n", - " 25 25 25 25 25 25 25 25 25 24\n", - " used=98, masked=2, layout=10,10\n", - " To chose this mask layout please put the following lines in ocean_model_nml and/or ice_model_nml\n", - " nmask = 2\n", - "layout = 10, 10\n", - "mask_list = 5,7,6,7\n", - "\n", - "\n", - "_______________________________________________________________________\n", - "\n", - "NOTE from check_mask: The following is for using model source code with version siena_201207 or newer,\n", - " specify ocean_model_nml/ice_model_nml/atmos_model_nml/land_model/nml \n", - " variable mask_table with the mask_table created here.\n", - " Also specify the layout variable in each namelist using corresponding layout\n", - "\n", - "***** Congratulation! You have successfully run check_mask\n", - "CHECK MASK CompletedProcess(args='/home/157/ahg157/repos/mom5/src/tools/check_mask/check_mask --grid_file ocean_mosaic.nc --ocean_topog topog.nc --layout 10,10 --halo 4', returncode=0)\n" - ] - } - ], + "outputs": [], "source": [ "expt.bathymetry(\n", - " '/g/data/ik11/inputs/GEBCO_2022/GEBCO_2022.nc',\n", + " 'PATH_TO_GEBCO_FILE/GEBCO_2022.nc', \n", " {\"xh\":\"lon\",\n", " \"yh\":\"lat\",\n", " \"elevation\":\"elevation\"}, ## Again this dictionary just maps mom6 variable names to what they are in your topog.\n", - " minimum_layers = 1\n", + " minimum_layers = 1 ## Minimum number of layers allowed. Any areas with fewer layers are marked as land\n", " )" ] }, @@ -710,30 +196,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHFCAYAAAAT5Oa6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9eZxdVZU2jq8z3amGW6kklUoghBkZlRcFgtogCIGXwanFV+zIJPJpEeQDqO3UBpuGFrsVf+D82oQGaWzfr0Njd9OAA7YdUInSgiAqBiSQkJDUXHc6w++Pc/bZz667d917q27dqqTWw+d+sjl1zj77nnvOPmuvZ61nWVEURcRgMBgMBoOxiGHP9wAYDAaDwWAw5htsEDEYDAaDwVj0YIOIwWAwGAzGogcbRAwGg8FgMBY92CBiMBgMBoOx6MEGEYPBYDAYjEUPNogYDAaDwWAserBBxGAwGAwGY9GDDSIGg8FgMBiLHmwQMRY9NmzYQJZldfScP/zhD+mSSy6hV7ziFdTV1UX77LMPvelNb6LNmzcr+wVBQJ/97GfpzDPPpH333ZcKhQIdfvjh9Fd/9Vc0PDzc1Lm+//3v07vf/W46+uijyfO8ht/1iSeeoLe//e20fPlyymaztP/++9P73ve+hue56KKLyLIssiyLjjrqqKbG1m5s2rSJNmzY0PS1mQu86lWvSq/DOeecM2/jYDAYrYENIsaix3ve8x56+OGHO3rOL33pS/Tss8/SBz7wAfr3f/93+vznP087duygE088kX74wx+m+5VKJdqwYQOtWbOGbrnlFvr3f/93uuyyy+irX/0qvfa1r6VSqdTwXN/5znfokUceoSOOOIJe+cpXTrvvj370Izr++ONpdHSUvvzlL9P9999Pf/M3f0O5XK6p7zU4OEgPP/ww3X333U3t325s2rSJrr/++nk1iO688056+OGHaXBwcN7GwGAwWoc73wNgMOYb++67L+27774dPecXvvAFGhgYULadeeaZdPDBB9ONN95Ip556KhER5fN52rJlCy1dujTd75RTTqH99tuP3v72t9P/9//9f/QXf/EX057ra1/7Gtl2vPZ5//vfX+eFEpicnKR3vetddOqpp9K9996reJLWr1/f1PfKZrN04oknNrXvnoTJyUkqFApN7Xv00UcTUXwtGAzGngP2EDH2agjqQvd59tlniWh+KLOpxhARUXd3Nx1xxBH0/PPPp9scx1GMIYHjjz+eiEjZ1wRhDDXCt771Ldq2bRt98IMfbPv1sCyL3v/+99Ptt99Ohx12GOXzeXr1q19NjzzyCEVRRJ/5zGfogAMOoO7ubjr11FPpD3/4Q10fDz74IJ122mnU29tLhUKBXvva19IPfvCD9O8bNmygD37wg0REdMABB6S/849//ON0n29+85u0du1a6urqou7ublq3bh396le/Us5z0UUXUXd3Nz3++ON0xhlnUE9PD5122mlERPSrX/2KzjnnHBoYGKBsNkurVq2is88+m7Zu3drW68VgMDoPNogYezUefvhh5fPDH/6Q9tlnHxocHKT+/v6W+oqiiHzfb+ozE4yMjNAvf/lLOvLIIxvuK2i1ZvZtFj/5yU+IKI5bet3rXkeZTIaWLFlC73znO+nFF1+cdf/f//736f/+3/9Lf/d3f0f//M//TGNjY3T22WfTtddeS//93/9Nt912G331q1+lJ598kt72trdRFEXpsXfddRedccYZ1NvbS3fccQf9y7/8C/X399O6detSo+g973kPXXnllURE9O1vfzv9zf/X//pfRER044030jvf+U464ogj6F/+5V/ozjvvpLGxMXr9619PTz75pDLWarVK5513Hp166qn0ve99j66//nqamJig008/nV566SX6whe+QA888ADdcssttN9++9HY2Nisrw+DwZhnRAzGIoHv+9Gb3vSmqLu7O9q8eXO6/ZOf/GTUzKNw++23R0TU1GcmeNe73hW5rhs9+uij0+63devWaMWKFdGrX/3qKAiCls5xxRVXGMe3bt26iIiivr6+6EMf+lD0wx/+MPryl78cLV26NDr44IOjiYmJafu+8MILozVr1mj/RkTR4OBgND4+nm777ne/GxFR9KpXvSoKwzDdfsstt0REFP3617+OoiiKJiYmov7+/ujcc89V+gyCIHrlK18ZHX/88em2z3zmMxERRVu2bFH2/dOf/hS5rhtdeeWVyvaxsbFocHAwOv/885XvQUTRP/7jPyr7PvrooxERRd/97nenvQ4Ca9asic4+++ym9mUwGPMPjiFiLBq8//3vp3/7t3+je++9N/UatIJzzz2XfvGLX8zByIg+8YlP0De+8Q269dZb6bjjjjPut3v3bvrf//t/UxRF9M1vfrNpOqwZhGFIRETveMc76NOf/jQREb3hDW+gwcFBevOb30x33303vec975lx/294wxuoq6sr/f/DDz+ciIjOOusshaIT25977jk6+uijadOmTbR792668MIL67xvZ555Jt188800MTGh9D0V//mf/0m+79O73/1upY9cLkcnn3wy/ehHP6o75m1ve5vy/wcffDAtWbKEPvzhD9O2bdvoz/7sz+iII45o4QowGIyFDDaIGIsCN9xwA335y1+mr3/963TmmWfOqI/+/n4qFottHhnR9ddfTzfccAP97d/+Lb3//e837jc0NESnn346vfDCC/TDH/6QDjzwwLaOQ8QqrVu3Ttm+bt06siyLfvnLX86q/6kUZSaTmXZ7uVwmIqKXXnqJiIj+/M//3Nj37t27pzWIRB+vec1rtH+falgWCgXq7e1VthWLRXrooYfob//2b+mjH/0oDQ0N0cqVK+myyy6jj3/84+R5nvH8DAZj4YMNIsZej40bN9InPvEJ2rBhA11yySUz7ueOO+6giy++uKl9I4h/mQ7XX389bdiwgTZs2EAf/ehHjfsNDQ3RG9/4RtqyZQv94Ac/oGOOOaap/lvBMcccQ/fcc4/x7+30RrWCZcuWERHRrbfeasxgW7FiRVN9/L//9/9ozZo1Dc9pCio/+uij6Z577qEoiujXv/41bdy4kT71qU9RPp+nv/qrv2rYL4PBWLhgg4ixV+O+++6jyy67jC655BL65Cc/Oau+2k2Z/c3f/A1t2LCBPv7xj087NmEM/fGPf6QHHniAjj322LaNAfGWt7yFPvaxj9F//Md/0Fve8pZ0+3/8x39QFEXzlk7/2te+lvr6+ujJJ5+c1oNGJFPdp+ozrVu3jlzXpWeeeaaOCpsJLMuiV77ylfS5z32ONm7cOGvvGYPBmH+wQcTYa7FlyxZ6+9vfTgceeCBdfPHF9Mgjjyh/P/bYY1vSilm6dKk2BX4m+Id/+Af667/+azrzzDPp7LPPrhubMD5KpVKaGn7LLbeQ7/vKvsuXL6eDDjoo/X/Xdenkk09W0tGfe+651JB75plniCj2lBAR7b///vTqV7+aiIhe8YpX0BVXXEFf/OIXqaenh8466yz63e9+Rx//+Mfp2GOPpfPPP78t371VdHd306233koXXngh7d69m/78z/+cBgYGaOfOnfQ///M/tHPnTvrSl75ERFID6POf/zxdeOGF5Hke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ZUt0xx13RI8//njSZj6f4/XXXx8tWbIk+o//+I9oy5Yt0b/9279Fvb290c0335y0mW/n9/3vfz+69tpro29961uRiET//u//rj7v5HyuuOKK6Nhjj402bNgQ3XfffdGrX/3q6Mwzz4xqtdocn40b+zvH8fHx6KKLLoq++c1vRr/+9a+jn/3sZ9E555wTrVu3TvVxtJ9jwOJFMIiiKHrFK14RXXHFFWrfySefHF1zzTVHaESHDzt27IhEJLrrrruiKIqiRqMRDQ8PRzfddFPSplQqRQMDA9E//uM/HqlhHhQmJyejE088MdqwYUN0wQUXJAbRQjjHj370o9GrXvUq7+fz/Rxf//rXR3/8x3+s9r35zW+O3vWud0VRNP/Pb7ax0Mn5jI+PR7lcLrr99tuTNs8991yUTqejH/zgB3M29k7hMvpm4957741EJFlczrdzDFhcWPSSWaVSkY0bN8rFF1+s9l988cVy9913H6FRHT7s3btXRESGhoZERGTLli0yOjqqzrdQKMgFF1ww7873L//yL+X1r3+9XHTRRWr/QjjH7373u3L22WfLH/zBH8jy5cvlrLPOkltvvTX5fL6f46te9Sr57//+b3nsscdEROSXv/yl/PSnP5Xf/d3fFZH5f36z0cn5bNy4UarVqmozMjIip59++rw8Z5Hm/JNKpWRwcFBEFuY5BiwcLJhM1QeLXbt2Sb1elxUrVqj9K1askNHR0SM0qsODKIrk6quvlle96lVy+umni4gk5+Q636effnrOx3iwuP322+W+++6T//3f/235bCGc45NPPilf+tKX5Oqrr5a//uu/lnvvvVc+8IEPSKFQkMsuu2zen+NHP/pR2bt3r5x88smSyWSkXq/Lpz/9aXnHO94hIgvjHhKdnM/o6Kjk83k55phjWtrMx7moVCrJNddcI+985zuTAq8L7RwDFhYWvUFkkEql1N9RFLXsm2943/veJw888ID89Kc/bflsPp/v1q1b5corr5Qf/vCH+60EPZ/PsdFoyNlnny033HCDiIicddZZ8vDDD8uXvvQlueyyy5J28/Ucv/nNb8ptt90m3/jGN+S0006TTZs2yVVXXSUjIyNy+eWXJ+3m6/n5cDDnMx/PuVqtytvf/nZpNBryxS9+sW37+XiOAQsPi14yW7p0qWQymZbVyY4dO1pWc/MJ73//++W73/2u3HnnnXLccccl+4eHh0VE5vX5bty4UXbs2CHr1q2TbDYr2WxW7rrrLvn7v/97yWazyXnM53NcuXKlnHrqqWrfKaecIs8884yIzP/7+Fd/9VdyzTXXyNvf/nY544wzZP369fLBD35QbrzxRhGZ/+c3G52cz/DwsFQqFdmzZ4+3zXxAtVqVt771rbJlyxbZsGFDwg6JLJxzDFiYWPQGUT6fl3Xr1smGDRvU/g0bNsgrX/nKIzSqg0cURfK+971Pvv3tb8v//M//yNq1a9Xna9euleHhYXW+lUpF7rrrrnlzvq997WvlwQcflE2bNiX/zj77bPnDP/xD2bRpk5xwwgnz/hx/8zd/syVdwmOPPSZr1qwRkfl/H6enpyWd1tNPJpNJwu7n+/nNRifns27dOsnlcqrNtm3b5KGHHpo352yMoc2bN8sdd9whS5YsUZ8vhHMMWMA4Ut7cRxNM2P2Xv/zl6JFHHomuuuqqqKenJ3rqqaeO9NAOGH/xF38RDQwMRD/60Y+ibdu2Jf+mp6eTNjfddFM0MDAQffvb344efPDB6B3veMdRHc7cCRhlFkXz/xzvvffeKJvNRp/+9KejzZs3R1//+tej7u7u6LbbbkvazOdzvPzyy6Njjz02Cbv/9re/HS1dujT6yEc+krSZb+c3OTkZ3X///dH9998fiUj0uc99Lrr//vuTCKtOzueKK66IjjvuuOiOO+6I7rvvvug1r3nNURWSvr9zrFar0aWXXhodd9xx0aZNm9T8Uy6Xkz6O9nMMWLwIBlGML3zhC9GaNWuifD4fvexlL0vC1OcbRMT57ytf+UrSptFoRJ/4xCei4eHhqFAoRL/1W78VPfjgg0du0IcBsw2ihXCO3/ve96LTTz89KhQK0cknnxzdcsst6vP5fI4TExPRlVdeGa1evToqFovRCSecEF177bXqxTnfzu/OO+90/vYuv/zyKIo6O5+ZmZnofe97XzQ0NBR1dXVFb3jDG6JnnnnmCJyNG/s7xy1btnjnnzvvvDPp42g/x4DFi1QURdHc8VEBAQEBAQEBAUcfFr0PUUBAQEBAQEBAMIgCAgICAgICFj2CQRQQEBAQEBCw6BEMooCAgICAgIBFj2AQBQQEBAQEBCx6BIMoICAgICAgYNEjGEQBAQEBAQEBix7BIAoICAgICAhY9AgGUUBAQEBAQMCiRzCIAgICAgICAhY9gkEUELDIceGFF8oHPvAB+chHPiJDQ0MyPDws1113nYiI/OhHP5J8Pi8/+clPkvaf/exnZenSpbJt27YjNOKAgICAw49gEAUEBMjXvvY16enpkXvuuUc+85nPyKc+9SnZsGGDXHjhhXLVVVfJ+vXrZe/evfLLX/5Srr32Wrn11ltl5cqVR3rYAQEBAYcNobhrQMAix4UXXij1el2xQK94xSvkNa95jdx0001SqVTk3HPPlRNPPFEefvhhOe+88+TWW289giMOCAgIOPzIHukBBAQEHHm85CUvUX+vXLlSduzYISIi+XxebrvtNnnJS14ia9askZtvvvkIjDAgICDghUWQzAICAiSXy6m/U6mUNBqN5O+7775bRETGxsZkbGxsTscWEBAQMBcIBlFAQMB+8cQTT8gHP/hBufXWW+Xcc8+Vyy67TBlLAQEBAQsBwSAKCAjwol6vy/r16+Xiiy+Wd7/73fKVr3xFHnroIfnsZz97pIcWEBAQcFgRDKKAgAAvPv3pT8tTTz0lt9xyi4iIDA8Pyz//8z/Lxz/+cdm0adORHVxAQEDAYUSIMgsICAgICAhY9AgMUUBAQEBAQMCiRzCIAgICAgICAhY9gkEUEBAQEBAQsOgRDKKAgICAgICARY9gEAUEBAQEBAQsegSDKCAgICAgIGDRIxhEAQEBAQEBAYsewSAKCAgICAgIWPQIBlFAQEBAQEDAokcwiAICAgICAgIWPYJBFBAQEBAQELDoEQyigICAgICAgEWP/w/Gk89SmIu4WgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "expt.topog.depth.plot()" ] @@ -758,7 +223,7 @@ "outputs": [], "source": [ "expt.ocean_forcing(\n", - " tmpdir, ## Path to ocean foring files\n", + " glorys_path, ## Path to ocean foring files\n", " {\"time\":\"time\",\n", " \"y\":\"latitude\",\n", " \"x\":\"longitude\",\n", @@ -771,7 +236,7 @@ " }\n", " },\n", " boundaries = [\"south\",\"north\",\"west\",\"east\"],\n", - " gridtype=\"A\"\n", + " gridtype=\"A\" ## Grid type. This is an Arakawa A grid sice velocities and tracers are all on the same points\n", ")" ] }, @@ -779,7 +244,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Step 6 Run the FRE tools\n", + "## Step 6: Run the FRE tools\n", "\n", "This is just a wrapper for the FRE tools needed to make the mosaics and masks for the experiment. The only thing you need to tell it is the processor layout. In this case we're saying that we want a 10 by 10 grid of 100 processors. " ] @@ -790,17 +255,35 @@ "metadata": {}, "outputs": [], "source": [ - "expt.FRE_tools((10,10))\n" + "expt.FRE_tools((10,10)) ## Here the tuple defines the processor layout\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Step 7: Modify the default input directory to make a (hopefully) runnable configuration out of the box\n", + "## Step 7: Set up ERA5 forcing:\n", + "Here we assume you've already got ERA5 data stored somewhere on your system. \n", "\n", - "This cell just copies a default run directory and modifies it to match your configuration.\n", - "\n" + "For this example, we are forcing for the entire year of 2003 so we just generate a single forcing file with 2003's data.\n", + "\n", + "Below is a table showing ERA5 characteristics and what needs to be done to sort it out\n", + "### Required ERA data:\n", + "Name | ERA filename | era variable name | Units\n", + "---|---|---|---\n", + "Surface Pressure | sp | sp | Pa \n", + "Surface Temperature | 2t | t2m | K \n", + "Meridional Wind | 10v | v10 | m/s \n", + "Zonal Wind | 10u | u10 | m/s \n", + "Specific Humidity | na | na | kg/kg, calculated from dewpoint temperature\n", + "Dewpoint Temperature | 2d | d2m | K\n", + "\n", + "\n", + "We calculate specific humidity $q$ from dewpoint temperature $T_d$ and surface pressure $P$ via saturation vapour pressure $P_v$.\n", + "\n", + "$\\large P_v = 10^{8.07131 - \\frac{1730.63}{233.426 + T}} \\frac{101325}{760} $ Pascals\n", + "\n", + "$\\large q = 0.001 * 0.622 \\frac{P_v}{P}$ " ] }, { @@ -809,130 +292,16 @@ "metadata": {}, "outputs": [], "source": [ - "subprocess.run(f\"cp default_rundir/era5_surface/* {rundir} -r\",shell = True)\n", - "# subprocess.run(f\"cp default_rundir/era5_surface/* {rundir} -r\",shell = True)\n", - "subprocess.run(f\"ln -s {inputdir} {rundir}/inputdir\",shell=True)\n", - "\n", - "hgrid = xr.open_dataset(f\"{inputdir}/hgrid.nc\")\n", - "\n", - "## Get mask table information\n", - "ncpus = 10\n", - "mask_table = None\n", - "for i in os.listdir(f\"{inputdir}\"):\n", - " if \"mask_table\" in i:\n", - " mask_table = i\n", - " a = mask_table.split(\".\")[1]\n", - " b = mask_table.split(\".\")[2].split(\"x\")\n", - " ncpus = int(b[0]) * int(b[1]) - int(a)\n", - "\n", - "\n", - "## Modify MOM_input\n", - "inputfile = open(f\"{rundir}/MOM_input\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"MASKTABLE\" in lines[i]:\n", - " if mask_table != None:\n", - " lines[i] = f'MASKTABLE = \"{mask_table}\"\\n'\n", - " else:\n", - " lines[i] = \"# MASKTABLE = no mask table\"\n", - " if \"LAYOUT =\" in lines[i] and \"IO\" not in lines[i]:\n", - " lines[i] = f'LAYOUT = {expt.layout[1]},{expt.layout[0]}\\n'\n", - "\n", - " if \"NIGLOBAL\" in lines[i]: \n", - " # lines[i] = f\"NIGLOBAL = {str(x_indices_centre[1] - x_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NIGLOBAL = {hgrid.nx.shape[0]//2}\\n\"\n", - "\n", - " \n", - " if \"NJGLOBAL\" in lines[i]:\n", - " # lines[i] = f\"NJGLOBAL = {str(y_indices_centre[1] - y_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NJGLOBAL = {hgrid.ny.shape[0]//2}\\n\"\n", - "\n", - " \n", - "inputfile = open(f\"{rundir}/MOM_input\",'w')\n", - "\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n", - "\n", - "## Modify SIS_input\n", - "inputfile = open(f\"{rundir}/SIS_input\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"MASKTABLE\" in lines[i]:\n", - " lines[i] = f'MASKTABLE = \"{mask_table}\"\\n'\n", - " if \"NIGLOBAL\" in lines[i]:\n", - " # lines[i] = f\"NIGLOBAL = {str(x_indices_centre[1] - x_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NIGLOBAL = {hgrid.nx.shape[0]//2}\\n\"\n", - " if \"LAYOUT =\" in lines[i] and \"IO\" not in lines[i]:\n", - " lines[i] = f'LAYOUT = {expt.layout[1]},{expt.layout[0]}\\n'\n", - " if \"NJGLOBAL\" in lines[i]:\n", - " # lines[i] = f\"NJGLOBAL = {str(y_indices_centre[1] - y_indices_centre[0])}\\n\"\n", - " lines[i] = f\"NJGLOBAL = {hgrid.ny.shape[0]//2}\\n\"\n", - " \n", - "inputfile = open(f\"{rundir}/SIS_input\",'w')\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n", - "\n", - "## Modify config.yaml \n", - "inputfile = open(f\"{rundir}/config.yaml\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"ncpus\" in lines[i]:\n", - " lines[i] = f'ncpus: {str(ncpus)}\\n'\n", - " if \"jobname\" in lines[i]:\n", - " lines[i] = f\"jobname: mom6_{expt_name}\\n\"\n", - " \n", - " if \"input:\" in lines[i]:\n", - " lines[i + 1] = f\" - {inputdir}\\n\"\n", - "\n", - "inputfile = open(f\"{rundir}/config.yaml\",'w')\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n", - "\n", - "\n", - "# Modify input.nml \n", - "inputfile = open(f\"{rundir}/input.nml\",'r')\n", - "lines = inputfile.readlines()\n", - "inputfile.close()\n", - "for i in range(len(lines)):\n", - " if \"current_date\" in lines[i]:\n", - " tmp = daterange[0].split(\" \")[0].split(\"-\")\n", - " lines[i] = f\"{lines[i].split(' = ')[0]} = {int(tmp[0])},{int(tmp[1])},{int(tmp[2])},0,0,0,\\n\"\n", - "\n", - " \n", - "inputfile = open(f\"{rundir}/input.nml\",'w')\n", - "inputfile.writelines(lines)\n", - "inputfile.close()\n" + "expt.setup_era5(\"PATH_TO_ERA5_DATA/era5/single-levels/reanalysis\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### SET UP ERA5 forcing:\n", - "Here we assume you've already got ERA5 data stored somewhere on your system. For NCI users, you need access to the rt group. ERA5 - specific functions provided cut out the region of interest and fix up the metadata ready for MOM6.\n", + "## Step 8: Modify the default input directory to make a (hopefully) runnable configuration out of the box\n", "\n", - "For this example, we are forcing for the entire year of 2015 so we just generate a single forcing file with 2015's data.\n", - "\n", - "Below is a table showing ERA5 characteristics and what needs to be done to sort it out\n", - "### Required ERA data:\n", - "Name | ERA filename | era variable name | notes\n", - "---|---|---|---\n", - "Surface Pressure | sp | sp | Pa :heavy_check_mark:\n", - "Surface Temperature | 2t | t2m | K :heavy_check_mark:\n", - "Meridional Wind | 10v | v10 | m/s :heavy_check_mark:\n", - "Zonal Wind | 10u | u10 | m/s :heavy_check_mark:\n", - "Specific Humidity | na | na | kg/kg, calculated from dewpoint temperature\n", - "Dewpoint Temperature | 2d | d2m | K\n", - "\n", - "\n", - "We can calculate specific humidity $q$ from dewpoint temperature $T_d$ and surface pressure $P$ via saturation vapour pressure $P_v$.\n", - "\n", - "$\\large P_v = 10^{8.07131 - \\frac{1730.63}{233.426 + T}} \\frac{101325}{760} $ Pascals\n", - "\n", - "$\\large q = 0.001 * 0.622 \\frac{P_v}{P}$ " + "This step copies the default directory, and modifies the `MOM_layout` files to match your experiment by inserting the right number of x,y points and cpu layout. If you use Payu to run mom6, set the `using_payu` flag to `True` and an example `config.yaml` file will be copied to your run directory. This still needs to be modified manually to work with your projects, executable etc." ] }, { @@ -941,59 +310,30 @@ "metadata": {}, "outputs": [], "source": [ - "erapath = \"/g/data/rt52/era5/single-levels/reanalysis\"\n", - "\n", - "## Firstly just open all raw data\n", - "rawdata = {}\n", - "for fname , vname in zip([\"2t\",\"10u\",\"10v\",\"sp\",\"2d\"] , [\"t2m\",\"u10\",\"v10\",\"sp\",\"d2m\"]):\n", - "\n", - " ## Cut out this variable to our domain size\n", - " rawdata[fname] = rm.nicer_slicer(\n", - " xr.open_mfdataset(f\"{erapath}/{fname}/{daterange[0].split('-')[0]}/{fname}*\",decode_times = False,chunks = {\"longitude\":100,\"latitude\":100}),\n", - " xextent,\n", - " \"longitude\"\n", - " ).sel(\n", - " latitude = slice(yextent[1],yextent[0]) ## This is because ERA5 has latitude in decreasing order (??)\n", - " )\n", - "\n", - " ## Now fix up the latitude and time dimensions\n", - "\n", - " rawdata[fname] = rawdata[fname].isel(\n", - " latitude = slice(None,None,-1) ## Flip latitude \n", - " ).assign_coords(\n", - " time = np.arange(0,rawdata[fname].time.shape[0],dtype=float) ## Set the zero date of forcing to start of run\n", - " )\n", - " \n", - "\n", - " \n", - "\n", - " rawdata[fname].time.attrs = {\"calendar\":\"julian\",\"units\":f\"hours since {daterange[0]}\"} ## Fix up calendar to match\n", - "\n", - " if fname == \"2d\":\n", - " ## Calculate specific humidity from dewpoint temperature \n", - " q = xr.Dataset(\n", - " data_vars= {\n", - " \"q\": (0.622 / rawdata[\"sp\"][\"sp\"]) * (10**(8.07131 - 1730.63 / (233.426 + rawdata[\"2d\"][\"d2m\"] - 273.15) )) * 101325 / 760\n", - " }\n", + "expt.setup_run_directory(surface_forcing = \"era5\",using_payu = False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 9: Run and Troubleshoot!\n", "\n", - " )\n", - " q.q.attrs = {\"long_name\":\"Specific Humidity\",\"units\": \"kg/kg\"}\n", - " q.to_netcdf(f\"{inputdir}/forcing/q_ERA5\",unlimited_dims = \"time\",encoding = {\"q\":{\"dtype\":\"double\"}})\n", - " else:\n", - " rawdata[fname].to_netcdf(f\"{inputdir}/forcing/{fname}_ERA5\",unlimited_dims = \"time\",encoding = {vname:{\"dtype\":\"double\"}})\n", + "To do this, navigate to your run directory in the terminal, and use your favourite tool to run the experiment on your system. \n", "\n", + "Hopefully your model is running. If not, the first thing you should do is reduce the timestep. You can do this by adding `#override DT=XXXX` to your `MOM_override` file. \n", "\n", - "## Update the data table to match:\n", + "If there's strange behaviour on your boundaries, you could play around with the `nudging timescale` (an example is already included in the `MOM_override` file). Sometimes, if your boundary has a lot going on (like all of the eddies spinning off the ACC), it can be hard to avoid these edge effects. This is because the chaotic, submesoscale structures developed within the regional domain won't match those at the boundary. \n", "\n", - "subprocess.run(f\"cp default_rundir/era5_surface/data_table {rundir}/data_table\",shell = True)" + "Another thing that can go wrong is little bays creating non-advective cells at your boundaries. Keep an eye out for tiny bays where one side is taken up by a boundary segment. You can either fill them in manually, or move your boundary slightly to avoid them" ] } ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:analysis3-23.04] *", + "display_name": "Python [conda env:analysis3-unstable]", "language": "python", - "name": "conda-env-analysis3-23.04-py" + "name": "conda-env-analysis3-unstable-py" }, "language_info": { "codemirror_mode": { @@ -1005,7 +345,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.17" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/pyproject.toml b/pyproject.toml index 2a12193f..2f2e4d5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,8 @@ dependencies = [ "scipy>=1.2.0", "xarray", "xesmf>=0.8", + "PyYAML>=6.0.1", + "f90nml>=1.4.1", ] [build-system] diff --git a/regional_mom6/default_rundir/era5_surface/MOM_input b/regional_mom6/default_rundir/era5_surface/MOM_input deleted file mode 100755 index ead7171a..00000000 --- a/regional_mom6/default_rundir/era5_surface/MOM_input +++ /dev/null @@ -1,287 +0,0 @@ -! modified from OM4_025.JRA and ESMG's Arctic5 - -! === module MOM === -USE_REGRIDDING = True -! diffuse interface heights with KHTH -THICKNESSDIFFUSE = False -! do thickness diffusion before dynamics -THICKNESSDIFFUSE_FIRST = True -! baroclinic timestep -DT = 900.0 -!DT = 360.0 - -! thermodynamic and tracer advection timestep -!DT_THERM = 3600.0 -DT_THERM = 1800.0 -!DT_THERM = 900.0 -! thermo timesteps can be longer than coupling timestep -THERMO_SPANS_COUPLING = True -! form frazil ice (accumulated heat deficit is returned -! in the surface state) -FRAZIL = True - -! limit salinity to positive values -BOUND_SALINITY = True -! heat capacity of seawater -C_P = 3992.0 - -! check for excessive SSH, SST and SSS -CHECK_BAD_SURFACE_VALS = True - -! don't write geometry/vertical grid files -WRITE_GEOM = 1 - -! for debug: save initial conditions -SAVE_INITIAL_CONDS = True -RESTART_CHECKSUMS_REQUIRED = False - -! === module MOM_domains === -NIGLOBAL = 210 -NJGLOBAL = 271 - -LAYOUT = 10,10 -IO_LAYOUT = 1,1 - -MASKTABLE = "mask_table.2.10x10" - -! === module MOM_verticalGrid === -NK = 75 - -! === module MOM_fixed_initialization === -INPUTDIR = "INPUT" - -DEPRESS_INITIAL_SURFACE = True -SURFACE_HEIGHT_IC_FILE = "forcing/init_eta.nc" -SURFACE_HEIGHT_IC_VAR = "eta_t" - -VELOCITY_CONFIG = "file" -VELOCITY_FILE = "forcing/init_vel.nc" - -! === module MOM_grid_init === -GRID_CONFIG = "mosaic" -GRID_FILE = "hgrid.nc" -TOPO_CONFIG = "file" -TOPO_FILE = "topog.nc" - -REENTRANT_X = False - -MINIMUM_DEPTH = 9.5 -MAXIMUM_DEPTH = 6000.0 - -! === module MOM_open_boundary === -OBC_NUMBER_OF_SEGMENTS = 4 -OBC_FREESLIP_VORTICITY = True -OBC_FREESLIP_STRAIN = True -#OBC_COMPUTED_VORTICITY = True -OBC_ZERO_BIHARMONIC = True -!RAMP_OBCS = True -BRUSHCUTTER_MODE = True ! read data on supergrid - -! segment 1: southern boundary -OBC_SEGMENT_001 = "J=0,I=0:N,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_001_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_001_DATA = "U=file:forcing/forcing_obc_segment_001.nc(u),V=file:forcing/forcing_obc_segment_001.nc(v),SSH=file:forcing/forcing_obc_segment_001.nc(eta),TEMP=file:forcing/forcing_obc_segment_001.nc(temp),SALT=file:forcing/forcing_obc_segment_001.nc(salt)" - -! segment 2: northern boundary -OBC_SEGMENT_002 = "J=N,I=N:0,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_002_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_002_DATA = "U=file:forcing/forcing_obc_segment_002.nc(u),V=file:forcing/forcing_obc_segment_002.nc(v),SSH=file:forcing/forcing_obc_segment_002.nc(eta),TEMP=file:forcing/forcing_obc_segment_002.nc(temp),SALT=file:forcing/forcing_obc_segment_002.nc(salt)" - -! segment 3: western boundary -OBC_SEGMENT_003 = "I=0,J=N:0,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_003_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_003_DATA = "U=file:forcing/forcing_obc_segment_003.nc(u),V=file:forcing/forcing_obc_segment_003.nc(v),SSH=file:forcing/forcing_obc_segment_003.nc(eta),TEMP=file:forcing/forcing_obc_segment_003.nc(temp),SALT=file:forcing/forcing_obc_segment_003.nc(salt)" - -! segment 4: eastern boundary -OBC_SEGMENT_004 = "I=N,J=0:N,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_004_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_004_DATA = "U=file:forcing/forcing_obc_segment_004.nc(u),V=file:forcing/forcing_obc_segment_004.nc(v),SSH=file:forcing/forcing_obc_segment_004.nc(eta),TEMP=file:forcing/forcing_obc_segment_004.nc(temp),SALT=file:forcing/forcing_obc_segment_004.nc(salt)" - -OBC_TRACER_RESERVOIR_LENGTH_SCALE_OUT = 30000 -OBC_TRACER_RESERVOIR_LENGTH_SCALE_IN = 3000 - -! sponges -SPONGE = False - -! === module MOM_coord_initialization === -! don't define layers in ALE mode -COORD_CONFIG = "ALE" - -REGRIDDING_COORDINATE_MODE = "ZSTAR" -! use high-order scheme at boundary cells for remapping, -! instead of just piecewise-constant -BOUNDARY_EXTRAPOLATION = True - -! read target densities from file, set minimum interface depth -! from profile: minimum dz=2, 4000m total thickness, profile is dz^4.5 -ALE_COORDINATE_CONFIG = "FILE:vcoord.nc,interfaces=zi" - -REMAPPING_SCHEME = "PPM_H4" - -! === module MOM_state_initialization === -! initialise states from the nested Z-space file -INIT_LAYERS_FROM_Z_FILE = True -! if we've pre-interpolated the initial conditions, -! we only have to perform remapping -TEMP_SALT_INIT_VERTICAL_REMAP_ONLY = True - -! === module MOM_initialize_layers_from_Z === -! read "temp" and "salt" from a z-space file -TEMP_SALT_Z_INIT_FILE = "forcing/init_tracers.nc" -Z_INIT_FILE_PTEMP_VAR = "temp" -! remap straight to the model coordinate -Z_INIT_ALE_REMAPPING = True - -! === module MOM_set_visc === -CHANNEL_DRAG = True -! turbulent Prandtl number for shear instability -PRANDTL_TURB = 1.25 -HBBL = 10.0 -DRAG_BG_VEL = 0.1 -BBL_USE_EOS = True -BBL_THICK_MIN = 0.1 -KV = 1.0E-04 -KV_BBL_MIN = 0.0 -KV_TBL_MIN = 0.0 - -! === module MOM_continuity_PPM === -ETA_TOLERANCE = 1.0E-06 -ETA_TOLERANCE_AUX = 0.001 - -! === module MOM_CoriolisAdv === -CORIOLIS_SCHEME = "SADOURNY75_ENSTRO" -BOUND_CORIOLIS = True - -! === module MOM_PressureForce_AFV === -MASS_WEIGHT_IN_PRESSURE_GRADIENT = True - -! === module MOM_hor_visc === -LAPLACIAN = True -AH_VEL_SCALE = 0.01 -SMAGORINSKY_AH = True -SMAG_BI_CONST = 0.06 - -! === module MOM_vert_friction === -U_TRUNC_FILE = "U_velocity_truncations" -V_TRUNC_FILE = "V_velocity_truncations" -HMIX_FIXED = 0.5 -! maximum velocity before truncation -MAXVEL = 6.0 - -! === module MOM_barotropic === -BOUND_BT_CORRECTION = True -BT_PROJECT_VELOCITY = True -DYNAMIC_SURFACE_PRESSURE = True -BEBT = 0.2 -DTBT = -0.9 - -! === module MOM_thickness_diffuse === -! maximum value of local diffusive CFL ratio -! permitted for thickness diffusivity -KHTH_MAX_CFL = 0.1 - -! === module MOM_mixed_layer_restrat === -MIXEDLAYER_RESTRAT = True -! proportional coefficient to ratio of deformation radius -! to the dominant lengthscale of submesoscale mixed layer -! instabilities, times the minimum of the ratio of -! mesoscale EKE to large-scale geostrophic KE, or 1 + the -! square of the grid spacing over the deformation radius -FOX_KEMPER_ML_RESTRAT_COEF = 1.0 -! frontal-length scale used to calculate -! upscaling of buoyancy gradients -MLE_FRONT_LENGTH = 500.0 -MLE_USE_PBL_MLD = True -! 720 days -MLE_MLD_DECAY_TIME = 2.592E+06 - -! === module MOM_diabatic_driver === -ENERGETICS_SFC_PBL = True -EPBL_IS_ADDITIVE = False - -! === module MOM_set_diffusivity === -! add BBL mixing diffusivity, instead of taking maximum -BBL_MIXING_AS_MAX = False -! non-coord dependent BBL diffusivity -USE_LOTW_BBL_DIFFUSIVITY = True -! use estimate of Kd/TKE for arbitrary vertical coordinate -SIMPLE_TKE_TO_KD = True -! latitude-dependent scaling for near-surface background -! diffusivity -HENYEY_IGW_BACKGROUND = True -!N2_FLOOR_IOMEGA2 = 0.0 -KD = 1.5E-05 -KD_MIN = 2.0E-06 -KD_MAX = 0.1 -INT_TIDE_DISSIPATION = False -!INT_TIDE_PROFILE = "POLZIN_09" -!INT_TIDE_DECAY_SCALE = 300.3003003003003 -! topographic wavenumber, 2pi/10km -!KAPPA_ITIDES = 6.28319E-04 -!KAPPA_H2_FACTOR = 0.84 -! maximum internal tide energy source available -! to mix above the BBL -!TKE_ITIDE_MAX = 0.1 - -! === MOM_kappa_shear === -USE_JACKSON_PARAM = True -!MAX_RINO_INT = 25 - -! === module MOM_energetic_PBL === -EPBL_MSTAR_SCHEME = "OM4" -MSTAR = 0.0 -MIX_LEN_EXPONENT = 1.0 -MSTAR_CAP = 10.0 -MSTAR_CONV_ADJ = 0.667 -MSTAR2_COEF1 = 0.29 -MSTAR2_COEF2 = 0.152 -NSTAR = 0.06 -TKE_DECAY = 0.01 -ML_OMEGA_FRAC = 0.001 -USE_MLD_ITERATION = True -EPBL_TRANSITION_SCALE = 0.01 -USE_LA_LI2016 = True -EPBL_LANGMUIR_SCHEME = "ADDITIVE" -LT_ENHANCE_COEF = 0.044 -LT_ENHANCE_EXP = -1.5 -LT_MOD_LAC1 = 0.0 -LT_MOD_LAC4 = 0.0 -LT_MOD_LAC5 = 0.22 -!EPBL_USTAR_MIN = 1.45842E-18 - -! === module MOM_trace_advect === -TRACER_ADVECTION_SCHEME = "PPM:H3" - -! === module MOM_tracer_hor_diff === -! ensure diffusive equivalent of CFL limit isn't -! violated -CHECK_DIFFUSIVE_CFL = True - -! === module ocean_model_init === -! time between saves of energies and other global -! integrals -TIMEUNIT = 86400 -ENERGYSAVEDAYS = 1.0 - -! === module MOM_surface_forcing === -! maximum surface pressure that can be exerted -! by atmosphere and floating sea-ice -MAX_P_SURF = 0.0 -CD_TIDES = 0.0018 -GUST_CONST = 0.0 -USE_RIGID_SEA_ICE = True -SEA_ICE_RIGID_MASS = 100.0 - -! === module MOM_sum_output === -MAXTRUNC = 100000 - -REPORT_UNUSED_PARAMS = True -!FATAL_UNUSED_PARAMS = True - -NUM_DIAG_COORDS = 1 -DIAG_COORDS = "z Z ZSTAR" -DIAG_COORD_DEF_Z = "FILE:vcoord.nc,interfaces=zi" -! drho (arg 5) is a bit magic and has a big impact on -! the tail of the coord... - -BAD_VAL_SST_MIN = -3.0 diff --git a/regional_mom6/default_rundir/era5_surface/MOM_override b/regional_mom6/default_rundir/era5_surface/MOM_override deleted file mode 100644 index b4be647e..00000000 --- a/regional_mom6/default_rundir/era5_surface/MOM_override +++ /dev/null @@ -1,7 +0,0 @@ -#override OBC_SEGMENT_001_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales -#override OBC_SEGMENT_001_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales -#override OBC_SEGMENT_003_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales -#override OBC_SEGMENT_004_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales - -#override DT = 300 -#override DT_THERM = 600 \ No newline at end of file diff --git a/regional_mom6/default_rundir/era5_surface/README.md b/regional_mom6/default_rundir/era5_surface/README.md deleted file mode 100755 index 6941c9c7..00000000 --- a/regional_mom6/default_rundir/era5_surface/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# mom6-eac -MOM6-SIS2 model configuration for the East Australian Current region. - -The domain limits are the Coral and Tasman seas, as far south as Tasmania, as far north as PNG, as far east as NZ: - - latitude: 48S to 6S - - longitude: 144E to 176E diff --git a/regional_mom6/default_rundir/era5_surface/data_table b/regional_mom6/default_rundir/era5_surface/data_table deleted file mode 100755 index e5f45074..00000000 --- a/regional_mom6/default_rundir/era5_surface/data_table +++ /dev/null @@ -1,21 +0,0 @@ -"ATM", "p_surf", "sp", "./INPUT/forcing/sp_ERA5", "bilinear", 1.0 -"ATM", "p_bot", "sp", "./INPUT/forcing/sp_ERA5", "bilinear", 1.0 -"ATM", "t_bot", "t2m", "./INPUT/forcing/2t_ERA5", "bilinear", 1.0 -"ATM", "sphum_bot", "q", "./INPUT/forcing/q_ERA5", "bilinear", 1.0 -"ATM", "u_bot", "u10", "./INPUT/forcing/10u_ERA5", "bicubic", 1.0 -"ATM", "v_bot", "v10", "./INPUT/forcing/10v_ERA5", "bicubic", 1.0 -"ATM", "z_bot", "", "", "bilinear", 10.0 -"ATM", "gust", "", "", "bilinear", 1.0e-4 -"ICE", "lw_flux_dn", "rlds", "./INPUT/RYF.rlds.1990_1991.nc", "bilinear", 1.0 -"ICE", "sw_flux_vis_dir_dn", "rsds", "./INPUT/RYF.rsds.1990_1991.nc", "bilinear", 0.285 -"ICE", "sw_flux_vis_dif_dn", "rsds", "./INPUT/RYF.rsds.1990_1991.nc", "bilinear", 0.285 -"ICE", "sw_flux_nir_dir_dn", "rsds", "./INPUT/RYF.rsds.1990_1991.nc", "bilinear", 0.215 -"ICE", "sw_flux_nir_dif_dn", "rsds", "./INPUT/RYF.rsds.1990_1991.nc", "bilinear", 0.215 -"ICE", "lprec", "prrn", "./INPUT/RYF.rain.1990_1991.nc", "bilinear", 1.0 -"ICE", "fprec", "prsn", "./INPUT/RYF.snow.1990_1991.nc", "bilinear", 1.0 -"ICE", "runoff", "", "", "none", 0.0 -"ICE", "dhdt", "", "", "none", 80.0 -"ICE", "dedt", "", "", "none", 2.0e-6 -"ICE", "drdt", "", "", "none", 10.0 -"LND", "rough_mom", "", "", "none", 0.01 -"LND", "rough_heat", "", "", "none", 0.1""" diff --git a/regional_mom6/default_rundir/era5_surface/env.yaml b/regional_mom6/default_rundir/era5_surface/env.yaml deleted file mode 100755 index dfe1ea31..00000000 --- a/regional_mom6/default_rundir/era5_surface/env.yaml +++ /dev/null @@ -1,93 +0,0 @@ -CPATH: /apps/openmpi/4.1.2/include -CPATH_modshare: /apps/openmpi/4.1.2/include:1 -CPLUS_INCLUDE_PATH: /apps/openmpi/4.1.2/include -CPLUS_INCLUDE_PATH_modshare: /apps/openmpi/4.1.2/include:1 -C_INCLUDE_PATH: /apps/openmpi/4.1.2/include -C_INCLUDE_PATH_modshare: /apps/openmpi/4.1.2/include:1 -ENVIRONMENT: BATCH -FPATH: /apps/openmpi/4.1.2/include -FPATH_modshare: /apps/openmpi/4.1.2/include:1 -GIT_CONFIG_NOGLOBAL: 'yes' -HCOLL_ENABLE_MCAST: '0' -HOME: /home/149/ab8992 -LC_CTYPE: C.UTF-8 -LD_LIBRARY_PATH: /apps/openmpi/4.1.2/lib:/apps/openmpi/4.1.2/lib/profilers -LD_LIBRARY_PATH_modshare: /apps/openmpi/4.1.2/lib:1:/apps/openmpi/4.1.2/lib/profilers:1 -LD_RUN_PATH: /apps/openmpi/4.1.2/lib:/apps/openmpi/4.1.2/lib/profilers -LD_RUN_PATH_modshare: /apps/openmpi/4.1.2/lib:1:/apps/openmpi/4.1.2/lib/profilers:1 -LIBRARY_PATH: /apps/openmpi/4.1.2/lib:/apps/openmpi/4.1.2/lib/profilers -LIBRARY_PATH_modshare: /apps/openmpi/4.1.2/lib:1:/apps/openmpi/4.1.2/lib/profilers:1 -LOADEDMODULES: openmpi/4.1.2:pbs -LOADEDMODULES_modshare: pbs:1:openmpi/4.1.2:1 -LOGNAME: ab8992 -MANPATH: /opt/pbs/default/share/man:/apps/openmpi/4.1.2/share/man -MANPATH_modshare: /apps/openmpi/4.1.2/share/man:1:/opt/pbs/default/share/man:1 -MODULEPATH: /g/data/hh5/public/modules:/etc/scl/modulefiles:/opt/Modules/modulefiles:/opt/Modules/v4.3.0/modulefiles:/apps/Modules/modulefiles -MODULESHOME: /opt/Modules/v4.3.0 -MODULES_CMD: /opt/Modules/v4.3.0/libexec/modulecmd.tcl -MODULES_LMCONFLICT: openmpi/4.1.2&mpi&lam&mpich&openmpi&intel-mpi&o/wrappers&o/yes-wrappers&o/use-wrappers&o/enable-wrappers&o/with-wrappers&o/no-wrappers&o/not-wrappers&o/disable-wrappers&o/without-wrappers&o/ld_library_path&o/yes-ld_library_path&o/use-ld_library_path&o/enable-ld_library_path&o/with-ld_library_path&o/no-ld_library_path&o/not-ld_library_path&o/disable-ld_library_path&o/without-ld_library_path&o/ld_run_path&o/yes-ld_run_path&o/use-ld_run_path&o/enable-ld_run_path&o/with-ld_run_path&o/no-ld_run_path&o/not-ld_run_path&o/disable-ld_run_path&o/without-ld_run_path&o/show-debug&o/yes-show-debug&o/use-show-debug&o/enable-show-debug&o/with-show-debug&o/no-show-debug&o/not-show-debug&o/disable-show-debug&o/without-show-debug&o/append-paths&o/yes-append-paths&o/use-append-paths&o/enable-append-paths&o/with-append-paths&o/no-append-paths&o/not-append-paths&o/disable-append-paths&o/without-append-paths&o/library_path&o/yes-library_path&o/use-library_path&o/enable-library_path&o/with-library_path&o/no-library_path&o/not-library_path&o/disable-library_path&o/without-library_path&o/packaged-envvars&o/yes-packaged-envvars&o/use-packaged-envvars&o/enable-packaged-envvars&o/with-packaged-envvars&o/no-packaged-envvars&o/not-packaged-envvars&o/disable-packaged-envvars&o/without-packaged-envvars -MODULES_LMCONFLICT_modshare: openmpi/4.1.2&mpi&lam&mpich&openmpi&intel-mpi&o/wrappers&o/yes-wrappers&o/use-wrappers&o/enable-wrappers&o/with-wrappers&o/no-wrappers&o/not-wrappers&o/disable-wrappers&o/without-wrappers&o/ld_library_path&o/yes-ld_library_path&o/use-ld_library_path&o/enable-ld_library_path&o/with-ld_library_path&o/no-ld_library_path&o/not-ld_library_path&o/disable-ld_library_path&o/without-ld_library_path&o/ld_run_path&o/yes-ld_run_path&o/use-ld_run_path&o/enable-ld_run_path&o/with-ld_run_path&o/no-ld_run_path&o/not-ld_run_path&o/disable-ld_run_path&o/without-ld_run_path&o/show-debug&o/yes-show-debug&o/use-show-debug&o/enable-show-debug&o/with-show-debug&o/no-show-debug&o/not-show-debug&o/disable-show-debug&o/without-show-debug&o/append-paths&o/yes-append-paths&o/use-append-paths&o/enable-append-paths&o/with-append-paths&o/no-append-paths&o/not-append-paths&o/disable-append-paths&o/without-append-paths&o/library_path&o/yes-library_path&o/use-library_path&o/enable-library_path&o/with-library_path&o/no-library_path&o/not-library_path&o/disable-library_path&o/without-library_path&o/packaged-envvars&o/yes-packaged-envvars&o/use-packaged-envvars&o/enable-packaged-envvars&o/with-packaged-envvars&o/no-packaged-envvars&o/not-packaged-envvars&o/disable-packaged-envvars&o/without-packaged-envvars:1 -MODULE_VERSION: v4.3.0 -MODULE_VERSION_STACK: v4.3.0 -NCPUS: '48' -OMPI_BASE: /apps/openmpi/4.1.2 -OMPI_MCA_orte_tmpdir_base: /jobfs/57505323.gadi-pbs -OMPI_ROOT: /apps/openmpi/4.1.2 -OMPI_VERSION: 4.1.2 -OMP_NUM_THREADS: '48' -OPENMPI_BASE: /apps/openmpi/4.1.2 -OPENMPI_ROOT: /apps/openmpi/4.1.2 -OPENMPI_VERSION: 4.1.2 -PATH: /apps/openmpi/wrapper/fortran:/apps/openmpi/wrapper:/apps/openmpi/4.1.2/bin:/bin:/usr/bin:/opt/pbs/default/bin -PATH_modshare: /apps/openmpi/4.1.2/bin:1:/bin:1:/apps/openmpi/wrapper/fortran:1:/usr/bin:1:/opt/pbs/default/bin:1:/apps/openmpi/wrapper:1 -PAYU_FORCE: 'True' -PAYU_PATH: /g/data3/hh5/public/apps/miniconda3/envs/analysis3-22.04/bin -PBS_ENVIRONMENT: PBS_BATCH -PBS_JOBCOOKIE: 4D421325409555406510687B28164628 -PBS_JOBDIR: /home/149/ab8992 -PBS_JOBFS: /jobfs/57505323.gadi-pbs -PBS_JOBID: 57505323.gadi-pbs -PBS_JOBNAME: mom6_GIPPSLAND -PBS_MOMPORT: '15003' -PBS_NCI_FS_GDATA1: '0' -PBS_NCI_FS_GDATA1A: '0' -PBS_NCI_FS_GDATA1B: '0' -PBS_NCI_FS_GDATA2: '0' -PBS_NCI_FS_GDATA3: '0' -PBS_NCI_FS_GDATA4: '0' -PBS_NCI_HT: '0' -PBS_NCI_IMAGE: '' -PBS_NCI_JOBFS: 10gb -PBS_NCI_LAUNCH_COMPATIBILITY: '0' -PBS_NCI_NCPUS_PER_NODE: '48' -PBS_NCI_NCPUS_PER_NUMA: '12' -PBS_NCI_NUMA_PER_NODE: '4' -PBS_NCI_STORAGE: gdata/hh5+gdata/ik11+gdata/x77+scratch/v45+scratch/x77+gdata/ua8 -PBS_NCI_WD: '1' -PBS_NCPUS: '96' -PBS_NGPUS: '0' -PBS_NNODES: '2' -PBS_NODEFILE: /local/spool/pbs/aux/57505323.gadi-pbs -PBS_NODENUM: '0' -PBS_O_HOME: /home/149/ab8992 -PBS_O_HOST: gadi-login-06.gadi.nci.org.au -PBS_O_LANG: en_AU.UTF-8 -PBS_O_LOGNAME: ab8992 -PBS_O_MAIL: /var/spool/mail/ab8992 -PBS_O_PATH: /home/149/ab8992/tools/topogtools:/home/149/ab8992/tools/access-om2/tools:/g/data3/hh5/public/apps/miniconda3/envs/analysis3-22.04/bin:/g/data3/hh5/public/apps/miniconda3/condabin:/apps/ncview/2.1.7/bin:/home/149/ab8992/.local/bin:/home/149/ab8992/bin:/opt/pbs/default/bin:/opt/nci/bin:/opt/bin:/opt/Modules/v4.3.0/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin -PBS_O_QUEUE: normal -PBS_O_SHELL: /bin/bash -PBS_O_SYSTEM: Linux -PBS_O_TZ: :/etc/localtime -PBS_O_WORKDIR: /home/149/ab8992/libraries/gippsland_rundir -PBS_QUEUE: normal-exec -PBS_TASKNUM: '1' -PBS_VMEM: '412316860416' -PROJECT: x77 -SHELL: /opt/bin/nfsh -TMPDIR: /jobfs/57505323.gadi-pbs -USER: ab8992 -VT_MAX_FLUSHES: '0' -VT_PFORM_LDIR: /jobfs/57505323.gadi-pbs -_LMFILES_: /apps/Modules/modulefiles/openmpi/4.1.2:/opt/Modules/modulefiles/pbs -_LMFILES__modshare: /apps/Modules/modulefiles/openmpi/4.1.2:1:/opt/Modules/modulefiles/pbs:1 diff --git a/regional_mom6/default_rundir/era5_surface/job.yaml b/regional_mom6/default_rundir/era5_surface/job.yaml deleted file mode 100755 index 788f8c53..00000000 --- a/regional_mom6/default_rundir/era5_surface/job.yaml +++ /dev/null @@ -1,9 +0,0 @@ -PAYU_CONTROL_DIR: /home/149/ab8992/libraries/gippsland_rundir -PAYU_CURRENT_RUN: 3 -PAYU_FINISH_TIME: '2022-09-09T14:20:28.453581' -PAYU_JOB_STATUS: 1 -PAYU_N_RUNS: 1 -PAYU_PATH: /g/data3/hh5/public/apps/miniconda3/envs/analysis3-22.04/bin -PAYU_RUN_ID: 39390be2ad0c5ac30dbc2ffef615c954ab984620 -PAYU_START_TIME: '2022-09-09T14:03:22.114145' -PAYU_WALLTIME: 1026.339436 s diff --git a/regional_mom6/default_rundir/jra_surface/MOM_input b/regional_mom6/default_rundir/jra_surface/MOM_input deleted file mode 100755 index ead7171a..00000000 --- a/regional_mom6/default_rundir/jra_surface/MOM_input +++ /dev/null @@ -1,287 +0,0 @@ -! modified from OM4_025.JRA and ESMG's Arctic5 - -! === module MOM === -USE_REGRIDDING = True -! diffuse interface heights with KHTH -THICKNESSDIFFUSE = False -! do thickness diffusion before dynamics -THICKNESSDIFFUSE_FIRST = True -! baroclinic timestep -DT = 900.0 -!DT = 360.0 - -! thermodynamic and tracer advection timestep -!DT_THERM = 3600.0 -DT_THERM = 1800.0 -!DT_THERM = 900.0 -! thermo timesteps can be longer than coupling timestep -THERMO_SPANS_COUPLING = True -! form frazil ice (accumulated heat deficit is returned -! in the surface state) -FRAZIL = True - -! limit salinity to positive values -BOUND_SALINITY = True -! heat capacity of seawater -C_P = 3992.0 - -! check for excessive SSH, SST and SSS -CHECK_BAD_SURFACE_VALS = True - -! don't write geometry/vertical grid files -WRITE_GEOM = 1 - -! for debug: save initial conditions -SAVE_INITIAL_CONDS = True -RESTART_CHECKSUMS_REQUIRED = False - -! === module MOM_domains === -NIGLOBAL = 210 -NJGLOBAL = 271 - -LAYOUT = 10,10 -IO_LAYOUT = 1,1 - -MASKTABLE = "mask_table.2.10x10" - -! === module MOM_verticalGrid === -NK = 75 - -! === module MOM_fixed_initialization === -INPUTDIR = "INPUT" - -DEPRESS_INITIAL_SURFACE = True -SURFACE_HEIGHT_IC_FILE = "forcing/init_eta.nc" -SURFACE_HEIGHT_IC_VAR = "eta_t" - -VELOCITY_CONFIG = "file" -VELOCITY_FILE = "forcing/init_vel.nc" - -! === module MOM_grid_init === -GRID_CONFIG = "mosaic" -GRID_FILE = "hgrid.nc" -TOPO_CONFIG = "file" -TOPO_FILE = "topog.nc" - -REENTRANT_X = False - -MINIMUM_DEPTH = 9.5 -MAXIMUM_DEPTH = 6000.0 - -! === module MOM_open_boundary === -OBC_NUMBER_OF_SEGMENTS = 4 -OBC_FREESLIP_VORTICITY = True -OBC_FREESLIP_STRAIN = True -#OBC_COMPUTED_VORTICITY = True -OBC_ZERO_BIHARMONIC = True -!RAMP_OBCS = True -BRUSHCUTTER_MODE = True ! read data on supergrid - -! segment 1: southern boundary -OBC_SEGMENT_001 = "J=0,I=0:N,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_001_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_001_DATA = "U=file:forcing/forcing_obc_segment_001.nc(u),V=file:forcing/forcing_obc_segment_001.nc(v),SSH=file:forcing/forcing_obc_segment_001.nc(eta),TEMP=file:forcing/forcing_obc_segment_001.nc(temp),SALT=file:forcing/forcing_obc_segment_001.nc(salt)" - -! segment 2: northern boundary -OBC_SEGMENT_002 = "J=N,I=N:0,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_002_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_002_DATA = "U=file:forcing/forcing_obc_segment_002.nc(u),V=file:forcing/forcing_obc_segment_002.nc(v),SSH=file:forcing/forcing_obc_segment_002.nc(eta),TEMP=file:forcing/forcing_obc_segment_002.nc(temp),SALT=file:forcing/forcing_obc_segment_002.nc(salt)" - -! segment 3: western boundary -OBC_SEGMENT_003 = "I=0,J=N:0,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_003_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_003_DATA = "U=file:forcing/forcing_obc_segment_003.nc(u),V=file:forcing/forcing_obc_segment_003.nc(v),SSH=file:forcing/forcing_obc_segment_003.nc(eta),TEMP=file:forcing/forcing_obc_segment_003.nc(temp),SALT=file:forcing/forcing_obc_segment_003.nc(salt)" - -! segment 4: eastern boundary -OBC_SEGMENT_004 = "I=N,J=0:N,FLATHER,ORLANSKI,NUDGED" -OBC_SEGMENT_004_VELOCITY_NUDGING_TIMESCALES = .3, 360.0 ! inflow and outflow timescales -OBC_SEGMENT_004_DATA = "U=file:forcing/forcing_obc_segment_004.nc(u),V=file:forcing/forcing_obc_segment_004.nc(v),SSH=file:forcing/forcing_obc_segment_004.nc(eta),TEMP=file:forcing/forcing_obc_segment_004.nc(temp),SALT=file:forcing/forcing_obc_segment_004.nc(salt)" - -OBC_TRACER_RESERVOIR_LENGTH_SCALE_OUT = 30000 -OBC_TRACER_RESERVOIR_LENGTH_SCALE_IN = 3000 - -! sponges -SPONGE = False - -! === module MOM_coord_initialization === -! don't define layers in ALE mode -COORD_CONFIG = "ALE" - -REGRIDDING_COORDINATE_MODE = "ZSTAR" -! use high-order scheme at boundary cells for remapping, -! instead of just piecewise-constant -BOUNDARY_EXTRAPOLATION = True - -! read target densities from file, set minimum interface depth -! from profile: minimum dz=2, 4000m total thickness, profile is dz^4.5 -ALE_COORDINATE_CONFIG = "FILE:vcoord.nc,interfaces=zi" - -REMAPPING_SCHEME = "PPM_H4" - -! === module MOM_state_initialization === -! initialise states from the nested Z-space file -INIT_LAYERS_FROM_Z_FILE = True -! if we've pre-interpolated the initial conditions, -! we only have to perform remapping -TEMP_SALT_INIT_VERTICAL_REMAP_ONLY = True - -! === module MOM_initialize_layers_from_Z === -! read "temp" and "salt" from a z-space file -TEMP_SALT_Z_INIT_FILE = "forcing/init_tracers.nc" -Z_INIT_FILE_PTEMP_VAR = "temp" -! remap straight to the model coordinate -Z_INIT_ALE_REMAPPING = True - -! === module MOM_set_visc === -CHANNEL_DRAG = True -! turbulent Prandtl number for shear instability -PRANDTL_TURB = 1.25 -HBBL = 10.0 -DRAG_BG_VEL = 0.1 -BBL_USE_EOS = True -BBL_THICK_MIN = 0.1 -KV = 1.0E-04 -KV_BBL_MIN = 0.0 -KV_TBL_MIN = 0.0 - -! === module MOM_continuity_PPM === -ETA_TOLERANCE = 1.0E-06 -ETA_TOLERANCE_AUX = 0.001 - -! === module MOM_CoriolisAdv === -CORIOLIS_SCHEME = "SADOURNY75_ENSTRO" -BOUND_CORIOLIS = True - -! === module MOM_PressureForce_AFV === -MASS_WEIGHT_IN_PRESSURE_GRADIENT = True - -! === module MOM_hor_visc === -LAPLACIAN = True -AH_VEL_SCALE = 0.01 -SMAGORINSKY_AH = True -SMAG_BI_CONST = 0.06 - -! === module MOM_vert_friction === -U_TRUNC_FILE = "U_velocity_truncations" -V_TRUNC_FILE = "V_velocity_truncations" -HMIX_FIXED = 0.5 -! maximum velocity before truncation -MAXVEL = 6.0 - -! === module MOM_barotropic === -BOUND_BT_CORRECTION = True -BT_PROJECT_VELOCITY = True -DYNAMIC_SURFACE_PRESSURE = True -BEBT = 0.2 -DTBT = -0.9 - -! === module MOM_thickness_diffuse === -! maximum value of local diffusive CFL ratio -! permitted for thickness diffusivity -KHTH_MAX_CFL = 0.1 - -! === module MOM_mixed_layer_restrat === -MIXEDLAYER_RESTRAT = True -! proportional coefficient to ratio of deformation radius -! to the dominant lengthscale of submesoscale mixed layer -! instabilities, times the minimum of the ratio of -! mesoscale EKE to large-scale geostrophic KE, or 1 + the -! square of the grid spacing over the deformation radius -FOX_KEMPER_ML_RESTRAT_COEF = 1.0 -! frontal-length scale used to calculate -! upscaling of buoyancy gradients -MLE_FRONT_LENGTH = 500.0 -MLE_USE_PBL_MLD = True -! 720 days -MLE_MLD_DECAY_TIME = 2.592E+06 - -! === module MOM_diabatic_driver === -ENERGETICS_SFC_PBL = True -EPBL_IS_ADDITIVE = False - -! === module MOM_set_diffusivity === -! add BBL mixing diffusivity, instead of taking maximum -BBL_MIXING_AS_MAX = False -! non-coord dependent BBL diffusivity -USE_LOTW_BBL_DIFFUSIVITY = True -! use estimate of Kd/TKE for arbitrary vertical coordinate -SIMPLE_TKE_TO_KD = True -! latitude-dependent scaling for near-surface background -! diffusivity -HENYEY_IGW_BACKGROUND = True -!N2_FLOOR_IOMEGA2 = 0.0 -KD = 1.5E-05 -KD_MIN = 2.0E-06 -KD_MAX = 0.1 -INT_TIDE_DISSIPATION = False -!INT_TIDE_PROFILE = "POLZIN_09" -!INT_TIDE_DECAY_SCALE = 300.3003003003003 -! topographic wavenumber, 2pi/10km -!KAPPA_ITIDES = 6.28319E-04 -!KAPPA_H2_FACTOR = 0.84 -! maximum internal tide energy source available -! to mix above the BBL -!TKE_ITIDE_MAX = 0.1 - -! === MOM_kappa_shear === -USE_JACKSON_PARAM = True -!MAX_RINO_INT = 25 - -! === module MOM_energetic_PBL === -EPBL_MSTAR_SCHEME = "OM4" -MSTAR = 0.0 -MIX_LEN_EXPONENT = 1.0 -MSTAR_CAP = 10.0 -MSTAR_CONV_ADJ = 0.667 -MSTAR2_COEF1 = 0.29 -MSTAR2_COEF2 = 0.152 -NSTAR = 0.06 -TKE_DECAY = 0.01 -ML_OMEGA_FRAC = 0.001 -USE_MLD_ITERATION = True -EPBL_TRANSITION_SCALE = 0.01 -USE_LA_LI2016 = True -EPBL_LANGMUIR_SCHEME = "ADDITIVE" -LT_ENHANCE_COEF = 0.044 -LT_ENHANCE_EXP = -1.5 -LT_MOD_LAC1 = 0.0 -LT_MOD_LAC4 = 0.0 -LT_MOD_LAC5 = 0.22 -!EPBL_USTAR_MIN = 1.45842E-18 - -! === module MOM_trace_advect === -TRACER_ADVECTION_SCHEME = "PPM:H3" - -! === module MOM_tracer_hor_diff === -! ensure diffusive equivalent of CFL limit isn't -! violated -CHECK_DIFFUSIVE_CFL = True - -! === module ocean_model_init === -! time between saves of energies and other global -! integrals -TIMEUNIT = 86400 -ENERGYSAVEDAYS = 1.0 - -! === module MOM_surface_forcing === -! maximum surface pressure that can be exerted -! by atmosphere and floating sea-ice -MAX_P_SURF = 0.0 -CD_TIDES = 0.0018 -GUST_CONST = 0.0 -USE_RIGID_SEA_ICE = True -SEA_ICE_RIGID_MASS = 100.0 - -! === module MOM_sum_output === -MAXTRUNC = 100000 - -REPORT_UNUSED_PARAMS = True -!FATAL_UNUSED_PARAMS = True - -NUM_DIAG_COORDS = 1 -DIAG_COORDS = "z Z ZSTAR" -DIAG_COORD_DEF_Z = "FILE:vcoord.nc,interfaces=zi" -! drho (arg 5) is a bit magic and has a big impact on -! the tail of the coord... - -BAD_VAL_SST_MIN = -3.0 diff --git a/regional_mom6/default_rundir/jra_surface/MOM_override b/regional_mom6/default_rundir/jra_surface/MOM_override deleted file mode 100644 index b4be647e..00000000 --- a/regional_mom6/default_rundir/jra_surface/MOM_override +++ /dev/null @@ -1,7 +0,0 @@ -#override OBC_SEGMENT_001_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales -#override OBC_SEGMENT_001_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales -#override OBC_SEGMENT_003_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales -#override OBC_SEGMENT_004_VELOCITY_NUDGING_TIMESCALES = .3, 300.0 ! inflow and outflow timescales - -#override DT = 300 -#override DT_THERM = 600 \ No newline at end of file diff --git a/regional_mom6/default_rundir/jra_surface/README.md b/regional_mom6/default_rundir/jra_surface/README.md deleted file mode 100755 index 6941c9c7..00000000 --- a/regional_mom6/default_rundir/jra_surface/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# mom6-eac -MOM6-SIS2 model configuration for the East Australian Current region. - -The domain limits are the Coral and Tasman seas, as far south as Tasmania, as far north as PNG, as far east as NZ: - - latitude: 48S to 6S - - longitude: 144E to 176E diff --git a/regional_mom6/default_rundir/jra_surface/SIS_input b/regional_mom6/default_rundir/jra_surface/SIS_input deleted file mode 100755 index 37231a83..00000000 --- a/regional_mom6/default_rundir/jra_surface/SIS_input +++ /dev/null @@ -1,66 +0,0 @@ -CGRID_ICE_DYNAMICS = True -DT_ICE_DYNAMICS = 180.0 -! fixed bulk salinity of sea ice -ICE_BULK_SALINITY = 0.0 -! salinity of sea ice as fraction of salinity -! of sea water from which it formed -ICE_RELATIVE_SALINITY = 0.1 -! cosine of solar zenith angle for first radiation step -CONSTANT_COSZEN_IC = 0.0 -! don't call iceberg module -DO_ICEBERGS = False -! time between writes of global ice diags and conservation -ICE_STATS_INTERVAL = 0.25 - -NIGLOBAL = 80 -NJGLOBAL = 129 -LAYOUT = 10,10 -MASKTABLE = "mask_table.18.10x10" - -GRID_CONFIG = "mosaic" -GRID_FILE = "hgrid.nc" -INPUTDIR = "INPUT" - -TOPO_FILE = "topog.nc" - -MAXIMUM_DEPTH = 6000.0 - -WRITE_GEOM = 0 - -! rotation rate of earth -OMEGA = 7.292E-05 - -! tuning params for radiative properties -ICE_DELTA_EDD_R_ICE = 1.0 -ICE_DELTA_EDD_R_SNOW = 1.0 -ICE_DELTA_EDD_R_POND = 1.0 - -CP_ICE = 2100.0 -CP_SEAWATER = 3992.0 -CP_BRINE = 3992.0 - -! subcycling timestep for rheology -DT_RHEOLOGY = 50.0 - -U_TRUNC_FILE = "SIS_U_truncations" -V_TRUNC_FILE = "SIS_V_truncations" - -SIS_THICKNESS_ADVECTION_SCHEME = "PCM" -SIS_CONTINUITY_SCHEME = "PCM" - -! use previous calculations of ice-top surface -! skin temp for tsurf -EULERIAN_TSURF = True -! redistribute after advection -RECATEGORIZE_ICE = True - -SIS_TRACER_ADVECTION_SCHEME = "PPM:H3" - -MAXTRUNC = 200 -DOCUMENT_FILE = "SIS_parameter_doc" - -REPORT_UNUSED_PARAMS = True -FATAL_UNUSED_PARAMS = True - -! from overrides: -ADD_DIURNAL_SW = False diff --git a/regional_mom6/default_rundir/jra_surface/config.yaml b/regional_mom6/default_rundir/jra_surface/config.yaml deleted file mode 100755 index a6b79176..00000000 --- a/regional_mom6/default_rundir/jra_surface/config.yaml +++ /dev/null @@ -1,29 +0,0 @@ -project: x77 -queue: normal -walltime: 02:00:00 -jobname: mom6_GIPPSLAND -ncpus: 82 -jobfs: 10GB - -shortpath: /scratch/x77 - -model: mom6 -input: - - /scratch/v45/ab8992/mom6/regional_configs/gippsland -# - /g/data/ua8/JRA55-do/RYF/v1-3/ - - /g/data/ik11/inputs/JRA-55/RYF/v1-3/ -# release exe -exe: /g/data/x77/ahg157/exes/MOM6_SIS2/symmetric_FMS2-e7d09b7 -# debug exe -#exe: /g/data/x77/ahg157/exes/MOM6_SIS2/symmetric_FMS2-9bc3419a - -collate: false -#runlog: true -storage: - gdata: - - ua8 - - x77 - - ik11 - -mpi: - module: openmpi/4.1.2 diff --git a/regional_mom6/default_rundir/jra_surface/diag_table b/regional_mom6/default_rundir/jra_surface/diag_table deleted file mode 100755 index d6d95b72..00000000 --- a/regional_mom6/default_rundir/jra_surface/diag_table +++ /dev/null @@ -1,90 +0,0 @@ -eac -1991 1 1 0 0 0 - -"ocean_daily", 1, "days", 1, "days", "time" -"ocean_month", 1, "months", 1, "days", "time" -"ocean_month_z", 1, "months", 1, "days", "time" -# "ocean_month_rho2", 1, "months", 1, "days", "time" -"ocean_static", -1, "months", 1, "days", "time" # ocean_static is a protected name. Do not change this line. -"ice_daily", 1, "days", 1, "days", "time" -"ice_month", 1, "months", 1, "days", "time" - -# Ocean grid-cell volume -"ocean_model_z", "volcello", "volcello", "ocean_month_z", "all", "mean", "none",2 -# "ocean_model_rho2", "volcello", "volcello", "ocean_month_rho2", "all", "mean", "none",2 - -# Sea surface height above geoid -"ocean_model", "zos", "zos", "ocean_daily", "all", "mean", "none",2 -# Sea Surface Temperature -"ocean_model", "tos", "tos", "ocean_daily", "all", "mean", "none",2 -# Sea Surface Salinity -"ocean_model", "sos", "sos", "ocean_daily", "all", "mean", "none",2 -# Sea Water Potential Temperature at Sea Floor -"ocean_model", "tob", "tob", "ocean_daily", "all", "mean", "none",2 -# Sea Water Salinity at Sea Floor -"ocean_model", "sob", "sob", "ocean_daily", "all", "mean", "none",2 -# Mixed layer depth (delta rho = 0.03) -"ocean_model", "mlotst", "mlotst", "ocean_daily", "all", "mean", "none",2 -# Sea Surface Speed -"ocean_model", "speed", "speed", "ocean_daily", "all", "mean", "none",2 - -# (umo,vmo) =net mass transport from residual mean velocity (model resolved + SGS) -# "ocean_model_rho2","umo", "umo", "ocean_month_rho2", "all", "mean", "none",2 -# "ocean_model_rho2","vmo", "vmo", "ocean_month_rho2", "all", "mean", "none",2 -# "ocean_model_rho2", "h", "hmo", "ocean_month_rho2", "all", "mean", "none", 2 - -# Zonal/Meridional velocity -"ocean_model_z","uo", "uo", "ocean_month_z", "all", "mean", "none",2 -"ocean_model_z","vo", "vo", "ocean_month_z", "all", "mean", "none",2 -# Potential Temperature -"ocean_model_z", "thetao", "thetao", "ocean_month_z", "all", "mean", "none",2 # if use pre-TEOS10 -# Salinity -"ocean_model_z", "so", "so", "ocean_month_z", "all", "mean", "none",2 -# Potential Density referenced to 2000 dbar -"ocean_model_z", "rhopot2", "rhopot2", "ocean_month_z", "all", "mean", "none", 2 - -# Ocean Mass X/Y Transport Vertical Sum -"ocean_model", "umo_2d", "umo_2d", "ocean_month", "all", "mean", "none",2 -"ocean_model", "vmo_2d", "vmo_2d", "ocean_month", "all", "mean", "none",2 - -# Zonal/Meridional surface stress from ocean interactions with atmos and ice -"ocean_model", "tauuo", "tauuo", "ocean_month", "all", "mean", "none",2 -"ocean_model", "tauvo", "tauvo", "ocean_month", "all", "mean", "none",2 -# Surface ocean heat flux from SW+LW+lat+sens+mass transfer+frazil+restore+seaice_melt_heat or flux adjustments -"ocean_model", "hfds", "hfds", "ocean_month", "all", "mean", "none",2 -# Net surface water flux (precip+melt+lrunoff+ice calving-evap) -"ocean_model", "wfo", "wfo", "ocean_month", "all", "mean", "none",2 -"ocean_model", "friver", "friver", "ocean_month", "all", "mean", "none",2 - -# Surface area of tracer (T) cells -"ocean_model", "areacello", "areacello", "ocean_static", "all", "none", "none", 2 -# Depth of the ocean at tracer points -"ocean_model", "deptho", "deptho", "ocean_static", "all", "none", "none", 2 -"ocean_model", "Coriolis", "Coriolis", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolon", "geolon", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolat", "geolat", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolon_c", "geolon_c", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolat_c", "geolat_c", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolon_u", "geolon_u", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolat_u", "geolat_u", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolon_v", "geolon_v", "ocean_static", "all", "none", "none", 2 -"ocean_model", "geolat_v", "geolat_v", "ocean_static", "all", "none", "none", 2 -"ocean_model", "wet", "wet", "ocean_static", "all", "none", "none", 2 -"ocean_model", "wet_c", "wet_c", "ocean_static", "all", "none", "none", 2 -"ocean_model", "wet_u", "wet_u", "ocean_static", "all", "none", "none", 2 -"ocean_model", "wet_v", "wet_v", "ocean_static", "all", "none", "none", 2 -"ocean_model", "dxt", "dxt", "ocean_static", "all", "none", "none", 2 -"ocean_model", "dyt", "dyt", "ocean_static", "all", "none", "none", 2 -"ocean_model", "dxCu", "dxCu", "ocean_static", "all", "none", "none", 2 -"ocean_model", "dyCu", "dyCu", "ocean_static", "all", "none", "none", 2 -"ocean_model", "dxCv", "dxCv", "ocean_static", "all", "none", "none", 2 -"ocean_model", "dyCv", "dyCv", "ocean_static", "all", "none", "none", 2 -"ocean_model", "areacello_cu","areacello_cu","ocean_static", "all", "none", "none", 2 -"ocean_model", "areacello_cv","areacello_cv","ocean_static", "all", "none", "none", 2 -"ocean_model", "areacello_bu","areacello_bu","ocean_static", "all", "none", "none", 2 - - -"ice_model", "siconc", "siconc", "ice_month", "all", "mean", "none", 2 -"ice_model", "siconc", "siconc", "ice_daily", "all", "mean", "none", 2 -"ice_model", "sithick", "sithick", "ice_month", "all", "mean", "none", 2 -"ice_model", "sithick", "sithick", "ice_daily", "all", "mean", "none", 2 diff --git a/regional_mom6/default_rundir/jra_surface/env.yaml b/regional_mom6/default_rundir/jra_surface/env.yaml deleted file mode 100755 index dfe1ea31..00000000 --- a/regional_mom6/default_rundir/jra_surface/env.yaml +++ /dev/null @@ -1,93 +0,0 @@ -CPATH: /apps/openmpi/4.1.2/include -CPATH_modshare: /apps/openmpi/4.1.2/include:1 -CPLUS_INCLUDE_PATH: /apps/openmpi/4.1.2/include -CPLUS_INCLUDE_PATH_modshare: /apps/openmpi/4.1.2/include:1 -C_INCLUDE_PATH: /apps/openmpi/4.1.2/include -C_INCLUDE_PATH_modshare: /apps/openmpi/4.1.2/include:1 -ENVIRONMENT: BATCH -FPATH: /apps/openmpi/4.1.2/include -FPATH_modshare: /apps/openmpi/4.1.2/include:1 -GIT_CONFIG_NOGLOBAL: 'yes' -HCOLL_ENABLE_MCAST: '0' -HOME: /home/149/ab8992 -LC_CTYPE: C.UTF-8 -LD_LIBRARY_PATH: /apps/openmpi/4.1.2/lib:/apps/openmpi/4.1.2/lib/profilers -LD_LIBRARY_PATH_modshare: /apps/openmpi/4.1.2/lib:1:/apps/openmpi/4.1.2/lib/profilers:1 -LD_RUN_PATH: /apps/openmpi/4.1.2/lib:/apps/openmpi/4.1.2/lib/profilers -LD_RUN_PATH_modshare: /apps/openmpi/4.1.2/lib:1:/apps/openmpi/4.1.2/lib/profilers:1 -LIBRARY_PATH: /apps/openmpi/4.1.2/lib:/apps/openmpi/4.1.2/lib/profilers -LIBRARY_PATH_modshare: /apps/openmpi/4.1.2/lib:1:/apps/openmpi/4.1.2/lib/profilers:1 -LOADEDMODULES: openmpi/4.1.2:pbs -LOADEDMODULES_modshare: pbs:1:openmpi/4.1.2:1 -LOGNAME: ab8992 -MANPATH: /opt/pbs/default/share/man:/apps/openmpi/4.1.2/share/man -MANPATH_modshare: /apps/openmpi/4.1.2/share/man:1:/opt/pbs/default/share/man:1 -MODULEPATH: /g/data/hh5/public/modules:/etc/scl/modulefiles:/opt/Modules/modulefiles:/opt/Modules/v4.3.0/modulefiles:/apps/Modules/modulefiles -MODULESHOME: /opt/Modules/v4.3.0 -MODULES_CMD: /opt/Modules/v4.3.0/libexec/modulecmd.tcl -MODULES_LMCONFLICT: openmpi/4.1.2&mpi&lam&mpich&openmpi&intel-mpi&o/wrappers&o/yes-wrappers&o/use-wrappers&o/enable-wrappers&o/with-wrappers&o/no-wrappers&o/not-wrappers&o/disable-wrappers&o/without-wrappers&o/ld_library_path&o/yes-ld_library_path&o/use-ld_library_path&o/enable-ld_library_path&o/with-ld_library_path&o/no-ld_library_path&o/not-ld_library_path&o/disable-ld_library_path&o/without-ld_library_path&o/ld_run_path&o/yes-ld_run_path&o/use-ld_run_path&o/enable-ld_run_path&o/with-ld_run_path&o/no-ld_run_path&o/not-ld_run_path&o/disable-ld_run_path&o/without-ld_run_path&o/show-debug&o/yes-show-debug&o/use-show-debug&o/enable-show-debug&o/with-show-debug&o/no-show-debug&o/not-show-debug&o/disable-show-debug&o/without-show-debug&o/append-paths&o/yes-append-paths&o/use-append-paths&o/enable-append-paths&o/with-append-paths&o/no-append-paths&o/not-append-paths&o/disable-append-paths&o/without-append-paths&o/library_path&o/yes-library_path&o/use-library_path&o/enable-library_path&o/with-library_path&o/no-library_path&o/not-library_path&o/disable-library_path&o/without-library_path&o/packaged-envvars&o/yes-packaged-envvars&o/use-packaged-envvars&o/enable-packaged-envvars&o/with-packaged-envvars&o/no-packaged-envvars&o/not-packaged-envvars&o/disable-packaged-envvars&o/without-packaged-envvars -MODULES_LMCONFLICT_modshare: openmpi/4.1.2&mpi&lam&mpich&openmpi&intel-mpi&o/wrappers&o/yes-wrappers&o/use-wrappers&o/enable-wrappers&o/with-wrappers&o/no-wrappers&o/not-wrappers&o/disable-wrappers&o/without-wrappers&o/ld_library_path&o/yes-ld_library_path&o/use-ld_library_path&o/enable-ld_library_path&o/with-ld_library_path&o/no-ld_library_path&o/not-ld_library_path&o/disable-ld_library_path&o/without-ld_library_path&o/ld_run_path&o/yes-ld_run_path&o/use-ld_run_path&o/enable-ld_run_path&o/with-ld_run_path&o/no-ld_run_path&o/not-ld_run_path&o/disable-ld_run_path&o/without-ld_run_path&o/show-debug&o/yes-show-debug&o/use-show-debug&o/enable-show-debug&o/with-show-debug&o/no-show-debug&o/not-show-debug&o/disable-show-debug&o/without-show-debug&o/append-paths&o/yes-append-paths&o/use-append-paths&o/enable-append-paths&o/with-append-paths&o/no-append-paths&o/not-append-paths&o/disable-append-paths&o/without-append-paths&o/library_path&o/yes-library_path&o/use-library_path&o/enable-library_path&o/with-library_path&o/no-library_path&o/not-library_path&o/disable-library_path&o/without-library_path&o/packaged-envvars&o/yes-packaged-envvars&o/use-packaged-envvars&o/enable-packaged-envvars&o/with-packaged-envvars&o/no-packaged-envvars&o/not-packaged-envvars&o/disable-packaged-envvars&o/without-packaged-envvars:1 -MODULE_VERSION: v4.3.0 -MODULE_VERSION_STACK: v4.3.0 -NCPUS: '48' -OMPI_BASE: /apps/openmpi/4.1.2 -OMPI_MCA_orte_tmpdir_base: /jobfs/57505323.gadi-pbs -OMPI_ROOT: /apps/openmpi/4.1.2 -OMPI_VERSION: 4.1.2 -OMP_NUM_THREADS: '48' -OPENMPI_BASE: /apps/openmpi/4.1.2 -OPENMPI_ROOT: /apps/openmpi/4.1.2 -OPENMPI_VERSION: 4.1.2 -PATH: /apps/openmpi/wrapper/fortran:/apps/openmpi/wrapper:/apps/openmpi/4.1.2/bin:/bin:/usr/bin:/opt/pbs/default/bin -PATH_modshare: /apps/openmpi/4.1.2/bin:1:/bin:1:/apps/openmpi/wrapper/fortran:1:/usr/bin:1:/opt/pbs/default/bin:1:/apps/openmpi/wrapper:1 -PAYU_FORCE: 'True' -PAYU_PATH: /g/data3/hh5/public/apps/miniconda3/envs/analysis3-22.04/bin -PBS_ENVIRONMENT: PBS_BATCH -PBS_JOBCOOKIE: 4D421325409555406510687B28164628 -PBS_JOBDIR: /home/149/ab8992 -PBS_JOBFS: /jobfs/57505323.gadi-pbs -PBS_JOBID: 57505323.gadi-pbs -PBS_JOBNAME: mom6_GIPPSLAND -PBS_MOMPORT: '15003' -PBS_NCI_FS_GDATA1: '0' -PBS_NCI_FS_GDATA1A: '0' -PBS_NCI_FS_GDATA1B: '0' -PBS_NCI_FS_GDATA2: '0' -PBS_NCI_FS_GDATA3: '0' -PBS_NCI_FS_GDATA4: '0' -PBS_NCI_HT: '0' -PBS_NCI_IMAGE: '' -PBS_NCI_JOBFS: 10gb -PBS_NCI_LAUNCH_COMPATIBILITY: '0' -PBS_NCI_NCPUS_PER_NODE: '48' -PBS_NCI_NCPUS_PER_NUMA: '12' -PBS_NCI_NUMA_PER_NODE: '4' -PBS_NCI_STORAGE: gdata/hh5+gdata/ik11+gdata/x77+scratch/v45+scratch/x77+gdata/ua8 -PBS_NCI_WD: '1' -PBS_NCPUS: '96' -PBS_NGPUS: '0' -PBS_NNODES: '2' -PBS_NODEFILE: /local/spool/pbs/aux/57505323.gadi-pbs -PBS_NODENUM: '0' -PBS_O_HOME: /home/149/ab8992 -PBS_O_HOST: gadi-login-06.gadi.nci.org.au -PBS_O_LANG: en_AU.UTF-8 -PBS_O_LOGNAME: ab8992 -PBS_O_MAIL: /var/spool/mail/ab8992 -PBS_O_PATH: /home/149/ab8992/tools/topogtools:/home/149/ab8992/tools/access-om2/tools:/g/data3/hh5/public/apps/miniconda3/envs/analysis3-22.04/bin:/g/data3/hh5/public/apps/miniconda3/condabin:/apps/ncview/2.1.7/bin:/home/149/ab8992/.local/bin:/home/149/ab8992/bin:/opt/pbs/default/bin:/opt/nci/bin:/opt/bin:/opt/Modules/v4.3.0/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin -PBS_O_QUEUE: normal -PBS_O_SHELL: /bin/bash -PBS_O_SYSTEM: Linux -PBS_O_TZ: :/etc/localtime -PBS_O_WORKDIR: /home/149/ab8992/libraries/gippsland_rundir -PBS_QUEUE: normal-exec -PBS_TASKNUM: '1' -PBS_VMEM: '412316860416' -PROJECT: x77 -SHELL: /opt/bin/nfsh -TMPDIR: /jobfs/57505323.gadi-pbs -USER: ab8992 -VT_MAX_FLUSHES: '0' -VT_PFORM_LDIR: /jobfs/57505323.gadi-pbs -_LMFILES_: /apps/Modules/modulefiles/openmpi/4.1.2:/opt/Modules/modulefiles/pbs -_LMFILES__modshare: /apps/Modules/modulefiles/openmpi/4.1.2:1:/opt/Modules/modulefiles/pbs:1 diff --git a/regional_mom6/default_rundir/jra_surface/field_table b/regional_mom6/default_rundir/jra_surface/field_table deleted file mode 100755 index 54f36b3b..00000000 --- a/regional_mom6/default_rundir/jra_surface/field_table +++ /dev/null @@ -1,2 +0,0 @@ -"TRACER", "atmos_mod", "sphum" / -"TRACER", "land_mod", "sphum" / \ No newline at end of file diff --git a/regional_mom6/default_rundir/jra_surface/job.yaml b/regional_mom6/default_rundir/jra_surface/job.yaml deleted file mode 100755 index 788f8c53..00000000 --- a/regional_mom6/default_rundir/jra_surface/job.yaml +++ /dev/null @@ -1,9 +0,0 @@ -PAYU_CONTROL_DIR: /home/149/ab8992/libraries/gippsland_rundir -PAYU_CURRENT_RUN: 3 -PAYU_FINISH_TIME: '2022-09-09T14:20:28.453581' -PAYU_JOB_STATUS: 1 -PAYU_N_RUNS: 1 -PAYU_PATH: /g/data3/hh5/public/apps/miniconda3/envs/analysis3-22.04/bin -PAYU_RUN_ID: 39390be2ad0c5ac30dbc2ffef615c954ab984620 -PAYU_START_TIME: '2022-09-09T14:03:22.114145' -PAYU_WALLTIME: 1026.339436 s diff --git a/regional_mom6/regional_mom6.py b/regional_mom6/regional_mom6.py index a2c2913a..66473293 100644 --- a/regional_mom6/regional_mom6.py +++ b/regional_mom6/regional_mom6.py @@ -11,9 +11,13 @@ import netCDF4 from dask.distributed import Client, worker_client from dask.diagnostics import ProgressBar +import f90nml import datetime as dt import warnings +import shutil +import os from .utils import vecdot +import yaml warnings.filterwarnings("ignore") @@ -491,7 +495,7 @@ def __init__( self.vlayers = vlayers self.dz_ratio = dz_ratio self.depth = depth - self.toolpath = toolpath + self.toolpath = Path(toolpath) self.hgrid = self._make_hgrid(gridtype) self.vgrid = self._make_vgrid() self.gridtype = gridtype @@ -541,6 +545,7 @@ def _make_vgrid(self): """Generates a vertical grid based on the number of layers and vertical ratio specified at the class level. + The vertical profile uses a hyperbolic tangent function to smoothly transition the thickness of cells. If the `dz_ratio` is set to one, the vertical grid will be uniform, for `dz_ratio` = 10, the top layer will be 10 times thicker than the bottom layer, and for negative numbers the bottom layer will be thicker than the top """ thickness = dz(self.vlayers + 1, self.dz_ratio, self.depth) @@ -548,7 +553,7 @@ def _make_vgrid(self): { "zi": ("zi", np.cumsum(thickness)), "zl": ("zl", (np.cumsum(thickness) + 0.5 * thickness)[0:-1]), - } ## THIS MIGHT BE WRONG REVISIT + } ) vcoord["zi"].attrs = {"units": "meters"} vcoord.to_netcdf(self.mom_input_dir / "vcoord.nc") @@ -585,9 +590,11 @@ def ocean_forcing( ## pull out the initial velocity on MOM5's Bgrid ic_raw = xr.open_dataset(path / "ic_unprocessed") + if varnames["time"] in ic_raw.variables: + ic_raw = ic_raw.drop_vars("time") if varnames["time"] in ic_raw.dims: ic_raw = ic_raw.isel({varnames["time"]: 0}) - + print(ic_raw) ## Separate out tracers from two velocity fields of IC try: ic_raw_tracers = ic_raw[ @@ -1192,8 +1199,8 @@ def FRE_tools(self, layout): print( "MAKE SOLO MOSAIC", subprocess.run( - self.toolpath - + "make_solo_mosaic/make_solo_mosaic --num_tiles 1 --dir . --mosaic_name ocean_mosaic --tile_file hgrid.nc", + str(self.toolpath / "make_solo_mosaic/make_solo_mosaic") + + " --num_tiles 1 --dir . --mosaic_name ocean_mosaic --tile_file hgrid.nc", shell=True, cwd=self.mom_input_dir, ), @@ -1203,8 +1210,8 @@ def FRE_tools(self, layout): print( "QUICK MOSAIC", subprocess.run( - self.toolpath - + "make_quick_mosaic/make_quick_mosaic --input_mosaic ocean_mosaic.nc --mosaic_name grid_spec --ocean_topog topog.nc", + str(self.toolpath / "make_quick_mosaic/make_quick_mosaic") + + " --input_mosaic ocean_mosaic.nc --mosaic_name grid_spec --ocean_topog topog.nc", shell=True, cwd=self.mom_input_dir, ), @@ -1214,14 +1221,246 @@ def FRE_tools(self, layout): print( "CHECK MASK", subprocess.run( - self.toolpath - + f"check_mask/check_mask --grid_file ocean_mosaic.nc --ocean_topog topog.nc --layout {layout[0]},{layout[1]} --halo 4", + str(self.toolpath / "check_mask/check_mask") + + f" --grid_file ocean_mosaic.nc --ocean_topog topog.nc --layout {layout[0]},{layout[1]} --halo 4", shell=True, cwd=self.mom_input_dir, ), ) self.layout = layout + def setup_run_directory( + self, surface_forcing=False, using_payu=False, overwrite=False + ): + """Sets up the run directory for MOM6. Either copies a pre-made set of files, or modifies existing files in the `rundir` directory for the experiment. + + Args: + surface_forcing (Optional[str,bool]): Specify the choice of surface forcing, one of `jra` or `era5`. If left blank, constant fluxes will be used. + using_payu (Optional[bool]): Whether or not to use payu to run the model. If True, a payu configuration file will be created. + overwrite (Optional[bool]): Whether or not to overwrite existing files in the run directory. If False, will only modify the `MOM_layout` file and not re-copy across the rest of the default files. + """ + + # Define the locations of the directories we'll copy files across from. Base contains most of the files, and overwrite replaces files in the base directory. + base_run_dir = ( + Path(__file__).parent.parent ## Path to where the demos are stored + / "demos" + / "premade_run_directories" + / "common_files" + ) + if surface_forcing != False: + overwrite_run_dir = ( + Path(__file__).parent.parent + / "demos" + / "premade_run_directories" + / f"{surface_forcing}_surface" + ) + print(overwrite_run_dir) + if not overwrite_run_dir.exists(): + raise ValueError( + f"Surface forcing {surface_forcing} not available. Please choose from {str(os.listdir(base_run_dir.parent))}." ##Here print all available run directories + ) + else: + overwrite_run_dir = False + + # 3 different cases to handle: + # 1. User is creating a new run directory from scratch. Here we copy across all files and modify. + # 2. User has already created a run directory, and wants to modify it. Here we only modify the MOM_layout file. + # 3. User has already created a run directory, and wants to overwrite it. Here we copy across all files and modify. This requires overwrite = True + + if not overwrite: + for file in base_run_dir.glob( + "*" + ): ## copy each file individually if it doesn't already exist OR overwrite = True + if not os.path.exists(self.mom_run_dir / file.name): + ## Check whether this file exists in an override directory or not + if ( + overwrite_run_dir != False + and (overwrite_run_dir / file.name).exists() + ): + shutil.copy(overwrite_run_dir / file.name, self.mom_run_dir) + else: + shutil.copy(base_run_dir / file, self.mom_run_dir) + else: + shutil.copytree(base_run_dir, self.mom_run_dir, dirs_exist_ok=True) + if overwrite_run_dir != False: + shutil.copy(base_run_dir / file, self.mom_run_dir) + + ## Make symlinks between run and input directories + inputdir_in_rundir = self.mom_run_dir / "inputdir" + rundir_in_inputdir = self.mom_input_dir / "rundir" + + inputdir_in_rundir.unlink(missing_ok=True) + inputdir_in_rundir.symlink_to(self.mom_input_dir) + + rundir_in_inputdir.unlink(missing_ok=True) + rundir_in_inputdir.symlink_to(self.mom_run_dir) + + # TODO Modify below here to reimplement with separate layout file + + ## Get mask table information + mask_table = None + for p in self.mom_input_dir.glob("mask_table.*"): + if mask_table != None: + print( + f"WARNING: Multiple mask tables found. Defaulting to {mask_table}. If this is not what you want, remove it from the run directory and try again." + ) + break + + _, masked, layout = p.name.split(".") + mask_table = p.name + x, y = (int(v) for v in layout.split("x")) + ncpus = (x * y) - int(masked) + if mask_table == None: + print( + "No mask table found! This suggests your domain is mostly water, so there are no `non compute` cells that are entirely land. If this doesn't seem right, ensure you've already run .FRE_tools()." + ) + if not hasattr(self, "layout"): + raise AttributeError( + "No layout information found. This suggests you haven't run .FRE_tools() yet. Please do so first so I know how many processors you'd like to use." + ) + ncpus = self.layout[0] * self.layout[1] + print("Number of CPUs required: ", ncpus) + + ## Modify the input namelists to give the correct layouts + # TODO Re-implement with package that works for this file type? or at least tidy up code + with open(self.mom_run_dir / "MOM_layout", "r") as file: + lines = file.readlines() + for jj in range(len(lines)): + if "MASKTABLE" in lines[jj]: + if mask_table != None: + lines[jj] = f'MASKTABLE = "{mask_table}"\n' + else: + lines[jj] = "# MASKTABLE = no mask table" + if "LAYOUT =" in lines[jj] and "IO" not in lines[jj]: + lines[jj] = f"LAYOUT = {self.layout[1]},{self.layout[0]}\n" + + if "NIGLOBAL" in lines[jj]: + lines[jj] = f"NIGLOBAL = {self.hgrid.nx.shape[0]//2}\n" + + if "NJGLOBAL" in lines[jj]: + lines[jj] = f"NJGLOBAL = {self.hgrid.ny.shape[0]//2}\n" + + with open(self.mom_run_dir / "MOM_layout", "w") as f: + f.writelines(lines) + + ## If using payu to run the model, create a payu configuration file + if not using_payu and os.path.exists(f"{self.mom_run_dir}/config.yaml"): + os.remove(f"{self.mom_run_dir}/config.yaml") + + else: + with open(f"{self.mom_run_dir}/config.yaml", "r") as file: + lines = file.readlines() + + inputfile = open(f"{self.mom_run_dir}/config.yaml", "r") + lines = inputfile.readlines() + inputfile.close() + for i in range(len(lines)): + if "ncpus" in lines[i]: + lines[i] = f"ncpus: {str(ncpus)}\n" + if "jobname" in lines[i]: + lines[i] = f"jobname: mom6_{self.mom_input_dir.name}\n" + + if "input:" in lines[i]: + lines[i + 1] = f" - {self.mom_input_dir}\n" + + with open(f"{self.mom_run_dir}/config.yaml", "w") as file: + file.writelines(lines) + + # Modify input.nml + nml = f90nml.read(self.mom_run_dir / "input.nml") + nml["coupler_nml"]["current_date"] = [ + self.daterange[0].year, + self.daterange[0].month, + self.daterange[0].day, + 0, + 0, + 0, + ] + nml.write(self.mom_run_dir / "input.nml", force=True) + return + + def setup_era5(self, era5_path): + """ + Sets up the ERA5 forcing files for your experiment. This assumes that you'd downloaded all of the ERA5 data in your daterange. + You'll need the following fields: + 2t, 10u, 10v, sp, 2d + + + Args: + era5_path (str): Path to the ERA5 forcing files. Specifically, the single level reanalysis product. Eg `SOMEPATH/era5/single-levels/reanalysis` + + """ + + ## Firstly just open all raw data + rawdata = {} + for fname, vname in zip( + ["2t", "10u", "10v", "sp", "2d"], ["t2m", "u10", "v10", "sp", "d2m"] + ): + ## Load data from all relevant years + datasets = [] + years = [ + i for i in range(self.daterange[0].year, self.daterange[1].year + 1) + ] + # Loop through each year and read the corresponding files + for year in years: + ds = xr.open_mfdataset( + f"{era5_path}/{fname}/{year}/{fname}*", + decode_times=False, + chunks={"longitude": 100, "latitude": 100}, + ) + datasets.append(ds) + + combined_ds = xr.concat(datasets, dim="time") + + ## Cut out this variable to our domain size + rawdata[fname] = nicer_slicer( + combined_ds, + self.xextent, + "longitude", + ).sel( + latitude=slice( + self.yextent[1], self.yextent[0] + ) ## This is because ERA5 has latitude in decreasing order (??) + ) + + ## Now fix up the latitude and time dimensions + + rawdata[fname] = ( + rawdata[fname] + .isel(latitude=slice(None, None, -1)) ## Flip latitude + .assign_coords( + time=np.arange( + 0, rawdata[fname].time.shape[0], dtype=float + ) ## Set the zero date of forcing to start of run + ) + ) + + rawdata[fname].time.attrs = { + "calendar": "julian", + "units": f"hours since {self.daterange[0].strftime('%Y-%m-%d %H:%M:%S')}", + } ## Fix up calendar to match + + if fname == "2d": + ## Calculate specific humidity from dewpoint temperature + dewpoint = 8.07131 - 1730.63 / (233.426 + rawdata["2d"]["d2m"] - 273.15) + humidity = ( + (0.622 / rawdata["sp"]["sp"]) * (10**dewpoint) * 101325 / 760 + ) + q = xr.Dataset(data_vars={"q": humidity}) + + q.q.attrs = {"long_name": "Specific Humidity", "units": "kg/kg"} + q.to_netcdf( + f"{self.mom_input_dir}/forcing/q_ERA5.nc", + unlimited_dims="time", + encoding={"q": {"dtype": "double"}}, + ) + else: + rawdata[fname].to_netcdf( + f"{self.mom_input_dir}/forcing/{fname}_ERA5.nc", + unlimited_dims="time", + encoding={vname: {"dtype": "double"}}, + ) + class segment: """Class to turn raw boundary segment data into MOM6 boundary @@ -1488,7 +1727,6 @@ def brushcut(self, ryf=False): segment_out.time.attrs = { "calendar": "julian", "units": f"{self.time_units} since {self.startdate}", - "modulo": " ", } # Dictionary we built for encoding the netcdf at end encoding_dict = { @@ -1600,10 +1838,11 @@ def brushcut(self, ryf=False): hgrid_seg.y.data, ) + # If repeat year forcing, add modulo coordinate + if ryf: + segment_out["time"] = segment_out["time"].assign_attrs({"modulo": " "}) + with ProgressBar(): - segment_out["time"] = segment_out["time"].assign_attrs( - {"modulo": " "} - ) ## Add modulo attribute for MOM6 to treat as repeat forcing segment_out.load().to_netcdf( self.outfolder / f"forcing/forcing_obc_{self.seg_name}.nc", encoding=encoding_dict,