@@ -1612,61 +1612,66 @@ def get_pde_as_diff_op(self) -> LinearPDESystemOperator:
16121612
16131613@dataclass (frozen = True , repr = False )
16141614class HeatKernel (ExpressionKernel ):
1615- r"""The Green's function for the heat equation given by
1616- :math:`e^{-r^2/{4 \alpha t}}/\sqrt{(4 \pi \alpha t)^d}`
1617- where :math:`d` is the number of spatial dimensions.
1615+ r"""The Green's function for the heat equation.
1616+
1617+ .. math::
1618+
1619+ \frac{\partial}{\partial t} K(t, \mathbf{x}, \mathbf{y})
1620+ - \alpha \Delta K(t, \mathbf{x}, \mathbf{y})
1621+ = \delta(t) \delta(\mathbf{x} - \mathbf{y})
16181622
16191623 .. note::
16201624
1621- This kernel cannot be used in an FMM yet and can only
1622- be used in expansions and evaluations that occur forward
1623- in the time dimension.
1625+ This kernel cannot be used in an FMM yet and can only be used in
1626+ expansions and evaluations that occur forward in the time dimension.
16241627 """
1625- heat_alpha_name : str
16261628
16271629 mapper_method : ClassVar [str ] = "map_heat_kernel"
16281630
1631+ heat_alpha_name : str
1632+
16291633 def __init__ (self , spatial_dims : int , heat_alpha_name : str = "alpha" ):
16301634 dim = spatial_dims + 1
1635+ alpha = sym .SpatialConstant (heat_alpha_name )
1636+
16311637 d = make_sym_vector ("d" , dim )
16321638 t = d [- 1 ]
1633- r = pymbolic_real_norm_2 (d [:- 1 ])
1634- alpha = SpatialConstant ( heat_alpha_name )
1639+ r = sym . pymbolic_real_norm_2 (d [:- 1 ])
1640+
16351641 expr = var ("exp" )(- r ** 2 / (4 * alpha * t )) / var ("sqrt" )(t ** (dim - 1 ))
16361642 scaling = 1 / var ("sqrt" )((4 * var ("pi" )* alpha )** (dim - 1 ))
16371643
1638- super ().__init__ (
1639- dim ,
1640- expression = expr ,
1641- global_scaling_const = scaling ,
1642- )
1643-
1644+ super ().__init__ (dim , expression = expr , global_scaling_const = scaling )
16441645 object .__setattr__ (self , "heat_alpha_name" , heat_alpha_name )
16451646
1647+ @override
1648+ def __reduce__ (self ) -> tuple [object , ...]:
1649+ return (self .__class__ , (self .dim - 1 , self .heat_alpha_name ))
1650+
16461651 @property
16471652 @override
16481653 def is_complex_valued (self ) -> bool :
16491654 return False
16501655
16511656 @override
1652- def __repr__ (self ):
1657+ def __str__ (self ):
16531658 return f"HeatKnl{ self .dim - 1 } D"
16541659
16551660 @override
16561661 def get_args (self ):
16571662 return [
1658- KernelArgument (
1659- loopy_arg = lp .ValueArg (self .heat_alpha_name , np .float64 ),
1660- )]
1663+ KernelArgument (loopy_arg = lp .ValueArg (self .heat_alpha_name , np .float64 ))
1664+ ]
16611665
16621666 @override
1663- def get_pde_as_diff_op (self ):
1667+ def get_pde_as_diff_op (self ) -> LinearPDESystemOperator :
16641668 from sumpy .expansion .diff_op import diff , laplacian , make_identity_diff_op
1669+
16651670 alpha = sym .Symbol (self .heat_alpha_name )
16661671 w = make_identity_diff_op (self .dim - 1 , time_dependent = True )
1667- time_diff = [0 ]* self .dim
1668- time_diff [ - 1 ] = 1
1669- return diff (w , tuple ( time_diff )) - laplacian (w ) * alpha
1672+ t_mi = ( * ( [0 ] * ( self .dim - 1 )), 1 )
1673+
1674+ return diff (w , t_mi ) - alpha * laplacian (w )
16701675
16711676
16721677# }}}
@@ -2489,7 +2494,7 @@ def map_expression_kernel(self, kernel: ExpressionKernel) -> ScalarKernel:
24892494 map_stresslet_kernel : Callable [[Self , StressletKernel ], ScalarKernel ] = map_expression_kernel # noqa: E501
24902495 map_brinkmanlet_kernel : Callable [[Self , BrinkmanletKernel ], ScalarKernel ] = map_expression_kernel # noqa: E501
24912496 map_brinkman_stress_kernel : Callable [[Self , BrinkmanStressKernel ], ScalarKernel ] = map_expression_kernel # noqa: E501
2492- map_heat_kernel : Callable [[Self , HeatKernel ], Kernel ] = map_expression_kernel
2497+ map_heat_kernel : Callable [[Self , HeatKernel ], ScalarKernel ] = map_expression_kernel
24932498
24942499 def map_axis_target_derivative (self , kernel : AxisTargetDerivative ) -> ScalarKernel :
24952500 return type (kernel )(kernel .axis , self .rec (kernel .inner_kernel ))
0 commit comments