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

Commit 012a393

Browse files
author
Romain Beucher
committed
Simplify Passive Tracers
1 parent 69e48c5 commit 012a393

File tree

2 files changed

+25
-50
lines changed

2 files changed

+25
-50
lines changed

UWGeodynamics/_model.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,8 +1739,9 @@ def _update(self):
17391739
self._update_stress_history(dt)
17401740

17411741
if self.passive_tracers:
1742-
for key in self.passive_tracers:
1743-
self.passive_tracers[key].integrate(dt)
1742+
for key, val in self.passive_tracers.items():
1743+
if val.advector:
1744+
val.advector.integrate(dt)
17441745

17451746
# Do pop control
17461747
self.population_control.repopulate()
@@ -1769,7 +1770,8 @@ def mesh_advector(self, axis):
17691770
self._advector = Mesh_advector(self, axis)
17701771

17711772
def add_passive_tracers(self, name, vertices=None,
1772-
particleEscape=True, centroids=None, zOnly=False):
1773+
particleEscape=True, centroids=None,
1774+
advect=True):
17731775
""" Add a swarm of passive tracers to the Model
17741776
17751777
Parameters:
@@ -1832,10 +1834,8 @@ def add_passive_tracers(self, name, vertices=None,
18321834
if not centroids:
18331835

18341836
tracers = PassiveTracers(self.mesh,
1835-
self.velocityField,
18361837
name=name,
1837-
particleEscape=particleEscape,
1838-
zOnly=zOnly)
1838+
particleEscape=particleEscape)
18391839
tracers.add_particles_with_coordinates(vertices)
18401840

18411841
else:
@@ -1857,15 +1857,16 @@ def add_passive_tracers(self, name, vertices=None,
18571857
vertices[:, 2] = z
18581858

18591859
tracers = PassiveTracers(self.mesh,
1860-
self.velocityField,
18611860
name=name,
1862-
particleEscape=particleEscape,
1863-
zOnly=zOnly)
1861+
particleEscape=particleEscape)
18641862
tracers.add_particles_with_coordinates(vertices)
18651863

1864+
if advect:
1865+
tracers.advector = uw.systems.SwarmAdvector(
1866+
self.velocityField, tracers, order=2)
1867+
18661868
self.passive_tracers[name] = tracers
18671869
setattr(self, name.lower() + "_tracers", tracers)
1868-
18691870
return tracers
18701871

18711872
def _get_melt_fraction(self):
@@ -2696,7 +2697,6 @@ def reload_restart_variables(self, step):
26962697
sys.stdout.flush()
26972698

26982699
def reload_passive_tracers(self, step):
2699-
27002700

27012701
Model = self.Model
27022702

@@ -2707,11 +2707,11 @@ def reload_passive_tracers(self, step):
27072707
tracked_fields = tracer.tracked_fields
27082708

27092709
obj = PassiveTracers(Model.mesh,
2710-
Model.velocityField,
27112710
tracer.name,
2712-
zOnly=tracer.zOnly,
27132711
particleEscape=tracer.particleEscape)
27142712
obj.load(fpath)
2713+
if tracer.advector:
2714+
tracer.advector = uw.systems.SwarmAdvector(Model.velocityField, tracer, order=2)
27152715

27162716
# Reload global indices
27172717
fpath = os.path.join(self.restartDir, tracer.name + '_global_index-%s.h5' % step)

UWGeodynamics/_utils.py

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,24 @@ def smooth(self):
6969

7070
class PassiveTracers(Swarm):
7171

72-
def __init__(self, mesh, velocityField, name=None,
73-
particleEscape=True, zOnly=False):
72+
def __init__(self, mesh, name=None, particleEscape=True):
7473

7574
super(PassiveTracers, self).__init__(mesh,
7675
particleEscape=particleEscape)
7776
self.name = name
78-
self.velocityField = velocityField
79-
self.angular_velocity = 0.5 * (self.velocityField.fn_gradient[1] -
80-
self.velocityField.fn_gradient[2])
8177
self.particleEscape = particleEscape
82-
self.zOnly = zOnly
83-
8478
self.tracked_fields = {}
79+
self._advector = None
80+
81+
@property
82+
def advector(self):
83+
return self._advector
84+
85+
@advector.setter
86+
def advector(self, uw_advector):
87+
if not isinstance(uw_advector, uw.systems.SwarmAdvector):
88+
raise ValueError(""" The advector must be an Underworld SwarmAdvector object""")
89+
self._advector = uw_advector
8590

8691
def _global_indices(self):
8792
indices = np.arange(self.particleLocalCount)
@@ -93,41 +98,12 @@ def _global_indices(self):
9398
self.global_index.data[:, 0] = pairs.view(np.int64)
9499

95100
def add_particles_with_coordinates(self, vertices, **kwargs):
96-
97101
vals = super(PassiveTracers,
98102
self).add_particles_with_coordinates(nd(vertices),
99103
**kwargs)
100-
self.advector = uw.systems.SwarmAdvector(
101-
swarm=self,
102-
velocityField=self.velocityField, order=2)
103-
104104
self._global_indices()
105105
return vals
106106

107-
def integrate(self, dt, **kwargs):
108-
""" Integrate swarm velocity in time """
109-
if self.zOnly:
110-
saved_velocities = np.copy(self.velocityField.data)
111-
self.velocityField.data[:, :-1] = 0.
112-
self.velocityField.syncronise()
113-
self.advector.integrate(dt, **kwargs)
114-
self.velocityField.data[...] = saved_velocities
115-
self.velocityField.syncronise()
116-
else:
117-
self.advector.integrate(dt, **kwargs)
118-
119-
# Integrate tracked field variables over time
120-
for name, field in self.tracked_fields.items():
121-
if field["timeIntegration"]:
122-
obj = getattr(self, name)
123-
if self.mesh.dim == 2 and obj.data.shape[-1] > 2:
124-
ang_vel = self.angular_velocity
125-
dtheta = dt * ang_vel.evaluate(self).reshape(1, -1)
126-
rotateTensor2D(obj.data[:, 0:3], dtheta)
127-
obj.data[:, 0:3] += field["value"].evaluate(self)
128-
else:
129-
obj.data[...] += field["value"].evaluate(self) * dt
130-
131107
def add_tracked_field(self, value, name, units, dataType, count=1,
132108
overwrite=True, timeIntegration=False):
133109
""" Add a field to be tracked """
@@ -206,7 +182,6 @@ def save(self, outputDir, checkpointID, time):
206182
comm.Barrier()
207183

208184
# get swarm parameters - serially read from hdf5 file to get size
209-
210185
if rank == 0:
211186
with h5py.File(name=swarm_fpath, mode="r") as h5f:
212187
dset = h5f.get('data')

0 commit comments

Comments
 (0)