[5925] | 1 | { |
---|
| 2 | "cells": [ |
---|
| 3 | { |
---|
| 4 | "cell_type": "markdown", |
---|
| 5 | "id": "10fcba33", |
---|
| 6 | "metadata": {}, |
---|
| 7 | "source": [ |
---|
| 8 | "# Constructs ```coordinates_mask``` file\n", |
---|
| 9 | "The ```coordinates_mask``` file is needed to run MOSAIX, to build interpolation weights for the coupled model" |
---|
| 10 | ] |
---|
| 11 | }, |
---|
| 12 | { |
---|
| 13 | "cell_type": "markdown", |
---|
| 14 | "id": "b1cbb871", |
---|
| 15 | "metadata": {}, |
---|
| 16 | "source": [ |
---|
| 17 | "Olivier Marti - olivier.marti@lsce.ipsl - 10/06/2021" |
---|
| 18 | ] |
---|
| 19 | }, |
---|
| 20 | { |
---|
| 21 | "cell_type": "code", |
---|
| 22 | "execution_count": 1, |
---|
| 23 | "id": "731d770c", |
---|
| 24 | "metadata": {}, |
---|
| 25 | "outputs": [], |
---|
| 26 | "source": [ |
---|
| 27 | "import xarray as xr\n", |
---|
| 28 | "import numpy as np\n", |
---|
| 29 | "import nemo\n", |
---|
| 30 | "import datetime, os, platform" |
---|
| 31 | ] |
---|
| 32 | }, |
---|
| 33 | { |
---|
| 34 | "cell_type": "markdown", |
---|
[5939] | 35 | "id": "fb78f0e5", |
---|
| 36 | "metadata": {}, |
---|
| 37 | "source": [ |
---|
| 38 | "# Various Switches To Deal With Bugs and Implementation Choices" |
---|
| 39 | ] |
---|
| 40 | }, |
---|
| 41 | { |
---|
| 42 | "cell_type": "code", |
---|
| 43 | "execution_count": 2, |
---|
| 44 | "id": "2bd430d4", |
---|
| 45 | "metadata": {}, |
---|
| 46 | "outputs": [], |
---|
| 47 | "source": [ |
---|
| 48 | "# reproduce periodicity bug for U and nperio = 4\n", |
---|
| 49 | "nemoUbug = False\n", |
---|
| 50 | "# change metrics (and bathymetry) for straits\n", |
---|
| 51 | "straits = False\n", |
---|
| 52 | "# periodicity imposed on coordinates, metrics and areas\n", |
---|
| 53 | "coordperio = False\n", |
---|
| 54 | "# function used to compute mask_T from bathymetry\n", |
---|
| 55 | "maskbathynemo = False" |
---|
| 56 | ] |
---|
| 57 | }, |
---|
| 58 | { |
---|
| 59 | "cell_type": "markdown", |
---|
[5925] | 60 | "id": "26422e3f", |
---|
| 61 | "metadata": {}, |
---|
| 62 | "source": [ |
---|
| 63 | "# Input files, type of ORCA grid, and output file" |
---|
| 64 | ] |
---|
| 65 | }, |
---|
| 66 | { |
---|
| 67 | "cell_type": "code", |
---|
[5939] | 68 | "execution_count": 3, |
---|
[5925] | 69 | "id": "deb66d3d", |
---|
| 70 | "metadata": {}, |
---|
| 71 | "outputs": [], |
---|
| 72 | "source": [ |
---|
| 73 | "#model = 'eORCA1.2'\n", |
---|
[5939] | 74 | "#model = 'ORCA2.3'\n", |
---|
| 75 | "model = 'paleORCA'\n", |
---|
| 76 | "#model = 'ORCA2.4'\n", |
---|
| 77 | "#model = 'ORCA.05'http://localhost:8888/notebooks/Build_coordinates_mask_new_2409.ipynb#" |
---|
[5925] | 78 | ] |
---|
| 79 | }, |
---|
| 80 | { |
---|
| 81 | "cell_type": "code", |
---|
[5939] | 82 | "execution_count": 4, |
---|
[5925] | 83 | "id": "2475c8b7", |
---|
| 84 | "metadata": {}, |
---|
| 85 | "outputs": [], |
---|
| 86 | "source": [ |
---|
| 87 | "if model == 'eORCA1.2' :\n", |
---|
[5939] | 88 | " n_coord = 'eORCA1.2coordinates.nc' # 'eORCA_R1_coordinates_v1.0.nc' \n", |
---|
| 89 | " n_bathy = 'eORCA1.2bathy_meter.nc' # 'eORCA_R1_bathy_meter_v2.2.nc'\n", |
---|
[5925] | 90 | " #n_coord = 'https://vesg.ipsl.upmc.fr/thredds/dodsC/work/p86mart/GRAF/DATA/eORCA_R1_coordinates_v1.0.nc'\n", |
---|
| 91 | " #n_bathy = 'https://vesg.ipsl.upmc.fr/thredds/dodsC/work/p86mart/GRAF/DATA/eORCA_R1_bathy_meter_v2.2.nc'\n", |
---|
| 92 | " nperio = 6\n", |
---|
[5939] | 93 | " n_out = 'My_eORCA_R1_coordinates_mask_test.nc'\n", |
---|
[5925] | 94 | "\n", |
---|
| 95 | "if model == 'ORCA2.3' :\n", |
---|
| 96 | " nperio = 4\n", |
---|
[5939] | 97 | " n_coord = 'coordinates.nc' # 'ORCA2.3_coordinates.nc' # 'coordinates_ORCA2_LIM3_PISCES.nc' #\n", |
---|
| 98 | " n_bathy = 'bathy_meter_closea_topo.nc' # 'ORCA2.3_bathy_meter.nc' # 'bathy_meter_ORCA2_LIM3_PISCES.nc' #\n", |
---|
[5925] | 99 | " n_out = 'My_test.nc'\n", |
---|
| 100 | " \n", |
---|
| 101 | "if model == 'ORCA2.4' :\n", |
---|
| 102 | " nperio = 4\n", |
---|
| 103 | " n_coord = 'ORCA2.4_coordinates.nc'\n", |
---|
| 104 | " n_bathy = 'ORCA2.4_bathy_meter.nc'\n", |
---|
[5939] | 105 | " n_out = 'ORCA2.4_coordinates_mask_test.nc'\n", |
---|
| 106 | " \n", |
---|
| 107 | "if model == 'paleORCA' :\n", |
---|
| 108 | " n_coord = 'coordinates_paleo.nc'\n", |
---|
| 109 | " n_bathy = 'bathy_meter_paleo.nc'\n", |
---|
| 110 | " nperio = 6\n", |
---|
| 111 | " n_out = 'My_coordinates_mask_paleo.nc'\n", |
---|
| 112 | "\n" |
---|
[5925] | 113 | ] |
---|
| 114 | }, |
---|
| 115 | { |
---|
| 116 | "cell_type": "markdown", |
---|
| 117 | "id": "8cd952a6", |
---|
| 118 | "metadata": {}, |
---|
| 119 | "source": [ |
---|
| 120 | "## Open input files\n", |
---|
[5939] | 121 | "Do not decode time which might be buggy in some files\n", |
---|
[5925] | 122 | "Suppress singleton dimensions if necessary" |
---|
| 123 | ] |
---|
| 124 | }, |
---|
| 125 | { |
---|
| 126 | "cell_type": "code", |
---|
[5939] | 127 | "execution_count": 5, |
---|
[5925] | 128 | "id": "0b7c7279", |
---|
| 129 | "metadata": { |
---|
| 130 | "scrolled": false |
---|
| 131 | }, |
---|
| 132 | "outputs": [], |
---|
| 133 | "source": [ |
---|
| 134 | "f_coord = xr.open_dataset (n_coord, decode_times=False).squeeze()\n", |
---|
| 135 | "f_bathy = xr.open_dataset (n_bathy, decode_times=False).squeeze()" |
---|
| 136 | ] |
---|
| 137 | }, |
---|
| 138 | { |
---|
| 139 | "cell_type": "code", |
---|
[5939] | 140 | "execution_count": 6, |
---|
[5925] | 141 | "id": "9fb92919", |
---|
| 142 | "metadata": {}, |
---|
| 143 | "outputs": [ |
---|
| 144 | { |
---|
| 145 | "name": "stdout", |
---|
| 146 | "output_type": "stream", |
---|
| 147 | "text": [ |
---|
[5939] | 148 | "failed to suppress time\n" |
---|
[5925] | 149 | ] |
---|
| 150 | } |
---|
| 151 | ], |
---|
| 152 | "source": [ |
---|
| 153 | "# Suppress time if necessary\n", |
---|
| 154 | "try :\n", |
---|
| 155 | " del f_coord['time']\n", |
---|
| 156 | " print ('success')\n", |
---|
| 157 | "except :\n", |
---|
| 158 | " pass\n", |
---|
| 159 | " print ('failed to suppress time')" |
---|
| 160 | ] |
---|
| 161 | }, |
---|
| 162 | { |
---|
| 163 | "cell_type": "markdown", |
---|
| 164 | "id": "d61fb6b2", |
---|
| 165 | "metadata": {}, |
---|
| 166 | "source": [ |
---|
| 167 | "## Creates masks" |
---|
| 168 | ] |
---|
| 169 | }, |
---|
| 170 | { |
---|
| 171 | "cell_type": "markdown", |
---|
| 172 | "id": "299c0a66", |
---|
| 173 | "metadata": {}, |
---|
| 174 | "source": [ |
---|
| 175 | "### Read bathymetry " |
---|
| 176 | ] |
---|
| 177 | }, |
---|
| 178 | { |
---|
| 179 | "cell_type": "code", |
---|
[5939] | 180 | "execution_count": 7, |
---|
[5925] | 181 | "id": "9dfd90e6", |
---|
| 182 | "metadata": { |
---|
| 183 | "scrolled": true |
---|
| 184 | }, |
---|
| 185 | "outputs": [ |
---|
| 186 | { |
---|
| 187 | "name": "stdout", |
---|
| 188 | "output_type": "stream", |
---|
| 189 | "text": [ |
---|
[5939] | 190 | "Normal case\n" |
---|
[5925] | 191 | ] |
---|
| 192 | } |
---|
| 193 | ], |
---|
| 194 | "source": [ |
---|
[5939] | 195 | "Bathymetry = f_bathy['Bathymetry'].copy()\n", |
---|
[5925] | 196 | "\n", |
---|
| 197 | "try :\n", |
---|
| 198 | " Bathymetry = Bathymetry.rename ({'nav_lat':'nav_lat_grid_T', 'nav_lon':'nav_lon_grid_T'})\n", |
---|
| 199 | " print ('Normal case')\n", |
---|
| 200 | "except : \n", |
---|
| 201 | " print ('Exception')\n", |
---|
| 202 | " nav_lon_grid_T = f_bathy ['nav_lon']\n", |
---|
| 203 | " nav_lat_grid_T = f_bathy ['nav_lat']\n", |
---|
| 204 | " Bathymetry = xr.DataArray (Bathymetry, coords = { \"nav_lat_grid_T\": ([\"y\", \"x\"], nav_lat_grid_T),\n", |
---|
| 205 | " \"nav_lon_grid_T\": ([\"y\", \"x\"], nav_lon_grid_T) } )\n", |
---|
| 206 | " \n", |
---|
| 207 | "Bathymetry = Bathymetry.rename ({'y':'y_grid_T', 'x':'x_grid_T'})" |
---|
| 208 | ] |
---|
| 209 | }, |
---|
| 210 | { |
---|
| 211 | "cell_type": "code", |
---|
[5939] | 212 | "execution_count": 8, |
---|
[5925] | 213 | "id": "2606d14b", |
---|
| 214 | "metadata": {}, |
---|
| 215 | "outputs": [], |
---|
| 216 | "source": [ |
---|
[5939] | 217 | "if straits :\n", |
---|
| 218 | " # Open straits for ORCA2 grid\n", |
---|
| 219 | " if model == 'ORCA2.3' :\n", |
---|
| 220 | " # orca_r2: Gibraltar strait open\n", |
---|
| 221 | " Bathymetry[101,139] = 284.\n", |
---|
| 222 | " # orca_r2: Bab el Mandeb strait open\n", |
---|
| 223 | " Bathymetry[87,159] = 137." |
---|
[5925] | 224 | ] |
---|
| 225 | }, |
---|
| 226 | { |
---|
| 227 | "cell_type": "markdown", |
---|
| 228 | "id": "71c9c821", |
---|
| 229 | "metadata": {}, |
---|
| 230 | "source": [ |
---|
| 231 | "### Determine which periodicity is needed" |
---|
| 232 | ] |
---|
| 233 | }, |
---|
| 234 | { |
---|
| 235 | "cell_type": "code", |
---|
[5939] | 236 | "execution_count": 9, |
---|
[5925] | 237 | "id": "7e7a49d5", |
---|
| 238 | "metadata": {}, |
---|
| 239 | "outputs": [ |
---|
| 240 | { |
---|
| 241 | "name": "stdout", |
---|
| 242 | "output_type": "stream", |
---|
| 243 | "text": [ |
---|
[5939] | 244 | "nperio specified : 6\n" |
---|
[5925] | 245 | ] |
---|
| 246 | } |
---|
| 247 | ], |
---|
| 248 | "source": [ |
---|
| 249 | "jpj, jpi = Bathymetry.shape\n", |
---|
| 250 | "try : \n", |
---|
| 251 | " if nperio != None :\n", |
---|
| 252 | " print ('nperio specified : ', nperio)\n", |
---|
| 253 | "except :\n", |
---|
| 254 | " nperio = None\n", |
---|
| 255 | " if jpi == 182 : nperio = 4 # ORCA2. \\!/ We choose legacy orca2\n", |
---|
| 256 | " if jpi == 362 : nperio = 6 # ORCA1.\n", |
---|
| 257 | " if jpi == 1442 : nperio = 6 # ORCA025.\n", |
---|
| 258 | " #\n", |
---|
| 259 | " if nperio == None :\n", |
---|
| 260 | " sys.exit ('nperio not found, and cannot by guessed' )\n", |
---|
| 261 | " else :\n", |
---|
| 262 | " print ('nperio set as {:d} (deduced from data size {:d} {:d})'.format (nperio, jpj, jpi))" |
---|
| 263 | ] |
---|
| 264 | }, |
---|
| 265 | { |
---|
| 266 | "cell_type": "code", |
---|
[5939] | 267 | "execution_count": 10, |
---|
[5925] | 268 | "id": "34cdcfe4", |
---|
| 269 | "metadata": {}, |
---|
| 270 | "outputs": [], |
---|
| 271 | "source": [ |
---|
[5939] | 272 | "Bathymetry = nemo.lbc (Bathymetry, nperio=nperio, cd_type='T')\n", |
---|
[5941] | 273 | "#Suppress ocean points at southernmost position for periodicity (3, 4, 5, 6)\n", |
---|
| 274 | "if nperio in (3 , 4 , 5 , 6) :\n", |
---|
| 275 | " Bathymetry[0,:] = 0.0 " |
---|
[5925] | 276 | ] |
---|
| 277 | }, |
---|
| 278 | { |
---|
| 279 | "cell_type": "markdown", |
---|
| 280 | "id": "0da91538", |
---|
| 281 | "metadata": {}, |
---|
| 282 | "source": [ |
---|
| 283 | "### Creates ```mask_T```" |
---|
| 284 | ] |
---|
| 285 | }, |
---|
| 286 | { |
---|
| 287 | "cell_type": "code", |
---|
[5939] | 288 | "execution_count": 11, |
---|
[5925] | 289 | "id": "49a654ef", |
---|
| 290 | "metadata": {}, |
---|
| 291 | "outputs": [], |
---|
| 292 | "source": [ |
---|
[5939] | 293 | "if maskbathynemo :\n", |
---|
| 294 | " # Use same formula as domzgr. Should be equivalent to Bathimetry > 0.0. \n", |
---|
| 295 | " mask_T = xr.where (Bathymetry - 1. + 0.1 >= 0.0, 1, 0).astype (dtype='f4')\n", |
---|
| 296 | "else :\n", |
---|
| 297 | " mask_T = xr.where (Bathymetry > 0.0, 1, 0).astype (dtype='f4')" |
---|
[5925] | 298 | ] |
---|
| 299 | }, |
---|
| 300 | { |
---|
| 301 | "cell_type": "markdown", |
---|
| 302 | "id": "327d48ea", |
---|
| 303 | "metadata": {}, |
---|
| 304 | "source": [ |
---|
| 305 | "### Creates other masks" |
---|
| 306 | ] |
---|
| 307 | }, |
---|
| 308 | { |
---|
| 309 | "cell_type": "code", |
---|
[5939] | 310 | "execution_count": 12, |
---|
[5925] | 311 | "id": "f0b656a1", |
---|
| 312 | "metadata": {}, |
---|
| 313 | "outputs": [], |
---|
| 314 | "source": [ |
---|
| 315 | "mask_U = mask_T * mask_T.shift (x_grid_T=-1)\n", |
---|
| 316 | "mask_V = mask_T * mask_T.shift (y_grid_T=-1)\n", |
---|
| 317 | "mask_F = mask_T * mask_T.shift (y_grid_T=-1) * mask_T.shift (x_grid_T=-1) * mask_T.shift (y_grid_T=-1, x_grid_T=-1)\n", |
---|
| 318 | "mask_W = mask_T\n", |
---|
| 319 | "\n", |
---|
[5939] | 320 | "mask_U = nemo.lbc (mask_U, nperio=nperio, cd_type='U', nemo_4U_bug=nemoUbug).astype (dtype='f4')\n", |
---|
| 321 | "mask_V = nemo.lbc (mask_V, nperio=nperio, cd_type='V').astype (dtype='f4')\n", |
---|
| 322 | "mask_F = nemo.lbc (mask_F, nperio=nperio, cd_type='F').astype (dtype='f4')\n", |
---|
| 323 | "mask_W = nemo.lbc (mask_W, nperio=nperio, cd_type='W').astype (dtype='f4')\n", |
---|
[5925] | 324 | "\n", |
---|
| 325 | "mask_U = mask_U.rename ( {'y_grid_T' : 'y_grid_U' , 'x_grid_T' : 'x_grid_U', \n", |
---|
| 326 | " 'nav_lat_grid_T': 'nav_lat_grid_U', 'nav_lon_grid_T': 'nav_lon_grid_U'} )\n", |
---|
| 327 | "mask_V = mask_V.rename ( {'y_grid_T' : 'y_grid_V' , 'x_grid_T' : 'x_grid_V',\n", |
---|
| 328 | " 'nav_lat_grid_T': 'nav_lat_grid_V', 'nav_lon_grid_T': 'nav_lon_grid_V'} )\n", |
---|
| 329 | "mask_W = mask_W.rename ( {'y_grid_T' : 'y_grid_W' , 'x_grid_T' : 'x_grid_W',\n", |
---|
| 330 | " 'nav_lat_grid_T': 'nav_lat_grid_W', 'nav_lon_grid_T': 'nav_lon_grid_W'} )\n", |
---|
| 331 | "mask_F = mask_F.rename ( {'y_grid_T' : 'y_grid_F' , 'x_grid_T' : 'x_grid_F',\n", |
---|
| 332 | " 'nav_lat_grid_T': 'nav_lat_grid_F', 'nav_lon_grid_T': 'nav_lon_grid_F'} )\n", |
---|
| 333 | "\n", |
---|
| 334 | "mask_T.name = 'mask_T'\n", |
---|
| 335 | "mask_U.name = 'mask_U'\n", |
---|
| 336 | "mask_V.name = 'mask_V'\n", |
---|
| 337 | "mask_F.name = 'mask_F'\n", |
---|
| 338 | "mask_W.name = 'mask_W'" |
---|
| 339 | ] |
---|
| 340 | }, |
---|
| 341 | { |
---|
| 342 | "cell_type": "markdown", |
---|
| 343 | "id": "5cb36da6", |
---|
| 344 | "metadata": {}, |
---|
| 345 | "source": [ |
---|
| 346 | "### Masks with duplicate points removed" |
---|
| 347 | ] |
---|
| 348 | }, |
---|
| 349 | { |
---|
| 350 | "cell_type": "code", |
---|
[5939] | 351 | "execution_count": 13, |
---|
[5925] | 352 | "id": "274e4321", |
---|
| 353 | "metadata": {}, |
---|
| 354 | "outputs": [], |
---|
| 355 | "source": [ |
---|
| 356 | "for cd_type in ['T', 'U', 'V', 'F', 'W'] :\n", |
---|
| 357 | " MaskName = 'mask_' + cd_type\n", |
---|
| 358 | " UtilName = 'maskutil_' + cd_type\n", |
---|
[5939] | 359 | " locals()[UtilName] = nemo.lbc_mask (locals()[MaskName].copy(), nperio=nperio, cd_type=cd_type).astype (dtype='f4')\n", |
---|
| 360 | " locals()[UtilName].name = UtilName\n", |
---|
| 361 | " locals()[UtilName].encoding['_FillValue'] = None" |
---|
[5925] | 362 | ] |
---|
| 363 | }, |
---|
| 364 | { |
---|
| 365 | "cell_type": "markdown", |
---|
| 366 | "id": "69ec3daa", |
---|
| 367 | "metadata": {}, |
---|
| 368 | "source": [ |
---|
| 369 | "### Add attributes" |
---|
| 370 | ] |
---|
| 371 | }, |
---|
| 372 | { |
---|
| 373 | "cell_type": "code", |
---|
[5939] | 374 | "execution_count": 14, |
---|
[5925] | 375 | "id": "f46e1c93", |
---|
| 376 | "metadata": {}, |
---|
| 377 | "outputs": [], |
---|
| 378 | "source": [ |
---|
| 379 | "mask_T.attrs ['cell_measures'] = 'area: area_grid_T'\n", |
---|
| 380 | "mask_U.attrs ['cell_measures'] = 'area: area_grid_U'\n", |
---|
| 381 | "mask_V.attrs ['cell_measures'] = 'area: area_grid_V'\n", |
---|
| 382 | "mask_W.attrs ['cell_measures'] = 'area: area_grid_W'\n", |
---|
| 383 | "mask_F.attrs ['cell_measures'] = 'area: area_grid_F'\n", |
---|
| 384 | "\n", |
---|
| 385 | "maskutil_T.attrs['cell_measures'] = 'area: area_grid_T'\n", |
---|
| 386 | "maskutil_U.attrs['cell_measures'] = 'area: area_grid_U'\n", |
---|
| 387 | "maskutil_V.attrs['cell_measures'] = 'area: area_grid_V'\n", |
---|
| 388 | "maskutil_W.attrs['cell_measures'] = 'area: area_grid_W'\n", |
---|
| 389 | "maskutil_F.attrs['cell_measures'] = 'area: area_grid_F'" |
---|
| 390 | ] |
---|
| 391 | }, |
---|
| 392 | { |
---|
| 393 | "cell_type": "markdown", |
---|
| 394 | "id": "580e2776", |
---|
| 395 | "metadata": {}, |
---|
| 396 | "source": [ |
---|
| 397 | "## Creates grid coordinates and surfaces" |
---|
| 398 | ] |
---|
| 399 | }, |
---|
| 400 | { |
---|
| 401 | "cell_type": "code", |
---|
[5939] | 402 | "execution_count": 15, |
---|
[5925] | 403 | "id": "a7ce1490", |
---|
| 404 | "metadata": {}, |
---|
| 405 | "outputs": [], |
---|
| 406 | "source": [ |
---|
[5939] | 407 | "if coordperio :\n", |
---|
| 408 | " nav_lon_grid_T = nemo.lbc (f_coord ['glamt'].copy(), nperio=nperio, cd_type='T')\n", |
---|
| 409 | " nav_lat_grid_T = nemo.lbc (f_coord ['gphit'].copy(), nperio=nperio, cd_type='T')\n", |
---|
| 410 | " nav_lon_grid_U = nemo.lbc (f_coord ['glamu'].copy(), nperio=nperio, cd_type='U',nemo_4U_bug=nemoUbug)\n", |
---|
| 411 | " nav_lat_grid_U = nemo.lbc (f_coord ['gphiu'].copy(), nperio=nperio, cd_type='U',nemo_4U_bug=nemoUbug)\n", |
---|
| 412 | " nav_lon_grid_V = nemo.lbc (f_coord ['glamv'].copy(), nperio=nperio, cd_type='V')\n", |
---|
| 413 | " nav_lat_grid_V = nemo.lbc (f_coord ['gphiv'].copy(), nperio=nperio, cd_type='V')\n", |
---|
| 414 | " nav_lon_grid_W = nemo.lbc (f_coord ['glamt'].copy(), nperio=nperio, cd_type='W')\n", |
---|
| 415 | " nav_lat_grid_W = nemo.lbc (f_coord ['gphit'].copy(), nperio=nperio, cd_type='W')\n", |
---|
| 416 | " nav_lon_grid_F = nemo.lbc (f_coord ['glamf'].copy(), nperio=nperio, cd_type='F')\n", |
---|
| 417 | " nav_lat_grid_F = nemo.lbc (f_coord ['gphif'].copy(), nperio=nperio, cd_type='F')\n", |
---|
| 418 | "else :\n", |
---|
| 419 | " nav_lon_grid_T = f_coord ['glamt'].copy()\n", |
---|
| 420 | " nav_lat_grid_T = f_coord ['gphit'].copy()\n", |
---|
| 421 | " nav_lon_grid_U = f_coord ['glamu'].copy()\n", |
---|
| 422 | " nav_lat_grid_U = f_coord ['gphiu'].copy()\n", |
---|
| 423 | " nav_lon_grid_V = f_coord ['glamv'].copy()\n", |
---|
| 424 | " nav_lat_grid_V = f_coord ['gphiv'].copy()\n", |
---|
| 425 | " nav_lon_grid_W = f_coord ['glamt'].copy()\n", |
---|
| 426 | " nav_lat_grid_W = f_coord ['gphit'].copy()\n", |
---|
| 427 | " nav_lon_grid_F = f_coord ['glamf'].copy()\n", |
---|
| 428 | " nav_lat_grid_F = f_coord ['gphif'].copy()\n", |
---|
[5925] | 429 | "\n", |
---|
| 430 | "nav_lon_grid_T = nav_lon_grid_T.rename( {'y':'y_grid_T', 'x':'x_grid_T'} )\n", |
---|
| 431 | "nav_lat_grid_T = nav_lat_grid_T.rename( {'y':'y_grid_T', 'x':'x_grid_T'} )\n", |
---|
| 432 | "nav_lon_grid_U = nav_lon_grid_U.rename( {'y':'y_grid_U', 'x':'x_grid_U'} )\n", |
---|
| 433 | "nav_lat_grid_U = nav_lat_grid_U.rename( {'y':'y_grid_U', 'x':'x_grid_U'} )\n", |
---|
| 434 | "nav_lon_grid_V = nav_lon_grid_V.rename( {'y':'y_grid_V', 'x':'x_grid_V'} )\n", |
---|
| 435 | "nav_lat_grid_V = nav_lat_grid_V.rename( {'y':'y_grid_V', 'x':'x_grid_V'} )\n", |
---|
| 436 | "nav_lon_grid_W = nav_lon_grid_W.rename( {'y':'y_grid_W', 'x':'x_grid_W'} )\n", |
---|
| 437 | "nav_lat_grid_W = nav_lat_grid_W.rename( {'y':'y_grid_W', 'x':'x_grid_W'} )\n", |
---|
| 438 | "nav_lon_grid_F = nav_lon_grid_F.rename( {'y':'y_grid_F', 'x':'x_grid_F'} )\n", |
---|
| 439 | "nav_lat_grid_F = nav_lat_grid_F.rename( {'y':'y_grid_F', 'x':'x_grid_F'} )\n", |
---|
| 440 | "\n", |
---|
[5939] | 441 | "# remove _FillValue and missing_value\n", |
---|
[5925] | 442 | "for cd_type in ['T', 'U', 'V', 'F', 'W'] :\n", |
---|
| 443 | " for dir_type in ['lat', 'lon'] :\n", |
---|
| 444 | " coord_name = 'nav_' + dir_type + '_grid_' + cd_type\n", |
---|
| 445 | " locals()[coord_name].encoding['_FillValue'] = None\n", |
---|
| 446 | " locals()[coord_name].encoding['missing_value'] = None" |
---|
| 447 | ] |
---|
| 448 | }, |
---|
| 449 | { |
---|
| 450 | "cell_type": "code", |
---|
[5939] | 451 | "execution_count": 16, |
---|
[5925] | 452 | "id": "516b4c5c", |
---|
| 453 | "metadata": {}, |
---|
| 454 | "outputs": [], |
---|
| 455 | "source": [ |
---|
| 456 | "nav_lon_grid_T.name = 'nav_lon_grid_T'\n", |
---|
| 457 | "nav_lat_grid_T.name = 'nav_lat_grid_T'\n", |
---|
| 458 | "nav_lon_grid_U.name = 'nav_lon_grid_U'\n", |
---|
| 459 | "nav_lat_grid_U.name = 'nav_lat_grid_U'\n", |
---|
| 460 | "nav_lon_grid_V.name = 'nav_lon_grid_V'\n", |
---|
| 461 | "nav_lat_grid_V.name = 'nav_lat_grid_V'\n", |
---|
| 462 | "nav_lon_grid_F.name = 'nav_lon_grid_F'\n", |
---|
| 463 | "nav_lat_grid_F.name = 'nav_lat_grid_F'\n", |
---|
| 464 | "nav_lon_grid_W.name = 'nav_lon_grid_W'\n", |
---|
| 465 | "nav_lat_grid_W.name = 'nav_lat_grid_W'" |
---|
| 466 | ] |
---|
| 467 | }, |
---|
| 468 | { |
---|
| 469 | "cell_type": "markdown", |
---|
| 470 | "id": "cffad9b4", |
---|
| 471 | "metadata": {}, |
---|
| 472 | "source": [ |
---|
| 473 | "### Add attributes" |
---|
| 474 | ] |
---|
| 475 | }, |
---|
| 476 | { |
---|
| 477 | "cell_type": "code", |
---|
[5939] | 478 | "execution_count": 17, |
---|
[5925] | 479 | "id": "de0e6514", |
---|
| 480 | "metadata": {}, |
---|
| 481 | "outputs": [], |
---|
| 482 | "source": [ |
---|
| 483 | "nav_lon_grid_T.attrs['standard_name'] = 'longitude'\n", |
---|
| 484 | "nav_lon_grid_T.attrs['long_name'] = 'Longitude'\n", |
---|
| 485 | "nav_lon_grid_T.attrs['units'] = 'degrees_east'\n", |
---|
| 486 | "nav_lat_grid_T.attrs['standard_name'] = 'latitude'\n", |
---|
| 487 | "nav_lat_grid_T.attrs['long_name'] = 'Latitude'\n", |
---|
| 488 | "nav_lat_grid_T.attrs['units'] = 'degrees_north'\n", |
---|
| 489 | "\n", |
---|
| 490 | "nav_lon_grid_U.attrs['standard_name'] = 'longitude'\n", |
---|
| 491 | "nav_lon_grid_U.attrs['long_name'] = 'Longitude'\n", |
---|
| 492 | "nav_lon_grid_U.attrs['units'] = 'degrees_east'\n", |
---|
| 493 | "nav_lat_grid_U.attrs['standard_name'] = 'latitude'\n", |
---|
| 494 | "nav_lat_grid_U.attrs['long_name'] = 'Latitude'\n", |
---|
| 495 | "nav_lat_grid_U.attrs['units'] = 'degrees_north'\n", |
---|
| 496 | "\n", |
---|
| 497 | "nav_lon_grid_V.attrs['standard_name'] = 'longitude'\n", |
---|
| 498 | "nav_lon_grid_V.attrs['long_name'] = 'Longitude'\n", |
---|
| 499 | "nav_lon_grid_V.attrs['units'] = 'degrees_east'\n", |
---|
| 500 | "nav_lat_grid_V.attrs['standard_name'] = 'latitude'\n", |
---|
| 501 | "nav_lat_grid_V.attrs['long_name'] = 'Latitude'\n", |
---|
| 502 | "nav_lat_grid_V.attrs['units'] = 'degrees_north'\n", |
---|
| 503 | "\n", |
---|
| 504 | "nav_lon_grid_W.attrs['standard_name'] = 'longitude'\n", |
---|
| 505 | "nav_lon_grid_W.attrs['long_name'] = 'Longitude'\n", |
---|
| 506 | "nav_lon_grid_W.attrs['units'] = 'degrees_east'\n", |
---|
| 507 | "nav_lat_grid_W.attrs['standard_name'] = 'latitude'\n", |
---|
| 508 | "nav_lat_grid_W.attrs['long_name'] = 'Latitude'\n", |
---|
| 509 | "nav_lat_grid_W.attrs['units'] = 'degrees_north'\n", |
---|
| 510 | "\n", |
---|
| 511 | "nav_lon_grid_F.attrs['standard_name'] = 'longitude'\n", |
---|
| 512 | "nav_lon_grid_F.attrs['long_name'] = 'Longitude'\n", |
---|
| 513 | "nav_lon_grid_F.attrs['units'] = 'degrees_east'\n", |
---|
| 514 | "nav_lat_grid_F.attrs['standard_name'] = 'latitude'\n", |
---|
| 515 | "nav_lat_grid_F.attrs['long_name'] = 'Latitude'\n", |
---|
| 516 | "nav_lat_grid_F.attrs['units'] = 'degrees_north'\n", |
---|
| 517 | "\n", |
---|
| 518 | "nav_lon_grid_T.attrs['bounds'] = 'bounds_lon_grid_T'\n", |
---|
| 519 | "nav_lat_grid_T.attrs['bounds'] = 'bounds_lat_grid_T'\n", |
---|
| 520 | "nav_lon_grid_U.attrs['bounds'] = 'bounds_lon_grid_U'\n", |
---|
| 521 | "nav_lat_grid_U.attrs['bounds'] = 'bounds_lat_grid_U'\n", |
---|
| 522 | "nav_lon_grid_V.attrs['bounds'] = 'bounds_lon_grid_V'\n", |
---|
| 523 | "nav_lat_grid_V.attrs['bounds'] = 'bounds_lat_grid_V'\n", |
---|
| 524 | "nav_lon_grid_W.attrs['bounds'] = 'bounds_lon_grid_W'\n", |
---|
| 525 | "nav_lat_grid_W.attrs['bounds'] = 'bounds_lat_grid_W'\n", |
---|
| 526 | "nav_lon_grid_F.attrs['bounds'] = 'bounds_lon_grid_F'\n", |
---|
| 527 | "nav_lat_grid_F.attrs['bounds'] = 'bounds_lat_grid_F'" |
---|
| 528 | ] |
---|
| 529 | }, |
---|
| 530 | { |
---|
| 531 | "cell_type": "code", |
---|
[5939] | 532 | "execution_count": 18, |
---|
[5925] | 533 | "id": "8e4d997c", |
---|
| 534 | "metadata": {}, |
---|
| 535 | "outputs": [], |
---|
| 536 | "source": [ |
---|
[5939] | 537 | "# create new variables e1 e2 to keep f_coord the same\n", |
---|
| 538 | "for cd_type in ['t', 'u', 'v', 'f'] :\n", |
---|
| 539 | " for axis in ['1', '2'] :\n", |
---|
| 540 | " coordName = 'e' + axis + cd_type\n", |
---|
| 541 | " locals()[coordName]=f_coord[coordName].copy()\n", |
---|
[5925] | 542 | "# remove zero values from areas\n", |
---|
| 543 | "# need to be define for the extended grid south of -80S\n", |
---|
| 544 | "# some point are undefined but you need to have e1 and e2 .NE. 0\n", |
---|
[5939] | 545 | " locals()[coordName]=xr.where(locals()[coordName] == 0.0, 1.0e2, locals()[coordName])" |
---|
[5925] | 546 | ] |
---|
| 547 | }, |
---|
| 548 | { |
---|
| 549 | "cell_type": "code", |
---|
[5939] | 550 | "execution_count": 19, |
---|
[5925] | 551 | "id": "175bae75", |
---|
| 552 | "metadata": {}, |
---|
| 553 | "outputs": [], |
---|
| 554 | "source": [ |
---|
| 555 | "# Correct areas for straits\n", |
---|
[5939] | 556 | "if straits :\n", |
---|
| 557 | " # ORCA R2 configuration\n", |
---|
| 558 | " if model == 'ORCA2.3' :\n", |
---|
| 559 | " # Gibraltar : e2u reduced to 20 km\n", |
---|
| 560 | " e2u[101,138:140] = 20.e3\n", |
---|
| 561 | " # Bab el Mandeb : e2u reduced to 30 km\n", |
---|
| 562 | " # e1v reduced to 18 km\n", |
---|
| 563 | " e1v[87,159] = 18.e3\n", |
---|
| 564 | " e2u[87,159] = 30.e3\n", |
---|
| 565 | " # Danish Straits: e2u reduced to 10 km\n", |
---|
| 566 | " e2u[115,144:146] = 10.e3\n", |
---|
| 567 | " # ORCA R1 configuration\n", |
---|
| 568 | " if model == 'eORCA1.2' :\n", |
---|
| 569 | " # Gibraltar : e2u reduced to 20 km\n", |
---|
| 570 | " e2u[240,281:283] = 20.e3\n", |
---|
| 571 | " # Bhosporus : e2u reduced to 10 km\n", |
---|
| 572 | " e2u[247,313:315] = 10.e3\n", |
---|
| 573 | " # Lombok : e1v reduced to 13 km\n", |
---|
| 574 | " e1v[163:165,43] = 13.e3\n", |
---|
| 575 | " # Sumba : e1v reduced to 8 km\n", |
---|
| 576 | " e1v[163:165,47] = 8.e3\n", |
---|
| 577 | " # Ombai : e1v reduced to 13 km\n", |
---|
| 578 | " e1v[163:165,52] = 13.e3\n", |
---|
| 579 | " # Timor Passage : e1v reduced to 20 km\n", |
---|
| 580 | " #e1v[163:165,55] = 20.e3\n", |
---|
| 581 | " # W Halmahera : e1v reduced to 30 km\n", |
---|
| 582 | " e1v[180:182,54] = 30.e3\n", |
---|
| 583 | " # E Halmahera : e1v reduced to 50 km\n", |
---|
| 584 | " e1v[180:182,57] = 50.e3\n", |
---|
| 585 | " # ORCA R05 configuration\n", |
---|
| 586 | " if model == 'ORCA.05' :\n", |
---|
| 587 | " # Reduced e2u at the Gibraltar Strait\n", |
---|
| 588 | " e2u[326,562:564] = 20.e3\n", |
---|
| 589 | " # Reduced e2u at the Bosphore Strait\n", |
---|
| 590 | " e2u[342,626:628] = 10.e3\n", |
---|
| 591 | " # Reduced e2u at the Sumba Strait\n", |
---|
| 592 | " e2u[231,92:94] = 40.e3\n", |
---|
| 593 | " # Reduced e2u at the Ombai Strait\n", |
---|
| 594 | " e2u[231,102] = 15.e3\n", |
---|
| 595 | " # Reduced e2u at the Palk Strait\n", |
---|
| 596 | " e2u[269,14] = 10.e3\n", |
---|
| 597 | " # Reduced e1v at the Lombok Strait\n", |
---|
| 598 | " e1v[231:233,86] = 10.e3\n", |
---|
| 599 | " # Reduced e1v at the Bab el Mandeb\n", |
---|
| 600 | " e1v[275,661] = 25.e3" |
---|
[5925] | 601 | ] |
---|
| 602 | }, |
---|
| 603 | { |
---|
| 604 | "cell_type": "code", |
---|
[5939] | 605 | "execution_count": 20, |
---|
[5925] | 606 | "id": "4f6cfbca", |
---|
| 607 | "metadata": {}, |
---|
| 608 | "outputs": [], |
---|
| 609 | "source": [ |
---|
[5939] | 610 | "if coordperio :\n", |
---|
| 611 | " area_grid_T = nemo.lbc (e1t*e2t, nperio=nperio, cd_type='T')\n", |
---|
| 612 | " area_grid_U = nemo.lbc (e1u*e2u, nperio=nperio, cd_type='U',nemo_4U_bug=nemoUbug)\n", |
---|
| 613 | " area_grid_V = nemo.lbc (e1v*e2v, nperio=nperio, cd_type='V')\n", |
---|
| 614 | " area_grid_W = nemo.lbc (e1t*e2t, nperio=nperio, cd_type='W')\n", |
---|
| 615 | " area_grid_F = nemo.lbc (e1f*e2f, nperio=nperio, cd_type='F')\n", |
---|
| 616 | "else :\n", |
---|
| 617 | " area_grid_T = e1t*e2t\n", |
---|
| 618 | " area_grid_U = e1u*e2u\n", |
---|
| 619 | " area_grid_V = e1v*e2v\n", |
---|
| 620 | " area_grid_W = e1t*e2t\n", |
---|
| 621 | " area_grid_F = e1f*e2f\n", |
---|
[5925] | 622 | "\n", |
---|
[5939] | 623 | "\n", |
---|
[5925] | 624 | "area_grid_T.name = 'area_grid_T'\n", |
---|
| 625 | "area_grid_U.name = 'area_grid_U'\n", |
---|
| 626 | "area_grid_V.name = 'area_grid_V'\n", |
---|
| 627 | "area_grid_F.name = 'area_grid_F'\n", |
---|
| 628 | "area_grid_W.name = 'area_grid_W'\n", |
---|
| 629 | "\n", |
---|
| 630 | "area_grid_T = area_grid_T.rename ({'y':'y_grid_T', 'x':'x_grid_T'})\n", |
---|
| 631 | "area_grid_U = area_grid_U.rename ({'y':'y_grid_U', 'x':'x_grid_U'})\n", |
---|
| 632 | "area_grid_V = area_grid_V.rename ({'y':'y_grid_V', 'x':'x_grid_V'})\n", |
---|
| 633 | "area_grid_W = area_grid_W.rename ({'y':'y_grid_W', 'x':'x_grid_W'})\n", |
---|
| 634 | "area_grid_F = area_grid_F.rename ({'y':'y_grid_F', 'x':'x_grid_F'})\n", |
---|
| 635 | "\n", |
---|
| 636 | "area_grid_T.attrs['standard_name'] = 'cell_area'\n", |
---|
| 637 | "area_grid_T.attrs['units'] = 'm2'\n", |
---|
[5939] | 638 | "#area_grid_T.attrs['coordinates'] = 'nav_lat_grid_T nav_lon_grid_T'\n", |
---|
[5925] | 639 | "area_grid_U.attrs['standard_name'] = 'cell_area'\n", |
---|
| 640 | "area_grid_U.attrs['units'] = 'm2'\n", |
---|
[5939] | 641 | "#area_grid_U.attrs['coordinates'] = 'nav_lat_grid_U nav_lon_grid_U'\n", |
---|
[5925] | 642 | "area_grid_V.attrs['standard_name'] = 'cell_area'\n", |
---|
| 643 | "area_grid_V.attrs['units'] = 'm2'\n", |
---|
[5939] | 644 | "#area_grid_V.attrs['coordinates'] = 'nav_lat_grid_V nav_lon_grid_V'\n", |
---|
[5925] | 645 | "area_grid_W.attrs['standard_name'] = 'cell_area'\n", |
---|
| 646 | "area_grid_W.attrs['units'] = 'm2'\n", |
---|
[5939] | 647 | "#area_grid_W.attrs['coordinates'] = 'nav_lat_grid_W nav_lon_grid_W'\n", |
---|
[5925] | 648 | "area_grid_F.attrs['standard_name'] = 'cell_area'\n", |
---|
| 649 | "area_grid_F.attrs['units'] = 'm2'\n", |
---|
[5939] | 650 | "#area_grid_F.attrs['coordinates'] = 'nav_lat_grid_F nav_lon_grid_F'\n", |
---|
| 651 | "\n", |
---|
| 652 | "for cd_type in ['T', 'U', 'V', 'F', 'W'] :\n", |
---|
| 653 | " areaName = 'area_grid_' + cd_type\n", |
---|
| 654 | " locals()[areaName].encoding['_FillValue'] = None" |
---|
[5925] | 655 | ] |
---|
| 656 | }, |
---|
| 657 | { |
---|
| 658 | "cell_type": "markdown", |
---|
| 659 | "id": "3c6f7b08", |
---|
| 660 | "metadata": {}, |
---|
| 661 | "source": [ |
---|
| 662 | "## Construct bounds" |
---|
| 663 | ] |
---|
| 664 | }, |
---|
| 665 | { |
---|
| 666 | "cell_type": "code", |
---|
[5939] | 667 | "execution_count": 21, |
---|
[5925] | 668 | "id": "69c404d9", |
---|
| 669 | "metadata": {}, |
---|
| 670 | "outputs": [], |
---|
| 671 | "source": [ |
---|
| 672 | "def set_bounds (cdgrd) :\n", |
---|
| 673 | " '''\n", |
---|
| 674 | " Constructs lon/lat bounds\n", |
---|
| 675 | " Bounds are numerated counter clockwise, from bottom left\n", |
---|
| 676 | " See NEMO file OPA_SRC/IOM/iom.F90, ROUTINE set_grid_bounds, for more details\n", |
---|
| 677 | " '''\n", |
---|
| 678 | " # Define offset of coordinate representing bottom-left corner\n", |
---|
| 679 | " if cdgrd in ['T', 'W'] : \n", |
---|
| 680 | " icnr = -1 ; jcnr = -1\n", |
---|
[5939] | 681 | " corner_lon = f_coord ['glamf'].copy() ; corner_lat = f_coord ['gphif'].copy()\n", |
---|
| 682 | " center_lon = f_coord ['glamt'].copy() ; center_lat = f_coord ['gphit'].copy()\n", |
---|
[5925] | 683 | " if cdgrd == 'U' : \n", |
---|
| 684 | " icnr = 0 ; jcnr = -1\n", |
---|
[5939] | 685 | " corner_lon = f_coord ['glamv'].copy() ; corner_lat = f_coord ['gphiv'].copy()\n", |
---|
| 686 | " center_lon = f_coord ['glamu'].copy() ; center_lat = f_coord ['gphiu'].copy()\n", |
---|
[5925] | 687 | " if cdgrd == 'V' : \n", |
---|
| 688 | " icnr = -1 ; jcnr = 0\n", |
---|
[5939] | 689 | " corner_lon = f_coord ['glamu'].copy() ; corner_lat = f_coord ['gphiu'].copy()\n", |
---|
| 690 | " center_lon = f_coord ['glamv'].copy() ; center_lat = f_coord ['gphiv'].copy()\n", |
---|
[5925] | 691 | " if cdgrd == 'F' : \n", |
---|
| 692 | " icnr = -1 ; jcnr = -1\n", |
---|
[5939] | 693 | " corner_lon = f_coord ['glamt'].copy() ; corner_lat = f_coord ['gphit'].copy()\n", |
---|
| 694 | " center_lon = f_coord ['glamf'].copy() ; center_lat = f_coord ['gphif'].copy()\n", |
---|
| 695 | " \n", |
---|
| 696 | " #y_grid, x_grid = corner_lon.shape ;\n", |
---|
| 697 | " nvertex = 4\n", |
---|
[5925] | 698 | " dims = ['y_grid_' + cdgrd, 'x_grid_' + cdgrd, 'nvertex_grid_' + cdgrd]\n", |
---|
| 699 | " \n", |
---|
[5939] | 700 | " bounds_lon = xr.DataArray (np.zeros ((jpj, jpi, nvertex)), dims=dims)\n", |
---|
| 701 | " bounds_lat = xr.DataArray (np.zeros ((jpj, jpi, nvertex)), dims=dims)\n", |
---|
[5925] | 702 | " \n", |
---|
| 703 | " idx = [(jcnr,icnr), (jcnr,icnr+1), (jcnr+1,icnr+1), (jcnr+1,icnr)]\n", |
---|
| 704 | " \n", |
---|
| 705 | " # Compute cell vertices that can be defined, \n", |
---|
| 706 | " # and complete with periodicity\n", |
---|
| 707 | " for nn in range (nvertex) :\n", |
---|
[5939] | 708 | " tmp = np.roll (corner_lon, shift=tuple(-1*np.array(idx[nn])), axis=(-2,-1))\n", |
---|
| 709 | " bounds_lon[1:jpj,1:jpi,nn] = tmp[1:jpj,1:jpi]\n", |
---|
| 710 | " tmp = np.roll (corner_lat, shift=tuple(-1*np.array(idx[nn])), axis=(-2,-1))\n", |
---|
| 711 | " bounds_lat[1:jpj,1:jpi,nn] = tmp[1:jpj,1:jpi]\n", |
---|
| 712 | " bounds_lon[:,:,nn] = nemo.lbc (bounds_lon[:,:,nn], nperio=nperio, cd_type=cdgrd, nemo_4U_bug=nemoUbug)\n", |
---|
| 713 | " bounds_lat[:,:,nn] = nemo.lbc (bounds_lat[:,:,nn], nperio=nperio, cd_type=cdgrd, nemo_4U_bug=nemoUbug)\n", |
---|
[5925] | 714 | " \n", |
---|
[5939] | 715 | " # Zero-size cells at closed boundaries if cell points provided,\n", |
---|
| 716 | " # otherwise they are closed cells with unrealistic bounds\n", |
---|
| 717 | " if not (nperio == 1 or nperio == 4 or nperio == 6) :\n", |
---|
| 718 | " for nn in range (nvertex) : \n", |
---|
| 719 | " bounds_lon[:,0,nn] = center_lon[:,0] # (West or jpni = 1), closed E-W\n", |
---|
| 720 | " bounds_lat[:,0,nn] = center_lat[:,0]\n", |
---|
| 721 | " bounds_lon[:,jpi,nn] = center_lon[:,jpi] # (East or jpni = 1), closed E-W\n", |
---|
| 722 | " bounds_lat[:,jpi,nn] = center_lat[:,jpi]\n", |
---|
| 723 | " if nperio != 2 :\n", |
---|
| 724 | " for nn in range (nvertex) :\n", |
---|
| 725 | " bounds_lon[0,:,nn] = center_lon[0,:] # (South or jpnj = 1), not symmetric\n", |
---|
| 726 | " bounds_lat[0,:,nn] = center_lat[0,:]\n", |
---|
| 727 | " if nperio < 3 :\n", |
---|
| 728 | " for nn in range (nvertex) :\n", |
---|
| 729 | " bounds_lon[jpj,:,nn] = center_lon[jpj,:] # (North or jpnj = 1), no north fold\n", |
---|
| 730 | " bounds_lat[jpj,:,nn] = center_lat[jpj,:]\n", |
---|
| 731 | " \n", |
---|
[5925] | 732 | " # Rotate cells at the north fold\n", |
---|
| 733 | " if nperio >= 3 :\n", |
---|
| 734 | " # Working array for location of northfold\n", |
---|
[5939] | 735 | " z_fld = nemo.lbc (np.ones ((jpj, jpi)), nperio=nperio, cd_type=cdgrd, psgn=-1., nemo_4U_bug=nemoUbug)\n", |
---|
| 736 | " z_fld = np.repeat((z_fld == -1.0)[...,np.newaxis],4,axis=2)\n", |
---|
| 737 | " # circular shift of 2 indices in bounds third index\n", |
---|
| 738 | " bounds_lon_tmp = np.roll (bounds_lon, shift=-2, axis=2)\n", |
---|
| 739 | " bounds_lat_tmp = np.roll (bounds_lat, shift=-2, axis=2)\n", |
---|
| 740 | " bounds_lon[:,:,:] = np.where (z_fld, bounds_lon_tmp[:,:,:] , bounds_lon[:,:,:] )\n", |
---|
| 741 | " bounds_lat[:,:,:] = np.where (z_fld, bounds_lat_tmp[:,:,:] , bounds_lat[:,:,:] )\n", |
---|
[5925] | 742 | " \n", |
---|
| 743 | " # Invert cells at the symmetric equator\n", |
---|
| 744 | " if nperio == 2 :\n", |
---|
[5939] | 745 | " bounds_lon_tmp = np.roll (bounds_lon, shift=-2, axis=2)\n", |
---|
| 746 | " bounds_lat_tmp = np.roll (bounds_lat, shift=-2, axis=2)\n", |
---|
| 747 | " bounds_lon [0,:,:] = bounds_lon [0,:,:]\n", |
---|
| 748 | " bounds_lat [0,:,:] = bounds_lat [0,:,:]\n", |
---|
[5925] | 749 | " \n", |
---|
[5939] | 750 | " #bounds_lon.attrs['coordinates'] = 'nav_lat_grid_' + cdgrd + ' nav_lon_grid_' + cdgrd\n", |
---|
| 751 | " #bounds_lat.attrs['coordinates'] = 'nav_lat_grid_' + cdgrd + ' nav_lon_grid_' + cdgrd\n", |
---|
[5925] | 752 | " bounds_lon.attrs['units'] = 'degrees_east'\n", |
---|
| 753 | " bounds_lat.attrs['units'] = 'degrees_north'\n", |
---|
| 754 | " bounds_lon.name = 'bounds_lon_grid_' + cdgrd\n", |
---|
| 755 | " bounds_lat.name = 'bounds_lat_grid_' + cdgrd\n", |
---|
[5939] | 756 | " # remove _FillValue\n", |
---|
| 757 | " bounds_lon.encoding['_FillValue'] = None\n", |
---|
| 758 | " bounds_lat.encoding['_FillValue'] = None\n", |
---|
[5925] | 759 | "\n", |
---|
| 760 | " return bounds_lon, bounds_lat" |
---|
| 761 | ] |
---|
| 762 | }, |
---|
| 763 | { |
---|
| 764 | "cell_type": "code", |
---|
[5939] | 765 | "execution_count": 22, |
---|
[5925] | 766 | "id": "87a8f592", |
---|
| 767 | "metadata": {}, |
---|
| 768 | "outputs": [], |
---|
| 769 | "source": [ |
---|
| 770 | "bounds_lon_grid_T, bounds_lat_grid_T = set_bounds ('T')\n", |
---|
| 771 | "bounds_lon_grid_U, bounds_lat_grid_U = set_bounds ('U')\n", |
---|
| 772 | "bounds_lon_grid_V, bounds_lat_grid_V = set_bounds ('V')\n", |
---|
| 773 | "bounds_lon_grid_W, bounds_lat_grid_W = set_bounds ('W')\n", |
---|
| 774 | "bounds_lon_grid_F, bounds_lat_grid_F = set_bounds ('F')" |
---|
| 775 | ] |
---|
| 776 | }, |
---|
| 777 | { |
---|
| 778 | "cell_type": "markdown", |
---|
| 779 | "id": "5dbf22b3", |
---|
| 780 | "metadata": {}, |
---|
| 781 | "source": [ |
---|
| 782 | "## Save Data in a NetCDF file" |
---|
| 783 | ] |
---|
| 784 | }, |
---|
| 785 | { |
---|
| 786 | "cell_type": "code", |
---|
[5939] | 787 | "execution_count": 23, |
---|
[5925] | 788 | "id": "ca87fa1b", |
---|
| 789 | "metadata": {}, |
---|
| 790 | "outputs": [], |
---|
| 791 | "source": [ |
---|
| 792 | "ds = xr.Dataset ({\n", |
---|
| 793 | " 'mask_T' : mask_T ,\n", |
---|
| 794 | " 'mask_U' : mask_U ,\n", |
---|
| 795 | " 'mask_V' : mask_V ,\n", |
---|
| 796 | " 'mask_W' : mask_W ,\n", |
---|
| 797 | " 'mask_F' : mask_F ,\n", |
---|
| 798 | " 'area_grid_T' : area_grid_T,\n", |
---|
| 799 | " 'area_grid_U' : area_grid_U,\n", |
---|
| 800 | " 'area_grid_V' : area_grid_V,\n", |
---|
| 801 | " 'area_grid_W' : area_grid_W,\n", |
---|
| 802 | " 'area_grid_F' : area_grid_F,\n", |
---|
| 803 | " 'maskutil_T' : maskutil_T ,\n", |
---|
| 804 | " 'maskutil_U' : maskutil_U ,\n", |
---|
| 805 | " 'maskutil_V' : maskutil_V ,\n", |
---|
| 806 | " 'maskutil_W' : maskutil_W ,\n", |
---|
| 807 | " 'maskutil_F' : maskutil_F ,\n", |
---|
| 808 | " 'bounds_lon_grid_T': bounds_lon_grid_T,\n", |
---|
| 809 | " 'bounds_lat_grid_T': bounds_lat_grid_T,\n", |
---|
| 810 | " 'bounds_lon_grid_U': bounds_lon_grid_U,\n", |
---|
| 811 | " 'bounds_lat_grid_U': bounds_lat_grid_U,\n", |
---|
| 812 | " 'bounds_lon_grid_V': bounds_lon_grid_V,\n", |
---|
| 813 | " 'bounds_lat_grid_V': bounds_lat_grid_V,\n", |
---|
| 814 | " 'bounds_lon_grid_W': bounds_lon_grid_W,\n", |
---|
| 815 | " 'bounds_lat_grid_W': bounds_lat_grid_W,\n", |
---|
| 816 | " 'bounds_lon_grid_F': bounds_lon_grid_F,\n", |
---|
| 817 | " 'bounds_lat_grid_F': bounds_lat_grid_F,\n", |
---|
| 818 | "})\n", |
---|
[5939] | 819 | "#replace nav_lon nav_lat with variables obtained from NEMO coordinates.nc file\n", |
---|
| 820 | "#by construction nav_lon nav_lat are those of the bathymetry \n", |
---|
[5925] | 821 | "for cd_type in ['T', 'U', 'V', 'F', 'W'] :\n", |
---|
| 822 | " for dir_type in ['lat', 'lon'] :\n", |
---|
| 823 | " coord_name = 'nav_' + dir_type + '_grid_' + cd_type\n", |
---|
| 824 | " ds.coords[coord_name]=locals()[coord_name]\n", |
---|
| 825 | "\n", |
---|
| 826 | "ds.attrs['name'] = 'coordinates_mask'\n", |
---|
| 827 | "ds.attrs['description'] = 'coordinates and mask for MOSAIX'\n", |
---|
| 828 | "ds.attrs['title'] = 'coordinates_mask'\n", |
---|
| 829 | "ds.attrs['source'] = 'IPSL Earth system model'\n", |
---|
| 830 | "ds.attrs['group'] = 'ICMC IPSL Climate Modelling Center'\n", |
---|
| 831 | "ds.attrs['Institution'] = 'IPSL https.//www.ipsl.fr'\n", |
---|
| 832 | "ds.attrs['Model'] = model\n", |
---|
| 833 | "ds.attrs['timeStamp'] = '{:%Y-%b-%d %H:%M:%S}'.format (datetime.datetime.now ())\n", |
---|
| 834 | "ds.attrs['history'] = 'Build from ' + n_coord + ' and ' + n_bathy\n", |
---|
| 835 | "ds.attrs['directory'] = os.getcwd ()\n", |
---|
| 836 | "ds.attrs['user'] = os.getlogin ()\n", |
---|
| 837 | "ds.attrs['HOSTNAME'] = platform.node ()\n", |
---|
| 838 | "ds.attrs['Python'] = 'Python version: ' + platform.python_version ()\n", |
---|
| 839 | "ds.attrs['xarray'] = 'xarray version: ' + xr.__version__\n", |
---|
| 840 | "ds.attrs['OS'] = platform.system ()\n", |
---|
| 841 | "ds.attrs['release'] = platform.release ()\n", |
---|
| 842 | "ds.attrs['hardware'] = platform.machine ()\n", |
---|
| 843 | "\n", |
---|
[5930] | 844 | "ds.attrs['SVN_Author'] = \"$Author$\"\n", |
---|
| 845 | "ds.attrs['SVN_Date'] = \"$Date$\"\n", |
---|
| 846 | "ds.attrs['SVN_Revision'] = \"$Revision$\"\n", |
---|
| 847 | "ds.attrs['SVN_Id'] = \"$Id$\"\n", |
---|
| 848 | "ds.attrs['SVN_HeadURL'] = \"$HeadURL$\"" |
---|
[5925] | 849 | ] |
---|
| 850 | }, |
---|
| 851 | { |
---|
| 852 | "cell_type": "code", |
---|
[5939] | 853 | "execution_count": 24, |
---|
[5925] | 854 | "id": "41391c22", |
---|
| 855 | "metadata": {}, |
---|
| 856 | "outputs": [], |
---|
| 857 | "source": [ |
---|
| 858 | "ds.to_netcdf (n_out)" |
---|
| 859 | ] |
---|
| 860 | }, |
---|
| 861 | { |
---|
| 862 | "cell_type": "markdown", |
---|
| 863 | "id": "75143732", |
---|
| 864 | "metadata": {}, |
---|
| 865 | "source": [ |
---|
| 866 | "# That's all folk's !" |
---|
| 867 | ] |
---|
| 868 | }, |
---|
| 869 | { |
---|
| 870 | "cell_type": "code", |
---|
| 871 | "execution_count": null, |
---|
| 872 | "id": "88457886", |
---|
| 873 | "metadata": {}, |
---|
| 874 | "outputs": [], |
---|
| 875 | "source": [] |
---|
| 876 | } |
---|
| 877 | ], |
---|
| 878 | "metadata": { |
---|
| 879 | "kernelspec": { |
---|
| 880 | "display_name": "Python 3", |
---|
| 881 | "language": "python", |
---|
| 882 | "name": "python3" |
---|
| 883 | }, |
---|
| 884 | "language_info": { |
---|
| 885 | "codemirror_mode": { |
---|
| 886 | "name": "ipython", |
---|
| 887 | "version": 3 |
---|
| 888 | }, |
---|
| 889 | "file_extension": ".py", |
---|
| 890 | "mimetype": "text/x-python", |
---|
| 891 | "name": "python", |
---|
| 892 | "nbconvert_exporter": "python", |
---|
| 893 | "pygments_lexer": "ipython3", |
---|
| 894 | "version": "3.8.10" |
---|
| 895 | } |
---|
| 896 | }, |
---|
| 897 | "nbformat": 4, |
---|
| 898 | "nbformat_minor": 5 |
---|
| 899 | } |
---|