@@ -356,7 +356,14 @@ def smooth(self, *args, **kwargs):
356356 def particle_operation (self , * args , ** kwargs ):
357357 raise NotImplementedError
358358
359- def deposit (self , positions , fields = None , method = None , kernel_name = "cubic" ):
359+ def deposit (
360+ self ,
361+ positions ,
362+ fields = None ,
363+ method = None ,
364+ kernel_name = "cubic" ,
365+ vector_field = False ,
366+ ):
360367 # Here we perform our particle deposition.
361368 cls = getattr (particle_deposit , f"deposit_{ method } " , None )
362369 if cls is None :
@@ -365,10 +372,18 @@ def deposit(self, positions, fields=None, method=None, kernel_name="cubic"):
365372 # inside this is Fortran ordered because of the ordering in the
366373 # octree deposit routines, so we reverse it here to match the
367374 # convention there
368- nvals = tuple ( self . ActiveDimensions [:: - 1 ])
375+
369376 # append a dummy dimension because we are only depositing onto
370377 # one grid
371- op = cls (nvals + (1 ,), kernel_name )
378+ nvals = tuple (self .ActiveDimensions [::- 1 ]) + (1 ,)
379+ if vector_field :
380+ vec_size = fields [0 ].shape [- 1 ] if fields else 1
381+ nvals = nvals + (vec_size ,)
382+ else :
383+ vec_size = 1
384+
385+ op = cls (nvals , kernel_name )
386+
372387 op .initialize ()
373388 if positions .size > 0 :
374389 op .process_grid (self , positions , fields )
@@ -377,8 +392,12 @@ def deposit(self, positions, fields=None, method=None, kernel_name="cubic"):
377392 return
378393 # Fortran-ordered, so transpose.
379394 vals = vals .transpose ()
380- # squeeze dummy dimension we appended above
381- return np .squeeze (vals , axis = 0 )
395+ # squeeze dummy dimension(s) we appended above
396+ if vector_field :
397+ new_shape = (vec_size , * self .ActiveDimensions )
398+ else :
399+ new_shape = self .ActiveDimensions
400+ return vals .reshape (new_shape )
382401
383402 def select_blocks (self , selector ):
384403 mask = self ._get_selector_mask (selector )
0 commit comments