{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Preparing Meteorological Inputs #\n",
"\n",
"This section shows a complete example of the current NetCDF-based meteorological workflow in `pycequeau`.\n",
"\n",
"The workflow assumes that the project already contains a `meteo/ERA` folder with prepared NetCDF files for the basin.\n",
"\n",
"1. create the `Basin` object\n",
"2. derive an additional meteorological variable when needed\n",
"3. load the NetCDF meteorological files\n",
"4. inspect missing values\n",
"5. interpolate the meteorological fields\n",
"6. construct the CEQUEAU meteorological grid\n",
"7. save the resulting NetCDF file\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from pycequeau.physiographic import Basin\n",
"from pycequeau.meteo import MeteoCalculator, NetCDFMeteo\n",
"from pycequeau.core.netcdf import intermidiate_interpolation"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Expected content of the ERA folder\n",
"\n",
"The `ERA` folder is expected to contain NetCDF files prepared for the basin, usually with one meteorological variable per file. The ERA folder should be located in the following path `path/to/your/project/meteo/ERA`\n",
"\n",
"The file names themselves do not matter. What matters for `pycequeau` is that each file contains a supported variable name and valid units metadata.\n",
"\n",
"For the current example project, the files in the folder look like this:\n",
"\n",
"| File name | Variable name | Units in this example | Other accepted units |\n",
"| --- | --- | --- | --- |\n",
"| `era5_10m-wind-speed_daily.nc` | `wind` | `m s-1` | `km h-1` |\n",
"| `era5_2m-dewpoint-temperature_daily.nc` | `d2m` | `K` | `C` |\n",
"| `era5_2m-temperature_daily_max.nc` | `tasmax` | `K` | `C` |\n",
"| `era5_2m-temperature_daily_min.nc` | `tasmin` | `K` | `C` |\n",
"| `era5_surface-solar-radiation-downwards_daily.nc` | `ssrd` | `J m-2` | `MJ m-2 d-1`
`MJ m-2`
`J m-2 d-1`
`W m-2` |\n",
"| `era5_surface-thermal-radiation-downwards_daily.nc` | `strd` | `J m-2` | `MJ m-2 d-1`
`MJ m-2`
`J m-2 d-1`
`W m-2` |\n",
"| `era5_total-cloud-cover_daily.nc` | `tcc` | `0-1` | `fraction`
`1`
`%`
`percent` |\n",
"| `era5_total-precipitation_daily.nc` | `tp` | `m` | `mm d-1`
`mm`
`m d-1`
`kg m-2 s-1` |\n",
"| `saturated_vapor_pressure.nc` | `vp` | `mmHg` | `Pa`
`kPa` |\n",
"\n",
"Most of these files come from prepared ERA5 products aggregated to the daily time step. In this workflow, wind speed and vapor pressure are obtained with the meteorological calculators before the complete meteorological dataset is loaded.\n",
"\n",
"In the example below, `saturated_vapor_pressure.nc` is created from `d2m` with `MeteoCalculator.create_variable_file(...)`. The wind-speed file follows the same idea, using the meteorological calculators to derive `wind` from the original wind components. For the calculator API reference, see [the meteorological calculators module](../api/pycequeau.meteo.calculators.rst).\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Project configuration\n",
"\n",
"Set the project folder, the basin name, and the raster files used to initialize the basin."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"project_folder = r\"path/to/your/project/\"\n",
"files_list = [\"DEM.tif\", # DEM tif file\n",
" \"FAC.tif\", #Flow accumulation tif file\n",
" \"LCF.tif\", # Land conver tif file\n",
" \"Watershed.tif\", # Watershed tif file\n",
" \"CAT.tif\" #Sub basins tif file\n",
" ]\n",
"basin_name = \"Margarite\"\n",
"\n",
"bassin_versant_file = os.path.join(\n",
" project_folder,\n",
" \"results\",\n",
" \"bassinVersant.mat\",\n",
")\n",
"meteo_folder = os.path.join(project_folder, \"meteo\", \"ERA\")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create the basin object\n",
"\n",
"The basin object is required to project and export the meteorological data to the CEQUEAU grid."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"basin = Basin(\n",
" project_folder,\n",
" basin_name,\n",
" files_list,\n",
" bassin_versant_file,\n",
")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load the NetCDF meteorological inputs\n",
"\n",
"Once the folder is ready, load the NetCDF meteorological files with `NetCDFMeteo.load_from_netcdf`."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
<xarray.Dataset> Size: 11MB\n",
"Dimensions: (lat: 41, lon: 21, time: 365)\n",
"Coordinates:\n",
" * lat (lat) float64 328B 40.0 40.25 40.5 40.75 ... 49.5 49.75 50.0\n",
" * lon (lon) float64 168B -70.0 -69.75 -69.5 ... -65.5 -65.25 -65.0\n",
" * time (time) datetime64[ns] 3kB 2023-01-01 2023-01-02 ... 2023-12-31\n",
"Data variables:\n",
" vitesseVent (time, lat, lon) float32 1MB 28.55 28.45 28.2 ... 20.39 20.99\n",
" d2m (time, lat, lon) float32 1MB 12.06 12.06 ... -7.709 -7.567\n",
" tMax (time, lat, lon) float32 1MB 16.69 16.64 ... -1.797 -1.594\n",
" tMin (time, lat, lon) float32 1MB 11.38 11.34 11.06 ... -5.42 -5.135\n",
" rayonnement (time, lat, lon) float32 1MB ...\n",
" longwaveRad (time, lat, lon) float32 1MB ...\n",
" nebulosite (time, lat, lon) float32 1MB ...\n",
" pTot (time, lat, lon) float32 1MB ...\n",
" pression (time, lat, lon) float32 1MB ...\n",
"Attributes:\n",
" source_dataset: era5\n",
" source_variables: 10m_u_component_of_wind, 10m_v_component_of_wind\n",
" processing_level: daily\n",
" daily_aggregation: daily_vector_magnitude_from_daily_mean_components\n",
" daily_conversion_method: sfcWind = sqrt(u10^2 + v10^2)<xarray.Dataset> Size: 263MB\n",
"Dimensions: (time: 365, lat: 200, lon: 100)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 3kB 2023-01-01 2023-01-02 ... 2023-12-31\n",
" * lat (lat) float64 2kB 40.0 40.05 40.1 40.15 ... 49.85 49.9 49.95\n",
" * lon (lon) float64 800B -70.0 -69.95 -69.9 ... -65.15 -65.1 -65.05\n",
"Data variables:\n",
" vitesseVent (time, lat, lon) float32 29MB 28.55 28.55 28.55 ... 20.99 20.99\n",
" d2m (time, lat, lon) float32 29MB 12.06 12.06 ... -7.567 -7.567\n",
" tMax (time, lat, lon) float32 29MB 16.69 16.69 ... -1.594 -1.594\n",
" tMin (time, lat, lon) float32 29MB 11.38 11.38 ... -5.135 -5.135\n",
" rayonnement (time, lat, lon) float32 29MB 7.048 7.048 7.048 ... 4.117 4.117\n",
" longwaveRad (time, lat, lon) float32 29MB 29.97 29.97 29.97 ... 19.93 19.93\n",
" nebulosite (time, lat, lon) float32 29MB 0.6492 0.6492 ... 0.6049 0.6049\n",
" pTot (time, lat, lon) float32 29MB 17.02 17.02 ... 0.3147 0.3147\n",
" pression (time, lat, lon) float32 29MB 10.56 10.56 10.56 ... 2.412 2.412\n",
"Attributes:\n",
" source_dataset: era5\n",
" source_variables: 10m_u_component_of_wind, 10m_v_component_of_wind\n",
" processing_level: daily\n",
" daily_aggregation: daily_vector_magnitude_from_daily_mean_components\n",
" daily_conversion_method: sfcWind = sqrt(u10^2 + v10^2)<xarray.Dataset> Size: 26MB\n",
"Dimensions: (time: 365, j: 40, i: 49)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 3kB 2023-01-01 2023-01-02 ... 2023-12-31\n",
" * j (j) int16 80B 49 48 47 46 45 44 43 42 ... 16 15 14 13 12 11 10\n",
" * i (i) int16 98B 10 11 12 13 14 15 16 17 ... 52 53 54 55 56 57 58\n",
"Data variables:\n",
" vitesseVent (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" d2m (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" tMax (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" tMin (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" rayonnement (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" longwaveRad (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" nebulosite (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" pTot (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" pression (time, j, i) float32 3MB nan nan nan nan ... nan nan nan nan\n",
" CE (j, i) float16 4kB nan nan nan nan nan ... 33.0 nan nan nan nan\n",
"Attributes:\n",
" source_dataset: era5\n",
" source_variables: 10m_u_component_of_wind, 10m_v_component_of_wind\n",
" processing_level: daily\n",
" daily_aggregation: daily_vector_magnitude_from_daily_mean_components\n",
" daily_conversion_method: sfcWind = sqrt(u10^2 + v10^2)\n",
" interpolated: Interpolated using xarray.Dataset.interp with m...<xarray.Dataset> Size: 14MB\n",
"Dimensions: (CEid: 1052, pasTemp: 365)\n",
"Coordinates:\n",
" * CEid (CEid) int32 4kB 1 2 3 4 5 6 ... 1047 1048 1049 1050 1051 1052\n",
" * pasTemp (pasTemp) float32 1kB 7.389e+05 7.389e+05 ... 7.393e+05\n",
"Data variables:\n",
" vitesseVent (pasTemp, CEid) float32 2MB 8.566 8.566 8.566 ... 13.79 13.79\n",
" d2m (pasTemp, CEid) float32 2MB -0.9576 -0.9576 ... -10.33 -10.33\n",
" tMax (pasTemp, CEid) float32 2MB 1.234 1.234 1.234 ... -6.68 -6.68\n",
" tMin (pasTemp, CEid) float32 2MB -0.9955 -0.9955 ... -11.58 -11.58\n",
" rayonnement (pasTemp, CEid) float32 2MB 2.401 2.401 2.401 ... 4.81 4.81\n",
" longwaveRad (pasTemp, CEid) float32 2MB 25.93 25.93 25.93 ... 18.86 18.86\n",
" nebulosite (pasTemp, CEid) float32 2MB 0.9681 0.9681 ... 0.8501 0.8501\n",
" pTot (pasTemp, CEid) float32 2MB 4.324 4.324 4.324 ... 0.1087 0.1087\n",
" pression (pasTemp, CEid) float32 2MB 4.233 4.233 4.233 ... 1.891 1.891