@@ -216,12 +216,7 @@ def eval(self, time: datetime, z, y, x, particles=None, applyConversion=True):
216216 else :
217217 _ei = particles .ei [:, self .igrid ]
218218
219- particle_positions = {"time" : time , "z" : z , "lat" : y , "lon" : x }
220- grid_positions = {}
221- grid_positions .update (_search_time_index (self , time ))
222- grid_positions .update (self .grid .search (z , y , x , ei = _ei ))
223- _update_particles_ei (particles , grid_positions , self )
224- _update_particle_states_position (particles , grid_positions )
219+ particle_positions , grid_positions = _get_positions (self , time , z , y , x , particles , _ei )
225220
226221 value = self ._interp_method (particle_positions , grid_positions , self )
227222
@@ -302,12 +297,7 @@ def eval(self, time: datetime, z, y, x, particles=None, applyConversion=True):
302297 else :
303298 _ei = particles .ei [:, self .igrid ]
304299
305- particle_positions = {"time" : time , "z" : z , "lat" : y , "lon" : x }
306- grid_positions = {}
307- grid_positions .update (_search_time_index (self .U , time ))
308- grid_positions .update (self .grid .search (z , y , x , ei = _ei ))
309- _update_particles_ei (particles , grid_positions , self )
310- _update_particle_states_position (particles , grid_positions )
300+ particle_positions , grid_positions = _get_positions (self .U , time , z , y , x , particles , _ei )
311301
312302 if self ._vector_interp_method is None :
313303 u = self .U ._interp_method (particle_positions , grid_positions , self .U )
@@ -343,7 +333,7 @@ def __getitem__(self, key):
343333 return _deal_with_errors (error , key , vector_type = self .vector_type )
344334
345335
346- def _update_particles_ei (particles , grid_positions , field ):
336+ def _update_particles_ei (particles , grid_positions : dict , field : Field ):
347337 """Update the element index (ei) of the particles"""
348338 if particles is not None :
349339 if isinstance (field .grid , XGrid ):
@@ -363,7 +353,7 @@ def _update_particles_ei(particles, grid_positions, field):
363353 )
364354
365355
366- def _update_particle_states_position (particles , grid_positions ):
356+ def _update_particle_states_position (particles , grid_positions : dict ):
367357 """Update the particle states based on the position dictionary."""
368358 if particles : # TODO also support uxgrid search
369359 for dim in ["X" , "Y" ]:
@@ -478,3 +468,14 @@ def _assert_same_time_interval(fields: list[Field]) -> None:
478468 raise ValueError (
479469 f"Fields must have the same time domain. { fields [0 ].name } : { reference_time_interval } , { field .name } : { field .time_interval } "
480470 )
471+
472+
473+ def _get_positions (field : Field , time , z , y , x , particles , _ei ) -> tuple [dict , dict ]:
474+ """Initialize and populate particle_positions and grid_positions dictionaries"""
475+ particle_positions = {"time" : time , "z" : z , "lat" : y , "lon" : x }
476+ grid_positions = {}
477+ grid_positions .update (_search_time_index (field , time ))
478+ grid_positions .update (field .grid .search (z , y , x , ei = _ei ))
479+ _update_particles_ei (particles , grid_positions , field )
480+ _update_particle_states_position (particles , grid_positions )
481+ return particle_positions , grid_positions
0 commit comments