@@ -496,97 +496,3 @@ class TSFCConstantMixin:
496496
497497 def __init__ (self ):
498498 pass
499-
500-
501- class FixedIndexRemover (MultiFunction ):
502-
503- def __init__ (self , fimap ):
504- MultiFunction .__init__ (self )
505- self .fimap = fimap
506-
507- expr = MultiFunction .reuse_if_untouched
508-
509- def zero (self , o ):
510- free_indices = []
511- index_dimensions = []
512- for i , d in zip (o .ufl_free_indices , o .ufl_index_dimensions ):
513- if Index (i ) in self .fimap :
514- ind_j = self .fimap [Index (i )]
515- if not isinstance (ind_j , FixedIndex ):
516- free_indices .append (ind_j .count ())
517- index_dimensions .append (d )
518- else :
519- free_indices .append (i )
520- index_dimensions .append (d )
521- return Zero (shape = o .ufl_shape , free_indices = tuple (free_indices ), index_dimensions = tuple (index_dimensions ))
522-
523- def list_tensor (self , o ):
524- rule = FixedIndexRemover (self .fimap )
525- cc = []
526- for o1 in o .ufl_operands :
527- comp = map_expr_dag (rule , o1 )
528- cc .append (comp )
529- return ListTensor (* cc )
530-
531- def multi_index (self , o ):
532- return MultiIndex (tuple (self .fimap .get (i , i ) for i in o .indices ()))
533-
534-
535- class IndexRemover (MultiFunction ):
536-
537- def __init__ (self ):
538- MultiFunction .__init__ (self )
539-
540- expr = MultiFunction .reuse_if_untouched
541-
542- def _zero_simplify (self , o ):
543- operand , = o .ufl_operands
544- rule = IndexRemover ()
545- operand = map_expr_dag (rule , operand )
546- if isinstance (operand , Zero ):
547- return Zero (shape = o .ufl_shape , free_indices = o .ufl_free_indices , index_dimensions = o .ufl_index_dimensions )
548- else :
549- return o ._ufl_expr_reconstruct_ (operand )
550-
551- def indexed (self , o ):
552- o1 , i1 = o .ufl_operands
553- if isinstance (o1 , ComponentTensor ):
554- o2 , i2 = o1 .ufl_operands
555- fimap = dict (zip (i2 .indices (), i1 .indices (), strict = True ))
556- rule = FixedIndexRemover (fimap )
557- v = map_expr_dag (rule , o2 )
558- rule = IndexRemover ()
559- return map_expr_dag (rule , v )
560- elif isinstance (o1 , ListTensor ):
561- if isinstance (i1 [0 ], FixedIndex ):
562- o1 = o1 .ufl_operands [i1 [0 ]._value ]
563- rule = IndexRemover ()
564- if len (i1 ) > 1 :
565- i1 = MultiIndex (i1 [1 :])
566- return map_expr_dag (rule , Indexed (o1 , i1 ))
567- else :
568- return map_expr_dag (rule , o1 )
569- rule = IndexRemover ()
570- o1 = map_expr_dag (rule , o1 )
571- return Indexed (o1 , i1 )
572-
573- # Do something nicer
574- positive_restricted = _zero_simplify
575- negative_restricted = _zero_simplify
576- single_value_restricted = _zero_simplify
577- to_be_restricted = _zero_simplify
578- reference_grad = _zero_simplify
579- reference_value = _zero_simplify
580-
581-
582- def remove_indices (o ):
583- if isinstance (o , Form ):
584- integrals = []
585- for integral in o .integrals ():
586- integrand = remove_indices (integral .integrand ())
587- if not isinstance (integrand , Zero ):
588- integrals .append (integral .reconstruct (integrand = integrand ))
589- return o ._ufl_expr_reconstruct_ (integrals )
590- else :
591- rule = IndexRemover ()
592- return map_expr_dag (rule , o )
0 commit comments