{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to create regular grids"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nes\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import geopandas as gpd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Create dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define grid details\n",
    "\n",
    "This corresponds to a regular grid for CAMS-REG-v5.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "projection='regular'\n",
    "lat_orig = 29.995\n",
    "lon_orig = -30.0\n",
    "inc_lat = 0.05\n",
    "inc_lon = 0.1\n",
    "n_lat = 840\n",
    "n_lon = 900"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "nessy = nes.create_nes(comm=None, info=False, projection=projection,\n",
    "                       lat_orig=lat_orig, lon_orig=lon_orig, inc_lat=inc_lat, inc_lon=inc_lon, \n",
    "                       n_lat=n_lat, n_lon=n_lon)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Read projection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Other Coordinate Operation Transformer: longlat>\n",
       "Description: PROJ-based coordinate operation\n",
       "Area of Use:\n",
       "- undefined"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nessy.projection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'grid_mapping_name': 'latitude_longitude',\n",
       " 'semi_major_axis': 6378137.0,\n",
       " 'inverse_flattening': 0,\n",
       " 'inc_lat': 0.05,\n",
       " 'inc_lon': 0.1,\n",
       " 'lat_orig': 29.995,\n",
       " 'lon_orig': -30.0,\n",
       " 'n_lat': 840,\n",
       " 'n_lon': 900}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nessy.projection_data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>geometry</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>FID</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>POLYGON ((-30 29.995, -29.9 29.995, -29.9 30.0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>POLYGON ((-29.9 29.995, -29.8 29.995, -29.8 30...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>POLYGON ((-29.8 29.995, -29.7 29.995, -29.7 30...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>POLYGON ((-29.7 29.995, -29.6 29.995, -29.6 30...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>POLYGON ((-29.6 29.995, -29.5 29.995, -29.5 30...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755995</th>\n",
       "      <td>POLYGON ((59.5 71.945, 59.6 71.945, 59.6 71.99...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755996</th>\n",
       "      <td>POLYGON ((59.6 71.945, 59.7 71.945, 59.7 71.99...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755997</th>\n",
       "      <td>POLYGON ((59.7 71.945, 59.8 71.945, 59.8 71.99...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755998</th>\n",
       "      <td>POLYGON ((59.8 71.945, 59.9 71.945, 59.9 71.99...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755999</th>\n",
       "      <td>POLYGON ((59.9 71.945, 60 71.945, 60 71.995, 5...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>756000 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 geometry\n",
       "FID                                                      \n",
       "0       POLYGON ((-30 29.995, -29.9 29.995, -29.9 30.0...\n",
       "1       POLYGON ((-29.9 29.995, -29.8 29.995, -29.8 30...\n",
       "2       POLYGON ((-29.8 29.995, -29.7 29.995, -29.7 30...\n",
       "3       POLYGON ((-29.7 29.995, -29.6 29.995, -29.6 30...\n",
       "4       POLYGON ((-29.6 29.995, -29.5 29.995, -29.5 30...\n",
       "...                                                   ...\n",
       "755995  POLYGON ((59.5 71.945, 59.6 71.945, 59.6 71.99...\n",
       "755996  POLYGON ((59.6 71.945, 59.7 71.945, 59.7 71.99...\n",
       "755997  POLYGON ((59.7 71.945, 59.8 71.945, 59.8 71.99...\n",
       "755998  POLYGON ((59.8 71.945, 59.9 71.945, 59.9 71.99...\n",
       "755999  POLYGON ((59.9 71.945, 60 71.945, 60 71.995, 5...\n",
       "\n",
       "[756000 rows x 1 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nessy.create_shapefile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 256028 characters]",
      "text/plain": [
       "<Figure size 1900x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, figsize=(19, 7))\n",
    "nessy.shapefile.plot(ax=ax, facecolor='blue', edgecolor='blue')\n",
    "countries = gpd.read_file('/gpfs/projects/bsc32/models/NES_tutorial_data/gadm_country_mask/gadm_country_ISO3166.shp')\n",
    "countries.plot(ax=ax, facecolor='none', edgecolor='black', linewidth=0.3)\n",
    "ax.margins(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Write dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Write NetCDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Rank 000: Creating regular_grid.nc\n",
      "Rank 000: NetCDF ready to write\n",
      "Rank 000: Dimensions done\n"
     ]
    }
   ],
   "source": [
    "nessy.to_netcdf('regular_grid.nc', info=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Write shapefile"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/bsc/bsc032781/.local/lib/python3.9/site-packages/nes/nc_projections/default_nes.py:3805: UserWarning: No vertical level has been specified. The first one will be selected.\n",
      "  warn(msg)\n",
      "/home/bsc/bsc032781/.local/lib/python3.9/site-packages/nes/nc_projections/default_nes.py:3816: UserWarning: No time has been specified. The first one will be selected.\n",
      "  warn(msg)\n"
     ]
    }
   ],
   "source": [
    "nessy.to_shapefile('regular_grid_shp')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
