1
+ {
2
+ "cells" : [
3
+ {
4
+ "cell_type" : " code" ,
5
+ "execution_count" : null ,
6
+ "metadata" : {
7
+ "collapsed" : false
8
+ },
9
+ "outputs" : [],
10
+ "source" : [
11
+ " %matplotlib inline"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type" : " markdown" ,
16
+ "metadata" : {},
17
+ "source" : [
18
+ " \n # Eddy detection Gulf stream\n\n Script will detect eddies on adt field, and compute u,v with method add_uv(which could use, only if equator is avoid)\n\n Figures will show different step to detect eddies.\n "
19
+ ]
20
+ },
21
+ {
22
+ "cell_type" : " code" ,
23
+ "execution_count" : null ,
24
+ "metadata" : {
25
+ "collapsed" : false
26
+ },
27
+ "outputs" : [],
28
+ "source" : [
29
+ " from datetime import datetime\n from matplotlib import pyplot as plt\n from py_eddy_tracker.dataset.grid import RegularGridDataset\n from py_eddy_tracker import data\n from py_eddy_tracker.eddy_feature import Contours"
30
+ ]
31
+ },
32
+ {
33
+ "cell_type" : " code" ,
34
+ "execution_count" : null ,
35
+ "metadata" : {
36
+ "collapsed" : false
37
+ },
38
+ "outputs" : [],
39
+ "source" : [
40
+ " def start_axes(title):\n fig = plt.figure(figsize=(13, 8))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94])\n ax.set_xlim(279, 304), ax.set_ylim(29, 44)\n ax.set_aspect(\" equal\" )\n ax.set_title(title)\n return ax\n\n\n def update_axes(ax, mappable=None):\n ax.grid()\n if mappable:\n plt.colorbar(mappable, cax=ax.figure.add_axes([0.95, 0.05, 0.01, 0.9]))"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type" : " markdown" ,
45
+ "metadata" : {},
46
+ "source" : [
47
+ " Load Input grid, ADT will be used to detect eddies\n\n "
48
+ ]
49
+ },
50
+ {
51
+ "cell_type" : " code" ,
52
+ "execution_count" : null ,
53
+ "metadata" : {
54
+ "collapsed" : false
55
+ },
56
+ "outputs" : [],
57
+ "source" : [
58
+ " margin = 30\n g = RegularGridDataset(\n data.get_path(\" nrt_global_allsat_phy_l4_20190223_20190226.nc\" ),\n \" longitude\" ,\n \" latitude\" ,\n # Manual area subset\n indexs=dict(\n longitude=slice(1116 - margin, 1216 + margin),\n latitude=slice(476 - margin, 536 + margin),\n ),\n )\n\n ax = start_axes(\" ADT (m)\" )\n m = g.display(ax, \" adt\" , vmin=-0.15, vmax=1)\n # Draw line on the gulf stream front\n great_current = Contours(g.x_c, g.y_c, g.grid(\" adt\" ), levels=(0.35,), keep_unclose=True)\n great_current.display(ax, color=\" k\" )\n update_axes(ax, m)"
59
+ ]
60
+ },
61
+ {
62
+ "cell_type" : " markdown" ,
63
+ "metadata" : {},
64
+ "source" : [
65
+ " ## Get u/v\n U/V are deduced from ADT, this algortihm are not usable around equator (~+- 2\u00b0 )\n\n "
66
+ ]
67
+ },
68
+ {
69
+ "cell_type" : " code" ,
70
+ "execution_count" : null ,
71
+ "metadata" : {
72
+ "collapsed" : false
73
+ },
74
+ "outputs" : [],
75
+ "source" : [
76
+ " g.add_uv(\" adt\" )"
77
+ ]
78
+ },
79
+ {
80
+ "cell_type" : " markdown" ,
81
+ "metadata" : {},
82
+ "source" : [
83
+ " ## Pre-processings\n Apply high filter to remove long scale to highlight mesoscale\n\n "
84
+ ]
85
+ },
86
+ {
87
+ "cell_type" : " code" ,
88
+ "execution_count" : null ,
89
+ "metadata" : {
90
+ "collapsed" : false
91
+ },
92
+ "outputs" : [],
93
+ "source" : [
94
+ " g.bessel_high_filter(\" adt\" , 700)\n ax = start_axes(\" ADT (m) filtered (700km)\" )\n m = g.display(ax, \" adt\" , vmin=-0.25, vmax=0.25)\n great_current.display(ax, color=\" k\" )\n update_axes(ax, m)"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type" : " markdown" ,
99
+ "metadata" : {},
100
+ "source" : [
101
+ " ## Identification\n run identification with slice of 2 mm\n\n "
102
+ ]
103
+ },
104
+ {
105
+ "cell_type" : " code" ,
106
+ "execution_count" : null ,
107
+ "metadata" : {
108
+ "collapsed" : false
109
+ },
110
+ "outputs" : [],
111
+ "source" : [
112
+ " date = datetime(2016, 5, 15)\n a, c = g.eddy_identification(\" adt\" , \" u\" , \" v\" , date, 0.002)"
113
+ ]
114
+ },
115
+ {
116
+ "cell_type" : " markdown" ,
117
+ "metadata" : {},
118
+ "source" : [
119
+ " All closed contour found in this input grid (Display only 1 contour every 5)\n\n "
120
+ ]
121
+ },
122
+ {
123
+ "cell_type" : " code" ,
124
+ "execution_count" : null ,
125
+ "metadata" : {
126
+ "collapsed" : false
127
+ },
128
+ "outputs" : [],
129
+ "source" : [
130
+ " ax = start_axes(\" ADT closed contour (only 1 / 5 levels)\" )\n g.contours.display(ax, step=5, lw=1)\n great_current.display(ax, color=\" k\" )\n update_axes(ax)"
131
+ ]
132
+ },
133
+ {
134
+ "cell_type" : " markdown" ,
135
+ "metadata" : {},
136
+ "source" : [
137
+ " Contours include in eddies\n\n "
138
+ ]
139
+ },
140
+ {
141
+ "cell_type" : " code" ,
142
+ "execution_count" : null ,
143
+ "metadata" : {
144
+ "collapsed" : false
145
+ },
146
+ "outputs" : [],
147
+ "source" : [
148
+ " ax = start_axes(\" ADT contour used as eddies\" )\n g.contours.display(ax, only_used=True, lw=0.25)\n great_current.display(ax, color=\" k\" )\n update_axes(ax)"
149
+ ]
150
+ },
151
+ {
152
+ "cell_type" : " markdown" ,
153
+ "metadata" : {},
154
+ "source" : [
155
+ " Contours reject from several origin (shape error to high, several extremum in contour, ...)\n\n "
156
+ ]
157
+ },
158
+ {
159
+ "cell_type" : " code" ,
160
+ "execution_count" : null ,
161
+ "metadata" : {
162
+ "collapsed" : false
163
+ },
164
+ "outputs" : [],
165
+ "source" : [
166
+ " ax = start_axes(\" ADT contour reject\" )\n g.contours.display(ax, only_unused=True, lw=0.25)\n great_current.display(ax, color=\" k\" )\n update_axes(ax)"
167
+ ]
168
+ },
169
+ {
170
+ "cell_type" : " markdown" ,
171
+ "metadata" : {},
172
+ "source" : [
173
+ " Contours closed which contains several eddies\n\n "
174
+ ]
175
+ },
176
+ {
177
+ "cell_type" : " code" ,
178
+ "execution_count" : null ,
179
+ "metadata" : {
180
+ "collapsed" : false
181
+ },
182
+ "outputs" : [],
183
+ "source" : [
184
+ " ax = start_axes(\" ADT contour reject but which contain eddies\" )\n g.contours.label_contour_unused_which_contain_eddies(a)\n g.contours.label_contour_unused_which_contain_eddies(c)\n g.contours.display(\n ax, only_contain_eddies=True, color=\" k\" , lw=1, label=\" Could be interaction contour\"\n )\n a.display(ax, color=\" r\" , linewidth=0.5, label=\" Anticyclonic\" , ref=-10)\n c.display(ax, color=\" b\" , linewidth=0.5, label=\" Cyclonic\" , ref=-10)\n ax.legend()\n update_axes(ax)"
185
+ ]
186
+ },
187
+ {
188
+ "cell_type" : " markdown" ,
189
+ "metadata" : {},
190
+ "source" : [
191
+ " ## Output\n Display detected eddies, dashed lines represent effective contour\n and solid lines represent contour of maximum of speed. See figure 1 of https://doi.org/10.1175/JTECH-D-14-00019.1\n\n "
192
+ ]
193
+ },
194
+ {
195
+ "cell_type" : " code" ,
196
+ "execution_count" : null ,
197
+ "metadata" : {
198
+ "collapsed" : false
199
+ },
200
+ "outputs" : [],
201
+ "source" : [
202
+ " ax = start_axes(\" Eddies detected\" )\n a.display(ax, color=\" r\" , linewidth=0.5, label=\" Anticyclonic\" , ref=-10)\n c.display(ax, color=\" b\" , linewidth=0.5, label=\" Cyclonic\" , ref=-10)\n ax.legend()\n great_current.display(ax, color=\" k\" )\n update_axes(ax)"
203
+ ]
204
+ },
205
+ {
206
+ "cell_type" : " markdown" ,
207
+ "metadata" : {},
208
+ "source" : [
209
+ " Display speed radius of eddies detected\n\n "
210
+ ]
211
+ },
212
+ {
213
+ "cell_type" : " code" ,
214
+ "execution_count" : null ,
215
+ "metadata" : {
216
+ "collapsed" : false
217
+ },
218
+ "outputs" : [],
219
+ "source" : [
220
+ " ax = start_axes(\" Eddies speed radius (km)\" )\n a.filled(ax, \" radius_e\" , vmin=10, vmax=150, cmap=\" magma_r\" , factor=0.001, lut=14)\n m = c.filled(ax, \" radius_e\" , vmin=10, vmax=150, cmap=\" magma_r\" , factor=0.001, lut=14)\n great_current.display(ax, color=\" k\" )\n update_axes(ax, m)"
221
+ ]
222
+ }
223
+ ],
224
+ "metadata" : {
225
+ "kernelspec" : {
226
+ "display_name" : " Python 3" ,
227
+ "language" : " python" ,
228
+ "name" : " python3"
229
+ },
230
+ "language_info" : {
231
+ "codemirror_mode" : {
232
+ "name" : " ipython" ,
233
+ "version" : 3
234
+ },
235
+ "file_extension" : " .py" ,
236
+ "mimetype" : " text/x-python" ,
237
+ "name" : " python" ,
238
+ "nbconvert_exporter" : " python" ,
239
+ "pygments_lexer" : " ipython3" ,
240
+ "version" : " 3.7.7"
241
+ }
242
+ },
243
+ "nbformat" : 4 ,
244
+ "nbformat_minor" : 0
245
+ }
0 commit comments