{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to create regular grids"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from nes import *\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 = 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": [
       "Proj('+proj=longlat +ellps=WGS84 +no_defs', preserve_units=True)"
      ]
     },
     "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.00000 29.99500, -29.90000 29.995...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>POLYGON ((-29.90000 29.99500, -29.80000 29.995...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>POLYGON ((-29.80000 29.99500, -29.70000 29.995...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>POLYGON ((-29.70000 29.99500, -29.60000 29.995...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>POLYGON ((-29.60000 29.99500, -29.50000 29.995...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755995</th>\n",
       "      <td>POLYGON ((59.50000 71.94500, 59.60000 71.94500...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755996</th>\n",
       "      <td>POLYGON ((59.60000 71.94500, 59.70000 71.94500...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755997</th>\n",
       "      <td>POLYGON ((59.70000 71.94500, 59.80000 71.94500...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755998</th>\n",
       "      <td>POLYGON ((59.80000 71.94500, 59.90000 71.94500...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>755999</th>\n",
       "      <td>POLYGON ((59.90000 71.94500, 60.00000 71.94500...</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.00000 29.99500, -29.90000 29.995...\n",
       "1       POLYGON ((-29.90000 29.99500, -29.80000 29.995...\n",
       "2       POLYGON ((-29.80000 29.99500, -29.70000 29.995...\n",
       "3       POLYGON ((-29.70000 29.99500, -29.60000 29.995...\n",
       "4       POLYGON ((-29.60000 29.99500, -29.50000 29.995...\n",
       "...                                                   ...\n",
       "755995  POLYGON ((59.50000 71.94500, 59.60000 71.94500...\n",
       "755996  POLYGON ((59.60000 71.94500, 59.70000 71.94500...\n",
       "755997  POLYGON ((59.70000 71.94500, 59.80000 71.94500...\n",
       "755998  POLYGON ((59.80000 71.94500, 59.90000 71.94500...\n",
       "755999  POLYGON ((59.90000 71.94500, 60.00000 71.94500...\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, 159816 characters]\n",
      "text/plain": [
       "<Figure size 1368x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "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('/esarchive/shapefiles/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": [
      "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:3058: UserWarning: No vertical level has been specified. The first one will be selected.\n",
      "  warnings.warn(msg)\n",
      "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:3069: UserWarning: No time has been specified. The first one will be selected.\n",
      "  warnings.warn(msg)\n"
     ]
    }
   ],
   "source": [
    "nessy.to_shapefile('regular_grid_shp')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
