@@ -19,15 +19,9 @@ function _sprepost(A, B) # for any other input types
1919 return _spre (A, Id_cache) * _spost (B, Id_cache)
2020end
2121
22- _liouvillian (H:: AbstractMatrix , Id:: AbstractMatrix ) = - 1im * (_spre (H, Id) - _spost (H, Id))
23- function _lindblad_dissipator (O:: AbstractMatrix , Id:: AbstractMatrix )
24- Od_O = O' * O
25- return _sprepost (O, O' ) - (_spre (Od_O, Id) + _spost (Od_O, Id)) / 2
26- end
27-
28- # # if input is AbstractSciMLOperator
29- _lazy_tensor_warning (func_name:: String , data:: AbstractSciMLOperator ) =
30- @warn " The function `$func_name ` uses lazy tensor (which can hurt performance) for data type: $(get_typename_wrapper (data)) "
22+ # # if input is AbstractSciMLOperator
23+ # # some of them are optimzed to speed things up
24+ # # the rest of the SciMLOperators will just use lazy tensor (and prompt a warning)
3125_spre (A:: MatrixOperator , Id:: AbstractMatrix ) = MatrixOperator (_spre (A. A, Id))
3226_spre (A:: ScaledOperator , Id:: AbstractMatrix ) = ScaledOperator (A. λ, _spre (A. L, Id))
3327_spre (A:: AddedOperator , Id:: AbstractMatrix ) = mapreduce (op -> _spre (op, Id), + , A. ops)
@@ -44,10 +38,18 @@ function _spost(B::AbstractSciMLOperator, Id::AbstractMatrix)
4438 return kron (transpose (B), Id)
4539end
4640
41+ # # intrinsic liouvillian
42+ _liouvillian (H:: MT , Id:: AbstractMatrix ) where {MT<: Union{AbstractMatrix,AbstractSciMLOperator} } =
43+ - 1im * (_spre (H, Id) - _spost (H, Id))
4744_liouvillian (H:: MatrixOperator , Id:: AbstractMatrix ) = MatrixOperator (_liouvillian (H. A, Id))
4845_liouvillian (H:: ScaledOperator , Id:: AbstractMatrix ) = ScaledOperator (H. λ, _liouvillian (H. L, Id))
4946_liouvillian (H:: AddedOperator , Id:: AbstractMatrix ) = mapreduce (op -> _liouvillian (op, Id), + , H. ops)
50- _liouvillian (H:: AbstractSciMLOperator , Id:: AbstractMatrix ) = - 1im * (_spre (H, Id) - _spost (H, Id))
47+
48+ # intrinsic lindblad_dissipator
49+ function _lindblad_dissipator (O:: MT , Id:: AbstractMatrix ) where {MT<: Union{AbstractMatrix,AbstractSciMLOperator} }
50+ Od_O = O' * O
51+ return _sprepost (O, O' ) - (_spre (Od_O, Id) + _spost (Od_O, Id)) / 2
52+ end
5153function _lindblad_dissipator (O:: MatrixOperator , Id:: AbstractMatrix )
5254 _O = O. A
5355 Od_O = _O' * _O
@@ -57,10 +59,6 @@ function _lindblad_dissipator(O::ScaledOperator, Id::AbstractMatrix)
5759 λc_λ = conj (O. λ) * O. λ
5860 return ScaledOperator (λc_λ, _lindblad_dissipator (O. L, Id))
5961end
60- function _lindblad_dissipator (O:: AbstractSciMLOperator , Id:: AbstractMatrix )
61- Od_O = O' * O
62- return _sprepost (O, O' ) - (_spre (Od_O, Id) + _spost (Od_O, Id)) / 2
63- end
6462
6563@doc raw """
6664 spre(A::AbstractQuantumObject, Id_cache=I(size(A,1)))
0 commit comments