@@ -183,12 +183,12 @@ def __new__(cls, expr, *dims, **kwargs):
183183 fd_order = fcounter .values ()
184184 else :
185185 # Default finite difference orders depending on input dimension (.dt or .dx)
186- fd_order = tuple ([
186+ fd_order = tuple (
187187 expr .time_order
188188 if getattr (d , 'is_Time' , False )
189189 else expr .space_order
190190 for d in dcounter .keys ()
191- ] )
191+ )
192192
193193 # SymPy expects the list of variables w.r.t. which we differentiate to be a list
194194 # of 2-tuples: `(s, count)` where:
@@ -546,59 +546,59 @@ def _eval_expand_nest(self, **hints):
546546 Note that this is not always a valid expansion depending on the kwargs
547547 used to construct the derivative.
548548 '''
549- if isinstance (self .expr , self .__class__ ):
550- new_expr = self .expr .args [0 ]
551- new_dims = [
552- (d , ii )
553- for d , ii in zip (
554- chain (self .dims , self .expr .dims ),
555- chain (self .deriv_order , self .expr .deriv_order )
556- )
557- ]
558- # This is necessary as tools.abc.Reconstructable._rebuild will copy
559- # all kwargs from the self object
560- # TODO: This dictionary merge needs to be a lot better
561- # EG: Don't actually expand if derivatives are incompatible
562- new_deriv_order = tuple (chain (self .deriv_order , self .expr .deriv_order ))
563- # The `fd_order` may need to be reduced to construct the nested derivative
564- dcounter = defaultdict (int )
565- fcounter = defaultdict (int )
566- new_fd_order = tuple (chain (self .fd_order , self .expr .fd_order ))
567- for d , do , fo in zip (new_dims , new_deriv_order , new_fd_order ):
568- if isinstance (d , Iterable ):
569- dcounter [d [0 ]] += d [1 ]
570- fcounter [d [0 ]] += fo
571- else :
572- dcounter [d ] += do
573- fcounter [d ] += fo
574- for (d , do ), (_ , fo ) in zip (dcounter .items (), fcounter .items ()):
575- if getattr (d , 'is_Time' , False ):
576- dim_name = 'time'
577- order = self .expr .time_order
578- else :
579- dim_name = 'space'
580- order = self .expr .space_order
581- if fo > order :
582- if do > order :
583- raise ValueError (
584- f'Nested { do } -derivative constructed which is bigger '
585- f'than the { dim_name } _order={ order } '
586- )
587- else :
588- warn (
589- f'Nested derivative constructed with fd_order={ fo } , '
590- f'but { dim_name } _order={ order } . Adjusting '
591- f'fd_order={ order } for the { d } dimension.'
592- )
593- fcounter [d ] = order
594- new_kwargs = {
595- 'deriv_order' : tuple (dcounter .values ()),
596- 'fd_order' : tuple (fcounter .values ())
597- }
598- return self .func (new_expr , * dcounter .items (), ** new_kwargs )
599- else :
549+ if not isinstance (self .expr , self .__class__ ):
600550 return self
601551
552+ new_expr = self .expr .args [0 ]
553+ new_dims = [
554+ (d , ii )
555+ for d , ii in zip (
556+ chain (self .dims , self .expr .dims ),
557+ chain (self .deriv_order , self .expr .deriv_order )
558+ )
559+ ]
560+ # This is necessary as tools.abc.Reconstructable._rebuild will copy
561+ # all kwargs from the self object
562+ # TODO: This dictionary merge needs to be a lot better
563+ # EG: Don't actually expand if derivatives are incompatible
564+ new_deriv_order = tuple (chain (self .deriv_order , self .expr .deriv_order ))
565+ # The `fd_order` may need to be reduced to construct the nested derivative
566+ dcounter = defaultdict (int )
567+ fcounter = defaultdict (int )
568+ new_fd_order = tuple (chain (self .fd_order , self .expr .fd_order ))
569+ for d , do , fo in zip (new_dims , new_deriv_order , new_fd_order ):
570+ if isinstance (d , Iterable ):
571+ dcounter [d [0 ]] += d [1 ]
572+ fcounter [d [0 ]] += fo
573+ else :
574+ dcounter [d ] += do
575+ fcounter [d ] += fo
576+ for (d , do ), (_ , fo ) in zip (dcounter .items (), fcounter .items ()):
577+ if getattr (d , 'is_Time' , False ):
578+ dim_name = 'time'
579+ order = self .expr .time_order
580+ else :
581+ dim_name = 'space'
582+ order = self .expr .space_order
583+ if fo > order :
584+ if do > order :
585+ raise ValueError (
586+ f'Nested { do } -derivative constructed which is bigger '
587+ f'than the { dim_name } _order={ order } '
588+ )
589+ else :
590+ warn (
591+ f'Nested derivative constructed with fd_order={ fo } , '
592+ f'but { dim_name } _order={ order } . Adjusting '
593+ f'fd_order={ order } for the { d } dimension.'
594+ )
595+ fcounter [d ] = order
596+ new_kwargs = {
597+ 'deriv_order' : tuple (dcounter .values ()),
598+ 'fd_order' : tuple (fcounter .values ())
599+ }
600+ return self .func (new_expr , * dcounter .items (), ** new_kwargs )
601+
602602 def _eval_expand_mul (self , ** hints ):
603603 ''' Expands products, moving independent terms outside the derivative
604604 `Derivative(C·f(x)·g(c, y), x)
0 commit comments