-
-
Save rupeshknn/5faae6f94b8298622ddf0e274375e095 to your computer and use it in GitHub Desktop.
Mathematica code for this animation of transitions in hydrogen wavefunctions: https://twitter.com/bencbartlett/status/1287802625602117632
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| << MaTeX` | |
| SetOptions[MaTeX, "Preamble" -> {"\\usepackage{color,txfonts}"}]; | |
| SetDirectory[NotebookDirectory[]]; | |
| Clear[drawLadder]; | |
| drawLadder[n_, l_, m_, imsize_: 500] := Module[{maxrungs = 5, mag = 4}, | |
| Graphics[{ | |
| White, Opacity[1], Thickness[.02], Dashing[None], | |
| Table[Line[{{0, k}, {1, k}}], {k, maxrungs}], (*draw n lines*) | |
| Gray, Dashed, Thickness[.005], Line[{{0, 0}, {1, 0}}], | |
| Red, Opacity[.75], | |
| Disk[{0.5, n}, .3], | |
| White, Opacity[1], Thickness[.02], Dashing[None], | |
| Table[ | |
| Line[{{2, k}, {3, k}}], {k, 0, | |
| Floor[n + 0.01] - 1}], (*draw l lines*) | |
| Gray, Dashed, | |
| Thickness[.005], | |
| Table[Line[{{2, k}, {3, k}}], {k, Floor[n + 0.01], maxrungs}], | |
| Blue, Opacity[.75], | |
| Disk[{2.5, l}, .3], | |
| White, Opacity[1], Thickness[.02], Dashing[None], | |
| Table[ | |
| Line[{{4, k}, {5, k}}], {k, 0, | |
| Ceiling[l - 0.01]}], (*draw m lines*) | |
| Gray, Dashed, | |
| Thickness[.005], | |
| Table[ | |
| Line[{{4, k}, {5, k}}], {k, Ceiling[l - 0.01] + 1, maxrungs}], | |
| Green, Opacity[.75], | |
| Disk[{4.5, m}, .3], | |
| White, Opacity[1], Thick, Dashing[None], | |
| Text[ | |
| MaTeX["\\color{white} n", Magnification -> mag], {.5, | |
| maxrungs + 1}], | |
| Text[ | |
| MaTeX["\\color{white} l", Magnification -> mag], {2.5, | |
| maxrungs + 1}], | |
| Text[ | |
| MaTeX["\\color{white} m", Magnification -> mag], {4.5, | |
| maxrungs + 1}], | |
| Table[ | |
| Text[MaTeX["\\color{white} " <> ToString[k], | |
| Magnification -> .5*mag], {5.8, k}], {k, 0, maxrungs}] | |
| }, | |
| (*Background\[Rule]Black,*) | |
| Background -> Transparent, | |
| ImageSize -> imsize | |
| ] | |
| ]; | |
| (*drawLadder[3,2,0]*) | |
| Clear[drawFrame]; | |
| drawFrame[{n1_, l1_, m1_}, {n2_, l2_, m2_}, c1_, c2_] := | |
| Module[{c1norm, c2norm}, | |
| c1norm = c1/Sqrt[Abs[c1]^2 + Abs[c2]^2]; | |
| c2norm = c2/Sqrt[Abs[c1]^2 + Abs[c2]^2]; | |
| ListDensityPlot[ | |
| Table[ | |
| Module[{r = Norm[{x, 0, z}], eq1, eq2}, | |
| eq1 = | |
| Sqrt[4 \[Pi]] | |
| r (Exp[-(r/n1)] r^ | |
| l1 LaguerreL[n1 - 1 - l1, 2 l1 + 1, (2 r)/ | |
| n1]) SphericalHarmonicY[l1, m1, ArcCos[z/r], ArcTan[x, 0]]; | |
| eq2 = | |
| Sqrt[4 \[Pi]] | |
| r (Exp[-(r/n2)] r^ | |
| l2 LaguerreL[n2 - 1 - l2, 2 l2 + 1, (2 r)/ | |
| n2]) SphericalHarmonicY[l2, m2, ArcCos[z/r], ArcTan[x, 0]]; | |
| Abs[c1norm*eq1 + c2norm*eq2]^2 | |
| ], {z, -40.1, 40, .5}, {x, -40.1, 80, .5}], | |
| DataRange -> {{-40, 40}, {-40, 80}}, | |
| AspectRatio -> .8/1.2, ImageSize -> 1000*{1.2, .8}, | |
| Mesh -> False, Frame -> False, | |
| (*InterpolationOrder\[Rule]1, | |
| THIS CAUSES CRASHES*) | |
| (*PlotPoints\[Rule]100, | |
| MaxRecursion\[Rule]6,*) | |
| ColorFunctionScaling -> True, | |
| ColorFunction -> "SunsetColors", | |
| Epilog -> Inset[ | |
| drawLadder[ | |
| (*n1*c1norm+n2*c2norm,m1*c1norm+m2*c2norm,l1*c1norm+l2*c2norm*) | |
| n1*c1norm^2 + n2*c2norm^2, l1*c1norm^2 + l2*c2norm^2, | |
| m1*c1norm^2 + m2*c2norm^2, 250], | |
| (*{60,0},*) | |
| {29, 20} | |
| ] | |
| ] | |
| ] | |
| drawFrame[{4, 3, 3}, {5, 3, 3}, .5, .5] | |
| (*drawFrame[{2,0,0},{2,1,0},1,.8]*) | |
| Clear[renderFrame]; | |
| renderFrame[t_] := Module[{tt = t - Floor[t], c1, c2, ttt}, | |
| ttt = Piecewise[{{0, | |
| tt < .1}, {(tt - .1)/(1 - .1 - .1), .1 <= tt < .9}, {1, | |
| tt >= .9}}]; | |
| c1 = Cos[\[Pi]/2 * ttt]; | |
| c2 = Sin[\[Pi]/2 * ttt]; | |
| Switch[Floor[t], | |
| 0, drawFrame[{5, 0, 0}, {4, 0, 0}, c1, c2], | |
| 1, drawFrame[{4, 0, 0}, {3, 0, 0}, c1, c2], | |
| 2, drawFrame[{3, 0, 0}, {3, 1, 0}, c1, c2], | |
| 3, drawFrame[{3, 1, 0}, {3, 1, 1}, c1, c2], | |
| 4, drawFrame[{3, 1, 1}, {4, 0, 0}, c1, c2], | |
| 5, drawFrame[{4, 0, 0}, {4, 1, 1}, c1, c2], | |
| 6, drawFrame[{4, 1, 1}, {4, 2, 1}, c1, c2], | |
| 7, drawFrame[{4, 2, 1}, {4, 3, 1}, c1, c2], | |
| 8, drawFrame[{4, 3, 1}, {5, 0, 0}, c1, c2], | |
| 9, drawFrame[{5, 0, 0}, {5, 1, 1}, c1, c2], | |
| 10, drawFrame[{5, 1, 1}, {5, 2, 1}, c1, c2], | |
| 11, drawFrame[{5, 2, 1}, {5, 3, 1}, c1, c2], | |
| 12, drawFrame[{5, 3, 1}, {5, 4, 1}, c1, c2], | |
| 13, drawFrame[{5, 4, 1}, {5, 3, 1}, c1, c2], | |
| 14, drawFrame[{5, 3, 1}, {5, 2, 1}, c1, c2], | |
| 15, drawFrame[{5, 2, 1}, {5, 1, 1}, c1, c2], | |
| 16, drawFrame[{5, 1, 1}, {4, 1, 1}, c1, c2], | |
| 17, drawFrame[{4, 1, 1}, {3, 1, 1}, c1, c2], | |
| 18, drawFrame[{3, 1, 1}, {2, 1, 1}, c1, c2], | |
| 19, drawFrame[{2, 1, 1}, {1, 0, 0}, c1, c2], | |
| _, drawFrame[{2, 1, 0}, {1, 0, 0}, 0, 1] | |
| ] | |
| ]; | |
| renderFrame[0.9] | |
| Plot[ | |
| Module[{}, | |
| ttt = Piecewise[{{0, | |
| x < .1}, {(x - .1)/(1 - .1 - .1), .1 <= x < .9}, {1, x > .9}}]; | |
| c1 = Cos[\[Pi]/2 * ttt]; | |
| c2 = Sin[\[Pi]/2 * ttt]; | |
| 2*c1^2 + 3*c2^2 | |
| ], {x, -1, 2}] | |
| saveframe[tt_] := Module[{frame, title}, | |
| frame = renderFrame[tt]; | |
| title = IntegerString[Floor[tt*1000], 10, 8] <> ".png"; | |
| Export["frames/" <> title, frame]; | |
| ]; | |
| Monitor[Table[saveframe[t], {t, 0, 20, 1/120}], | |
| ProgressIndicator[t, {0, 20}]]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment