Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

greenspline.rst 19 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
  1. .. index:: ! greenspline
  2. .. include:: module_core_purpose.rst_
  3. ***********
  4. greenspline
  5. ***********
  6. |greenspline_purpose|
  7. Synopsis
  8. --------
  9. .. include:: common_SYN_OPTs.rst_
  10. **gmt greenspline** [ *table* ]
  11. [ |-A|\ *gradfile*\ **+f**\ **1**\|\ **2**\|\ **3**\|\ **4**\|\ **5** ]
  12. [ |-C|\ [**n**]\ *value*\ [%][**+f**\ *file*][**+m**\|\ **M**] ]
  13. [ |-D|\ *mode* ]
  14. [ |-E|\ [*misfitfile*] ]
  15. [ |-G|\ *grdfile* ]
  16. [ |-I|\ *xinc*\ [/*yinc*\ [/*zinc*]] ]
  17. [ |-L| ]
  18. [ |-N|\ *nodefile* ]
  19. [ |-Q|\ *az*\|\ *x/y/z* ]
  20. [ **-R**\ *xmin*/*xmax*\ [/*ymin*/*ymax*\ [/*zmin*/*zmax*]] ]
  21. [ |-S|\ **c\|t\|l\|r\|p\|q**\ [*pars*] ] [ |-T|\ *maskgrid* ]
  22. [ |SYN_OPT-V| ]
  23. [ |-W|\ [**w**]]
  24. [ |SYN_OPT-b| ]
  25. [ |SYN_OPT-d| ]
  26. [ |SYN_OPT-e| ]
  27. [ |SYN_OPT-f| ]
  28. [ |SYN_OPT-h| ]
  29. [ |SYN_OPT-o| ]
  30. [ |SYN_OPT-q| ]
  31. [ |SYN_OPT-x| ]
  32. [ |SYN_OPT-:| ]
  33. [ |SYN_OPT--| ]
  34. |No-spaces|
  35. Description
  36. -----------
  37. **greenspline** uses the Green's function G(\ **x**; **x'**) for the
  38. chosen spline and geometry to interpolate data at regular [or arbitrary]
  39. output locations. Mathematically, the solution is composed as
  40. *w*\ (**x**) = sum {*c*\ (*i*) G(\ **x'**; **x**\ (*i*))}, for *i* = 1,
  41. *n*, the number of data points {**x**\ (*i*), *w*\ (*i*)}. Once the *n*
  42. coefficients *c*\ (*i*) have been found the sum can be evaluated at any
  43. output point **x**. Choose between minimum curvature, regularized, or
  44. continuous curvature splines in tension for either 1-D, 2-D, or 3-D
  45. Cartesian coordinates or spherical surface coordinates. After first
  46. removing a linear or planar trend (Cartesian geometries) or mean value
  47. (spherical surface) and normalizing these residuals, the least-squares
  48. matrix solution for the spline coefficients *c*\ (*i*) is found by
  49. solving the *n* by *n* linear system *w*\ (*j*) = sum-over-*i*
  50. {*c*\ (*i*) G(\ **x**\ (*j*); **x**\ (*i*))}, for *j* = 1, *n*; this
  51. solution yields an exact interpolation of the supplied data points.
  52. Alternatively, you may choose to perform a singular value decomposition
  53. (SVD) and eliminate the contribution from the smallest eigenvalues; this
  54. approach yields an approximate solution. Trends and scales are restored
  55. when evaluating the output.
  56. Required Arguments
  57. ------------------
  58. None.
  59. Optional Arguments
  60. ------------------
  61. *table*
  62. The name of one or more ASCII [or binary, see
  63. **-bi**] files holding the **x**, *w* data
  64. points. If no file is given then we read standard input instead.
  65. .. _-A:
  66. **-A**\ *gradfile*\ **+f**\ **1**\|\ **2**\|\ **3**\|\ **4**\|\ **5**
  67. The solution will partly be constrained by surface gradients **v** =
  68. *v*\ \*\ **n**, where *v* is the gradient magnitude and **n** its
  69. unit vector direction. The gradient direction may be specified
  70. either by Cartesian components (either unit vector **n** and
  71. magnitude *v* separately or gradient components **v** directly) or
  72. angles w.r.t. the coordinate axes. Append name of ASCII file with
  73. the surface gradients. Use **+f** to select one of five input
  74. formats: **0**: For 1-D data there is no direction, just gradient
  75. magnitude (slope) so the input format is *x*, *gradient*. Options
  76. 1-2 are for 2-D data sets: **1**: records contain *x*, *y*,
  77. *azimuth*, *gradient* (*azimuth* in degrees is measured clockwise
  78. from the vertical (north) [Default]). **2**: records contain *x*,
  79. *y*, *gradient*, *azimuth* (*azimuth* in degrees is measured
  80. clockwise from the vertical (north)). Options 3-5 are for either 2-D
  81. or 3-D data: **3**: records contain **x**, *direction(s)*, *v*
  82. (*direction(s)* in degrees are measured counter-clockwise from the
  83. horizontal (and for 3-D the vertical axis). **4**: records contain
  84. **x**, **v**. **5**: records contain **x**, **n**, *v*.
  85. .. _-C:
  86. **-C**\ [**n**]\ *value*\ [%][**+f**\ *file*][**+m**\|\ **M**]
  87. Find an approximate surface fit: Solve the linear system for the
  88. spline coefficients by SVD and eliminate the contribution from all
  89. eigenvalues whose ratio to the largest eigenvalue is less than *value*
  90. [Default uses Gauss-Jordan elimination to solve the linear system
  91. and fit the data exactly]. Optionally, append **+f**\ *file* to save the
  92. eigenvalues to the specified file for further analysis.
  93. If a negative *value* is given then **+f**\ *file* is required and
  94. execution will stop after saving the eigenvalues, i.e., no surface
  95. output is produced. Specify **-Cn** to retain only the *value* largest
  96. eigenvalues; append % if *value* is the percentage of eigenvalues
  97. to use instead. The two last modifiers (**+m**\|\ **M**) are only
  98. available for 2-D gridding and can be used to write intermediate grids,
  99. one per eigenvalue, and thus require a file name template with a C-format
  100. integer specification to be given via **-G**. The **+m** modifier will
  101. write the contributions to the grid for each eigenvalue, while **+M**
  102. will instead produce the cumulative sum of these contributions.
  103. .. _-D:
  104. **-D**\ *mode*
  105. Sets the distance flag that determines how we calculate distances
  106. between data points. Select *mode* 0 for Cartesian 1-D spline
  107. interpolation: **-D**\ 0 means (*x*) in user units, Cartesian
  108. distances, Select *mode* 1-3 for Cartesian 2-D surface spline
  109. interpolation: **-D**\ 1 means (*x*,\ *y*) in user units, Cartesian
  110. distances, **-D**\ 2 for (*x*,\ *y*) in degrees, Flat Earth
  111. distances, and **-D**\ 3 for (*x*,\ *y*) in degrees, Spherical
  112. distances in km. Then, if :term:`PROJ_ELLIPSOID` is spherical, we
  113. compute great circle arcs, otherwise geodesics. Option *mode* = 4
  114. applies to spherical surface spline interpolation only: **-D**\ 4
  115. for (*x*,\ *y*) in degrees, use cosine of great circle (or geodesic)
  116. arcs. Select *mode* 5 for Cartesian 3-D surface spline
  117. interpolation: **-D**\ 5 means (*x*,\ *y*,\ *z*) in user units,
  118. Cartesian distances.
  119. .. _-E:
  120. **-E**\ [*misfitfile*]
  121. Evaluate the spline exactly at the input data locations and report
  122. statistics of the misfit (mean, standard deviation, and rms). Optionally,
  123. append a filename and we will write the data table, augmented by
  124. two extra columns holding the spline estimate and the misfit.
  125. .. _-G:
  126. **-G**\ *grdfile*
  127. Name of resulting output file. (1) If options **-R**, **-I**, and
  128. possibly **-r** are set we produce an equidistant output table. This
  129. will be written to stdout unless **-G** is specified. **Note**: For 2-D
  130. grids the **-G** option is required. (2) If option **-T** is
  131. selected then **-G** is required and the output file is a 2-D binary
  132. grid file. Applies to 2-D interpolation only. (3) If **-N** is
  133. selected then the output is an ASCII (or binary; see
  134. **-bo**) table; if **-G** is not given then
  135. this table is written to standard output. Ignored if **-C** or
  136. **-C**\ 0 is given.
  137. .. _-I:
  138. **-I**\ *xinc*\ [/*yinc*\ [/*zinc*]]
  139. Specify equidistant sampling intervals, on for each dimension, separated by slashes.
  140. .. _-L:
  141. **-L**
  142. Do *not* remove a linear (1-D) or planer (2-D) trend when **-D**
  143. selects mode 0-3 [For those Cartesian cases a least-squares line or
  144. plane is modeled and removed, then restored after fitting a spline
  145. to the residuals]. However, in mixed cases with both data values and
  146. gradients, or for spherical surface data, only the mean data value
  147. is removed (and later and restored).
  148. .. _-N:
  149. **-N**\ *nodefile*
  150. ASCII file with coordinates of desired output locations **x** in the
  151. first column(s). The resulting *w* values are appended to each
  152. record and written to the file given in **-G** [or stdout if not
  153. specified]; see **-bo** for binary output
  154. instead. This option eliminates the need to specify options **-R**,
  155. **-I**, and **-r**.
  156. .. _-Q:
  157. **-Q**\ *az*\|\ *x/y/z*
  158. Rather than evaluate the surface, take the directional derivative in
  159. the *az* azimuth and return the magnitude of this derivative
  160. instead. For 3-D interpolation, specify the three components of the
  161. desired vector direction (the vector will be normalized before use).
  162. .. _-R:
  163. **-R**\ *xmin*/*xmax*\ [/*ymin*/*ymax*\ [/*zmin*/*zmax*]]
  164. Specify the domain for an equidistant lattice where output
  165. predictions are required. Requires **-I** and optionally **-r**.
  166. *1-D:* Give *xmin/xmax*, the minimum and maximum *x* coordinates.
  167. *2-D:* Give *xmin/xmax/ymin/ymax*, the minimum and maximum *x* and
  168. *y* coordinates. These may be Cartesian or geographical. If
  169. geographical, then *west*, *east*, *south*, and *north* specify the
  170. Region of interest, and you may specify them in decimal degrees or
  171. in [±]dd:mm[:ss.xxx][**W**\|\ **E**\|\ **S**\|\ **N**]
  172. format. The two shorthands **-Rg**
  173. and **-Rd** stand for global domain (0/360 and -180/+180 in
  174. longitude respectively, with -90/+90 in latitude).
  175. *3-D:* Give *xmin/xmax/ymin/ymax/zmin/zmax*, the minimum and maximum
  176. *x*, *y* and *z* coordinates. See the 2-D section if your horizontal
  177. coordinates are geographical; note the shorthands **-Rg** and
  178. **-Rd** cannot be used if a 3-D domain is specified.
  179. .. _-S:
  180. **-S**\ **c\|t\|l\|r\|p\|q**\ [*pars*]
  181. Select one of six different splines. The first two are used for
  182. 1-D, 2-D, or 3-D Cartesian splines (see **-D** for discussion). Note
  183. that all tension values are expected to be normalized tension in the
  184. range 0 < *t* < 1: (**c**) Minimum curvature spline [*Sandwell*,
  185. 1987], (**t**) Continuous curvature spline in tension [*Wessel and
  186. Bercovici*, 1998]; append *tension*\ [/*scale*] with *tension* in
  187. the 0-1 range and optionally supply a length scale [Default is the
  188. average grid spacing]. The next is a 1-D or 2-D spline: (**l**)
  189. Linear (1-D) or Bilinear (2-D) spline; these produce output that do
  190. not exceed the range of the given data. The next is a 2-D or 3-D spline: (**r**)
  191. Regularized spline in tension [*Mitasova and Mitas*, 1993]; again,
  192. append *tension* and optional *scale*. The last two are spherical
  193. surface splines and both imply **-D**\ 4: (**p**) Minimum
  194. curvature spline [*Parker*, 1994], (**q**) Continuous curvature
  195. spline in tension [*Wessel and Becker*, 2008]; append *tension*. The
  196. G(\ **x'**; **x'**) for the last method is slower to compute (a series solution) so we
  197. pre-calculate values and use cubic spline interpolation lookup instead.
  198. Optionally append **+n**\ *N* (an odd integer) to change how many
  199. points to use in the spline setup [10001]. The finite Legendre sum has
  200. a truncation error [1e-6]; you can lower that by appending **+e**\ *limit*
  201. at the expense of longer run-time.
  202. .. _-T:
  203. **-T**\ *maskgrid*
  204. For 2-D interpolation only. Only evaluate the solution at the nodes
  205. in the *maskgrid* that are not equal to NaN. This option eliminates
  206. the need to specify options **-R**, **-I**, and **-r**.
  207. .. _-V:
  208. .. |Add_-V| unicode:: 0x20 .. just an invisible code
  209. .. include:: explain_-V.rst_
  210. .. _-W:
  211. **-W**\ [**w**]
  212. Data one-sigma uncertainties are provided in the last column.
  213. We then compute weights that are inversely proportional to the uncertainties squared.
  214. Append **w** if weights are given instead of uncertainties and then they will be used
  215. as is (no squaring). This results in a weighted least squares fit. Note that this
  216. only has an effect if **-C** is used. [Default uses no weights or uncertainties].
  217. .. |Add_-bi| replace:: [Default is 2-4 input
  218. columns (**x**,\ *w*); the number depends on the chosen dimension].
  219. .. include:: explain_-bi.rst_
  220. .. |Add_-bo| unicode:: 0x20 .. just an invisible code
  221. .. include:: explain_-bo.rst_
  222. .. |Add_-d| unicode:: 0x20 .. just an invisible code
  223. .. include:: explain_-d.rst_
  224. .. |Add_-e| unicode:: 0x20 .. just an invisible code
  225. .. include:: explain_-e.rst_
  226. .. |Add_-f| unicode:: 0x20 .. just an invisible code
  227. .. include:: explain_-f.rst_
  228. .. |Add_-h| unicode:: 0x20 .. just an invisible code
  229. .. include:: explain_-h.rst_
  230. .. include:: explain_-icols.rst_
  231. .. include:: explain_-ocols.rst_
  232. .. include:: explain_-q.rst_
  233. .. |Add_nodereg| unicode:: 0x20 .. just an invisible code
  234. .. include:: explain_nodereg.rst_
  235. .. include:: explain_core.rst_
  236. .. include:: explain_help.rst_
  237. 1-d Examples
  238. ------------
  239. To resample the *x*,\ *y* Gaussian random data created by :doc:`gmtmath`
  240. and stored in 1D.txt, requesting output every 0.1 step from 0 to 10, and
  241. using a minimum cubic spline, try::
  242. gmt begin 1D
  243. gmt math -T0/10/1 0 1 NRAND = 1D.txt
  244. gmt plot -R0/10/-5/5 -JX6i/3i -B -Sc0.1 -Gblack 1D.txt
  245. gmt greenspline 1D.txt -R0/10 -I0.1 -Sc | gmt plot -Wthin
  246. gmt end show
  247. To apply a spline in tension instead, using a tension of 0.7, try::
  248. gmt begin 1Dt
  249. gmt plot -R0/10/-5/5 -JX6i/3i -B -Sc0.1 -Gblack 1D.txt
  250. gmt greenspline 1D.txt -R0/10 -I0.1 -St0.7 | gmt plot -Wthin
  251. gmt end show
  252. 2-d Examples
  253. ------------
  254. To make a uniform grid using the minimum curvature spline for the same
  255. Cartesian data set from Table 5.11 in Davis (1986) that is used in the
  256. GMT Technical Reference and Cookbook example 16, try::
  257. gmt begin 2D
  258. gmt greenspline @Table_5_11.txt -R0/6.5/-0.2/6.5 -I0.1 -Sc -V -D1 -GS1987.nc
  259. gmt plot -R0/6.5/-0.2/6.5 -JX6i -B -Sc0.1 -Gblack @Table_5_11.txt
  260. gmt grdcontour -C25 -A50 S1987.nc
  261. gmt end show
  262. To use Cartesian splines in tension but only evaluate the solution where
  263. the input mask grid is not NaN, try::
  264. gmt greenspline @Table_5_11.txt -Tmask.nc -St0.5 -V -D1 -GWB1998.nc
  265. To use Cartesian generalized splines in tension and return the magnitude
  266. of the surface slope in the NW direction, try::
  267. gmt greenspline @Table_5_11.txt -R0/6.5/-0.2/6.5 -I0.1 -Sr0.95 -V -D1 -Q-45 -Gslopes.nc
  268. To use Cartesian cubic splines and evaluate the cumulative solution as a function of eigenvalue,
  269. using the output template with three digits for the eigenvalue, try::
  270. gmt greenspline @Table_5_11.txt -R0/6.5/-0.2/6.5 -I0.1 -Gcontribution_%3.3d.nc -Sc -D1 -C+M
  271. Finally, to use Cartesian minimum curvature splines in recovering a
  272. surface where the input data is a single surface value (pt.txt) and the
  273. remaining constraints specify only the surface slope and direction
  274. (slopes.txt), use::
  275. gmt greenspline pt.txt -R-3.2/3.2/-3.2/3.2 -I0.1 -Sc -V -D1 -Aslopes.txt+f1 -Gslopes.nc
  276. 3-d Examples
  277. ------------
  278. To create a uniform 3-D Cartesian grid table based on the data in
  279. Table 5.23 in Davis (1986) that contains *x*,\ *y*,\ *z* locations and
  280. a measure of uranium oxide concentrations (in percent), try::
  281. gmt greenspline @Table_5_23.txt -R5/40/-5/10/5/16 -I0.25 -Sr0.85 -V -D5 -G3D_UO2.txt
  282. 2-d Spherical Surface Examples
  283. ------------------------------
  284. To recreate Parker's [1994] example on a global 1x1 degree grid,
  285. assuming the data are in the remote file mag_obs_1990.txt, try::
  286. gmt greenspline -V -Rg -Sp -D3 -I1 -GP1994.nc @mag_obs_1990.txt
  287. To do the same problem but applying tension of 0.85, use::
  288. gmt greenspline -V -Rg -Sq0.85 -D3 -I1 -GWB2008.nc @mag_obs_1990.txt
  289. Considerations
  290. --------------
  291. #. For the Cartesian cases we use the free-space Green functions, hence
  292. no boundary conditions are applied at the edges of the specified domain.
  293. For most applications this is fine as the region typically is
  294. arbitrarily set to reflect the extent of your data. However, if your
  295. application requires particular boundary conditions then you may
  296. consider using :doc:`surface` instead.
  297. #. In all cases, the solution is obtained by inverting a *n* x *n*
  298. double precision matrix for the Green function coefficients, where *n*
  299. is the number of data constraints. Hence, your computer's memory may
  300. place restrictions on how large data sets you can process with
  301. **greenspline**. Pre-processing your data with doc:`blockmean`,
  302. doc:`blockmedian`, or doc:`blockmode` is recommended to avoid aliasing and
  303. may also control the size of *n*. For information, if *n* = 1024 then
  304. only 8 Mb memory is needed, but for *n* = 10240 we need 800 Mb. Note
  305. that **greenspline** is fully 64-bit compliant if compiled as such.
  306. For spherical data you may consider decimating using doc:`gmtspatial`
  307. nearest neighbor reduction.
  308. #. The inversion for coefficients can become numerically unstable when
  309. data neighbors are very close compared to the overall span of the data.
  310. You can remedy this by pre-processing the data, e.g., by averaging
  311. closely spaced neighbors. Alternatively, you can improve stability by
  312. using the SVD solution and discard information associated with the
  313. smallest eigenvalues (see **-C**).
  314. #. The series solution implemented for **-Sq** was developed by
  315. Robert L. Parker, Scripps Institution of Oceanography, which we
  316. gratefully acknowledge.
  317. #. If you need to fit a certain 1-D spline through your data
  318. points you may wish to consider :doc:`sample1d` instead.
  319. It will offer traditional splines with standard boundary conditions
  320. (such as the natural cubic spline, which sets the curvatures at the ends
  321. to zero). In contrast, **greenspline**\ 's 1-D spline, as is explained in
  322. note 1, does *not* specify boundary conditions at the end of the data domain.
  323. Tension
  324. -------
  325. Tension is generally used to suppress spurious oscillations caused by
  326. the minimum curvature requirement, in particular when rapid gradient
  327. changes are present in the data. The proper amount of tension can only
  328. be determined by experimentation. Generally, very smooth data (such as
  329. potential fields) do not require much, if any tension, while rougher
  330. data (such as topography) will typically interpolate better with
  331. moderate tension. Make sure you try a range of values before choosing
  332. your final result. **Note**: The regularized spline in tension is only
  333. stable for a finite range of *scale* values; you must experiment to find
  334. the valid range and a useful setting. For more information on tension
  335. see the references below.
  336. References
  337. ----------
  338. Davis, J. C., 1986, *Statistics and Data Analysis in Geology*, 2nd
  339. Edition, 646 pp., Wiley, New York,
  340. Mitasova, H., and L. Mitas, 1993, Interpolation by regularized spline
  341. with tension: I. Theory and implementation, *Math. Geol.*, **25**,
  342. 641-655.
  343. Parker, R. L., 1994, *Geophysical Inverse Theory*, 386 pp., Princeton
  344. Univ. Press, Princeton, N.J.
  345. Sandwell, D. T., 1987, Biharmonic spline interpolation of Geos-3 and
  346. Seasat altimeter data, *Geophys. Res. Lett.*, **14**, 139-142.
  347. Wessel, P., and D. Bercovici, 1998, Interpolation with splines in
  348. tension: a Green's function approach, *Math. Geol.*, **30**, 77-93.
  349. Wessel, P., and J. M. Becker, 2008, Interpolation using a generalized
  350. Green's function for a spherical surface spline in tension, *Geophys. J.
  351. Int*, **174**, 21-28.
  352. Wessel, P., 2009, A general-purpose Green's function interpolator,
  353. *Computers & Geosciences*, **35**, 1247-1254, doi:10.1016/j.cageo.2008.08.012.
  354. See Also
  355. --------
  356. :doc:`gmt`, :doc:`gmtmath`,
  357. :doc:`nearneighbor`, :doc:`plot`,
  358. :doc:`sample1d`,
  359. :doc:`sphtriangulate`,
  360. :doc:`surface`,
  361. :doc:`triangulate`, :doc:`xyz2grd`
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...