|
11 | 11 | from parcels._core.kernel import Kernel |
12 | 12 | from parcels._datasets.structured.generated import simple_UV_dataset |
13 | 13 | from parcels.kernels import AdvectionRK4, AdvectionRK45 |
14 | | -from tests.common_kernels import MoveEast, MoveNorth |
| 14 | +from tests.common_kernels import DoNothing, MoveEast, MoveNorth |
15 | 15 |
|
16 | 16 |
|
17 | 17 | def test_unknown_var_in_kernel(fieldset): |
@@ -216,3 +216,27 @@ def Kernel2(particles, fieldset): # pragma: no cover |
216 | 216 | pset = ParticleSet(fieldset, x=[0.5], y=[0.5]) |
217 | 217 | pset.execute([Kernel1, Kernel2], runtime=1.0, dt=1.0) |
218 | 218 | np.testing.assert_allclose(pset.x, 0.3, rtol=1e-5) |
| 219 | + |
| 220 | + |
| 221 | +@pytest.mark.xfail(reason="Modifying dt in a kernel doesn't work GH2765") |
| 222 | +def test_dt_modify_in_kernel(fieldset): |
| 223 | + TestParticle = Particle.add_variable(Variable("age", dtype=np.float32, initial=0)) |
| 224 | + pset = ParticleSet(fieldset, pclass=TestParticle, x=[0.5], y=[0]) |
| 225 | + |
| 226 | + def ModifyDt(particles, fieldset): # pragma: no cover |
| 227 | + particles.age += particles.dt |
| 228 | + particles.dt = 2 |
| 229 | + |
| 230 | + runtime = 10 |
| 231 | + expected_age = 1 + 2 * (runtime - 2) # 1 for the first step; 2 for the remaining steps (except last) |
| 232 | + pset.execute(ModifyDt, runtime=runtime, dt=1.0) |
| 233 | + np.testing.assert_allclose(pset.t[0], runtime) |
| 234 | + np.testing.assert_allclose(pset.age[0], expected_age) |
| 235 | + |
| 236 | + |
| 237 | +@pytest.mark.parametrize("dt", [1e-2, 1e-5, 1e-6, 1e-9]) |
| 238 | +def test_small_dt(fieldset, dt): |
| 239 | + pset = ParticleSet(fieldset, x=[0], y=[0]) |
| 240 | + |
| 241 | + pset.execute(DoNothing, dt=dt, runtime=dt * 100) |
| 242 | + assert np.allclose([p.t for p in pset], dt * 100) |
0 commit comments