Skip to content

Commit 4dc18c0

Browse files
authored
Merge pull request #39 from OceanParcels/refactoring_particleset
Refactoring particleset creation method
2 parents 5269406 + b195ac3 commit 4dc18c0

1 file changed

Lines changed: 63 additions & 39 deletions

File tree

plasticparcels/constructors.py

Lines changed: 63 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -202,63 +202,32 @@ def create_fieldset(settings):
202202
return fieldset
203203

204204

205-
def create_particleset_from_map(fieldset, settings):
206-
""" A constructor method to create a Parcels.ParticleSet for a plasticparcels simulation from one of the available initialisation maps
205+
def create_particleset(fieldset, settings, release_locations):
206+
""" A constructor method to create a Parcels.ParticleSet for a plasticparcels simulation
207207
208208
Parameters
209209
----------
210210
fieldset :
211211
A Parcels.FieldSet object
212212
settings :
213213
A dictionary of model settings, simulation settings, and release settings and plastic-type settings
214+
release_locations :
215+
A dictionary of release locations for particles
214216
215217
Returns
216218
-------
217219
particleset
218220
A parcels.ParticleSet object
219221
"""
220222

221-
# Load release type information
222-
release_type = settings['release']['initialisation_type'] # TODO: MAKE THIS PART BETTER!
223-
224-
release_quantity_names = {
225-
'coastal': 'MPW_Cell',
226-
'rivers': 'Emissions',
227-
'fisheries': 'fishing_hours',
228-
'global_concentrations': 'Concentration'
229-
}
230-
release_quantity_name = release_quantity_names[release_type]
231-
232-
particle_locations = pd.read_csv(settings['release_maps'][release_type])
233-
234-
# Select specific continent/region/subregion/country/economic status if applicable:
235-
if 'continent' in settings['release'].keys():
236-
particle_locations = particle_locations[particle_locations['Continent'] == settings['release']['continent']]
237-
if 'region' in settings['release'].keys():
238-
particle_locations = particle_locations[particle_locations['Region'] == settings['release']['region']]
239-
if 'subregion' in settings['release'].keys():
240-
particle_locations = particle_locations[particle_locations['Subregion'] == settings['release']['subregion']]
241-
if 'country' in settings['release'].keys():
242-
particle_locations = particle_locations[particle_locations['Country'] == settings['release']['country']]
243-
if 'economicstatus' in settings['release'].keys():
244-
particle_locations = particle_locations[particle_locations['Economic status'] == settings['release']['economicstatus']]
245-
if 'concentration_type' in settings['release'].keys():
246-
particle_locations = particle_locations[particle_locations['ConcentrationType'] == settings['release']['concentration_type']]
247-
248-
particle_locations = particle_locations.groupby(['Longitude', 'Latitude'])[release_quantity_name].agg('sum').reset_index()
249-
particle_locations = particle_locations[particle_locations[release_quantity_name] > 0]
250-
251-
release_locations = {'lons': particle_locations['Longitude'],
252-
'lats': particle_locations['Latitude'],
253-
'plastic_amount': particle_locations[release_quantity_name]}
254-
255223
# Set the longitude, latitude, and plastic amount per particle
256224
lons = release_locations['lons']
257225
lats = release_locations['lats']
258-
plastic_amounts = release_locations['plastic_amount']
226+
if 'plastic_amount' in release_locations.keys():
227+
plastic_amounts = release_locations['plastic_amount']
228+
else:
229+
plastic_amounts = np.nan_like(lons)
259230

260-
# 20240429 - for simplification I have removed the option to set custom times and depths, as well as different densities, diameters, and wind_coefficients, this can be done in an alternate way
261-
# TODO: Update this to use model grid id's instead of T-points lat/lon
262231
# Set particle properties
263232
plastic_densities = np.full(lons.shape, settings['plastictype']['plastic_density'])
264233
plastic_diameters = np.full(lons.shape, settings['plastictype']['plastic_diameter'])
@@ -301,6 +270,61 @@ def create_particleset_from_map(fieldset, settings):
301270
return pset
302271

303272

273+
def create_particleset_from_map(fieldset, settings):
274+
""" A constructor method to create a Parcels.ParticleSet for a plasticparcels simulation from one of the available initialisation maps
275+
276+
Parameters
277+
----------
278+
fieldset :
279+
A Parcels.FieldSet object
280+
settings :
281+
A dictionary of model settings, simulation settings, and release settings and plastic-type settings
282+
283+
Returns
284+
-------
285+
particleset
286+
A parcels.ParticleSet object
287+
"""
288+
289+
# Load release type information
290+
release_type = settings['release']['initialisation_type']
291+
292+
release_quantity_names = {
293+
'coastal': 'MPW_Cell',
294+
'rivers': 'Emissions',
295+
'fisheries': 'fishing_hours',
296+
'global_concentrations': 'Concentration'
297+
}
298+
release_quantity_name = release_quantity_names[release_type]
299+
300+
particle_locations = pd.read_csv(settings['release_maps'][release_type])
301+
302+
# Select specific continent/region/subregion/country/economic status if applicable:
303+
if 'continent' in settings['release'].keys():
304+
particle_locations = particle_locations[particle_locations['Continent'] == settings['release']['continent']]
305+
if 'region' in settings['release'].keys():
306+
particle_locations = particle_locations[particle_locations['Region'] == settings['release']['region']]
307+
if 'subregion' in settings['release'].keys():
308+
particle_locations = particle_locations[particle_locations['Subregion'] == settings['release']['subregion']]
309+
if 'country' in settings['release'].keys():
310+
particle_locations = particle_locations[particle_locations['Country'] == settings['release']['country']]
311+
if 'economicstatus' in settings['release'].keys():
312+
particle_locations = particle_locations[particle_locations['Economic status'] == settings['release']['economicstatus']]
313+
if 'concentration_type' in settings['release'].keys():
314+
particle_locations = particle_locations[particle_locations['ConcentrationType'] == settings['release']['concentration_type']]
315+
316+
particle_locations = particle_locations.groupby(['Longitude', 'Latitude'])[release_quantity_name].agg('sum').reset_index()
317+
particle_locations = particle_locations[particle_locations[release_quantity_name] > 0]
318+
319+
release_locations = {'lons': particle_locations['Longitude'],
320+
'lats': particle_locations['Latitude'],
321+
'plastic_amount': particle_locations[release_quantity_name]}
322+
323+
pset = create_particleset(fieldset, settings, release_locations)
324+
325+
return pset
326+
327+
304328
def create_kernel(fieldset):
305329
""" A constructor method to create a list of kernels for a plasticparcels simulation
306330

0 commit comments

Comments
 (0)