88__all__ = ["AdvectionDiffusionEM" , "AdvectionDiffusionM1" , "DiffusionUniformKh" ]
99
1010
11- def AdvectionDiffusionM1 (particle , fieldset , time ): # pragma: no cover
11+ def AdvectionDiffusionM1 (particles , fieldset ): # pragma: no cover
1212 """Kernel for 2D advection-diffusion, solved using the Milstein scheme at first order (M1).
1313
1414 Assumes that fieldset has fields `Kh_zonal` and `Kh_meridional`
@@ -23,30 +23,34 @@ def AdvectionDiffusionM1(particle, fieldset, time): # pragma: no cover
2323 The Wiener increment `dW` is normally distributed with zero
2424 mean and a standard deviation of sqrt(dt).
2525 """
26- dt = particle .dt / np .timedelta64 (1 , "s" ) # TODO: improve API for converting dt to seconds
26+ dt = particles .dt / np .timedelta64 (1 , "s" ) # TODO: improve API for converting dt to seconds
2727 # Wiener increment with zero mean and std of sqrt(dt)
2828 dWx = np .random .normal (0 , np .sqrt (np .fabs (dt )))
2929 dWy = np .random .normal (0 , np .sqrt (np .fabs (dt )))
3030
31- Kxp1 = fieldset .Kh_zonal [particle .time , particle .depth , particle .lat , particle .lon + fieldset .dres , particle ]
32- Kxm1 = fieldset .Kh_zonal [particle .time , particle .depth , particle .lat , particle .lon - fieldset .dres , particle ]
31+ Kxp1 = fieldset .Kh_zonal [particles .time , particles .depth , particles .lat , particles .lon + fieldset .dres , particles ]
32+ Kxm1 = fieldset .Kh_zonal [particles .time , particles .depth , particles .lat , particles .lon - fieldset .dres , particles ]
3333 dKdx = (Kxp1 - Kxm1 ) / (2 * fieldset .dres )
3434
35- u , v = fieldset .UV [particle .time , particle .depth , particle .lat , particle .lon , particle ]
36- bx = np .sqrt (2 * fieldset .Kh_zonal [particle .time , particle .depth , particle .lat , particle .lon , particle ])
35+ u , v = fieldset .UV [particles .time , particles .depth , particles .lat , particles .lon , particles ]
36+ bx = np .sqrt (2 * fieldset .Kh_zonal [particles .time , particles .depth , particles .lat , particles .lon , particles ])
3737
38- Kyp1 = fieldset .Kh_meridional [particle .time , particle .depth , particle .lat + fieldset .dres , particle .lon , particle ]
39- Kym1 = fieldset .Kh_meridional [particle .time , particle .depth , particle .lat - fieldset .dres , particle .lon , particle ]
38+ Kyp1 = fieldset .Kh_meridional [
39+ particles .time , particles .depth , particles .lat + fieldset .dres , particles .lon , particles
40+ ]
41+ Kym1 = fieldset .Kh_meridional [
42+ particles .time , particles .depth , particles .lat - fieldset .dres , particles .lon , particles
43+ ]
4044 dKdy = (Kyp1 - Kym1 ) / (2 * fieldset .dres )
4145
42- by = np .sqrt (2 * fieldset .Kh_meridional [particle .time , particle .depth , particle .lat , particle .lon , particle ])
46+ by = np .sqrt (2 * fieldset .Kh_meridional [particles .time , particles .depth , particles .lat , particles .lon , particles ])
4347
4448 # Particle positions are updated only after evaluating all terms.
45- particle .dlon += u * dt + 0.5 * dKdx * (dWx ** 2 + dt ) + bx * dWx
46- particle .dlat += v * dt + 0.5 * dKdy * (dWy ** 2 + dt ) + by * dWy
49+ particles .dlon += u * dt + 0.5 * dKdx * (dWx ** 2 + dt ) + bx * dWx
50+ particles .dlat += v * dt + 0.5 * dKdy * (dWy ** 2 + dt ) + by * dWy
4751
4852
49- def AdvectionDiffusionEM (particle , fieldset , time ): # pragma: no cover
53+ def AdvectionDiffusionEM (particles , fieldset ): # pragma: no cover
5054 """Kernel for 2D advection-diffusion, solved using the Euler-Maruyama scheme (EM).
5155
5256 Assumes that fieldset has fields `Kh_zonal` and `Kh_meridional`
@@ -59,31 +63,35 @@ def AdvectionDiffusionEM(particle, fieldset, time): # pragma: no cover
5963 The Wiener increment `dW` is normally distributed with zero
6064 mean and a standard deviation of sqrt(dt).
6165 """
62- dt = particle .dt / np .timedelta64 (1 , "s" )
66+ dt = particles .dt / np .timedelta64 (1 , "s" )
6367 # Wiener increment with zero mean and std of sqrt(dt)
6468 dWx = np .random .normal (0 , np .sqrt (np .fabs (dt )))
6569 dWy = np .random .normal (0 , np .sqrt (np .fabs (dt )))
6670
67- u , v = fieldset .UV [particle .time , particle .depth , particle .lat , particle .lon , particle ]
71+ u , v = fieldset .UV [particles .time , particles .depth , particles .lat , particles .lon , particles ]
6872
69- Kxp1 = fieldset .Kh_zonal [particle .time , particle .depth , particle .lat , particle .lon + fieldset .dres , particle ]
70- Kxm1 = fieldset .Kh_zonal [particle .time , particle .depth , particle .lat , particle .lon - fieldset .dres , particle ]
73+ Kxp1 = fieldset .Kh_zonal [particles .time , particles .depth , particles .lat , particles .lon + fieldset .dres , particles ]
74+ Kxm1 = fieldset .Kh_zonal [particles .time , particles .depth , particles .lat , particles .lon - fieldset .dres , particles ]
7175 dKdx = (Kxp1 - Kxm1 ) / (2 * fieldset .dres )
7276 ax = u + dKdx
73- bx = np .sqrt (2 * fieldset .Kh_zonal [particle .time , particle .depth , particle .lat , particle .lon , particle ])
74-
75- Kyp1 = fieldset .Kh_meridional [particle .time , particle .depth , particle .lat + fieldset .dres , particle .lon , particle ]
76- Kym1 = fieldset .Kh_meridional [particle .time , particle .depth , particle .lat - fieldset .dres , particle .lon , particle ]
77+ bx = np .sqrt (2 * fieldset .Kh_zonal [particles .time , particles .depth , particles .lat , particles .lon , particles ])
78+
79+ Kyp1 = fieldset .Kh_meridional [
80+ particles .time , particles .depth , particles .lat + fieldset .dres , particles .lon , particles
81+ ]
82+ Kym1 = fieldset .Kh_meridional [
83+ particles .time , particles .depth , particles .lat - fieldset .dres , particles .lon , particles
84+ ]
7785 dKdy = (Kyp1 - Kym1 ) / (2 * fieldset .dres )
7886 ay = v + dKdy
79- by = np .sqrt (2 * fieldset .Kh_meridional [particle .time , particle .depth , particle .lat , particle .lon , particle ])
87+ by = np .sqrt (2 * fieldset .Kh_meridional [particles .time , particles .depth , particles .lat , particles .lon , particles ])
8088
8189 # Particle positions are updated only after evaluating all terms.
82- particle .dlon += ax * dt + bx * dWx
83- particle .dlat += ay * dt + by * dWy
90+ particles .dlon += ax * dt + bx * dWx
91+ particles .dlat += ay * dt + by * dWy
8492
8593
86- def DiffusionUniformKh (particle , fieldset , time ): # pragma: no cover
94+ def DiffusionUniformKh (particles , fieldset ): # pragma: no cover
8795 """Kernel for simple 2D diffusion where diffusivity (Kh) is assumed uniform.
8896
8997 Assumes that fieldset has constant fields `Kh_zonal` and `Kh_meridional`.
@@ -101,15 +109,13 @@ def DiffusionUniformKh(particle, fieldset, time): # pragma: no cover
101109 The Wiener increment `dW` is normally distributed with zero
102110 mean and a standard deviation of sqrt(dt).
103111 """
104- dt = particle .dt / np .timedelta64 (1 , "s" )
112+ dt = particles .dt / np .timedelta64 (1 , "s" )
105113 # Wiener increment with zero mean and std of sqrt(dt)
106114 dWx = np .random .normal (0 , np .sqrt (np .fabs (dt )))
107115 dWy = np .random .normal (0 , np .sqrt (np .fabs (dt )))
108116
109- print (particle )
110-
111- bx = np .sqrt (2 * fieldset .Kh_zonal [particle ])
112- by = np .sqrt (2 * fieldset .Kh_meridional [particle ])
117+ bx = np .sqrt (2 * fieldset .Kh_zonal [particles ])
118+ by = np .sqrt (2 * fieldset .Kh_meridional [particles ])
113119
114- particle .dlon += bx * dWx
115- particle .dlat += by * dWy
120+ particles .dlon += bx * dWx
121+ particles .dlat += by * dWy
0 commit comments