|
63 | 63 | "\n", |
64 | 64 | " # Boolean mask and coordinates of attractors\n", |
65 | 65 | " attractor_mask = particles.attractor.astype(bool)\n", |
66 | | - " lon_a = particles.lon[attractor_mask]\n", |
67 | | - " lat_a = particles.lat[attractor_mask]\n", |
| 66 | + " x_a = particles.x[attractor_mask]\n", |
| 67 | + " y_a = particles.y[attractor_mask]\n", |
68 | 68 | "\n", |
69 | 69 | " # Pairwise differences and distances (n_attractors × n_particles)\n", |
70 | | - " dx = particles.lon - lon_a[:, None]\n", |
71 | | - " dy = particles.lat - lat_a[:, None]\n", |
| 70 | + " dx = particles.x - x_a[:, None]\n", |
| 71 | + " dy = particles.y - y_a[:, None]\n", |
72 | 72 | " distances = np.sqrt(dx**2 + dy**2)\n", |
73 | 73 | "\n", |
74 | 74 | " # Mask dx, dy by interaction range\n", |
|
81 | 81 | " dx_norm = dx * inv_dist\n", |
82 | 82 | " dy_norm = dy * inv_dist\n", |
83 | 83 | "\n", |
84 | | - " particles.dlon += np.sum(dx_norm, axis=0) * velocity * particles.dt\n", |
85 | | - " particles.dlat += np.sum(dy_norm, axis=0) * velocity * particles.dt" |
| 84 | + " particles.dx += np.sum(dx_norm, axis=0) * velocity * particles.dt\n", |
| 85 | + " particles.dy += np.sum(dy_norm, axis=0) * velocity * particles.dt" |
86 | 86 | ] |
87 | 87 | }, |
88 | 88 | { |
|
124 | 124 | "pset = parcels.ParticleSet(\n", |
125 | 125 | " fieldset=DiffusionFieldSet(),\n", |
126 | 126 | " pclass=InteractingParticle,\n", |
127 | | - " lon=X,\n", |
128 | | - " lat=Y,\n", |
| 127 | + " x=X,\n", |
| 128 | + " y=Y,\n", |
129 | 129 | " attractor=attractor,\n", |
130 | 130 | ")\n", |
131 | 131 | "\n", |
|
170 | 170 | "ax.set_ylim(-1.1, 1.1)\n", |
171 | 171 | "\n", |
172 | 172 | "particles = df_other.filter(pl.col(\"time\") == pl.lit(timerange[0]))\n", |
173 | | - "scatter = ax.scatter(particles[\"lon\"], particles[\"lat\"], c=\"b\", s=5, zorder=1)\n", |
| 173 | + "scatter = ax.scatter(particles[\"x\"], particles[\"y\"], c=\"b\", s=5, zorder=1)\n", |
174 | 174 | "particles_attr = df_attr.filter(pl.col(\"time\") == pl.lit(timerange[0]))\n", |
175 | 175 | "scatter_attr = ax.scatter(\n", |
176 | | - " particles_attr[\"lon\"], particles_attr[\"lat\"], c=\"r\", s=40, zorder=2\n", |
| 176 | + " particles_attr[\"x\"], particles_attr[\"y\"], c=\"r\", s=40, zorder=2\n", |
177 | 177 | ")\n", |
178 | 178 | "circs = []\n", |
179 | | - "for lon_a, lat_a in zip(particles_attr[\"lon\"], particles_attr[\"lat\"], strict=True):\n", |
| 179 | + "for x_a, y_a in zip(particles_attr[\"x\"], particles_attr[\"y\"], strict=True):\n", |
180 | 180 | " circs.append(\n", |
181 | 181 | " ax.add_patch(\n", |
182 | 182 | " plt.Circle(\n", |
183 | | - " (lon_a, lat_a), 0.25, facecolor=\"None\", edgecolor=\"r\", linestyle=\"--\"\n", |
| 183 | + " (x_a, y_a), 0.25, facecolor=\"None\", edgecolor=\"r\", linestyle=\"--\"\n", |
184 | 184 | " )\n", |
185 | 185 | " )\n", |
186 | 186 | " )\n", |
|
192 | 192 | "\n", |
193 | 193 | "def animate(i):\n", |
194 | 194 | " particles = df_other.filter(pl.col(\"time\") == pl.lit(timerange[i]))\n", |
195 | | - " scatter.set_offsets(np.c_[particles[\"lon\"], particles[\"lat\"]])\n", |
| 195 | + " scatter.set_offsets(np.c_[particles[\"x\"], particles[\"y\"]])\n", |
196 | 196 | " particles_attr = df_attr.filter(pl.col(\"time\") == pl.lit(timerange[i]))\n", |
197 | | - " scatter_attr.set_offsets(np.c_[particles_attr[\"lon\"], particles_attr[\"lat\"]])\n", |
198 | | - " for c, lon_a, lat_a in zip(\n", |
199 | | - " circs, particles_attr[\"lon\"], particles_attr[\"lat\"], strict=True\n", |
| 197 | + " scatter_attr.set_offsets(np.c_[particles_attr[\"x\"], particles_attr[\"y\"]])\n", |
| 198 | + " for c, x_a, y_a in zip(\n", |
| 199 | + " circs, particles_attr[\"x\"], particles_attr[\"y\"], strict=True\n", |
200 | 200 | " ):\n", |
201 | | - " c.center = (lon_a, lat_a)\n", |
| 201 | + " c.center = (x_a, y_a)\n", |
202 | 202 | " title.set_text(\n", |
203 | 203 | " f\"Particles at t = {timerange[i].total_seconds()}s\\n(Red particles are attractors)\"\n", |
204 | 204 | " )\n", |
|
235 | 235 | " \"\"\"\n", |
236 | 236 | " interaction_distance = 0.05\n", |
237 | 237 | "\n", |
238 | | - " N = len(particles.lon)\n", |
| 238 | + " N = len(particles.x)\n", |
239 | 239 | "\n", |
240 | 240 | " # calculate pairwise distances (n_particles × n_particles)\n", |
241 | | - " dx = particles.lon[None, :] - particles.lon[:, None]\n", |
242 | | - " dy = particles.lat[None, :] - particles.lat[:, None]\n", |
| 241 | + " dx = particles.x[None, :] - particles.x[:, None]\n", |
| 242 | + " dy = particles.y[None, :] - particles.y[:, None]\n", |
243 | 243 | " distances = np.sqrt(dx**2 + dy**2)\n", |
244 | 244 | "\n", |
245 | 245 | " # mask distances by interaction range\n", |
|
291 | 291 | "pset = parcels.ParticleSet(\n", |
292 | 292 | " fieldset=DiffusionFieldSet(),\n", |
293 | 293 | " pclass=MergeParticle,\n", |
294 | | - " lon=np.random.uniform(-1, 1, size=npart),\n", |
295 | | - " lat=np.random.uniform(-1, 1, size=npart),\n", |
| 294 | + " x=np.random.uniform(-1, 1, size=npart),\n", |
| 295 | + " y=np.random.uniform(-1, 1, size=npart),\n", |
296 | 296 | " mass=np.random.uniform(0.5, 1.5, size=npart),\n", |
297 | 297 | ")\n", |
298 | 298 | "\n", |
|
335 | 335 | "\n", |
336 | 336 | "particles = df.filter(pl.col(\"time\") == pl.lit(timerange[0]))\n", |
337 | 337 | "scatter = ax.scatter(\n", |
338 | | - " particles[\"lon\"], particles[\"lat\"], c=\"b\", s=particles[\"mass\"], zorder=1\n", |
| 338 | + " particles[\"x\"], particles[\"y\"], c=\"b\", s=particles[\"mass\"], zorder=1\n", |
339 | 339 | ")\n", |
340 | 340 | "title = ax.set_title(f\"Particles at t = {timerange[0].total_seconds()}s\")\n", |
341 | 341 | "\n", |
342 | 342 | "\n", |
343 | 343 | "def animate(i):\n", |
344 | 344 | " particles = df.filter(pl.col(\"time\") == pl.lit(timerange[i]))\n", |
345 | | - " scatter.set_offsets(np.c_[particles[\"lon\"], particles[\"lat\"]])\n", |
| 345 | + " scatter.set_offsets(np.c_[particles[\"x\"], particles[\"y\"]])\n", |
346 | 346 | " scatter.set_sizes(particles[\"mass\"])\n", |
347 | 347 | " title.set_text(f\"Particles at t = {timerange[i].total_seconds()}s\")\n", |
348 | 348 | "\n", |
|
355 | 355 | ], |
356 | 356 | "metadata": { |
357 | 357 | "kernelspec": { |
358 | | - "display_name": "docs", |
| 358 | + "display_name": "Parcels:docs (3.14.6)", |
359 | 359 | "language": "python", |
360 | 360 | "name": "python3" |
361 | 361 | }, |
|
369 | 369 | "name": "python", |
370 | 370 | "nbconvert_exporter": "python", |
371 | 371 | "pygments_lexer": "ipython3", |
372 | | - "version": "3.14.4" |
| 372 | + "version": "3.14.6" |
373 | 373 | } |
374 | 374 | }, |
375 | 375 | "nbformat": 4, |
|
0 commit comments