@@ -220,7 +220,7 @@ def values(self):
220220 else :
221221 return super ().values ()
222222
223- def div (self , shift = None , order = None , method = 'FD' , ** kwargs ):
223+ def div (self , shift = None , order = None , method = 'FD' , side = None , ** kwargs ):
224224 """
225225 Divergence of the TensorFunction (is a VectorFunction).
226226
@@ -234,6 +234,9 @@ 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 """
@@ -247,7 +250,7 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
247250 for i in range (len (self .space_dimensions )):
248251 comps .append (sum ([getattr (self [j , i ], 'd%s' % d .name )
249252 (x0 = shift_x0 (shift , d , i , j ), fd_order = order ,
250- method = method , w = w )
253+ method = method , side = side , w = w )
251254 for j , d in enumerate (space_dims )]))
252255 return func ._new (comps )
253256
@@ -258,7 +261,7 @@ def laplace(self):
258261 """
259262 return self .laplacian ()
260263
261- def laplacian (self , shift = None , order = None , method = 'FD' , ** kwargs ):
264+ def laplacian (self , shift = None , order = None , method = 'FD' , side = None , ** kwargs ):
262265 """
263266 Laplacian of the TensorFunction with shifted derivatives and custom
264267 FD order.
@@ -277,6 +280,9 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
277280 method: str, optional, default='FD'
278281 Discretization method. Options are 'FD' (default) and
279282 'RSFD' (rotated staggered grid finite-difference).
283+ side : Side or tuple of Side, optional, default=centered
284+ Side of the finite difference location, centered (at x), left (at x - 1)
285+ or right (at x + 1).
280286 weights/w: list, tuple, or dict, optional, default=None
281287 Custom weights for the finite
282288 """
@@ -290,7 +296,7 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
290296 for j in range (ndim ):
291297 comps .append (sum ([getattr (self [j , i ], 'd%s2' % d .name )
292298 (x0 = shift_x0 (shift , d , j , i ), fd_order = order ,
293- method = method , w = w )
299+ method = method , side = side , w = w )
294300 for i , d in enumerate (space_dims )]))
295301 return func ._new (comps )
296302
@@ -358,7 +364,7 @@ def __str__(self):
358364
359365 __repr__ = __str__
360366
361- def div (self , shift = None , order = None , method = 'FD' , ** kwargs ):
367+ def div (self , shift = None , order = None , method = 'FD' , side = None , ** kwargs ):
362368 """
363369 Divergence of the VectorFunction, creates the divergence Function.
364370
@@ -372,6 +378,9 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
372378 method: str, optional, default='FD'
373379 Discretization method. Options are 'FD' (default) and
374380 'RSFD' (rotated staggered grid finite-difference).
381+ side : Side or tuple of Side, optional, default=centered
382+ Side of the finite difference location, centered (at x), left (at x - 1)
383+ or right (at x + 1).
375384 weights/w: list, tuple, or dict, optional, default=None
376385 Custom weights for the finite difference coefficients.
377386 """
@@ -380,7 +389,8 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
380389 order = order or self .space_order
381390 space_dims = self .root_dimensions
382391 return sum ([getattr (self [i ], 'd%s' % d .name )(x0 = shift_x0 (shift , d , None , i ),
383- fd_order = order , method = method , w = w )
392+ fd_order = order , method = method ,
393+ side = side , w = w )
384394 for i , d in enumerate (space_dims )])
385395
386396 @property
@@ -390,7 +400,7 @@ def laplace(self):
390400 """
391401 return self .laplacian ()
392402
393- def laplacian (self , shift = None , order = None , method = 'FD' , ** kwargs ):
403+ def laplacian (self , shift = None , order = None , method = 'FD' , side = None , ** kwargs ):
394404 """
395405 Laplacian of the VectorFunction, creates the Laplacian VectorFunction.
396406
@@ -404,6 +414,9 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
404414 method: str, optional, default='FD'
405415 Discretization method. Options are 'FD' (default) and
406416 'RSFD' (rotated staggered grid finite-difference).
417+ side : Side or tuple of Side, optional, default=centered
418+ Side of the finite difference location, centered (at x), left (at x - 1)
419+ or right (at x + 1).
407420 weights/w: list, tuple, or dict, optional, default=None
408421 Custom weights for the finite
409422 """
@@ -413,12 +426,13 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
413426 order = order or self .space_order
414427 space_dims = self .root_dimensions
415428 comps = [sum ([getattr (s , 'd%s2' % d .name )(x0 = shift_x0 (shift , d , None , i ),
416- fd_order = order , w = w , method = method )
429+ fd_order = order , method = method ,
430+ side = side , w = w )
417431 for i , d in enumerate (space_dims )])
418432 for s in self ]
419433 return func ._new (comps )
420434
421- def curl (self , shift = None , order = None , method = 'FD' , ** kwargs ):
435+ def curl (self , shift = None , order = None , method = 'FD' , side = None , ** kwargs ):
422436 """
423437 Gradient of the (3D) VectorFunction, creates the curl VectorFunction.
424438
@@ -432,6 +446,9 @@ def curl(self, shift=None, order=None, method='FD', **kwargs):
432446 method: str, optional, default='FD'
433447 Discretization method. Options are 'FD' (default) and
434448 'RSFD' (rotated staggered grid finite-difference).
449+ side : Side or tuple of Side, optional, default=centered
450+ Side of the finite difference location, centered (at x), left (at x - 1)
451+ or right (at x + 1).
435452 weights/w: list, tuple, or dict, optional, default=None
436453 Custom weights for the finite difference coefficients.
437454 """
@@ -444,21 +461,27 @@ def curl(self, shift=None, order=None, method='FD', **kwargs):
444461 shift_x0 = make_shift_x0 (shift , (len (dims ), len (dims )))
445462 order = order or self .space_order
446463 comp1 = (getattr (self [2 ], derivs [1 ])(x0 = shift_x0 (shift , dims [1 ], 2 , 1 ),
447- fd_order = order , method = method , w = w ) -
464+ fd_order = order , method = method ,
465+ side = side , w = w ) -
448466 getattr (self [1 ], derivs [2 ])(x0 = shift_x0 (shift , dims [2 ], 1 , 2 ),
449- fd_order = order , method = method , w = w ))
467+ fd_order = order , method = method ,
468+ side = side , w = w ))
450469 comp2 = (getattr (self [0 ], derivs [2 ])(x0 = shift_x0 (shift , dims [2 ], 0 , 2 ),
451- fd_order = order , method = method , w = w ) -
470+ fd_order = order , method = method ,
471+ side = side , w = w ) -
452472 getattr (self [2 ], derivs [0 ])(x0 = shift_x0 (shift , dims [0 ], 2 , 0 ),
453- fd_order = order , method = method , w = w ))
473+ fd_order = order , method = method ,
474+ side = side , w = w ))
454475 comp3 = (getattr (self [1 ], derivs [0 ])(x0 = shift_x0 (shift , dims [0 ], 1 , 0 ),
455- fd_order = order , method = method , w = w ) -
476+ fd_order = order , method = method ,
477+ side = side , w = w ) -
456478 getattr (self [0 ], derivs [1 ])(x0 = shift_x0 (shift , dims [1 ], 0 , 1 ),
457- fd_order = order , method = method , w = w ))
479+ fd_order = order , method = method ,
480+ side = side , w = w ))
458481 func = vec_func (self )
459482 return func ._new (3 , 1 , [comp1 , comp2 , comp3 ])
460483
461- def grad (self , shift = None , order = None , method = 'FD' , ** kwargs ):
484+ def grad (self , shift = None , order = None , method = 'FD' , side = None , ** kwargs ):
462485 """
463486 Gradient of the VectorFunction, creates the gradient TensorFunction.
464487
@@ -472,6 +495,9 @@ def grad(self, shift=None, order=None, method='FD', **kwargs):
472495 method: str, optional, default='FD'
473496 Discretization method. Options are 'FD' (default) and
474497 'RSFD' (rotated staggered grid finite-difference).
498+ side : Side or tuple of Side, optional, default=centered
499+ Side of the finite difference location, centered (at x), left (at x - 1)
500+ or right (at x + 1).
475501 weights/w: list, tuple, or dict, optional, default=None
476502 Custom weights for the finite difference coefficients.
477503 """
@@ -481,8 +507,9 @@ def grad(self, shift=None, order=None, method='FD', **kwargs):
481507 shift_x0 = make_shift_x0 (shift , (ndim , ndim ))
482508 order = order or self .space_order
483509 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 )
510+ comps = [[getattr (f , 'd%s' % d .name )(x0 = shift_x0 (shift , d , i , j ),
511+ fd_order = order , method = method ,
512+ side = side , w = w )
486513 for j , d in enumerate (space_dims )]
487514 for i , f in enumerate (self )]
488515 return func ._new (comps )
0 commit comments