Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented gen-biquad interaction in dipole mode #179

Merged
merged 2 commits into from
Oct 28, 2023
Merged

Conversation

Hao-Phys
Copy link
Contributor

The implementation passes the check for the scalar biquadratic interactions.
However, a unit test for general interactions still needs to be included. I cannot find a simple general biquadratic interaction compatible with a given symmetry.

@Hao-Phys Hao-Phys requested a review from kbarros October 23, 2023 22:11
@Lazersmoke
Copy link
Contributor

Putting this code here so people have it available:

The following applies to Sunny.diamond_crystal():

Bond(1, 1, [0, 0, 1])
Distance 1, coordination 6
Connects [0, 0, 0] to [0, 0, 1]
Allowed exchange matrix:[A    -I  B    
                          A    B -I    
                            C       D J
                         I B    H      
                         B I      H    
                                 E   
                            D       F K
                           -J      -K G]
function physical_basis_su3()
    S = 1
    dipole_operators = spin_matrices(; N=2S+1)
    Sx, Sy, Sz = dipole_operators

    # we choose a particular basis of the quadrupole operators listed in Appendix B of *Phys. Rev. B 104, 104409*
    quadrupole_operators = Vector{Matrix{ComplexF64}}(undef, 5)
    quadrupole_operators[1] = -(Sx * Sz + Sz * Sx)
    quadrupole_operators[2] = -(Sy * Sz + Sz * Sy)
    quadrupole_operators[3] = Sx * Sx - Sy * Sy
    quadrupole_operators[4] = Sx * Sy + Sy * Sx
    quadrupole_operators[5] = 3 * Sz * Sz - 1/√3 * S * (S+1) * I

    [dipole_operators; quadrupole_operators]
end

but note that the 3x5 off-diagonal block of the exchange matrix is disallowed by time-reversal symmetry due to having odd number of spin operators. via Kip, this is the code needed to implement this:

S = spin_irrep_label(sys, 1)
Sx, Sy, Sz = spin_matrices(S)
Q = [-(Sx * Sz + Sz * Sx),
     -(Sy * Sz + Sz * Sy),
     Sx * Sx - Sy * Sy,
     Sx * Sy + Sy * Sx,
     3 * Sz * Sz - 1/√3 * S * (S+1) * I]
Qi, Qj = to_product_space(Q, Q)
biquad = [
    1.4 0 0 0 0
    0 1.4 0 0 0
    0 0 1.1 0 0
    0 0 0 1.2 +1.5
    0 0 0 -1.5 1.3
]
bond = Bond(1, 1, [0, 0, 1])
set_pair_coupling!(sys, 0.01(Qi'*biquad*Qj), bond)```

@kbarros
Copy link
Member

kbarros commented Oct 28, 2023

I made a few tweaks to enhance readability. One notable thing is that it can be 10x slower to turn on quadrupoles (e.g., for the powder_averaging.jl tutorial), so I have it disabled unless a nonzero biquad coupling actually appears. In the future, we can precompute the rotated 5x5 coupling matrix which will speed things up a lot.

@kbarros kbarros merged commit d7889e7 into main Oct 28, 2023
3 checks passed
@kbarros kbarros deleted the gen-biquad-dipole branch October 28, 2023 18:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants