Skip to content

Instantly share code, notes, and snippets.

@chakpongchung
Created July 11, 2015 16:20
Show Gist options
  • Save chakpongchung/ab46f134ffa68dc210da to your computer and use it in GitHub Desktop.
Save chakpongchung/ab46f134ffa68dc210da to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Derivation for the inner product of 3D rotational gradient operator acted on spherical harmonics "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"with application in object/scenes response to a lighting environment, often represented using spherical harmonics,including complex global illumination effects"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first paper that\n",
"has been used extensively in games deals with using Spherical Harmonics to represent\n",
"irradiance environment maps efficiently, allowing for interactive rendering of diffuse objects\n",
"under distant illumination"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Reference about spherical harmonics\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"http://mathworld.wolfram.com/SphericalHarmonic.html"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Spherical harmonics in Sympy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get back the well known expressions in spherical coordinates we use full expansion:"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"$$\\frac{P_{n}^{\\left(m\\right)}\\left(\\cos{\\left (\\theta \\right )}\\right)}{2 \\sqrt{\\pi}} \\sqrt{\\frac{\\left(- m + n\\right)!}{\\left(m + n\\right)!} \\left(2 n + 1\\right)} e^{i m \\phi}$$"
],
"text/plain": [
" _____________________ \n",
" ╱ (2⋅n + 1)⋅(-m + n)! ⅈ⋅m⋅φ \n",
" ╱ ─────────────────── ⋅ℯ ⋅assoc_legendre(n, m, cos(θ))\n",
"╲╱ (m + n)! \n",
"─────────────────────────────────────────────────────────────\n",
" ___ \n",
" 2⋅╲╱ π "
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sympy import Ynm, Symbol, expand_func\n",
"from sympy.abc import n,m\n",
"theta = Symbol(\"theta\")\n",
"phi = Symbol(\"phi\")\n",
"expand_func(Ynm(n, m, theta, phi))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Relevant page\n",
"http://docs.sympy.org/latest/modules/functions/special.html?highlight=spherical%20harmonics#sympy.functions.special.spherical_harmonics.Ynm"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"3d plot of spherical harmonics\n",
"\n",
"http://stsdas.stsci.edu/download/mdroe/plotting/entry1/index.html"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"# Derivation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We try to derive the dot product of rotational gradient of spherical harmonics with spherical harmonics expansion."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"$$\\vec{R} = \\begin{bmatrix}\n",
" R_{x}\\\\\n",
" R_{y} \\\\\n",
" R_{z}\n",
" \\end{bmatrix}\n",
" =\\begin{bmatrix}\n",
" - \\frac{cos\\theta}{sin\\theta}cos\\phi \\frac{\\partial }{\\partial \\phi} - sin\\phi \\frac{\\partial }{\\partial \\theta}\n",
" \\\\\n",
" - \\frac{cos\\theta}{sin\\theta}cos\\phi \\frac{\\partial }{\\partial \\phi} + cos\\phi \\frac{\\partial }{\\partial \\theta} \n",
" \\\\\n",
" \\frac{\\partial }{\\partial \\phi} \n",
" \\end{bmatrix}\n",
" $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"R_{\\alpha} = i L_{\\alpha}, where \\, \\alpha = x,y,z\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" $$ \\vec{R} = \\begin{bmatrix}\n",
" R_{x} \\\\\n",
" R_{y} \\\\\n",
" R_{z}\n",
" \\end{bmatrix}\n",
" =\n",
" \\begin{bmatrix}\n",
" i L_{x} \\\\\n",
" i L_{y} \\\\\n",
" i L_{z}\n",
" \\end{bmatrix}\n",
" =\n",
" \\begin{bmatrix}\n",
" \\frac{i}{2}(L_{+}+L_{-} ) \\\\\n",
" \\frac{1}{2}(L_{+}-L_{-} ) \\\\\n",
" i L_{z}\n",
" \\end{bmatrix}\n",
" $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"L_{+} Y{_l^{m}}= c_{l,m,1} Y{_l^{m+1}}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"$$\n",
"L_{-} Y{_l^{m}}= c_{l,m,2} Y{_l^{m-1}}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"$$\n",
"L_{z} Y{_l^{m}}= m Y{_l^{m}}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"after some manipulations of the above identities, it can be shown that (details will be added later)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ \\vec{R}Y{_j^{p}} \\cdot \\vec{R}Y{_l^{m}} = - \\frac{1}{2} [c_{j,p,1}c_{l,m,2}Y{_j^{p+1}} Y{_l^{m-1}}+c_{j,p,2}c_{l,m,1}Y{_j^{p-1}}Y{_l^{m+1}}] - mp Y{_j^{p}} Y{_l^{m}} $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ =(-1)*(-1)^{m+p} \\sum\\limits_{k=|l-j|}^{l+j}Y{_k^{m+p}}[\\frac{1}{2} (c_{j,p,1}c_{l,m,2} \\alpha_{l,m-1,j,p+1,k} +c_{j,p,2}C_{l,m,1}\\alpha_{l,m+1,j,p-1,k}) + mp \\alpha_{l,m,j,p,k}] $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $$ \\alpha_{l,m,j,p,k} = \\int_{0}^{2\\pi} \\int_{0}^{\\pi} Y{_j^{p}} Y{_l^{m}} Y{_k^{-m-p}} \\sin \\theta d\\theta d\\phi$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ =[\\frac{(2l+1)(2j+1)(2k+1)}{4\\pi}]^{1/2} * \\left(\\begin{array}{clcr} j & l & k\\\\ 0& 0 & 0 \\end{array}\\right) * \\left(\\begin{array}{clcr} j & l & k\\\\ p& m & -(m+p) \\end{array}\\right) $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"here \n",
"$$\n",
"\\left(\\begin{array}{clcr} j & l & k\\\\ 0& 0 & 0 \\end{array}\\right)\n",
"$$\n",
"\n",
"is Wigner 3j symbol"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Wigner 3j symbol"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"reference for Wigner 3j symbol(strange fraction here)\n",
"\n",
"http://docs.sympy.org/dev/modules/physics/wigner.html"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"$$\\frac{\\sqrt{715}}{143}$$"
],
"text/plain": [
" _____\n",
"╲╱ 715 \n",
"───────\n",
" 143 "
]
},
"execution_count": 115,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sympy.physics.wigner import wigner_3j\n",
"wigner_3j(2, 6, 4, 0, 0, 0)"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"$$0$$"
],
"text/plain": [
"0"
]
},
"execution_count": 116,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wigner_3j(2, 6, 4, 0, 0, 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and$$\n",
" Y{_j^{p}} = Y{_j^{p}}(\\theta, \\phi)\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"c_{l,m,1}=\\sqrt{(l-m)(l+m+1)}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"c_{l,m,2}=\\sqrt{(l+m)(l-m+1)}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" using the recursive relation shown p760,34.3.14,NIST Handbook 2010 ,we have:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" $$ \\frac{1}{2} (c_{j,p,1}c_{l,m,2} \\alpha_{l,m-1,j,p+1,k} +c_{j,p,2}C_{l,m,1}\\alpha_{l,m+1,j,p-1,k}) + mp \\alpha_{l,m,j,p,k} $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ =\\frac{1}{2}[\\frac{(2l+1)(2j+1)(2k+1)}{4\\pi}]^{1/2} * \\left(\\begin{array}{clcr} j & l & k\\\\ 0& 0 & 0 \\end{array}\\right) * [ c_{j,p,1}c_{l,m,2} \\left(\\begin{array}{clcr} j & l & k\\\\ p+1& m-1 & -(m+p) \\end{array}\\right) + c_{j,p,2}c_{l,m,1} \\left(\\begin{array}{clcr} j & l & k\\\\ p-1& m+1 & -(m+p) \\end{array}\\right) + 2mp \\left(\\begin{array}{clcr} j & l & k\\\\ p-1& m+1 & -(m+p) \\end{array}\\right) ] $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ = \\frac{1}{2}[\\frac{(2l+1)(2j+1)(2k+1)}{4\\pi}]^{1/2} * \\left(\\begin{array}{clcr} j & l & k\\\\ 0& 0 & 0 \\end{array}\\right) * \\left(\\begin{array}{clcr} k & j & l\\\\ -(m+p)& p & m \\end{array}\\right) *(k^2-j^2-l^2+k-j-(-2pm+2pm)) $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" $$ = \\frac{1}{2}[\\frac{(2l+1)(2j+1)(2k+1)}{4\\pi}]^{1/2} * \\left(\\begin{array}{clcr} k & j & l\\\\ 0& 0 & 0 \\end{array}\\right) * \\left(\\begin{array}{clcr} k & j & l\\\\ -(m+p)& p & m \\end{array}\\right) *(k^2-j^2-l^2+k-j-l) $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ = \\alpha_{l,m,j,p,k} * \\frac{1}{2} (k^2-j^2-l^2+k-j-l) $$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## so, we have \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ \\vec{R}Y{_j^{p}} \\cdot \\vec{R}Y{_l^{m}} = (-1)^{m+p} \\sum\\limits_{k=|l-j|}^{l+j}Y{_k^{m+p}} * \\alpha_{l,m,j,p,k} * \\frac{1}{2} (k^2-j^2-l^2+k-j-l) $$"
]
},
{
"cell_type": "code",
"execution_count": 117,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sympy import *\n",
"init_printing(use_latex='mathjax')\n",
"#init_printing()"
]
},
{
"cell_type": "code",
"execution_count": 151,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def dot_rota_grad_SH(j, p, l, m, theta, phi):\n",
" return (-S(1))**(m+p) *summation(Ynm(k, m+p, theta,phi)*alpha(l,m,j,p,k)/2 *(k**2-j**2-l**2+k-j-l), (k, abs(l-j), l+j))"
]
},
{
"cell_type": "code",
"execution_count": 153,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sympy.physics.wigner import wigner_3j\n",
"def alpha(l,m,j,p,k):\n",
" return sqrt((2*l+1)*(2*j+1)*(2*k+1)/(4*pi)) * wigner_3j(j, l, k, 0, 0, 0)*wigner_3j(j, l, k, p, m, -m-p)"
]
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sympy.physics.wigner import wigner_3j\n",
"def alpha(l,m,j,p,k):\n",
" return sqrt((2*l+1)*(2*j+1)*(2*k+1)/(4*pi)) #* wigner_3j(j, l, k, 0, 0, 0)*wigner_3j(j, l, k, p, m, -m-p)"
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"$$\\sum_{k=\\left\\lvert{j - l}\\right\\rvert}^{j + l} Y_{k}^{m + p}\\left(\\theta,\\phi\\right)$$"
],
"text/plain": [
" j + l \n",
" ___ \n",
" ╲ \n",
" ╲ Ynm(k, m + p, θ, φ)\n",
" ╱ \n",
" ╱ \n",
" ‾‾‾ \n",
"k = │j - l│ "
]
},
"execution_count": 140,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var(\"k p l j m p\")\n",
"summation(Ynm(k, m+p, theta, phi), (k, abs(l-j), l+j))"
]
},
{
"cell_type": "code",
"execution_count": 143,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"$$\\left(-1\\right)^{m + p} \\sum_{k=\\left\\lvert{j - l}\\right\\rvert}^{j + l} \\frac{Y_{k}^{m + p}\\left(\\theta,\\phi\\right)}{4 \\sqrt{\\pi}} \\sqrt{\\left(2 j + 1\\right) \\left(2 k + 1\\right) \\left(2 l + 1\\right)} \\left(- j^{2} - j + k^{2} + k - l^{2} - l\\right)$$"
],
"text/plain": [
" j + l \n",
" _____ \n",
" ╲ \n",
" ╲ _______________________________ ⎛ 2 2 \n",
" ╲ ╲╱ (2⋅j + 1)⋅(2⋅k + 1)⋅(2⋅l + 1) ⋅⎝- j - j + k + k - l\n",
" m + p ╲ ────────────────────────────────────────────────────────\n",
"(-1) ⋅ ╱ ___ \n",
" ╱ 4⋅╲╱ π \n",
" ╱ \n",
" ╱ \n",
" ‾‾‾‾‾ \n",
" k = │j - l│ \n",
"\n",
" \n",
" \n",
" \n",
"2 ⎞ \n",
" - l⎠⋅Ynm(k, m + p, θ, φ)\n",
"──────────────────────────\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" "
]
},
"execution_count": 143,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var(\"k p l j m p\")\n",
"(-S(1))**(m+p) *Sum(Ynm(k, m+p, theta,phi)*alpha(l,m,j,p,k)/2 *(k**2-j**2-l**2+k-j-l), (k, abs(l-j), l+j))"
]
},
{
"cell_type": "code",
"execution_count": 154,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "TypeError",
"evalue": "<class 'sympy.core.mul.Mul'> is not a number",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-154-e5424a643430>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdot_rota_grad_SH\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtheta\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mphi\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m<ipython-input-151-f9b5e9949da7>\u001b[0m in \u001b[0;36mdot_rota_grad_SH\u001b[1;34m(j, p, l, m, theta, phi)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdot_rota_grad_SH\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mm\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtheta\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mphi\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mS\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mm\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mp\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0msummation\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mYnm\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mm\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mp\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtheta\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mphi\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0malpha\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mm\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mp\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mabs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m<ipython-input-153-4f4e3d149a1b>\u001b[0m in \u001b[0;36malpha\u001b[1;34m(l, m, j, p, k)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0msympy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mphysics\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwigner\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mwigner_3j\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0malpha\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mm\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mp\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mpi\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mwigner_3j\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mwigner_3j\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mm\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[0mm\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/cpchung/anaconda/lib/python2.7/site-packages/sympy/physics/wigner.pyc\u001b[0m in \u001b[0;36mwigner_3j\u001b[1;34m(j_1, j_2, j_3, m_1, m_2, m_3)\u001b[0m\n\u001b[0;32m 158\u001b[0m \"\"\"\n\u001b[0;32m 159\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mj_1\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mj_1\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mj_2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mj_2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m \u001b[1;32mor\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 160\u001b[1;33m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mj_3\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mj_3\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 161\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"j values must be integer or half integer\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 162\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mm_1\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mm_1\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mm_2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mm_2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m2\u001b[0m \u001b[1;32mor\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/cpchung/anaconda/lib/python2.7/site-packages/sympy/core/expr.pyc\u001b[0m in \u001b[0;36m__int__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 192\u001b[0m \u001b[1;31m# (regardless of how much extra work we do to calculate extra decimal\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 193\u001b[0m \u001b[1;31m# places) we need to test whether we are off by one.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 194\u001b[1;33m \u001b[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mround\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 195\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_Number\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 196\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"can't convert complex to int\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/cpchung/anaconda/lib/python2.7/site-packages/sympy/core/expr.pyc\u001b[0m in \u001b[0;36mround\u001b[1;34m(self, p)\u001b[0m\n\u001b[0;32m 3040\u001b[0m \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3041\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_number\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3042\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'%s is not a number'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3043\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mS\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mNaN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mS\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mInfinity\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mS\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mNegativeInfinity\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mS\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mComplexInfinity\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3044\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mTypeError\u001b[0m: <class 'sympy.core.mul.Mul'> is not a number"
]
}
],
"source": [
"dot_rota_grad_SH(1, 1, 1, 1, theta, phi)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment