|
| 1 | +import warnings |
| 2 | + |
1 | 3 | import numpy as np |
2 | 4 |
|
3 | 5 | from parcels.kernels._advection import _constrain_dt_to_within_time_interval |
@@ -40,23 +42,34 @@ def AdvectionRK2_3D_CROCO(particles, fieldset): # pragma: no cover |
40 | 42 | This kernel assumes the vertical velocity is the 'w' field from CROCO output and works on sigma-layers. |
41 | 43 | It also uses linear interpolation of the W field, which gives much better results than the default C-grid interpolation. |
42 | 44 | """ |
43 | | - dt = _constrain_dt_to_within_time_interval(fieldset.time_interval, particles.t, particles.dt) |
44 | | - sigma = particles.z / fieldset.h[particles.t, np.zeros_like(particles.z), particles.y, particles.x] |
45 | | - |
46 | | - sig = convert_z_to_sigma_croco(fieldset, particles.t, particles.z, particles.y, particles.x, particles) |
47 | | - (u1, v1) = fieldset.UV[particles.t, sig, particles.y, particles.x, particles] |
48 | | - w1 = fieldset.W[particles.t, sig, particles.y, particles.x, particles] |
49 | | - w1 *= sigma / fieldset.h[particles.t, np.zeros_like(particles.z), particles.y, particles.x] |
50 | | - x1 = particles.x + u1 * 0.5 * dt |
51 | | - y1 = particles.y + v1 * 0.5 * dt |
52 | | - sig_dep1 = sigma + w1 * 0.5 * dt |
53 | | - dep1 = sig_dep1 * fieldset.h[particles.t, np.zeros_like(particles.z), y1, x1] |
54 | | - |
55 | | - sig1 = convert_z_to_sigma_croco(fieldset, particles.t + 0.5 * dt, dep1, y1, x1, particles) |
56 | | - (u2, v2) = fieldset.UV[particles.t + 0.5 * dt, sig1, y1, x1, particles] |
57 | | - w2 = fieldset.W[particles.t + 0.5 * dt, sig1, y1, x1, particles] |
58 | | - w2 *= sig_dep1 / fieldset.h[particles.t + 0.5 * dt, np.zeros_like(particles.z), y1, x1] |
59 | | - |
60 | | - particles.dx += u2 * dt |
61 | | - particles.dy += v2 * dt |
62 | | - particles.dz += w2 * dt |
| 45 | + with warnings.catch_warnings(): |
| 46 | + warnings.filterwarnings( |
| 47 | + "ignore", |
| 48 | + message=r"^Sampling of velocities should normally be done using fieldset\.UV or fieldset\.UVW object; tread carefully$", |
| 49 | + category=RuntimeWarning, |
| 50 | + ) # Needed because of linear sampling of W with sigma conversion |
| 51 | + |
| 52 | + dt = _constrain_dt_to_within_time_interval(fieldset.time_interval, particles.t, particles.dt) |
| 53 | + sigma = particles.z / fieldset.h[particles.t, np.zeros_like(particles.z), particles.y, particles.x] |
| 54 | + |
| 55 | + sig = convert_z_to_sigma_croco(fieldset, particles.t, particles.z, particles.y, particles.x, particles) |
| 56 | + (u1, v1) = fieldset.UV[particles.t, sig, particles.y, particles.x, particles] |
| 57 | + w1 = fieldset.W[particles.t, sig, particles.y, particles.x, particles] |
| 58 | + w1 *= sigma / fieldset.h[particles.t, np.zeros_like(particles.z), particles.y, particles.x] |
| 59 | + x1 = particles.x + u1 * 0.5 * dt |
| 60 | + y1 = particles.y + v1 * 0.5 * dt |
| 61 | + sig_dep1 = sigma + w1 * 0.5 * dt |
| 62 | + dep1 = sig_dep1 * fieldset.h[particles.t, np.zeros_like(particles.z), y1, x1] |
| 63 | + |
| 64 | + sig1 = convert_z_to_sigma_croco(fieldset, particles.t + 0.5 * dt, dep1, y1, x1, particles) |
| 65 | + (u2, v2) = fieldset.UV[particles.t + 0.5 * dt, sig1, y1, x1, particles] |
| 66 | + w2 = fieldset.W[particles.t + 0.5 * dt, sig1, y1, x1, particles] |
| 67 | + w2 *= sig_dep1 / fieldset.h[particles.t + 0.5 * dt, np.zeros_like(particles.z), y1, x1] |
| 68 | + x2 = particles.x + u2 * 0.5 * dt |
| 69 | + y2 = particles.y + v2 * 0.5 * dt |
| 70 | + sig_dep2 = sigma + w2 * 0.5 * dt |
| 71 | + dep2 = sig_dep2 * fieldset.h[particles.t + 0.5 * dt, np.zeros_like(particles.z), y2, x2] |
| 72 | + |
| 73 | + particles.dx += u2 * dt |
| 74 | + particles.dy += v2 * dt |
| 75 | + particles.dz += (dep1 - particles.z) + (dep2 - particles.z) |
0 commit comments