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) :: QNDiag
Return the QNDiag of the number of electrons, implemented as
QNDiag("Ne", fill(1, no))
FuzzifiED.GetLz2QNDiag
— MethodGetLz2QNDiag(nm :: Int64, nf :: Int64) :: QNDiag
Return the QNDiag of the number 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]) :: QNDiag
Return 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) :: QNDiag
Return the QNDiag of a $ℤ_{N_f}$-charge,
\[ Q = ∑_{f=0}^{N_f-1}fn_f\ \mathrm{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]) :: QNDiag
Return the QNDiag of the number of electrons in the subset 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 :: Int64
andnf :: Int64
are 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])
Return the flavour permutaiton transformation
\[ 𝒵: c^†_{mf}↦α_fc^†_{mπ_f}\]
Arguments
nm :: Int64
andnf :: Int64
are 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 :: Int64
is the period of the permutation.
FuzzifiED.GetRotyQNOffd
— MethodGetRotyQNOffd(nm :: Int64, nf :: Int64)
Return the $π$-rotation along 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}
Argument
nm :: Int64
is the number of orbitalsps_pot :: Vector{<:Number}
is the vector of non-zero pseudopotentials
Output
- A
nm
*nm
*nm
array 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}]) :: Terms
Return 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 :: Int64
is the number of orbitals.nf :: Int64
is 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
*nf
matrix specifying $M^A_{ff'}$. Facultative, $I_{N_f}$ by default.mat_b :: Matrix{<:Number}
is anf
*nf
matrix specifying $M^B_{ff'}$. Facultative, the Hermitian conjugate ofmat_a
by 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}]) :: Terms
Return 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 :: Int64
is the number of orbitals.nf :: Int64
is 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
*nf
matrix specifying $(M^A_{α})_{ff'}$. Facultative, $I_{N_f}$ by default.mat_b :: Vector{<:AbstractMatrix{<:Number}}
is a vector ofnf
*nf
matrix specifying $(M^B_{α})_{ff'}$. Facultative, the Hermitian conjugate ofmat_a
by 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}]) :: Terms
Return 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 :: Int64
is the number of orbitals.nf :: Int64
is 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
*nf
matrix specifying $M^A_{ff'}$. Facultative, $I_{N_f}$ by default.mat_b :: Matrix{<:Number}
is anf
*nf
matrix specifying $M^B_{ff'}$. Facultative, the Hermitian conjugate ofmat_a
by 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}]) :: Terms
Return the polarisation term in the Hamiltonian
\[∑_{mff'}c^{†}_{mf}M_{ff'}c_{mf'}\]
Arguments
nm :: Int64
is the number of orbitals ;nf :: Int64
is the number of flavours ;mat :: Matrix{<:Number}
is anf
*nf
matrix 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) :: Terms
Return the terms for the total angular momentum.
Arguments
nm :: Int64
is the number of orbitals.nf :: Int64
is the number of flavours.
FuzzifiED.GetC2Terms
— MethodGetC2Terms(nm :: Int64, nf :: Int64, mat_gen :: Vector{<:AbstractMatrix{<:Number}}[, mat_tr :: Vector{<:AbstractMatrix{<:Number}}]) :: Terms
Return 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})}{\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})}{\operatorname{tr}T_i^†T_i}\]
where $G_i$ are the generator matrices, and $T_i$ are the trace matrices.
Arguments
nm :: Int64
is the number of orbitals.nf :: Int64
is 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 unity.mat_tr :: Vector{Matrix{Number}})
is a list of trace matrices that will be normalised automatically and substracted. Facultative.
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
— TypeSphereObs
The mutable type SphereObs
stores the information of a local observable (or local operator) $\Phi$ that can be decomposed into angular components.
\[ \Phi(\Omega)=∑_{lm}\Phi_{lm}Y^{(s)}_{lm}\]
Fields
s2 :: Int64
is twice the spin $2s$ of the observable.l2m :: Int64
is twice the maximal angular momentum $2l_{\max}$ of the components of the observable.get_comp :: Function
is a functionget_comp(l2 :: Int64, m2 :: Int64) :: Terms
that 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 :: Bool
is 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) :: SphereObs
initialises the observable from $2s$, $2l_{\max}$ and the function $(l,m)↦\Phi_{lm}$
Arguments
s2 :: Int64
is twice the spin $2s$ of the observable.l2m :: Int64
is twice the maximal angular momentum $2l_{\max}$ of the components of the observable.get_comp :: Function
is a functionget_comp(l2 :: Int64, m2 :: Int64) :: Terms
that 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, get_comp :: Function) :: SphereObs
initialises the observable from $2s$, $2l_{\max}$ and a list of $\Phi_{lm}$ specified by a dictionary.
Arguments
s2 :: Int64
is twice the spin $2s$ of the observable.l2m :: Int64
is 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) :: SphereObs
calculates 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) :: SphereObs
enables the multiplication of an observable with a number.
Base.:+
— Method+(obs1 :: SphereObs, obs2 :: SphereObs) :: SphereObs
-(obs1 :: SphereObs, obs2 :: SphereObs) :: SphereObs
enables the addition of two observables.
Base.adjoint
— Methodadjoint(obs :: SphereObs) :: SphereObs
enables 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) :: SphereObs
enables the multiplication of two observable by making use of the composition of two monopole harmonics into one.
FuzzifiED.Laplacian
— MethodLaplacian(obs :: SphereObs) :: SphereObs
Takes the Laplacian of an observable
\[ (∇^2Φ)_{lm}=-l(l+1)Φ_{lm}\]
The observables can be evaluated either at an angular component or at a real-space point.
FuzzifiED.GetComponent
— MethodGetComponent(obs :: SphereObs, l :: Number, m :: Number) :: Terms
returns an angular component $Φ_{lm}$ of an observable in the format of a list of terms.
FuzzifiED.GetPointValue
— MethodGetPointValue(obs :: SphereObs, θ :: Float64, ϕ :: Float64) :: Terms
evaluates an observable at one point $Φ(θ,ϕ)$ in the format of a list of terms.
Three types of operators, viz. electrons and density operators, and pairing operators are built-in.
FuzzifiED.GetElectronObs
— MethodGetElectronObs(nm :: Int64, nf :: Int64, f :: Int64) :: SphereObs
returns the electron annihilation operator $ψ_f$
Arguments
nf :: Int64
is the number of flavours.nm :: Int64
is the number of orbitals.f :: Int64
is the index of the flavour to be taken.
FuzzifiED.GetDensityObs
— MethodGetDensityObs(nm :: Int64, nf :: Int64[, mat :: Matrix{<:Number}]) :: SphereObs
returns the density operator $n=∑_{ff'}ψ^†_{f}M_{ff'}ψ_{f'}$
Arguments
nf :: Int64
is the number of flavours.nm :: Int64
is the number of orbitals.mat :: Int64
is the matrix $M_{ff'}$. Facultative, identity matrix $\mathbb{I}$ by default.
FuzzifiED.GetPairingObs
— MethodGetPairingObs(nm :: Int64, nf :: Int64, mat :: Matrix{<:Number}) :: SphereObs
returns the pair operator $Δ=∑_{ff'}ψ_{f}M_{ff'}ψ_{f'}$
Arguments
nf :: Int64
is the number of flavours.nm :: Int64
is the number of orbitals.mat :: Int64
is the matrix $M_{ff'}$.
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
— TypeAngModes
The 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 :: Int64
is twice the maximal angular momentum $2l_{\max}$ of the components of the modes object.get_comp :: Function
is a functionget_comp(l2 :: Int64, m2 :: Int64) :: Terms
that 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 :: Bool
is 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) :: AngModes
initialises the modes object from $2l_{\max}$ and the function $(l,m)↦\Phi_{lm}$
Arguments
l2m :: Int64
is twice the maximal angular momentum $2l_{\max}$ of the components of the modes object.get_comp :: Function
is a functionget_comp(l2 :: Int64, m2 :: Int64) :: Terms
that 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) :: AngModes
initialises the modes object from $2l_{\max}$ and a list of $\Phi_{lm}$ specified by a dictionary.
Arguments
l2m :: Int64
is 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) :: AngModes
calculates 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) :: AngModes
enables the multiplication of a mode with a number.
Base.:+
— Method+(obs1 :: AngModes, obs2 :: AngModes) :: AngModes
-(obs1 :: AngModes, obs2 :: AngModes) :: AngModes
enables the addition of two modes.
Base.adjoint
— Methodadjoint(amd :: AngModes) :: AngModes
enables the Hermitian conjugate of a spherical mode.
\[\begin{aligned} (Φ^†)_{lm}&=(-1)^{l+m}(Φ_{l,-m})^† \end{aligned}\]
Base.:*
— Method*(obs1 :: AngModes, obs2 :: AngModes) :: AngModes
enables 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}\]
One can take out either one or a set of components
FuzzifiED.GetComponent
— MethodGetComponent(amd :: AngModes, l :: Number, m :: Number) :: Terms
returns an angular component $Φ_{lm}$ of a modes object in the format of a list of terms.
FuzzifiED.FilterL2
— MethodFilterL2(amd :: AngModes, l :: Number) :: AngModes
returns an angular modes object with modes of a certain total angular momentum filtered out.
FuzzifiED.FilterComponent
— MethodFilterComponent(amd :: AngModes, flt) :: AngModes
returns an angular modes object with certain modes filtered out.
Arguments
amd :: AngModes
is the original angular modesflt
is 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
.
Three types of operators, viz. electrons and density operators, and pairing operators are built-in.
FuzzifiED.GetElectronMod
— MethodGetElectronMod(nm :: Int64, nf :: Int64, f :: Int64) :: AngModes
returns the modes of electron annihilation operator $c_m$, with angular momentum $s=(N_m-1)/2$
Arguments
nf :: Int64
is the number of flavours.nm :: Int64
is the number of orbitals.f :: Int64
is the index of the flavour to be taken.
FuzzifiED.GetPairingMod
— MethodGetPairingMod(nm :: Int64, nf :: Int64, mat :: Matrix{<:Number}) :: AngModes
returns 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 :: Int64
is the number of flavours.nm :: Int64
is the number of orbitals.mat :: Int64
is the matrix $M_{ff'}$.
FuzzifiED.GetDensityMod
— MethodGetDensityMod(nm :: Int64, nf :: Int64, mat :: Matrix{<:Number}) :: AngModes
returns 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 :: Int64
is the number of flavours.nm :: Int64
is the number of orbitals.mat :: Int64
is the matrix $M_{ff'}$. Facultative, identity matrix $\mathbb{I}$ by default.