Spectral sensitivity with the Sh-matrix method
Fast, exact wavelength / refractive-index sensitivities for an axisymmetric scatterer, built on the Sh-matrix moment-separation backend of TransitionMatrices.jl.
The Sh-matrix method factors every EBCM surface integral as
$$\int = \sum_{\text{terms}} \big[\,\text{coefficient}(k, m_r)\,\big] \times \big[\,\text{shape-only moment}\,\big],$$
where the shape moments depend only on the geometry — not on the wavelength \(\lambda\) or the refractive index \(m_r\). prepare_sh computes the moments once; each transition_matrix(prep, λ, mᵣ) is then a cheap coefficient×moment sum. Because that reconstruction is a plain differentiable function of \((\lambda, m_r)\) with the moments riding through as constants, ForwardDiff straight through it gives exact \(\partial T/\partial\lambda\) and \(\partial T/\partial m_r\) — at a fraction of the cost of differentiating the full from-scratch assembly.
begin
import Pkg
Pkg.activate(@__DIR__) # the examples/ environment
Pkg.develop(; path = dirname(@__DIR__)) # point TransitionMatrices at this repo
Pkg.instantiate()
using TransitionMatrices, ForwardDiff, Plots, BenchmarkTools
end
1. Define the scatterer and prepare the moments
A prolate spheroid (semi-axes a = 2, c = 1) with a fixed small absorption mᵢ = 0.02. prepare_sh runs the geometry quadrature once — every spectral point below reuses it.
begin
nmax, Ng = 10, 200
mᵢ = 0.02
spheroid = TransitionMatrices.Spheroid{Float64, ComplexF64}(2.0, 1.0, 1.5 + mᵢ * im)
prep = prepare_sh(spheroid, nmax, Ng)
end
ShPreparation{Spheroid{Float64, ComplexF64}, Vector{@NamedTuple{Mτd::OffsetArrays.OffsetArray{Float64, 3, Array{Float64, 3}}, Mπd::OffsetArrays.OffsetArray{Float64, 3, Array{Float64, 3}}, Mππττ::OffsetArrays.OffsetMatrix{Float64, Matrix{Float64}}, nmin::Int64, qlo::Int64, qhi::Int64, sym::Bool, ng::Int64}}, @NamedTuple{ψ::OffsetArrays.OffsetVector{Tuple{Int64, Vector{Float64}}, Vector{Tuple{Int64, Vector{Float64}}}}, ψ′::OffsetArrays.OffsetVector{Tuple{Int64, Vector{Float64}}, Vector{Tuple{Int64, Vector{Float64}}}}, χ::OffsetArrays.OffsetVector{Tuple{Int64, Vector{Float64}}, Vector{Tuple{Int64, Vector{Float64}}}}, χ′::OffsetArrays.OffsetVector{Tuple{Int64, Vector{Float64}}, Vector{Tuple{Int64, Vector{Float64}}}}}}(Spheroid{Float64, ComplexF64}(2.0, 1.0, 1.5 + 0.02im), 10, 200, 30, @NamedTuple{Mτd::OffsetArrays.OffsetArray{Float64, 3, Array{Float64, 3}}, Mπd::OffsetArrays.OffsetArray{Float64, 3, Array{Float64, 3}}, Mππττ::OffsetArrays.OffsetMatrix{Float64, Matrix{Float64}}, nmin::Int64, qlo::Int64, qhi::Int64, sym::Bool, ng::Int64}[(Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; -6.206320203713274e20 -3.7043146918274117e21 … -1.2596302847100982e21 -1.1144755575052641e21; 1.9520286441748424e20 8.945488012541322e20 … 3.6878598840722935e20 1.874211290640545e20; … ; -7.704772103440639e20 -6.130643443016551e21 … -1.7445612997371177e21 -2.32312597077111e21; 1.2856642865459162e21 6.464779858526699e21 … 2.5441182733039016e21 1.6044501024474978e21;;; -1.2181271182545741e21 -7.319520600228689e21 … -2.4784658637735566e21 -2.217538965244375e21; 3.806735350750353e20 1.7566675284302808e21 … 7.217160307268497e20 3.7335618909736704e20; … ; -1.5284870548773863e21 -1.2178458176945998e22 … -3.4577434184250777e21 -4.617130465351015e21; 2.5178168029101257e21 1.2730623209477232e22 … 4.993524665638477e21 3.187250244124098e21;;; -2.391399890181405e21 -1.446506316192557e22 … -4.877490825802162e21 -4.4121479131833146e21; 7.426013342190431e20 3.4504075483162477e21 … 1.4127163869515028e21 7.435501557158452e20; … ; -3.0319283822292516e21 -2.4192480454655064e22 … -6.853224471595671e21 -9.177027908077613e21; 4.931841046019026e21 2.507327652536079e22 … 9.80274658874532e21 6.331078462681293e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], Mππττ = [0.0 0.0 … 4.946575120586221e22 9.830499550826374e22; 0.0 0.0 … 1.9346945197197015e21 3.795427652666887e21; … ; 0.0 0.0 … 2.1975955092785412e23 4.3807442820825376e23; 0.0 0.0 … 1.0244374720002233e23 2.0201699288725294e23], nmin = 1, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 3.1031601018566384e20 -5.635021315901029e19 … 5.742798058145771e19 -8.667946851631587e19; 6.472411466627936e21 -9.066818776884188e20 … 1.590203654841026e21 -1.5268660668979565e21; … ; 8.392428848806124e21 -1.4210236669974025e21 … 1.728594590137881e21 -2.287075673208998e21; 8.351851411991952e21 -8.195081096626403e20 … 2.582478286096461e21 -1.6302511555095662e21;;; 6.090635591272873e20 -1.0989098397446906e20 … 1.1392669858114291e20 -1.6975117422296472e20; 1.2787672550617607e22 -1.7801752447474747e21 … 3.1589360019247627e21 -3.0063931523826167e21; … ; 1.651212775535008e22 -2.7807225458909407e21 … 3.4261463972736124e21 -4.488772033799732e21; 1.6615460293343982e22 -1.6317758288003413e21 … 5.13247076178637e21 -3.2376926409117495e21;;; 1.1956999450907026e21 -2.1437054010596996e20 … 2.2598659885251907e20 -3.3250465549166e20; 2.526859487125398e22 -3.4959716439682025e21 … 6.275233197136797e21 -5.920482241571846e21; … ; 3.2493216539523146e22 -5.442665436062522e21 … 6.79068579994223e21 -8.811415402413289e21; 3.305386933408405e22 -3.2483180124304316e21 … 1.0201088598407628e22 -6.429714285753598e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; -3.801916124036154e21 5.3748309604363095e20 … -9.265087933132635e20 9.011881276305858e20; 5.3748309604363095e20 -9.760143220874219e19 … 9.946818014316365e19 -1.50133243443326e20; … ; -9.265087933132635e20 9.946818014316365e19 … -2.7378608943944837e20 1.897774399666024e20; 9.011881276305858e20 -1.50133243443326e20 … 1.8977743996660236e20 -2.4409700977162043e20;;; -7.509857367766209e21 1.0549290294471925e21 … -1.8405229405535968e21 1.7740319206934905e21; 1.0549290294471925e21 -1.903367675375177e20 … 1.9732683028112468e20 -2.9401765839865125e20; … ; -1.8405229405535968e21 1.9732683028112468e20 … -5.440149599371842e20 3.760968700941778e20; 1.7740319206934905e21 -2.9401765839865122e20 … 3.760968700941778e20 -4.793208036111016e20;;; -1.4836363829035095e22 2.071013055504413e21 … -3.656218614657985e21 3.492816213751279e21; 2.071013055504413e21 -3.713006671095217e20 … 3.914202710422496e20 -5.7591495706474106e20; … ; -3.656218614657985e21 3.914202710422496e20 … -1.081030102388393e21 7.453433319763579e20; 3.492816213751279e21 -5.759149570647409e20 … 7.453433319763579e20 -9.41362691105749e20], Mππττ = [0.0 0.0 … 2.4950786401194828e22 4.957991077808086e22; 0.0 0.0 … 7.356256285710468e22 1.4620944723246468e23; … ; 0.0 0.0 … 8.32005783069615e22 1.6398271642636478e23; 0.0 0.0 … 2.312335884852783e23 4.610324041601935e23], nmin = 1, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 4.594074770613525e20 … 1.5070575989112147e20 8.049483736034658e19; … ; 0.0 -7.643560411443642e21 … -1.766092590312008e21 -2.36455037882737e21; 0.0 7.941766143307472e21 … 2.49734753100036e21 1.6298383473838952e21;;; 0.0 0.0 … 0.0 0.0; 0.0 9.01841480532334e20 … 2.9488333931723853e20 1.6020853774212855e20; … ; 0.0 -1.5179484470003464e22 … -3.4988977247543084e21 -4.6993256121657233e21; 0.0 1.5633773636559363e22 … 4.900620668475255e21 3.2363051950150873e21;;; 0.0 0.0 … 0.0 0.0; 0.0 1.7707678698100773e21 … 5.7712408768976224e20 3.187882296356513e20; … ; 0.0 -3.0145480650511744e22 … -6.931851125627285e21 -9.340086622481864e21; 0.0 3.078074880381268e22 … 9.618245406516903e21 6.42584694717739e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 -5.654073469949859e21 … -1.5389515262757105e21 -1.4064218134180447e21; … ; 0.0 -1.5389515262757105e21 … -4.887082634743123e20 -3.059349494850811e20; 0.0 -1.4064218134180447e21 … -3.05934949485081e20 -4.61601158297766e20;;; 0.0 0.0 … 0.0 0.0; 0.0 -1.1169617667880552e22 … -3.0277185261848373e21 -2.797535244594491e21; … ; 0.0 -3.0277185261848373e21 … -9.584062073303448e20 -6.077094199649057e20; 0.0 -2.797535244594491e21 … -6.077094199649056e20 -9.173170260217481e20;;; 0.0 0.0 … 0.0 0.0; 0.0 -2.2068895409997875e22 … -5.95773216475517e21 -5.564395664929285e21; … ; 0.0 -5.957732164755171e21 … -1.879870225250007e21 -1.2070536642084324e21; 0.0 -5.564395664929285e21 … -1.2070536642084324e21 -1.8230913012201009e21], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 7.4521075895413265e22 1.4809006453784008e23; … ; 0.0 0.0 … 2.209083174871646e23 4.402503881422411e23; 0.0 0.0 … 1.0693738527972723e23 2.110346914689605e23], nmin = 2, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.7661446830436393e21 -2.1785778414973548e21; 0.0 0.0 … 2.7012752168032503e21 -1.6822157755007527e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 3.497534457590643e21 -4.273881366855639e21; 0.0 0.0 … 5.368107399963211e21 -3.338036388772147e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 6.926307822637923e21 -8.385848626008758e21; 0.0 0.0 … 1.06684163590797e22 -6.6234487943447e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -8.990807001002892e20 6.114184437419883e20; 0.0 0.0 … 6.114184437419883e20 -7.346999802820343e20;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.7861739329420132e21 1.210739585245546e21; 0.0 0.0 … 1.210739585245546e21 -1.4420557654061008e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.548735816499661e21 2.397573811540613e21; 0.0 0.0 … 2.397573811540613e21 -2.8309014734889623e21], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 9.587410150643736e22 1.89385476987771e23; 0.0 0.0 … 2.3459449959295518e23 4.6752641143625916e23], nmin = 3, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.820597215012839e21 -2.5010750859701843e21; 0.0 0.0 … 2.339992234576375e21 1.7008434298568222e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.6021416228753695e21 -4.969684064883718e21; 0.0 0.0 … 4.5886327221722447e21 3.3729537809165074e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -7.127245535378715e21 -9.87539286161567e21; 0.0 0.0 … 8.999765599125347e21 6.688762145888105e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -9.678291466096755e20 -6.76883240223466e20; 0.0 0.0 … -6.76883240223466e20 -1.0381314665783852e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.8966123581272592e21 -1.3426268871282105e21; 0.0 0.0 … -1.3426268871282102e21 -2.062916798283439e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.717437848190654e21 -2.663036427057152e21; 0.0 0.0 … -2.663036427057152e21 -4.099592915898166e21], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 2.2310459620580215e23 4.4426822418245343e23; 0.0 0.0 … 1.2346969372846651e23 2.4417839522727812e23], nmin = 4, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.8139482026302004e21 -1.922955039056183e21; 0.0 0.0 … 2.989015196736736e21 -1.774912038411314e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 3.5859082878586575e21 -3.7688114093579064e21; 0.0 0.0 … 5.937561170793925e21 -3.515877597764067e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 7.089182453901672e21 -7.387946845428333e21; 0.0 0.0 … 1.1795328954619168e22 -6.96453987340816e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.8383375851469453e21 1.1795130468977919e21; 0.0 0.0 … 1.1795130468977919e21 -1.2228474661377433e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.650076415865155e21 2.331924965712985e21; 0.0 0.0 … 2.331924965712985e21 -2.3979481572951337e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -7.24772641815432e21 4.6105337141939017e21; 0.0 0.0 … 4.6105337141939017e21 -4.703123170991452e21], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.3185218547213114e23 2.61363015730627e23; 0.0 0.0 … 2.3961831552439297e23 4.7708569216337396e23], nmin = 5, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.8592141868353963e21 -2.7689104691959274e21; 0.0 0.0 … 2.011932628178316e21 1.7904329052604982e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.670362919421293e21 -5.497981213210878e21; 0.0 0.0 … 3.940440191761817e21 3.542910039313437e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -7.246469088746187e21 -1.0917392475289438e22; 0.0 0.0 … 7.719105727582097e21 7.010909988786317e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.389104803633932e21 -1.1946854581280852e21; 0.0 0.0 … -1.1946854581280852e21 -1.9568381843971407e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -2.7185995237011017e21 -2.364013754991083e21; 0.0 0.0 … -2.364013754991083e21 -3.8867552897878967e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -5.321741294028404e21 -4.677933404821863e21; 0.0 0.0 … -4.677933404821863e21 -7.720456354808908e21], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 2.2064908035337283e23 4.387419717016566e23; 0.0 0.0 … 1.653151375972636e23 3.2790163767712275e23], nmin = 6, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.7600357330844013e21 -1.4205331514013416e21; 0.0 0.0 … 3.5990542394015356e21 -1.860532435950302e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 3.4700832823472114e21 -2.7798696628635624e21; 0.0 0.0 … 7.140966681296235e21 -3.675717471820754e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 6.842421634499441e21 -5.441226314863477e21; 0.0 0.0 … 1.4169366693256154e22 -7.262345910093292e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.792819081716976e21 2.0877946582082726e21; 0.0 0.0 … 2.0877946582082726e21 -1.657441297203784e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -7.519957972850259e21 4.117306098910232e21; 0.0 0.0 … 4.117306098910232e21 -3.245227863252615e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.4910734578195936e22 8.120612543854719e21; 0.0 0.0 … 8.120612543854719e21 -6.35544577847116e21], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 2.337918721715197e23 4.647117256223566e23; 0.0 0.0 … 2.4007966302950592e23 4.7724918895726194e23], nmin = 7, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.6864193045714158e21 -3.1823007591192294e21; 0.0 0.0 … 1.3754032444061773e21 1.78496478673016e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.31860658418729e21 -6.307423936448634e21; 0.0 0.0 … 2.688742658147337e21 3.5211863914994593e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -6.531590465337953e21 -1.2502443940926248e22; 0.0 0.0 … 5.257493544013438e21 6.946945810338582e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.5400537634716532e21 -1.939655454700587e21; 0.0 0.0 … -1.9396554547005867e21 -3.949250449755723e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -3.0079496503120935e21 -3.825125967959605e21; 0.0 0.0 … -3.8251259679596043e21 -7.832858021380489e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -5.876585154196315e21 -7.544202262991468e21; 0.0 0.0 … -7.544202262991467e21 -1.5536519016746729e22], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.9216010188593937e23 3.8123816015643474e23; 0.0 0.0 … 2.8184567231227362e23 5.6036590453099176e23], nmin = 8, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 9.358807377040984e20 -4.1264305131729125e20; 0.0 0.0 … 5.292562778845838e21 -1.7362945430548272e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.8392081353806793e21 -8.061158398572306e20; 0.0 0.0 … 1.0473642648826794e22 -3.417793850683656e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 3.6151707399067177e21 -1.5752085081383916e21; 0.0 0.0 … 2.072891905392696e22 -6.728807855623876e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.1874442650129877e22 4.0794095588584603e21; 0.0 0.0 … 4.0794095588584603e21 -1.7986693604463409e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -2.3474722301062827e22 8.016922398262255e21; 0.0 0.0 … 8.016922398262256e21 -3.5137774827250846e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -4.6413637752838334e22 1.575816391889855e22; 0.0 0.0 … 1.575816391889855e22 -6.866174701980715e21], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 7.243441813324107e23 1.4399794908955394e24; 0.0 0.0 … 2.1224536094039614e23 4.209066091723316e23], nmin = 9, qlo = -12, qhi = 80, sym = 1, ng = 100), (Mτd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 9.759014279716345e20;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 1.9181374211458274e21;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 3.770852595692575e21], Mπd = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0;;; … ;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 -1.2434207832890073e22;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 -2.458366367985936e22;;; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 -4.861071903344153e22], Mππττ = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 8.460402201366554e23 1.6819930380342997e24], nmin = 10, qlo = -12, qhi = 80, sym = 1, ng = 100)], (ψ = [(2, [0.3333333333333333, -0.03333333333333333, 0.0011904761904761906, -2.2045855379188714e-5, 2.505210838544172e-7, -1.9270852604185937e-9, 1.0706029224547743e-11, -4.498331606952833e-14, 1.4797143443923793e-16, -3.9145882126782523e-19 … 6.95188564451722e-52, -3.6782463727604336e-55, 1.778649116421873e-58, -7.891078599919579e-62, 3.2234798202285863e-65, -1.216407479331542e-68, 4.253173004655741e-72, -1.381797597354042e-75, 4.182196117899643e-79, -1.182079174081301e-82]), (3, [0.06666666666666667, -0.004761904761904762, 0.00013227513227513228, -2.0041686708353374e-6, 1.9270852604185938e-8, -1.284723506945729e-10, 6.297664249733966e-13, -2.367542951027807e-15, 7.046258782820854e-18, -1.701994875077501e-20 … 1.5448634765593823e-53, -7.826056112256243e-57, 3.6298961559630063e-60, -1.5472703137097214e-63, 6.08203739665771e-67, -2.2116499624209855e-70, 7.461707025711826e-74, -2.3420298260238e-77, 6.856059209671546e-81, -1.8763161493353983e-84]), (4, [0.009523809523809525, -0.0005291005291005291, 1.2025012025012024e-5, -1.541668208334875e-7, 1.284723506945729e-9, -7.55719709968076e-12, 3.31456013143893e-14, -1.1274014052513367e-16, 3.063590775139502e-19, -6.807979500310004e-22 … 3.2869435671476214e-55, -1.5971543086237228e-58, 7.117443443064718e-62, -2.919377950395701e-65, 1.1058249812104927e-68, -3.88008765337015e-72, 1.264696106052852e-75, -3.839393157416066e-79, 1.088263366614531e-82, -2.8866402297467667e-86]), (5, [0.0010582010582010583, -4.81000481000481e-5, 9.25000925000925e-7, -1.0277788055565833e-8, 7.55719709968076e-11, -3.977472157726716e-13, 1.5783619673518714e-15, -4.901745240223203e-18, 1.2254363100558008e-20, -2.5214738890037053e-23 … 6.708048096219635e-57, -3.131675114948476e-60, 1.3429138571820223e-63, -5.307959909810365e-67, 1.940043826685075e-70, -6.5764197514748305e-74, 2.0732723050046753e-77, -6.094274853041374e-81, 1.6742513332531247e-84, -4.308418253353383e-88]), (6, [9.62000962000962e-5, -3.7000037000037e-6, 6.1666728333395e-8, -6.045757679744608e-10, 3.977472157726716e-12, -1.8940343608222456e-14, 6.862443336312483e-17, -1.9606980960892812e-19, 4.538653000206669e-22, -8.69473754828864e-25 … 1.31530354827836e-58, -5.908820971600898e-62, 2.441661558512768e-65, -9.31221036808836e-69, 3.2882098757374153e-72, -1.0781015986024312e-75, 3.290908420642342e-79, -9.375807466217499e-83, 2.4988825869449622e-86, -6.244084425149831e-90]), (7, [7.4000074000074e-6, -2.4666691333358e-7, 3.627454607846765e-9, -3.181977726181373e-11, 1.8940343608222457e-13, -8.234932003574981e-16, 2.7449773345249934e-18, -7.26184480033067e-21, 1.565052758691955e-23, -2.8047540478350445e-26 … 2.4817048080723773e-60, -1.074331085745618e-63, 4.283616769320646e-67, -1.5783407403539593e-70, 5.390507993012156e-74, -1.7112723787340177e-77, 5.062936031757449e-81, -1.399374248689179e-84, 3.621568966586902e-88, -8.794485105844832e-92]), (8, [4.9333382666716e-7, -1.450981843138706e-8, 1.9091866357088235e-10, -1.5152274886577965e-12, 8.23493200357498e-15, -3.2939728014299924e-17, 1.0166582720462939e-19, -2.504084413907128e-22, 5.04855728610308e-25, -8.499254690409227e-28 … 4.512190560131595e-62, -1.884791378501084e-65, 7.260367405628212e-69, -2.587443836645835e-72, 8.556361893670089e-76, -2.6327267365138734e-79, 7.556620942921566e-83, -2.028078621288665e-86, 5.100801361390003e-90, -1.2047239871020318e-93]), (9, [2.901963686277412e-8, -7.636746542835294e-10, 9.091364931946779e-12, -6.587945602859985e-14, 3.293972801429992e-16, -1.2199899264555528e-18, 3.505718179469979e-21, -8.077691657764928e-24, 1.5298658442736607e-26, -2.4283584829740647e-29 … 7.916123789704553e-64, -3.194561658476414e-67, 1.190224164857084e-70, -4.107053708961643e-74, 1.3163633682569368e-77, -3.929442890319214e-81, 1.095162455495879e-84, -2.8564487623784017e-88, 6.987399125191784e-92, -1.606298649469376e-95]), (10, [1.5273493085670588e-9, -3.6365459727787115e-11, 3.9527673617159907e-13, -2.6351782411439937e-15, 1.2199899264555527e-17, -4.2068618153639746e-20, 1.13087683208709e-22, -2.447785350837857e-25, 4.371045269353316e-28, -6.56313103506504e-31 … 1.3417158965600938e-65, -5.23698632537117e-69, 1.8892447061223556e-72, -6.318544167633297e-76, 1.964721445159607e-79, -5.694844768578571e-83, 1.5424823316843368e-86, -3.9129435101073994e-90, 9.31653216692238e-94, -2.0861021421680204e-97]), (11, [7.273091945557423e-11, -1.5811069446863963e-12, 1.5811069446863962e-14, -9.759919411644421e-17, 4.2068618153639746e-19, -1.357052198504508e-21, 3.426899491173e-24, -6.993672430965306e-27, 1.181363586311707e-29, -1.6828541115551385e-32 … 2.1995342566558915e-67, -8.312676706938365e-71, 2.9065303171113163e-74, -9.430662936766114e-78, 2.8474223842892857e-81, -8.020908124758551e-85, 2.1129894954579956e-88, -5.2172580134765327e-92, 1.2099392424574518e-95, -2.6406356229974942e-99])], ψ′ = [(1, [0.6666666666666666, -0.13333333333333333, 0.0071428571428571435, -0.0001763668430335097, 2.505210838544172e-6, -2.3125023125023123e-8, 1.498844091436684e-10, -7.197330571124533e-13, 2.6634858199062827e-15, -7.829176425356505e-18 … 2.9197919706972322e-50, -1.6184284040145907e-53, 8.181785935540616e-57, -3.787717727961398e-60, 1.6117399101142932e-63, -6.325318892524018e-67, 2.2967134225141003e-70, -7.738066545182636e-74, 2.425673748381793e-77, -7.092475044487806e-81]), (2, [0.2, -0.02380952380952381, 0.000925925925925926, -1.8037518037518038e-5, 2.119793786460453e-7, -1.6701405590294477e-9, 9.44649637460095e-12, -4.024823016747272e-14, 1.3387891687359624e-16, -3.574189237662752e-19 … 6.642912949205344e-52, -3.5217252505153094e-55, 1.706051193302613e-58, -7.581624537177635e-62, 3.101839072295432e-65, -1.1721744800831223e-68, 4.1039388641415046e-72, -1.334957000833566e-75, 4.045074933706212e-79, -1.1445528510945929e-82]), (3, [0.0380952380952381, -0.0031746031746031746, 9.62000962000962e-5, -1.541668208334875e-6, 1.541668208334875e-8, -1.0580075939553064e-10, 5.303296210302288e-13, -2.029322529452406e-15, 6.127181550279003e-18, -1.497755490068201e-20 … 1.4462551695449534e-53, -7.346909819669125e-57, 3.416372852671065e-60, -1.4596889751978504e-63, 5.750289902294562e-67, -2.095247332819881e-70, 7.082298193895972e-74, -2.226848031301318e-77, 6.529580199687186e-81, -1.7897169424429953e-84]), (4, [0.005291005291005292, -0.00033670033670033666, 8.325008325008325e-6, -1.1305566861122415e-7, 9.824356229584988e-10, -5.9662082365900735e-12, 2.6832153444981813e-14, -9.313315956424085e-17, 2.5734162511171816e-19, -5.799389944708522e-22 … 3.018621643298836e-55, -1.4718873040257839e-58, 6.580277900191909e-62, -2.707059554003286e-65, 1.0282232281430897e-68, -3.6170308633111566e-72, 1.181765213852665e-75, -3.5956221632944105e-79, 1.0212933132844061e-82, -2.7143034996126314e-86]), (5, [0.0005772005772005772, -2.96000296000296e-5, 6.1666728333395e-7, -7.254909215693529e-9, 5.5684610208174025e-11, -3.030454977315593e-13, 1.2352398005362471e-15, -3.921396192178562e-18, 9.985036600454672e-21, -2.0867370115892735e-23 … 6.050396322080456e-57, -2.836234066368431e-60, 1.2208307792563839e-63, -4.842349391405947e-67, 1.7756333328982043e-70, -6.037368952173615e-74, 1.908726883972558e-77, -5.625484479730499e-81, 1.5493072039058765e-84, -3.9962140320958917e-88]), (6, [5.1800051800051795e-5, -2.22000222000222e-6, 3.9902000686314417e-8, -4.1365710440357845e-10, 2.8410515412333686e-12, -1.3999384406077467e-14, 5.215456935597487e-17, -1.524987408069441e-19, 3.5996213449914964e-22, -7.011885119587611e-25 … 1.1664012597940174e-58, -5.264222320153528e-62, 2.1846445523535294e-65, -8.365205923875984e-69, 2.964779396156686e-72, -9.754252558783901e-76, 2.9871322587368946e-79, -8.536182917003992e-83, 2.2815884489497484e-86, -5.71641531879914e-90]), (7, [3.94667061333728e-6, -1.450981843138706e-7, 2.291023962850588e-9, -2.1213184841209153e-11, 1.317589120571997e-13, -5.929151042573987e-16, 2.033316544092588e-18, -5.508985710595681e-21, 1.2116537486647392e-23, -2.209806219506399e-26 … 2.1658514688631656e-60, -9.42395689250542e-64, 3.7753910509266703e-67, -1.3972196717887509e-70, 4.79156266045525e-74, -1.5269815071780465e-77, 4.53397256575294e-81, -1.2574087451989722e-84, 3.264512871289602e-88, -7.95117831487341e-92]), (8, [2.6117673176496706e-7, -8.400421197118823e-9, 1.1818774411530812e-10, -9.881918404289976e-13, 5.5997537624309865e-15, -2.3179808602655502e-17, 7.362008176886955e-20, -1.8578690812859335e-22, 3.824664610684152e-25, -6.556567904029974e-28 … 3.878900656955231e-62, -1.6292264458229712e-65, 6.308188073742545e-69, -2.2588795399289037e-72, 7.50327119906454e-76, -2.3183713052883363e-79, 6.680490978524862e-83, -1.799562720298393e-86, 4.54180943137466e-90, -1.0762200951444819e-93]), (9, [1.527349308567059e-8, -4.363855167334454e-10, 5.5338743064023874e-12, -4.21628518583039e-14, 2.1959818676199949e-16, -8.413723630727949e-19, 2.487929030591598e-21, -5.8746848420108574e-24, 1.1364717700318621e-26, -1.837676689818211e-29 … 6.708579482800469e-64, -2.7232328891930083e-67, 1.020192141306072e-70, -3.538384733874646e-74, 1.1395384381925722e-77, -3.4169068611471427e-81, 9.563390456442889e-85, -2.5042838464687356e-88, 6.148911230168771e-92, -1.4185494566742538e-95]), (10, [8.000401140113166e-10, -2.055439028092315e-11, 2.3716604170295944e-13, -1.6591862999795517e-15, 7.993037449191552e-18, -2.849809616859467e-20, 7.881868829697899e-23, -1.7484181077413264e-25, 3.189681683041609e-28, -4.880276923509902e-31 … 1.1217624708945047e-65, -4.4057186546773336e-69, 1.5985916744112238e-72, -5.3754778739566846e-76, 1.6799792067306786e-79, -4.892753956102716e-83, 1.3311833821385373e-86, -3.391217708759746e-90, 8.106592924464927e-94, -1.822038579868271e-97])], χ = [(-1, [-1.0, -0.5, 0.125, -0.006944444444444444, 0.00017361111111111112, -2.48015873015873e-6, 2.296443268665491e-8, -1.4911969277048643e-10, 7.169215998581078e-13, -2.6552651846596585e-15 … 4.7799080126007045e-47, -2.9181367598294903e-50, 1.6175924389298726e-53, -8.177919307026656e-57, 3.786073753253082e-60, -1.6110952141502475e-63, 6.322979647371458e-67, -2.2959257978836086e-70, 7.735599049473075e-74, -2.4249526800856032e-77]), (-2, [-3.0, -0.5, -0.125, 0.020833333333333332, -0.0008680555555555555, 1.736111111111111e-5, -2.066798941798942e-7, 1.6403166204753507e-9, -9.319980798155402e-12, 3.982897776989488e-14 … -1.768565964662261e-45, 1.1380733363335011e-48, -6.6321289996124775e-52, 3.516505302021462e-55, -1.7037331889638866e-58, 7.572147506506163e-62, -3.0982600272120143e-65, 1.1709221569206403e-68, -4.0998674962207297e-72, 1.3337239740470818e-75]), (-3, [-15.0, -1.5, -0.125, -0.020833333333333332, 0.0026041666666666665, -8.680555555555556e-5, 1.4467592592592592e-6, -1.4762849584278155e-8, 1.0251978877970942e-10, -5.177767110086334e-13 … 6.189980876317913e-44, -4.210871344433954e-47, 2.5865303098488663e-50, -1.4417671738287994e-53, 7.326052712544713e-57, -3.407466377927773e-60, 1.4561822127896468e-63, -5.7375185689111376e-67, 2.090932423072572e-70, -7.0687370624495336e-74]), (-4, [-105.0, -7.5, -0.375, -0.020833333333333332, -0.0026041666666666665, 0.00026041666666666666, -7.2337962962962966e-6, 1.033399470899471e-7, -9.226780990173847e-10, 5.6955438210949675e-12 … -2.0426936891849113e-42, 1.473804970551884e-45, -9.570162146440805e-49, 5.622891977932318e-52, -3.0036816121433323e-55, 1.4652105425089426e-58, -6.55281995755341e-62, 2.6966337273882347e-65, -1.0245568873055603e-68, 3.6050559018492623e-72]), (-5, [-945.0, -52.5, -1.875, -0.0625, -0.0026041666666666665, -0.00026041666666666666, 2.170138888888889e-5, -5.166997354497355e-7, 6.458746693121693e-9, -5.125989438985471e-11 … 6.332350436473224e-41, -4.863556402821217e-44, 3.349556751254282e-47, -2.0804700318349577e-50, 1.1714358287358995e-53, -6.007363224286664e-57, 2.8177125817479663e-60, -1.2134851773247056e-63, 4.815417370336133e-67, -1.7664773919061385e-70]), (-6, [-10395.0, -472.5, -13.125, -0.3125, -0.0078125, -0.00026041666666666666, -2.170138888888889e-5, 1.5500992063492063e-6, -3.229373346560847e-8, 3.5881926072898297e-10 … -1.8363816265772353e-39, 1.5077024848745773e-42, -1.105353727913913e-45, 7.281645111422351e-49, -4.3343125663228286e-52, 2.342871657471799e-55, -1.1552621585166662e-58, 5.2179862624962345e-62, -2.16693781665126e-65, 8.302443741958851e-69]), (-7, [-135135.0, -5197.5, -118.125, -2.1875, -0.0390625, -0.00078125, -2.170138888888889e-5, -1.5500992063492063e-6, 9.68812003968254e-8, -1.7940963036449148e-9 … 4.958230391758535e-38, -4.372337206136274e-41, 3.4265965565331304e-44, -2.402942886769376e-47, 1.5170093982129898e-50, -8.668625132645657e-54, 4.5055224182149983e-57, -2.139374367623456e-60, 9.317832611600418e-64, -3.7360996838814826e-67]), (-8, [-2.027025e6, -67567.5, -1299.375, -19.6875, -0.2734375, -0.00390625, -6.510416666666667e-5, -1.5500992063492063e-6, -9.68812003968254e-8, 5.382288910934745e-9 … -1.2395575979396338e-36, 1.1805310456567941e-39, -9.937130013946078e-43, 7.449122948985067e-46, -5.0061310141028664e-49, 3.03401879642598e-52, -1.6670432947395494e-55, 8.343560033731478e-59, -3.8203113707561713e-62, 1.6065228640690376e-65]), (-9, [-3.4459425e7, -1.0135125e6, -16891.875, -216.5625, -2.4609375, -0.02734375, -0.0003255208333333333, -4.6502976190476195e-6, -9.68812003968254e-8, -5.382288910934745e-9 … 2.8509824752611576e-35, -2.951327614141985e-38, 2.683025103765441e-41, -2.160245655205669e-44, 1.5519006143718887e-47, -1.0012262028205733e-50, 5.834651531588423e-54, -3.087117212480647e-57, 1.4899214345949068e-60, -6.586743742683055e-64]), (-10, [-6.54729075e8, -1.72297125e7, -253378.125, -2815.3125, -27.0703125, -0.24609375, -0.0022786458333333335, -2.3251488095238094e-5, -2.906436011904762e-7, -5.382288910934745e-9 … -5.987063198048431e-34, 6.788053512526565e-37, -6.707562759413602e-40, 5.8326632690553065e-43, -4.500511781678477e-46, 3.1038012287437775e-49, -1.9254350054241794e-52, 1.0804910243682265e-55, -5.512709308001156e-59, 2.568830059646391e-62])], χ′ = [(-2, [1.0, -0.5, 0.375, -0.034722222222222224, 0.0012152777777777778, -2.232142857142857e-5, 2.5260875955320403e-7, -1.9385560060163236e-9, 1.0753823997871616e-11, -4.5139508139214194e-14 … 1.8641641249142746e-45, -1.196436071530091e-48, 6.955647487398453e-52, -3.680063688161995e-55, 1.7794546640289485e-58, -7.894366549336212e-62, 3.2247196201594434e-65, -1.2168406728783126e-68, 4.254579477210191e-72, -1.3822230276487938e-75]), (-3, [6.0, -0.0, -0.25, 0.08333333333333333, -0.005208333333333333, 0.0001388888888888889, -2.066798941798942e-6, 1.968379944570421e-8, -1.3047973117417563e-10, 6.372636443183181e-13 … -6.720550665716591e-44, 4.552293345334004e-47, -2.7854941798372404e-50, 1.5472623328894435e-53, -7.837172669233879e-57, 3.634630803122958e-60, -1.549130013606007e-63, 6.08879521598733e-67, -2.213928447959194e-70, 7.468854254663658e-74]), (-4, [45.0, 1.5, -0.125, -0.0625, 0.013020833333333332, -0.0006076388888888889, 1.3020833333333332e-5, -1.6239134542705971e-7, 1.3327572541362226e-9, -7.766650665129502e-12 … 2.2902929242376276e-42, -1.642239824329242e-45, 1.0604774270380352e-48, -6.199598847463838e-52, 3.2967237206451204e-55, -1.6015091976260532e-58, 7.1352928426692695e-62, -2.92613447014468e-65, 1.1081941842284631e-68, -3.8878053843472433e-72]), (-5, [420.0, 15.0, -0.0, -0.041666666666666664, -0.010416666666666666, 0.0015625, -5.787037037037037e-5, 1.033399470899471e-6, -1.1072137188208615e-8, 7.973761349532954e-11 … -7.353697281065681e-41, 5.600458888097159e-44, -3.828064858576322e-47, 2.3616146307315735e-50, -1.3216199093430663e-53, 6.739968495541137e-57, -3.1453535796256366e-60, 1.3483168636941173e-63, -5.3276958139889134e-67, 1.9467301869986017e-70]), (-6, [4725.0, 157.5, 1.875, -0.0625, -0.0078125, -0.0013020833333333333, 0.00015190972222222222, -4.6502976190476195e-6, 7.104621362433863e-8, -6.663786270681113e-10 … 2.2163226527656285e-39, -1.7995158690438504e-42, 1.30632713298917e-45, -8.529927130523327e-49, 5.037174063564368e-52, -2.703313450928999e-55, 1.324324913421544e-58, -5.946077368891057e-62, 2.4558628588714277e-65, -9.362330177102533e-69]), (-7, [62370.0, 1890.0, 26.25, -0.0, -0.015625, -0.0010416666666666667, -0.00013020833333333333, 1.240079365079365e-5, -3.229373346560847e-7, 4.305831128747796e-9 … -6.2436975303626e-38, 5.427728945548479e-41, -4.20034416607287e-44, 2.9126580445689405e-47, -1.820411277855588e-50, 1.0308635292875916e-53, -5.314205929176664e-57, 2.5046334059981926e-60, -1.08346890832563e-63, 4.317270745818602e-67]), (-8, [945945.0, 25987.5, 354.375, 2.1875, -0.0390625, -0.0023437500000000003, -0.00010850694444444445, -1.0850694444444445e-5, 8.719308035714285e-7, -1.973505934009406e-8 … 1.6362160292803167e-36, -1.530318022147696e-39, 1.2678407259172583e-42, -9.371477258400566e-46, 6.219738532673258e-49, -3.7275088070376326e-52, 2.027485088196749e-55, -1.0055059527830242e-58, 4.565737979684205e-62, -1.905410838779556e-65]), (-9, [1.62162e7, 405405.0, 5197.5, 39.375, -0.0, -0.0078125, -0.00026041666666666666, -9.300595238095239e-6, -7.750496031746032e-7, 5.3822889109347446e-8 … -3.966584313406828e-35, 4.0138055552331e-38, -3.577366805020588e-41, 2.8306667206143253e-44, -2.0024524056411467e-47, 1.2742878944989115e-50, -7.334990496854017e-54, 3.83803761551648e-57, -1.8337494579629622e-60, 8.032614320345189e-64]), (-10, [3.10134825e8, 7.0945875e6, 84459.375, 649.6875, 2.4609375, -0.02734375, -0.0009765625, -2.3251488095238097e-5, -6.781684027777778e-7, -4.84406001984127e-8 … 8.838045673309588e-34, -9.73938112666855e-37, 9.390587863179044e-40, -7.992908924260976e-43, 6.0524123960503656e-46, -4.10502743156435e-49, 2.508900158583022e-52, -1.3892027456162912e-55, 7.002630742596062e-59, -3.2275044339146967e-62]), (-11, [6.54729075e9, 1.378377e8, 1.52026875e6, 11261.25, 54.140625, -0.0, -0.004557291666666667, -9.300595238095238e-5, -1.7438616071428573e-6, -4.305831128747796e-8 … -1.7961189594145292e-32, 2.172177124008501e-35, -2.2805713382006248e-38, 2.0997587768599102e-41, -1.7101944770378213e-44, 1.241520491497511e-47, -8.086827022781553e-51, 4.7541605072201964e-54, -2.5358462816805317e-57, 1.2330384286302677e-60])]), true)
2. Spectrum and sensitivities
Sweep the wavelength across a band; at each point reconstruct the T-matrix and read off the scattering / extinction cross sections. The sensitivities \(\partial C_\text{sca}/\partial\lambda\) and \(\partial C_\text{sca}/\partial m_r\) come from ForwardDiff applied to the reconstruction only — the moments in prep are constants.
begin
mᵣ = 1.5
λs = collect(range(2π / 1.6, 2π / 0.6; length = 60))
Csca(λ, m) = calc_Csca(transition_matrix(prep, λ, complex(m, mᵢ)), λ)
Cext(λ, m) = calc_Cext(transition_matrix(prep, λ, complex(m, mᵢ)), λ)
csca = [Csca(λ, mᵣ) for λ in λs]
cext = [Cext(λ, mᵣ) for λ in λs]
∂Csca_∂λ = [ForwardDiff.derivative(l -> Csca(l, mᵣ), λ) for λ in λs]
∂Csca_∂mᵣ = [ForwardDiff.derivative(m -> Csca(λ, m), mᵣ) for λ in λs]
nothing
end
3. The spectra and their sensitivities
let
p1 = plot(λs, [csca cext]; label = ["Csca" "Cext"], lw = 2,
ylabel = "cross section", legend = :topright)
p2 = plot(λs, ∂Csca_∂λ; label = "∂Csca/∂λ", lw = 2, color = 3, ylabel = "∂/∂λ")
p3 = plot(λs, ∂Csca_∂mᵣ; label = "∂Csca/∂mᵣ", lw = 2, color = 4,
xlabel = "wavelength λ", ylabel = "∂/∂mᵣ")
plot(p1, p2, p3; layout = (3, 1), size = (720, 660),
title = ["spheroid a=2, c=1, m=1.5+0.02im" "" ""])
end
4. Why it is cheap — and how much
Differentiating the reconstruction reuses the single prepare_sh for the whole spectrum; differentiating the classic from-scratch assembly re-runs the full quadrature and Bessel recursions (in dual numbers) at every wavelength.
begin
function Csca_classic(λ, m)
T = promote_type(typeof(λ), typeof(m))
s = TransitionMatrices.Spheroid{T, Complex{T}}(T(2.0), T(1.0), Complex{T}(m, mᵢ))
calc_Csca(transition_matrix(s, λ, EBCM(nmax, Ng)), λ)
end
f_sh(λ) = ForwardDiff.derivative(l -> Csca(l, mᵣ), λ)
f_classic(λ) = ForwardDiff.derivative(l -> Csca_classic(l, mᵣ), λ)
f_sh(λs[1]); f_classic(λs[1]) # warm up
t_prepare = @belapsed prepare_sh($spheroid, $nmax, $Ng) samples=1 evals=1
t_sh = @belapsed [f_sh(λ) for λ in $λs] samples=1 evals=1
t_classic = @belapsed [f_classic(λ) for λ in $λs] samples=1 evals=1
(; n_points = length(λs),
sh_ms = round((t_prepare + t_sh) * 1e3; digits = 1),
classic_ms = round(t_classic * 1e3; digits = 1),
speedup = round(t_classic / (t_prepare + t_sh); digits = 1))
end
(n_points = 60, sh_ms = 224.5, classic_ms = 5927.6, speedup = 26.4)
Takeaway
prepare_sh once, then ForwardDiff the reconstruction, gives exact \(\partial C/\partial\lambda\) and \(\partial C/\partial m_r\) (matching the classic result to machine precision) at a large speedup for spectra — the win grows with the number of wavelengths because the geometry quadrature is amortized.
Ideal for material/wavelength sensitivity (retrievals, dispersion fitting). Shape-parameter derivatives act on the moments themselves and are better served by the dedicated analytical EBCM linearization backend.