Built-in models
Diagonal quantum numbers on fuzzy sphere
The following diagonal quantum numbers (symmetry charges) on fuzzy sphere are built in in FuzzifiED.
FuzzifiED.GetNeQNDiag — MethodGetNeQNDiag(no :: Int64[, modul :: Int64 = 1]) :: QNDiagReturn the QNDiag of the number of electrons, implemented as
QNDiag("Ne", fill(1, no), modul)If modul = 2, parity is returned.
FuzzifiED.GetLz2QNDiag — MethodGetLz2QNDiag(nm :: Int64, nf :: Int64) :: QNDiagReturn the QNDiag of twice the angular momentum $2L_z$, implemented as
QNDiag("Lz", collect(0 : nm * nf - 1) .÷ nf .* 2 .- (nm - 1))FuzzifiED.GetFlavQNDiag — FunctionGetFlavQNDiag(nm :: Int64, nf :: Int64, qf :: Dict{Int64, Int64}[, id :: Int64 = 1, modul :: Int64 = 1]) :: QNDiag
GetFlavQNDiag(nm :: Int64, nf :: Int64, qf :: Vector{Int64}[, id :: Int64 = 1, modul :: Int64 = 1]) :: QNDiagReturn the QNDiag of linear combination of number of electrons in each flavour,
\[ Q = ∑_{f}q_fn_f\]
the factor $q_f$ can either be given by a length-$N_f$ vector or a dictionary containing non-zero terms. E.g., for $Q=n_{f=1}-n_{f=3}$ in a 4-flavour system, qf = [1, 0, -1, 0] or qf = Dict(1 => 1, 3 => -3). id is an index to be put in the name to distinguish. For qf given as vector, the function is implemented as
QNDiag("Sz$id", qf[collect(0 : nm * nf - 1) .% nf .+ 1], modul)FuzzifiED.GetZnfChargeQNDiag — MethodGetZnfChargeQNDiag(nm :: Int64, nf :: Int64) :: QNDiagReturn the QNDiag of a $ℤ_{N_f}$-charge,
\[ Q = ∑_{f=0}^{N_f-1}fn_f\mod N_f\]
implemented as
QNDiag("Q_Z$nf", collect(0 : nm * nf - 1) .% nf, nf)FuzzifiED.GetPinOrbQNDiag — FunctionGetPinOrbQNDiag(no :: Int64, pin_o :: Vector{Int64}[, id :: Int64 = 1]) :: QNDiagReturn the QNDiag of the number of electrons in the subset of sites pin_o, implemented as
QNDiag("Npin$i", [ o in pin_o ? 1 : 0 for o = 1 : no])This QNDiag is useful in pinning defects, where certain subset of sites need to be set empty or filled. To empty the sites, set this QNDiag to 0 ; to fill the sites, set this QNDiag to length(pin_o). id is an index to be put in the name to distinguish.
Off-diagonal quantum numbers on fuzzy sphere
The following off-diagonal quantum numbers (transformations) on fuzzy sphere are built in in FuzzifiED.
FuzzifiED.GetParityQNOffd — FunctionGetParityQNOffd(nm :: Int64, nf :: Int64[, permf, fac])Return the particle-hole transformation
\[ 𝒫: c^†_{mf}↦α_fc_{mπ_f}\]
Arguments
nm :: Int64andnf :: Int64are the number of orbitals and the flavours.permf :: Dict{Int64, Int64},permf :: Vector{Vector{Int64}}orVector{Int64}gives the flavour permutation $π_f$. It is either a vector of the cycles, a vector of the target flavours, or a dictionary of the changed elements. E.g., a permutation $1↦4,2↦5,3↦3,4↦1,5↦6,6↦2$ can be expressed as[4,5,3,1,6,2],[[1,4],[2,5,6]]orDict(1=>4,2=>5,4=>1,5=>6,6=>2). Facultative, identity by default.fac :: Dict{Int64, <: Number}orVector{<: Number}gives the factor $α_f$. It is either a vector of all vectors, or a dictionary of all non-unity elements. Facultative, all unity by default.
FuzzifiED.GetFlavPermQNOffd — FunctionGetFlavPermQNOffd(nm :: Int64, nf :: Int64, permf[, fac][, cyc :: Int64])Return the flavour permutaiton transformation
\[ 𝒵: c^†_{mf}↦α_fc^†_{mπ_f}\]
Arguments
nm :: Int64andnf :: Int64are the number of orbitals and the flavours.permf :: Dict{Int64, Int64},permf :: Vector{Vector{Int64}}orVector{Int64}gives the flavour permutation $π_f$. It is either a vector of the cycles, a vector of the target flavours, or a dictionary of the changed elements. E.g., a permutation $1↦4,2↦5,3↦3,4↦1,5↦6,6↦2$ can be expressed as[4,5,3,1,6,2],[[1,4],[2,5,6]]orDict(1=>4,2=>5,4=>1,5=>6,6=>2). Facultative, identity by default.fac :: Dict{Int64, <: Number}orVector{<: Number}gives the factor $α_f$. It is either a vector of all vectors, or a dictionary of all non-unity elements. Facultative, all unity by default.cyc :: Int64is the period of the permutation.
FuzzifiED.GetRotyQNOffd — MethodGetRotyQNOffd(nm :: Int64, nf :: Int64)Return the $π$-rotation with respect to the $y$-axis.
\[ ℛ_y: c^†_{mf}↦(-)^{m+s}c^†_{-mf}\]
Operators on fuzzy sphere
FuzzifiED.GetIntMatrix — MethodGetIntMatrix(nm :: Int64, ps_pot :: Vector{<:Number}) :: Array{ComplexF64, 3}Gives the interaction matrix $U_{m_1,m_2,m_3,m_4}$ from the pseudopotentials.
Argument
nm :: Int64is the number of orbitals.ps_pot :: Vector{<:Number}is the vector of non-zero pseudopotentials.
Output
- A
nm×nm×nmarray giving the interaction matrix $U_{m_1,m_2,m_3,-m_1-m_2-m_3}$.
FuzzifiED.GetDenIntTerms — FunctionGetDenIntTerms(nm :: Int64, nf :: Int64[, ps_pot :: Vector{<:Number}][, mat_a :: Matrix{<:Number}[, mat_b :: Matrix{<:Number}]][ ; m_kept :: Vector{Int64}]) :: TermsReturn the normal-ordered density-density term in the Hamiltonian
\[∑_{\{m_i,f_i\}}U_{m_1m_2m_3m_4}M^A_{f_1f_4}M^B_{f_2f_3}c^{†}_{m_1f_1}c^{†}_{m_2f_2}c_{m_3f_3}c_{m_4f_4}.\]
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.ps_pot :: Vector{<:Number}is a list of numbers specifying the pseudopotentials for the interacting matrix $U_{m_1m_2m_3m_4}$. Facultative,[1.0]by default.mat_a :: Matrix{<:Number}is anf×nfmatrix specifying $M^A_{ff'}$. Facultative, $I_{N_f}$ by default.mat_b :: Matrix{<:Number}is anf×nfmatrix specifying $M^B_{ff'}$. Facultative, the Hermitian conjugate ofmat_aby default.m_kept :: Vector{Int64}is a list of orbitals that range from 1 tonm. Facultative, if specified, only terms for which all $m_i$ are in the list are kept.
FuzzifiED.GetDenIntTerms — FunctionGetDenIntTerms(nm :: Int64, nf :: Int64, ps_pot :: Vector{<:Number}, mat_a :: Vector{<:AbstractMatrix{<:Number}}[, mat_b :: Vector{<:AbstractMatrix{<:Number}}][ ; m_kept :: Vector{Int64}]) :: TermsReturn the sum of a series of normal-ordered density-density term in the Hamiltonian
\[∑_{\{m_i,f_i,α\}}U_{m_1m_2m_3m_4}(M^A_{α})_{f_1f_4}(M^B_{α})_{f_2f_3}c^{†}_{m_1f_1}c^{†}_{m_2f_2}c_{m_3f_3}c_{m_4f_4}.\]
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.ps_pot :: Vector{<:Number}is a list of numbers specifying the pseudopotentials for the interacting matrix $U_{m_1m_2m_3m_4}$. Facultative,[1.0]by default.mat_a :: Vector{<:AbstractMatrix{<:Number}}is a vector ofnf×nfmatrix specifying $(M^A_{α})_{ff'}$. Facultative, $I_{N_f}$ by default.mat_b :: Vector{<:AbstractMatrix{<:Number}}is a vector ofnf×nfmatrix specifying $(M^B_{α})_{ff'}$. Facultative, the Hermitian conjugate ofmat_aby default.m_kept :: Vector{Int64}is a list of orbitals that range from 1 tonm. Facultative, if specified, only terms for which all $m_i$ are in the list are kept.
FuzzifiED.GetPairIntTerms — FunctionGetPairIntTerms(nm :: Int64, nf :: Int64, ps_pot :: Vector{<:Number}, mat_a :: Matrix{<:Number}[, mat_b :: Matrix{<:Number}][ ; m_kept :: Vector{Int64}]) :: TermsReturn the normal-ordered pair-pair interaction term in the Hamiltonian
\[∑_{\{m_i,f_i\}}U_{m_1m_2m_3m_4}M^A_{f_1f_2}M^B_{f_3f_4}c^{†}_{m_1f_1}c^{†}_{m_2f_2}c_{m_3f_3}c_{m_4f_4}.\]
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.ps_pot :: Vector{<:Number}is a list of numbers specifying the pseudopotentials for the interacting matrix $U_{m_1m_2m_3m_4}$.mat_a :: Matrix{<:Number}is anf×nfmatrix specifying $M^A_{ff'}$. Facultative, $I_{N_f}$ by default.mat_b :: Matrix{<:Number}is anf×nfmatrix specifying $M^B_{ff'}$. Facultative, the Hermitian conjugate ofmat_aby default.m_kept :: Vector{Int64}is a list of orbitals that range from 1 tonm. Facultative, if specified, only terms for which all $m_i$ are in the list are kept.
FuzzifiED.GetPolTerms — MethodGetPolTerms(nm :: Int64, nf :: Int64[, mat :: Matrix{<:Number}][ ; fld_m :: Vector{<:Number}]) :: TermsReturn the polarisation term in the Hamiltonian
\[∑_{mff'}c^{†}_{mf}M_{ff'}c_{mf'}.\]
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.mat :: Matrix{<:Number}is anf×nfmatrix specifying $M_{ff'}$. Facultative, $I_{N_f}$ by default.fld_m :: Vector{<:Number}gives an orbital dependent polarisation
\[∑_{mff'}h_mc^{†}_{mf}M_{ff'}c_{mf'}\]
Facultative.
FuzzifiED.GetL2Terms — MethodGetL2Terms(nm :: Int64, nf :: Int64) :: TermsReturn the terms for the total angular momentum.
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.
FuzzifiED.GetLpLzTerms — FunctionGetLpLzTerms(nm :: Int64, nf :: Int64) :: Tuple{Terms, Terms}Return the a pair of terms containing $L^z$ and $L^+$
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.
FuzzifiED.GetL2Terms — MethodGetL2Terms(tms_lzlp :: Tuple{Terms, Terms}) :: TermsReturn the terms for the total angular momentum from a tuple of terms containing $L^z$ and $L^+$, implemented as
tms_lz, tms_lp = tms_lzlp
return SimplifyTerms(tms_lz * tms_lz - tms_lz + tms_lp * tms_lp')FuzzifiED.GetC2Terms — FunctionGetC2Terms(nm :: Int64, nf :: Int64, mat_gen :: Vector{Matrix{<:Number}}[, mat_tr :: Vector{Matrix{<:Number}}]) :: TermsReturn the terms for the quadratic Casimir of the flavour symmetry.
\[ C_2=∑_{imm'}\frac{(c^†_{mf_1}G_{i,f_1f_2}c_{mf_2})(c^†_{m'f_3}G^†_{i,f_3f_4}c_{m'f_4})}{2\operatorname{tr}G_i^†G_i}-∑_{imm'}\frac{(c^†_{mf_1}T_{i,f_1f_2}c_{mf_2})(c^†_{m'f_3}T^†_{i,f_3f_4}c_{m'f_4})}{2\operatorname{tr}T_i^†T_i}\]
where $G_i$ are the generator matrices, and $T_i$ are the trace matrices.
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.mat_gen :: Vector{Matrix{Number}}is a list of the matrices that gives the generators. It will automatically be normalised such that its square traces to $1/2$.mat_tr :: Vector{Matrix{Number}}is a list of trace matrices that will be normalised automatically and substracted. Facultative.
GetC2Terms(nm :: Int64, nf :: Int64, group :: Symbol) :: TermsReturn the terms for the quadratic Casimir of the flavour symmetry for a built-in Lie-group
Arguments
nm :: Int64is the number of orbitals.nf :: Int64is the number of flavours.group :: Symbolspecifies the built-in Lie group.:Spgives the Casimir of $\mathrm{Sp}(N_f/2)$:SUgives the Casimir of $\mathrm{SU}(N_f)$
\[\begin{aligned} C_{2,\mathrm{Sp}}&=-\frac{1}{4}(c^†_{m_1f_1}c_{m_1f_2})(c^†_{m_2f_3}c_{m_2f_4})Ω_{f_1f_3}Ω_{f_2f_4}+\frac{1}{4}(c^†_{m_1f_1}c_{m_1f_2})(c^†_{m_2f_2}c_{m_2f_1})\\ C_{2,\mathrm{SU}}&=\frac{1}{2}(c^†_{m_1f_1}c_{m_1f_2})(c^†_{m_2f_2}c_{m_2f_1})-\frac{1}{2N_f}(c^†_{m_1f_1}c_{m_1f_1})(c^†_{m_2f_2}c_{m_2f_2}) \end{aligned}\]
Spherical observables
FuzzifiED supports local observables on sphere that can be decomposed into angular components $\Phi(\Omega)=\sum_{lm}\Phi_{lm}Y^{(s)}_{lm}$
FuzzifiED.SphereObs — TypeSphereObsThe mutable type SphereObs stores the information of a local observable (or local operator) $𝒪$ that can be decomposed into angular components.
\[ 𝒪(\Omega)=∑_{lm}𝒪_{lm}Y^{(s)}_{lm}\]
Fields
s2 :: Int64is twice the spin $2s$ of the observable.l2m :: Int64is twice the maximal angular momentum $2l_{\max}$ of the components of the observable.get_comp :: Functionis a functionget_comp(l2 :: Int64, m2 :: Int64) :: Termsthat sends the component specified by a tuple of integers $(2l,2m)$ where $|s|\leq l\leq l_{\max}, -l\leq m\leq l$ to a list of terms that specifies the expression of the component.stored_q :: Boolis a boolean that specifies whether or not each component of the observable is stored.comps :: Dict{Tuple{Int64, Int64}, Terms}stores each component of the observable in the format of a dictionary whose keys are the tuples of integers $(2l,2m)$ and values are the lists of terms that specifies the expression of the component.
It can be initialised with the following methods
FuzzifiED.SphereObs — MethodSphereObs(s2 :: Int64, l2m :: Int64, get_comp :: Function) :: SphereObsinitialises the observable from $2s$, $2l_{\max}$ and the function $(l,m)↦𝒪_{lm}$.
Arguments
s2 :: Int64is twice the spin $2s$ of the observable.l2m :: Int64is twice the maximal angular momentum $2l_{\max}$ of the components of the observable.get_comp :: Functionis a functionget_comp(l2 :: Int64, m2 :: Int64) :: Termsthat sends the component specified by a tuple of integers $(2l,2m)$ where $|s|\leq s\leq l_{\max}, -l\leq m\leq l$ to a list of terms that specifies the expression of the component.
FuzzifiED.SphereObs — MethodSphereObs(s2 :: Int64, l2m :: Int64, comps :: Dict{Tuple{Int64, Int64}, Terms}) :: SphereObsinitialises the observable from $2s$, $2l_{\max}$ and a list of $𝒪_{lm}$ specified by a dictionary.
Arguments
s2 :: Int64is twice the spin $2s$ of the observable.l2m :: Int64is twice the maximal angular momentum $2l_{\max}$ of the components of the observable.comps :: Dict{Tuple{Int64, Int64}, Terms}stores each component of the observable in the format of a dictionary whose keys are the tuples of integers $(2l,2m)$ and values are the lists of terms that specifies the expression of the component.
The following methods explicitly calculates and stores each component
FuzzifiED.StoreComps! — MethodStoreComps!(obs :: SphereObs)calculates and stores each component of the observable obs and replace the function in obs by the list of calculated components.
FuzzifiED.StoreComps — MethodStoreComps(obs :: SphereObs) :: SphereObscalculates and stores each component of the observable obs and return a new observable with the list of calculated components.
The multiplication, addition, conjugate and Laplacian operation of an observable is supported
Base.:* — Method*(fac :: Number, obs :: SphereObs) :: SphereObs
*(obs :: SphereObs, fac :: Number) :: SphereObs
/(obs :: SphereObs, fac :: Number) :: SphereObs
-(obs :: SphereObs) :: SphereObsenables the multiplication of an observable with a number.
Base.:+ — Method+(obs1 :: SphereObs, obs2 :: SphereObs) :: SphereObs
-(obs1 :: SphereObs, obs2 :: SphereObs) :: SphereObsenables the addition of two observables.
Base.adjoint — Methodadjoint(obs :: SphereObs) :: SphereObsenables the Hermitian conjugate of a spherical observable.
\[\begin{aligned} 𝒪^†(Ω)&=∑_{lm}(𝒪_{lm})^†\bar{Y}^{(s)}_{lm}(Ω)=∑_{lm}(𝒪_{lm})^†(-1)^{s+m}Y^{(-s)}_{l,-m}(Ω)\\ (𝒪^†)_{lm}&=(-1)^{s-m}(𝒪_{l,-m})^† \end{aligned}\]
Base.:* — Method*(obs1 :: SphereObs, obs2 :: SphereObs) :: SphereObsenables the multiplication of two observable by making use of the composition of two monopole harmonics into one.
FuzzifiED.Laplacian — MethodLaplacian(obs :: SphereObs[ ; norm_r2 :: Float64]) :: SphereObsTakes the Laplacian of an observable
\[ (∇^2𝒪)_{lm}=-l(l+1)𝒪_{lm}\]
Arguments
norm_r2 :: Float64is the radius squared $R^2$ used for normalisation. Facultative,ObsNormRadSqby default. If $R≠1$, an extra factor $1/R^2$ is included.
Padding orbitals for SphereObs is realised
FuzzifiED.PadSphereObs — FunctionPadSphereObs(obs :: SphereObs, nol :: Int64)adds nol empty orbitals to the left by shifting each orbital index, implemented as
SphereObs(obs.s2, obs.l2m, (l, m) -> PadTerms(obs.get_comp(l, m), nol))Here, a parameter ObsNormRadSq is used to specify the normalisation of the observables
FuzzifiED.ObsNormRadSq — ConstantFuzzifiED.ObsNormRadSq :: Float64The default radius squared $R^2$ that is used to normalise the observables, 1 by default. In the convention of He2025, $R^2=N_m$.
One can evaluate an angular component, the value at one point, the uniform spatial integral of an observable, or filter a specific set of components.
FuzzifiED.GetComponent — MethodGetComponent(obs :: SphereObs, l :: Number, m :: Number) :: Termsreturns an angular component $𝒪_{lm}$ of an observable in the format of a list of terms.
FuzzifiED.GetPointValue — MethodGetPointValue(obs :: SphereObs, θ :: Float64, ϕ :: Float64) :: Termsevaluates an observable at one point $𝒪(θ,ϕ)$ in the format of a list of terms.
FuzzifiED.GetIntegral — MethodGetIntegral(obs :: SphereObs[ ; norm_r2 :: Float64]) :: Termsreturns the uniform spatial integral $∫\mathrm{d}^2𝐫\,𝒪(𝐫)$ in the format of a list of terms.
Arguments
norm_r2 :: Float64is the radius squared $R^2$ used for normalisation. Facultative,ObsNormRadSqby default. If $R≠1$, an extra factor $R^2$ is included.
FuzzifiED.FilterComponent — MethodFilterComponent(obs :: SphereObs, flt) :: AngModesreturns an observable object with certain modes filtered out.
Arguments
obs :: SphereObsis the original observablefltis the filter function whose input is the pair $(l,m)$ and output is a logical that indicates whether this mode is chosen. E.g., if one wants to filter out the components with $L^z=0$, one should put(l, m) -> m == 0.
Three types of operators, viz. electrons and density operators, and pairing operators are built-in.
FuzzifiED.GetElectronObs — MethodGetElectronObs(nm :: Int64, nf :: Int64, f :: Int64[ ; norm_r2 :: Float64]) :: SphereObsreturns the electron annihilation operator $ψ_f$.
Arguments
nf :: Int64is the number of flavours.nm :: Int64is the number of orbitals.f :: Int64is the index of the flavour to be taken.norm_r2 :: Float64is the radius squared $R^2$ used for normalisation. Facultative,ObsNormRadSqby default. If $R≠1$, an extra factor $1/R$ is included.
FuzzifiED.GetDensityObs — MethodGetDensityObs(nm :: Int64, nf :: Int64[, mat :: Matrix{<:Number}][ ; norm_r2 :: Float64]) :: SphereObsreturns the density operator $n=∑_{ff'}ψ^†_{f}M_{ff'}ψ_{f'}$
Arguments
nf :: Int64is the number of flavours.nm :: Int64is the number of orbitals.mat :: Int64is the matrix $M_{ff'}$. Facultative, identity matrix $\mathbb{I}$ by default.norm_r2 :: Float64is the radius squared $R^2$ used for normalisation. Facultative,ObsNormRadSqby default. If $R≠1$, an extra factor $1/R^2$ is included.
FuzzifiED.GetPairingObs — MethodGetPairingObs(nm :: Int64, nf :: Int64, mat :: Matrix{<:Number}[ ; norm_r2 :: Float64]) :: SphereObsreturns the pair operator $Δ=∑_{ff'}ψ_{f}M_{ff'}ψ_{f'}$.
Arguments
nf :: Int64is the number of flavours.nm :: Int64is the number of orbitals.mat :: Int64is the matrix $M_{ff'}$.norm_r2 :: Float64is the radius squared $R^2$ used for normalisation. Facultative,ObsNormRadSqby default. If $R≠1$, an extra factor $1/R^2$ is included.
Angular modes
An angular modes object is similar to spherical observables except that it superposes in the rule of Clebsch-Gordan coefficients and does not have the notion of locality.
FuzzifiED.AngModes — TypeAngModesThe mutable type AngModes stores angular momentum components of an operator on the sphere $Φ_{lm}$ and superposes in the rule of Clebsch-Gordan coefficients. The usage is similar to the spherical observables, except that SphereObs superposes in the rule of spherical harmonics and has the notion of locality
Fields
l2m :: Int64is twice the maximal angular momentum $2l_{\max}$ of the components of the modes object.get_comp :: Functionis a functionget_comp(l2 :: Int64, m2 :: Int64) :: Termsthat sends the component specified by a tuple of integers $(2l,2m)$ where $|s|\leq l\leq l_{\max}, -l\leq m\leq l$ to a list of terms that specifies the expression of the component.stored_q :: Boolis a boolean that specifies whether or not each component of the modes object is stored.comps :: Dict{Tuple{Int64, Int64}, Terms}stores each component of the modes object in the format of a dictionary whose keys are the tuples of integers $(2l,2m)$ and values are the lists of terms that specifies the expression of the component.
It can be initialised with the following methods
FuzzifiED.AngModes — MethodAngModes(l2m :: Int64, get_comp :: Function) :: AngModesinitialises the modes object from $2l_{\max}$ and the function $(l,m)↦\Phi_{lm}$
Arguments
l2m :: Int64is twice the maximal angular momentum $2l_{\max}$ of the components of the modes object.get_comp :: Functionis a functionget_comp(l2 :: Int64, m2 :: Int64) :: Termsthat sends the component specified by a tuple of integers $(2l,2m)$ where $|s|\leq s\leq l_{\max}, -l\leq m\leq l$ to a list of terms that specifies the expression of the component.
FuzzifiED.AngModes — MethodAngModes(l2m :: Int64, get_comp :: Function) :: AngModesinitialises the modes object from $2l_{\max}$ and a list of $\Phi_{lm}$ specified by a dictionary.
Arguments
l2m :: Int64is twice the maximal angular momentum $2l_{\max}$ of the components of the modes object.comps :: Dict{Tuple{Int64, Int64}, Terms}stores each component of the modes object in the format of a dictionary whose keys are the tuples of integers $(2l,2m)$ and values are the lists of terms that specifies the expression of the component.
The following methods explicitly calculates and stores each component
FuzzifiED.StoreComps! — MethodStoreComps!(amd :: AngModes)calculates and stores each component of the modes object amd and replace the function in amd by the list of calculated components.
FuzzifiED.StoreComps — MethodStoreComps(amd :: AngModes) :: AngModescalculates and stores each component of the modes object amd and return a new modes object with the list of calculated components.
The multiplication, addition and conjugate of an observable is supported
Base.:* — Method*(fac :: Number, amd :: AngModes) :: AngModes
*(amd :: AngModes, fac :: Number) :: AngModes
/(amd :: AngModes, fac :: Number) :: AngModes
-(amd :: AngModes) :: AngModesenables the multiplication of a mode with a number.
Base.:+ — Method+(amd1 :: AngModes, amd2 :: AngModes) :: AngModes
-(amd1 :: AngModes, amd2 :: AngModes) :: AngModesenables the addition of two modes.
Base.adjoint — Methodadjoint(amd :: AngModes) :: AngModesenables the Hermitian conjugate of a spherical mode.
\[\begin{aligned} (Φ^†)_{lm}&=(-1)^{l+m}(Φ_{l,-m})^† \end{aligned}\]
Base.:* — Method*(amd1 :: AngModes, amd2 :: AngModes) :: AngModesenables the multiplication of two modes in the rule of CG coefficients.
\[ Φ_{lm}=∑_{l_1l_2m_1m_2}δ_{m,m_1+m_2}⟨l_1m_1,l_2m_2|lm⟩Φ_{l_1m_1}Φ_{l_2m_2}\]
Padding orbitals for AngModes is realised
FuzzifiED.PadAngModes — FunctionPadAngModes(amd :: AngModes, nol :: Int64)adds nol empty orbitals to the left by shifting each orbital index, implemented as
AngModes(amd.l2m, (l, m) -> PadTerms(amd.get_comp(l, m), nol))One can take out either one or a set of components, or contract two angular modes.
FuzzifiED.GetComponent — MethodGetComponent(amd :: AngModes, l :: Number, m :: Number) :: Termsreturns an angular component $Φ_{lm}$ of a modes object in the format of a list of terms.
FuzzifiED.FilterL2 — MethodFilterL2(amd :: AngModes, l :: Number) :: AngModesreturns an angular modes object with modes of a certain total angular momentum filtered out.
FuzzifiED.FilterComponent — MethodFilterComponent(amd :: AngModes, flt) :: AngModesreturns an angular modes object with certain modes filtered out.
Arguments
amd :: AngModesis the original angular modesfltis the filter function whose input is the pair $(l,m)$ and output is a logical that indicates whether this mode is chosen. E.g., if one wants to filter out the modes with angular momentuml0, one should put(l, m) -> l == l0.
FuzzifiED.ContractMod — MethodContractMod(amd1 :: AngModes, amd2 :: amd2, comps :: Dict) :: Terms
ContractMod(amd1 :: AngModes, amd2 :: AngModes, l0 :: Number) :: TermsReturn the contraction of two angular modes
\[ ∑_{l}U_l∑_{m=-l}^l(-1)^{l+m}Φ_{1,l}Φ_{2,l(-m)}\]
where the list of $U_l$ is given by a dictionary, or
\[ U_{l₀}∑_{m=-l₀}^{l₀}(-1)^{l₀+m}Φ_{1,l₀m}Φ_{2,l₀(-m)}.\]
Three types of operators, viz. electrons and density operators, and pairing operators are built-in.
FuzzifiED.GetElectronMod — MethodGetElectronMod(nm :: Int64, nf :: Int64, f :: Int64) :: AngModesreturns the modes of electron annihilation operator $c_m$, with angular momentum $s=(N_m-1)/2$
Arguments
nf :: Int64is the number of flavours.nm :: Int64is the number of orbitals.f :: Int64is the index of the flavour to be taken.
FuzzifiED.GetPairingMod — MethodGetPairingMod(nm :: Int64, nf :: Int64, mat :: Matrix{<:Number}) :: AngModesreturns the modes of two electrons superposed in the rule of CG coefficients.
\[ Δ_{lm}=∑_{m_1m_2}δ_{m,m_1+m_2}⟨sm_1,sm_2|lm⟩c_{a,m_1}M_{ab}c_{b,m_2}\]
Arguments
nf :: Int64is the number of flavours.nm :: Int64is the number of orbitals.mat :: Int64is the matrix $M_{ff'}$.
FuzzifiED.GetDensityMod — MethodGetDensityMod(nm :: Int64, nf :: Int64, mat :: Matrix{<:Number}) :: AngModesreturns the modes of electron creation and annihilation superposed in the rule of CG coefficients.
\[ n_{lm}=∑_{m_1m_2}δ_{m,-m_1+m_2}(-1)^{s+m_1}⟨s(-m_1),sm_2|lm⟩c^†_{m_1}c_{m_2}\]
Arguments
nf :: Int64is the number of flavours.nm :: Int64is the number of orbitals.mat :: Int64is the matrix $M_{ff'}$. Facultative, identity matrix $\mathbb{I}$ by default.