Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Coupling

The coupling operator KK takes an ICT X\mathbf X of weight ℓ1\ell_1 and an ICT Y\mathbf Y of weight ℓ2\ell_2 to the weight-ℓ3\ell_3 part Z\mathbf Z of their product, the Cartesian counterpart of a Clebsch-Gordan coefficient. KK takes X\mathbf X and Y\mathbf Y as its two inputs, so Z\mathbf Z is act(K, X, Y).

Two vectors, ICTs of weight 1, couple to weight 2, a symmetric traceless matrix:

import numpy as np

from natto import act, get_coupling_operator

X = np.array([1.0, 0.0, 0.0])
Y = np.array([0.0, 1.0, 0.0])

K = get_coupling_operator(1, 1, 2)
Z = act(K, X, Y)

print(f"K from weights 1 and 1 to 2: {K}\n")
print(f"Z = K · X Y:\n{Z}")
K from weights 1 and 1 to 2: +3/4 δ_Aa δ_Bb  +3/4 δ_Ab δ_Ba  -1/2 δ_AB δ_ab

Z = K · X Y:
[[0.   0.75 0.  ]
 [0.75 0.   0.  ]
 [0.   0.   0.  ]]

As with the other operators, act evaluates KK into an array and contracts it with its inputs by numpy.einsum. evaluate gives the array and the rule, with one operand for X\mathbf X and one for Y\mathbf Y:

from natto import evaluate

K_array, rule = evaluate(K)
Z = np.einsum(rule, K_array, X, Y)

print(f"einsum rule: {rule}\n")
print(f"Z = K · X Y:\n{Z}")
einsum rule: abAB,...A,...B->...ab

Z = K · X Y:
[[0.   0.75 0.  ]
 [0.75 0.   0.  ]
 [0.   0.   0.  ]]

By default, normalize="legendre", the scale of KK is fixed so that, for even ℓ1+ℓ2+ℓ3\ell_1 + \ell_2 + \ell_3, the Cartesian harmonics of one direction couple to the harmonic of that direction. normalize="none" leaves KK unscaled.