Skip to content
This repository was archived by the owner on May 23, 2022. It is now read-only.

Commit 9284fe7

Browse files
author
Romain Beucher
committed
Simplify passive tracers interface, coordinates can only be entered as a numpy array, consistent with underworld
1 parent 3171b2b commit 9284fe7

20 files changed

+280
-203
lines changed

UWGeodynamics/_model.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1839,14 +1839,22 @@ def add_passive_tracers(self, name, vertices=None,
18391839
tracers.add_particles_with_coordinates(vertices)
18401840

18411841
else:
1842-
x = np.array(vertices[0])[..., np.newaxis] + np.array(centroids[0]).ravel()
1843-
y = np.array(vertices[1])[..., np.newaxis] + np.array(centroids[1]).ravel()
1842+
x = np.array(vertices[:, 0])[..., np.newaxis] + np.array(centroids[0]).ravel()
1843+
y = np.array(vertices[:, 1])[..., np.newaxis] + np.array(centroids[1]).ravel()
1844+
x = x.ravel()
1845+
y = y.ravel()
18441846

18451847
if self.mesh.dim == 2:
1846-
vertices = [x.ravel(), y.ravel()]
1848+
vertices = np.ndarray((x.size, 2))
1849+
vertices[:, 0] = x
1850+
vertices[:, 1] = y
18471851
else:
18481852
z = np.array(vertices[2])[..., np.newaxis] + np.array(centroids[2]).ravel()
1849-
vertices = [x.ravel(), y.ravel(), z.ravel()]
1853+
z = z.ravel()
1854+
vertices = np.ndarray((x.size, 3))
1855+
vertices[:, 0] = x
1856+
vertices[:, 1] = y
1857+
vertices[:, 2] = z
18501858

18511859
tracers = PassiveTracers(self.mesh,
18521860
self.velocityField,
@@ -2701,7 +2709,6 @@ def reload_passive_tracers(self, step):
27012709
with h5py.File(fpath, "r", driver="mpio", comm=comm) as h5f:
27022710

27032711
vertices = h5f["data"][()] * u.Quantity(h5f.attrs["units"])
2704-
vertices = [vertices[:, dim] for dim in range(Model.mesh.dim)]
27052712
obj = PassiveTracers(Model.mesh,
27062713
Model.velocityField,
27072714
tracer.name,

UWGeodynamics/_utils.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,8 @@ def _global_indices(self):
9494

9595
def add_particles_with_coordinates(self, vertices, **kwargs):
9696

97-
for dim, _ in enumerate(vertices):
98-
vertices[dim] = nd(vertices[dim])
99-
100-
sizes = np.array([np.array(x).size for x in vertices])
101-
points = np.zeros((sizes.max(), len(vertices)))
102-
103-
for dim, _ in enumerate(vertices):
104-
points[:, dim] = vertices[dim]
10597
vals = super(PassiveTracers,
106-
self).add_particles_with_coordinates(points,
98+
self).add_particles_with_coordinates(nd(vertices),
10799
**kwargs)
108100
self.advector = uw.systems.SwarmAdvector(
109101
swarm=self,
@@ -381,9 +373,14 @@ def circles_grid(radius, minCoord, maxCoord, npoints=72):
381373
coords[:, 0] = x
382374
coords[:, 1] = y
383375
points = points[:, np.newaxis] + coords
376+
377+
# Finally, returns a 2D array
384378
x, y = points[:, :, 0].ravel(), points[:, :, 1].ravel()
379+
coords = np.ndarray((x.size, 2))
380+
coords[:, 0] = x
381+
coords[:, 1] = y
385382

386-
return x, y
383+
return coords
387384

388385
if len(minCoord) == 3:
389386
# Create points on circle
@@ -418,16 +415,25 @@ def circles_grid(radius, minCoord, maxCoord, npoints=72):
418415
x = points[:, :, 0].ravel()
419416
y = points[:, :, 1].ravel()
420417
z = points[:, :, 2].ravel()
418+
419+
# Finally, returns a 2D array
420+
coords = np.ndarray((x.size, 2))
421+
coords[:, 0] = x
422+
coords[:, 1] = y
423+
coords[:, 2] = z
421424

422-
return x, y, z
425+
return coords
423426

424427

425428
def circle_points_tracers(radius, centre=tuple([0., 0.]), npoints=72):
426429
angles = np.linspace(0, 360, npoints)
427430
radius = nd(radius)
428431
x = radius * np.cos(np.radians(angles)) + nd(centre[0])
429432
y = radius * np.sin(np.radians(angles)) + nd(centre[1])
430-
return x, y
433+
coords = np.ndarray((x.size, 2))
434+
coords[:, 0] = x
435+
coords[:, 1] = y
436+
return coords
431437

432438

433439
def sphere_points_tracers(radius, centre=tuple([0., 0., 0.]), npoints=30):
@@ -444,7 +450,13 @@ def sphere_points_tracers(radius, centre=tuple([0., 0., 0.]), npoints=30):
444450
y += nd(centre[1])
445451
z += nd(centre[2])
446452

447-
return x, y, z
453+
# Finally, returns a 2D array
454+
coords = np.ndarray((x.size, 2))
455+
coords[:, 0] = x
456+
coords[:, 1] = y
457+
coords[:, 2] = z
458+
459+
return coords
448460

449461

450462
class Nearest_neighbors_projector(object):

docs/source/UserGuide.rst

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,9 +1650,11 @@ Passive Tracers
16501650
>>> u = GEO.u
16511651
16521652
>>> Model = GEO.Model()
1653-
>>> x = np.linspace(GEO.nd(Model.minCoord[0]), GEO.nd(Model.maxCoord[0]), 1000)
1654-
>>> y = 32. * u.kilometre
1655-
>>> tracers = Model.add_passive_tracers(vertices=[x,y])
1653+
>>> npoints = 1000
1654+
>>> coords = np.ndarray((npoints, 2))
1655+
>>> coords[:, 0] = np.linspace(GEO.nd(Model.minCoord[0]), GEO.nd(Model.maxCoord[0]), npoints)
1656+
>>> coords[:, 1] = GEO.nd(32. * u.kilometre)
1657+
>>> tracers = Model.add_passive_tracers(vertices=coords)
16561658
16571659
You can pass a list of centroids to the `Model.add_passive_tracers` method.
16581660
In that case, the coordinates of the passive tracers are relative to the
@@ -1668,7 +1670,9 @@ position of the centroids. The pattern is repeated around each centroid.
16681670
>>> cxpos = np.linspace(GEO.nd(20*u.kilometer), GEO.nd(40*u.kilometer),5)
16691671
>>> cypos = np.linspace(GEO.nd(20*u.kilometer), GEO.nd(40*u.kilometer),5)
16701672
>>> cxpos, cypos = np.meshgrid(cxpos, cypos)
1671-
>>> tracers = Model.add_passive_tracers(vertices=[0,0],
1673+
>>>
1674+
>>> coords = np.zeros((1, 2))
1675+
>>> tracers = Model.add_passive_tracers(vertices=coords,
16721676
... centroids=[cxpos.ravel(),
16731677
... cypos.ravel())
16741678
@@ -1679,9 +1683,9 @@ We provide a function to create circles on a grid:
16791683
16801684
>>> import UWGeodynamics as GEO
16811685
1682-
>>> x_c, y_c = GEO.circles_grid(radius = 2.0 * u.kilometer,
1683-
... minCoord=[Model.minCoord[0], lowercrust.bottom],
1684-
... maxCoord=[Model.maxCoord[0], 0.*u.kilometer])
1686+
>>> coords = GEO.circles_grid(radius = 2.0 * u.kilometer,
1687+
... minCoord=[Model.minCoord[0], lowercrust.bottom],
1688+
... maxCoord=[Model.maxCoord[0], 0.*u.kilometer])
16851689
16861690
Tracking Values
16871691
~~~~~~~~~~~~~~~
@@ -1697,11 +1701,11 @@ through time.
16971701
>>> u = GEO.u
16981702
>>> Model = GEO.Model()
16991703
1700-
>>> x = np.linspace(GEO.nd(Model.minCoord[0]), GEO.nd(Model.maxCoord[0]), 1000)
1701-
>>> y = 32. * u.kilometre
1702-
1703-
>>> tracers = Model.add_passive_tracers(vertices=[x,y])
1704-
>>> P = Model.add_passive_tracers(vertices=[x,y])
1704+
>>> npoints = 1000
1705+
>>> coords = np.ndarray((npoints, 2))
1706+
>>> coords[:, 0] = np.linspace(GEO.nd(Model.minCoord[0]), GEO.nd(Model.maxCoord[0]), npoints)
1707+
>>> coords[:, 1] = GEO.nd(32. * u.kilometre)
1708+
>>> tracers = Model.add_passive_tracers(vertices=coords)
17051709
17061710
>>> tracers.add_tracked_field(Model.pressureField,
17071711
name="tracers_press",

examples/1_05_StokesSinker.ipynb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,11 @@
238238
}
239239
],
240240
"source": [
241-
"x0, y0 = 0, 20. * u.centimetre\n",
242-
"Model.add_passive_tracers(name=\"tip\", vertices=[x0, y0])"
241+
"coords = np.ndarray((1, 2))\n",
242+
"coords[:, 0] = 0.\n",
243+
"coords[:, 1] = GEO.nd(20. * u.centimetre)\n",
244+
"\n",
245+
"Model.add_passive_tracers(name=\"tip\", vertices=coords)"
243246
]
244247
},
245248
{
@@ -520,7 +523,7 @@
520523
"name": "python",
521524
"nbconvert_exporter": "python",
522525
"pygments_lexer": "ipython3",
523-
"version": "3.5.3"
526+
"version": "3.7.3"
524527
}
525528
},
526529
"nbformat": 4,

examples/1_08_ViscoElasticHalfSpace.ipynb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,14 @@
311311
"metadata": {},
312312
"outputs": [],
313313
"source": [
314-
"x = np.linspace(GEO.nd(minX), GEO.nd(maxX), 201)\n",
315-
"y = GEO.nd(w_m) * np.cos(2. * np.pi * x / GEO.nd(Lambda))\n",
314+
"coords = np.ndarray((201, 2))\n",
315+
"coords[:, 0] = np.linspace(GEO.nd(minX), GEO.nd(maxX), 201)\n",
316+
"coords[:, 1] = GEO.nd(w_m) * np.cos(2. * np.pi * x / GEO.nd(Lambda))\n",
316317
"\n",
317-
"tracerSurface = Model.add_passive_tracers(name=\"Tracer Swarm\", vertices=[x, y])\n",
318-
"tracerSolo = Model.add_passive_tracers(name=\"Single Tracer\", vertices=[0., GEO.nd(w_m)])"
318+
"tracerSurface = Model.add_passive_tracers(name=\"Tracer Swarm\", vertices=coords)\n",
319+
"\n",
320+
"coords[:, 1] = GEO.nd(w_m)\n",
321+
"tracerSolo = Model.add_passive_tracers(name=\"Single Tracer\", vertices=coords)"
319322
]
320323
},
321324
{
@@ -528,7 +531,7 @@
528531
"name": "python",
529532
"nbconvert_exporter": "python",
530533
"pygments_lexer": "ipython3",
531-
"version": "3.5.3"
534+
"version": "3.7.3"
532535
}
533536
},
534537
"nbformat": 4,

examples/1_26_NumericalSandboxCompression-MovingWall.ipynb

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -158,18 +158,25 @@
158158
"source": [
159159
"import numpy as np\n",
160160
"\n",
161-
"x = np.linspace(GEO.nd(Model.minCoord[0]), GEO.nd(Model.maxCoord[0]), 1000)\n",
162-
"interface1 = GEO.nd(sand1.top)\n",
163-
"interface2 = GEO.nd(sand2.top)\n",
164-
"interface3 = GEO.nd(sand2.bottom)\n",
165-
"interface4 = GEO.nd(microbeads.top)\n",
166-
"interface5 = GEO.nd(microbeads.bottom)\n",
161+
"npoints = 1000\n",
167162
"\n",
168-
"interface1 = Model.add_passive_tracers(name=\"Interface1\", vertices=[x, interface1])\n",
169-
"interface2 = Model.add_passive_tracers(name=\"Interface2\", vertices=[x, interface2])\n",
170-
"interface3 = Model.add_passive_tracers(name=\"Interface3\", vertices=[x, interface3])\n",
171-
"interface4 = Model.add_passive_tracers(name=\"Interface4\", vertices=[x, interface4])\n",
172-
"interface5 = Model.add_passive_tracers(name=\"Interface5\", vertices=[x, interface5])"
163+
"coords = np.ndarray((npoints, 2))\n",
164+
"coords[:, 0] = np.linspace(GEO.nd(Model.minCoord[0]), GEO.nd(Model.maxCoord[0]), npoints)\n",
165+
"coords[:, 1] = GEO.nd(sand1.top)\n",
166+
"\n",
167+
"interface1 = Model.add_passive_tracers(name=\"Interface1\", vertices=coords)\n",
168+
"\n",
169+
"coords[:, 1] = GEO.nd(sand2.top)\n",
170+
"interface2 = Model.add_passive_tracers(name=\"Interface2\", vertices=coords)\n",
171+
"\n",
172+
"coords[:, 1] = GEO.nd(sand2.bottom)\n",
173+
"interface3 = Model.add_passive_tracers(name=\"Interface3\", vertices=coords)\n",
174+
"\n",
175+
"coords[:, 1] = GEO.nd(microbeads.top)\n",
176+
"interface4 = Model.add_passive_tracers(name=\"Interface4\", vertices=coords)\n",
177+
"\n",
178+
"coords[:, 1] = GEO.nd(microbeads.bottom)\n",
179+
"interface5 = Model.add_passive_tracers(name=\"Interface5\", vertices=coords)"
173180
]
174181
},
175182
{
@@ -460,7 +467,7 @@
460467
"name": "python",
461468
"nbconvert_exporter": "python",
462469
"pygments_lexer": "ipython3",
463-
"version": "3.5.3"
470+
"version": "3.7.3"
464471
}
465472
},
466473
"nbformat": 4,

examples/1_27_ColumnPureThermalAdvection.ipynb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,16 @@
228228
"source": [
229229
"import numpy as np\n",
230230
"\n",
231-
"x = np.linspace(Model.minCoord[0], Model.maxCoord[0], 100) * u.kilometer\n",
232-
"interface1 = GEO.nd(uppercrust.top)\n",
233-
"interface2 = GEO.nd(mantle.top)\n",
231+
"npoints = 100\n",
234232
"\n",
235-
"interface1 = Model.add_passive_tracers(name=\"Interface1\", vertices=[x, interface1])\n",
236-
"interface2 = Model.add_passive_tracers(name=\"Interface2\", vertices=[x, interface2])"
233+
"coords = np.ndarray((npoints, 2))\n",
234+
"coords[:, 0] = np.linspace(GEO.nd(Model.minCoord[0]), GEO.nd(Model.maxCoord[0]), npoints)\n",
235+
"coords[:, 1] = GEO.nd(uppercrust.top)\n",
236+
"\n",
237+
"interface1 = Model.add_passive_tracers(name=\"Interface1\", vertices=coords)\n",
238+
"\n",
239+
"coords[:, 1] = GEO.nd(mantle.top)\n",
240+
"interface2 = Model.add_passive_tracers(name=\"Interface2\", vertices=coords)"
237241
]
238242
},
239243
{
@@ -683,7 +687,7 @@
683687
"name": "python",
684688
"nbconvert_exporter": "python",
685689
"pygments_lexer": "ipython3",
686-
"version": "3.5.3"
690+
"version": "3.7.3"
687691
}
688692
},
689693
"nbformat": 4,

examples/1_32_Passive_Tracers_tests.ipynb

Lines changed: 23 additions & 16 deletions
Large diffs are not rendered by default.

examples/2_15_Rayleigh-Taylor_van_Keken_et_al_1997.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@
592592
"name": "python",
593593
"nbconvert_exporter": "python",
594594
"pygments_lexer": "ipython3",
595-
"version": "3.5.3"
595+
"version": "3.7.3"
596596
}
597597
},
598598
"nbformat": 4,

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
MAJOR = 2
1010
MINOR = 9
11-
MICRO = 5
11+
MICRO = 6
1212
ISRELEASED = True
1313
VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
1414

0 commit comments

Comments
 (0)