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