@@ -234,9 +234,13 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
234234 method: str, optional, default='FD'
235235 Discretization method. Options are 'FD' (default) and
236236 'RSFD' (rotated staggered grid finite-difference).
237+ side : Side or tuple of Side, optional, default=centered
238+ Side of the finite difference location, centered (at x), left (at x - 1)
239+ or right (at x + 1).
237240 weights/w: list, tuple, or dict, optional, default=None
238241 Custom weights for the finite differences.
239242 """
243+ side = kwargs .get ("side" )
240244 w = kwargs .get ('weights' , kwargs .get ('w' ))
241245 comps = []
242246 func = vec_func (self )
@@ -247,7 +251,7 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
247251 for i in range (len (self .space_dimensions )):
248252 comps .append (sum ([getattr (self [j , i ], 'd%s' % d .name )
249253 (x0 = shift_x0 (shift , d , i , j ), fd_order = order ,
250- method = method , w = w )
254+ method = method , side = side , w = w )
251255 for j , d in enumerate (space_dims )]))
252256 return func ._new (comps )
253257
@@ -277,9 +281,13 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
277281 method: str, optional, default='FD'
278282 Discretization method. Options are 'FD' (default) and
279283 'RSFD' (rotated staggered grid finite-difference).
284+ side : Side or tuple of Side, optional, default=centered
285+ Side of the finite difference location, centered (at x), left (at x - 1)
286+ or right (at x + 1).
280287 weights/w: list, tuple, or dict, optional, default=None
281288 Custom weights for the finite
282289 """
290+ side = kwargs .get ("side" )
283291 w = kwargs .get ('weights' , kwargs .get ('w' ))
284292 comps = []
285293 func = vec_func (self )
@@ -290,7 +298,7 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
290298 for j in range (ndim ):
291299 comps .append (sum ([getattr (self [j , i ], 'd%s2' % d .name )
292300 (x0 = shift_x0 (shift , d , j , i ), fd_order = order ,
293- method = method , w = w )
301+ method = method , side = side , w = w )
294302 for i , d in enumerate (space_dims )]))
295303 return func ._new (comps )
296304
@@ -372,15 +380,20 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
372380 method: str, optional, default='FD'
373381 Discretization method. Options are 'FD' (default) and
374382 'RSFD' (rotated staggered grid finite-difference).
383+ side : Side or tuple of Side, optional, default=centered
384+ Side of the finite difference location, centered (at x), left (at x - 1)
385+ or right (at x + 1).
375386 weights/w: list, tuple, or dict, optional, default=None
376387 Custom weights for the finite difference coefficients.
377388 """
389+ side = kwargs .get ("side" )
378390 w = kwargs .get ('weights' , kwargs .get ('w' ))
379391 shift_x0 = make_shift_x0 (shift , (len (self .space_dimensions ),))
380392 order = order or self .space_order
381393 space_dims = self .root_dimensions
382394 return sum ([getattr (self [i ], 'd%s' % d .name )(x0 = shift_x0 (shift , d , None , i ),
383- fd_order = order , method = method , w = w )
395+ fd_order = order , method = method ,
396+ side = side , w = w )
384397 for i , d in enumerate (space_dims )])
385398
386399 @property
@@ -404,16 +417,21 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
404417 method: str, optional, default='FD'
405418 Discretization method. Options are 'FD' (default) and
406419 'RSFD' (rotated staggered grid finite-difference).
420+ side : Side or tuple of Side, optional, default=centered
421+ Side of the finite difference location, centered (at x), left (at x - 1)
422+ or right (at x + 1).
407423 weights/w: list, tuple, or dict, optional, default=None
408424 Custom weights for the finite
409425 """
426+ side = kwargs .get ("side" )
410427 w = kwargs .get ('weights' , kwargs .get ('w' ))
411428 func = vec_func (self )
412429 shift_x0 = make_shift_x0 (shift , (len (self .space_dimensions ),))
413430 order = order or self .space_order
414431 space_dims = self .root_dimensions
415432 comps = [sum ([getattr (s , 'd%s2' % d .name )(x0 = shift_x0 (shift , d , None , i ),
416- fd_order = order , w = w , method = method )
433+ fd_order = order , method = method ,
434+ side = side , w = w )
417435 for i , d in enumerate (space_dims )])
418436 for s in self ]
419437 return func ._new (comps )
@@ -432,29 +450,39 @@ def curl(self, shift=None, order=None, method='FD', **kwargs):
432450 method: str, optional, default='FD'
433451 Discretization method. Options are 'FD' (default) and
434452 'RSFD' (rotated staggered grid finite-difference).
453+ side : Side or tuple of Side, optional, default=centered
454+ Side of the finite difference location, centered (at x), left (at x - 1)
455+ or right (at x + 1).
435456 weights/w: list, tuple, or dict, optional, default=None
436457 Custom weights for the finite difference coefficients.
437458 """
438459 if len (self .space_dimensions ) != 3 :
439460 raise AttributeError ("Curl only supported for 3D VectorFunction" )
440461 # The curl of a VectorFunction is a VectorFunction
462+ side = kwargs .get ("side" )
441463 w = kwargs .get ('weights' , kwargs .get ('w' ))
442464 dims = self .root_dimensions
443465 derivs = ['d%s' % d .name for d in dims ]
444466 shift_x0 = make_shift_x0 (shift , (len (dims ), len (dims )))
445467 order = order or self .space_order
446468 comp1 = (getattr (self [2 ], derivs [1 ])(x0 = shift_x0 (shift , dims [1 ], 2 , 1 ),
447- fd_order = order , method = method , w = w ) -
469+ fd_order = order , method = method ,
470+ side = side , w = w ) -
448471 getattr (self [1 ], derivs [2 ])(x0 = shift_x0 (shift , dims [2 ], 1 , 2 ),
449- fd_order = order , method = method , w = w ))
472+ fd_order = order , method = method ,
473+ side = side , w = w ))
450474 comp2 = (getattr (self [0 ], derivs [2 ])(x0 = shift_x0 (shift , dims [2 ], 0 , 2 ),
451- fd_order = order , method = method , w = w ) -
475+ fd_order = order , method = method ,
476+ side = side , w = w ) -
452477 getattr (self [2 ], derivs [0 ])(x0 = shift_x0 (shift , dims [0 ], 2 , 0 ),
453- fd_order = order , method = method , w = w ))
478+ fd_order = order , method = method ,
479+ side = side , w = w ))
454480 comp3 = (getattr (self [1 ], derivs [0 ])(x0 = shift_x0 (shift , dims [0 ], 1 , 0 ),
455- fd_order = order , method = method , w = w ) -
481+ fd_order = order , method = method ,
482+ side = side , w = w ) -
456483 getattr (self [0 ], derivs [1 ])(x0 = shift_x0 (shift , dims [1 ], 0 , 1 ),
457- fd_order = order , method = method , w = w ))
484+ fd_order = order , method = method ,
485+ side = side , w = w ))
458486 func = vec_func (self )
459487 return func ._new (3 , 1 , [comp1 , comp2 , comp3 ])
460488
@@ -472,17 +500,22 @@ def grad(self, shift=None, order=None, method='FD', **kwargs):
472500 method: str, optional, default='FD'
473501 Discretization method. Options are 'FD' (default) and
474502 'RSFD' (rotated staggered grid finite-difference).
503+ side : Side or tuple of Side, optional, default=centered
504+ Side of the finite difference location, centered (at x), left (at x - 1)
505+ or right (at x + 1).
475506 weights/w: list, tuple, or dict, optional, default=None
476507 Custom weights for the finite difference coefficients.
477508 """
509+ side = kwargs .get ("side" )
478510 w = kwargs .get ('weights' , kwargs .get ('w' ))
479511 func = tens_func (self )
480512 ndim = len (self .space_dimensions )
481513 shift_x0 = make_shift_x0 (shift , (ndim , ndim ))
482514 order = order or self .space_order
483515 space_dims = self .root_dimensions
484- comps = [[getattr (f , 'd%s' % d .name )(x0 = shift_x0 (shift , d , i , j ), w = w ,
485- fd_order = order , method = method )
516+ comps = [[getattr (f , 'd%s' % d .name )(x0 = shift_x0 (shift , d , i , j ),
517+ fd_order = order , method = method ,
518+ side = side , w = w )
486519 for j , d in enumerate (space_dims )]
487520 for i , f in enumerate (self )]
488521 return func ._new (comps )
0 commit comments