diff --git a/demos/model-forced.ipynb b/demos/access_om2-forced.ipynb similarity index 97% rename from demos/model-forced.ipynb rename to demos/access_om2-forced.ipynb index bb468940..1e736660 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,14 @@ } ], "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", - "\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", + "## To simply use Ashley's version of this package, uncomment the following:\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 os\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" @@ -440,13 +438,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 +461,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 +471,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 +513,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 +535,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 +549,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 +711,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 +760,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 +771,6 @@ "metadata": {}, "outputs": [], "source": [ - "## FOR ACCESS OM2: \n", "expt.ocean_forcing(\n", " tmpdir, ## Path to ocean foring files\n", " {\"time\":\"time\",\n", @@ -815,7 +812,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 +830,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/regional_mom6/default_rundir/era5_surface/MOM_input b/demos/premade_run_directories/era5_surface/MOM_input similarity index 100% rename from regional_mom6/default_rundir/era5_surface/MOM_input rename to demos/premade_run_directories/era5_surface/MOM_input diff --git a/regional_mom6/default_rundir/era5_surface/MOM_override b/demos/premade_run_directories/era5_surface/MOM_override similarity index 100% rename from regional_mom6/default_rundir/era5_surface/MOM_override rename to demos/premade_run_directories/era5_surface/MOM_override diff --git a/regional_mom6/default_rundir/era5_surface/README.md b/demos/premade_run_directories/era5_surface/README.md similarity index 100% rename from regional_mom6/default_rundir/era5_surface/README.md rename to demos/premade_run_directories/era5_surface/README.md diff --git a/regional_mom6/default_rundir/era5_surface/SIS_input b/demos/premade_run_directories/era5_surface/SIS_input similarity index 100% rename from regional_mom6/default_rundir/era5_surface/SIS_input rename to demos/premade_run_directories/era5_surface/SIS_input diff --git a/regional_mom6/default_rundir/era5_surface/config.yaml b/demos/premade_run_directories/era5_surface/config.yaml similarity index 61% rename from regional_mom6/default_rundir/era5_surface/config.yaml rename to demos/premade_run_directories/era5_surface/config.yaml index a6b79176..1336703d 100755 --- a/regional_mom6/default_rundir/era5_surface/config.yaml +++ b/demos/premade_run_directories/era5_surface/config.yaml @@ -1,7 +1,9 @@ +## Example of a config.yaml file for using MOM6 with Payu + project: x77 queue: normal walltime: 02:00:00 -jobname: mom6_GIPPSLAND +jobname: mom6_regional ncpus: 82 jobfs: 10GB @@ -10,15 +12,10 @@ 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/demos/premade_run_directories/era5_surface/data_table b/demos/premade_run_directories/era5_surface/data_table new file mode 100755 index 00000000..e7bc87b1 --- /dev/null +++ b/demos/premade_run_directories/era5_surface/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/era5_surface/diag_table similarity index 100% rename from regional_mom6/default_rundir/era5_surface/diag_table rename to demos/premade_run_directories/era5_surface/diag_table diff --git a/regional_mom6/default_rundir/era5_surface/field_table b/demos/premade_run_directories/era5_surface/field_table similarity index 100% rename from regional_mom6/default_rundir/era5_surface/field_table rename to demos/premade_run_directories/era5_surface/field_table diff --git a/regional_mom6/default_rundir/era5_surface/input.nml b/demos/premade_run_directories/era5_surface/input.nml similarity index 100% rename from regional_mom6/default_rundir/era5_surface/input.nml rename to demos/premade_run_directories/era5_surface/input.nml diff --git a/regional_mom6/default_rundir/jra_surface/MOM_input b/demos/premade_run_directories/jra_surface/MOM_input similarity index 100% rename from regional_mom6/default_rundir/jra_surface/MOM_input rename to demos/premade_run_directories/jra_surface/MOM_input diff --git a/regional_mom6/default_rundir/jra_surface/MOM_override b/demos/premade_run_directories/jra_surface/MOM_override similarity index 100% rename from regional_mom6/default_rundir/jra_surface/MOM_override rename to demos/premade_run_directories/jra_surface/MOM_override diff --git a/regional_mom6/default_rundir/jra_surface/README.md b/demos/premade_run_directories/jra_surface/README.md similarity index 100% rename from regional_mom6/default_rundir/jra_surface/README.md rename to demos/premade_run_directories/jra_surface/README.md diff --git a/regional_mom6/default_rundir/jra_surface/SIS_input b/demos/premade_run_directories/jra_surface/SIS_input similarity index 100% rename from regional_mom6/default_rundir/jra_surface/SIS_input rename to demos/premade_run_directories/jra_surface/SIS_input diff --git a/regional_mom6/default_rundir/jra_surface/config.yaml b/demos/premade_run_directories/jra_surface/config.yaml similarity index 69% rename from regional_mom6/default_rundir/jra_surface/config.yaml rename to demos/premade_run_directories/jra_surface/config.yaml index a6b79176..f714f2cb 100755 --- a/regional_mom6/default_rundir/jra_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/regional_mom6/default_rundir/jra_surface/diag_table b/demos/premade_run_directories/jra_surface/diag_table similarity index 99% rename from regional_mom6/default_rundir/jra_surface/diag_table rename to demos/premade_run_directories/jra_surface/diag_table index d6d95b72..0c7d1212 100755 --- a/regional_mom6/default_rundir/jra_surface/diag_table +++ b/demos/premade_run_directories/jra_surface/diag_table @@ -1,5 +1,5 @@ -eac -1991 1 1 0 0 0 +regional_mom6 +1990 1 1 0 0 0 "ocean_daily", 1, "days", 1, "days", "time" "ocean_month", 1, "months", 1, "days", "time" diff --git a/regional_mom6/default_rundir/jra_surface/field_table b/demos/premade_run_directories/jra_surface/field_table similarity index 100% rename from regional_mom6/default_rundir/jra_surface/field_table rename to demos/premade_run_directories/jra_surface/field_table diff --git a/regional_mom6/default_rundir/jra_surface/input.nml b/demos/premade_run_directories/jra_surface/input.nml similarity index 100% rename from regional_mom6/default_rundir/jra_surface/input.nml rename to demos/premade_run_directories/jra_surface/input.nml diff --git a/demos/reanalysis-forced.ipynb b/demos/reanalysis-forced.ipynb index ec44edb2..d0f2d185 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", + "**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", + "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", - "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", - "\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", - "\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,18 @@ "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", + "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", - "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}$ " + "If you've pip-installed the package, you'll need to know where the `regional-mom6` code was copied to. Alternatively, just clone the repo somewhere else and pass the path to the method below. This allows it to find and modify the default input directory included with the package." ] }, { @@ -941,59 +312,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(\"PATH_TO_REGIONAL_MOM6_PACKAGE\",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 +347,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..1a56b489 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,8 @@ dependencies = [ "scipy>=1.2.0", "xarray", "xesmf>=0.8", + "ruamel.yaml>=0.18.0", + "f90nml>=1.4.1", ] [build-system] 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/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/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..95e532d8 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 +from ruamel.yaml import YAML warnings.filterwarnings("ignore") @@ -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") @@ -1222,6 +1227,176 @@ def FRE_tools(self, layout): ) self.layout = layout + def setup_run_directory(self, demo_run_dir=False, using_payu=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: + demo_run_dir (Optional[str,bool]): Choose whether or not to load a premade run directory. If yes, choose one of ``era5`` or ``jra`` corresponding to the choices of surface forcing. + using_payu (Optional[bool]): Whether or not to use payu to run the model. If True, a payu configuration file will be created. + """ + + ## Copy the default directory to the run directory + if demo_run_dir != False: + rundir_src = ( + Path(__file__).parent.parent + / "demos" + / "premade_run_directories" + / f"{demo_run_dir}" + ) + else: + print( + "Setting up run directory without using a premade template. Will attempt to modify files in existing run directory. At a minimum, you'll need `MOM_input`, `SIS_input` and `input.nml` files." + ) + shutil.copytree(rundir_src, self.mom_run_dir, dirs_exist_ok=True) + ## 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) + + ## 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 {p}. If this is not what you want, remove it from the run directory and try again." + ) + + _, 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()." + ) + ncpus = self.layout[0] * self.layout[1] + print("Number of CPUs required: ", ncpus) + + ## Modify the input namelists to give the correct layouts + for j in ["MOM_input", "SIS_input"]: + with open(self.mom_run_dir / j, "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 / j, "w") as f: + f.writelines(lines) + + ## If using payu to run the model, create a payu configuration file + config_yaml_file = self.mom_run_dir / "config.yaml" + if not using_payu: + config_yaml_file.unlink(missing_ok=True) + else: + yaml = YAML() # round-trip yaml parser + with open(config_yaml_file, "r") as f: + conf = yaml.load(f) + + conf["ncpus"] = ncpus + conf["jobname"] = f"mom6_{self.mom_input_dir.name}" + conf["input"].append(self.mom_input_dir) + + with open(config_yaml_file, "w") as f: + yaml.dump(conf, f) + + # 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) + + 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"] + ): + ## Cut out this variable to our domain size + rawdata[fname] = nicer_slicer( + xr.open_mfdataset( + f"{era5_path}/{fname}/{self.daterange[0].year}/{fname}*", + decode_times=False, + chunks={"longitude": 100, "latitude": 100}, + ), + 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", + unlimited_dims="time", + encoding={"q": {"dtype": "double"}}, + ) + else: + rawdata[fname].to_netcdf( + f"{self.mom_input_dir}/forcing/{fname}_ERA5", + unlimited_dims="time", + encoding={vname: {"dtype": "double"}}, + ) + class segment: """Class to turn raw boundary segment data into MOM6 boundary