3D Representation of H Atom Orbitals

The following code generates different representations of the real H atom orbitals. The wave function and the wave function squared are represented as isosurfaces in different Gizmo plots. The sign of the wave function is represented by color (i.e., blue and red isosurfaces).  In a different window, a Monte Carlo simulation is used to generate a probabilistic point cloud representation of the wave function. Graphs of the radial wave function are also generated.

The isosurfaces may need to be tweaked. For people not used to the Gizmo interface, this can be accomplished with the Modify Isosurface macro.

Code to generate the Bohr orbitals is also included.

Sample images are shown after the code.

#pragma TextEncoding = "UTF-8"
#pragma rtGlobals=3             // Use modern global access method and strict wave access
#pragma DefaultTab={3,20,4}     // Set default tab width in Igor Pro 9 and later
 
// Procedures to generate 3D plots of real H wave functions orbitals
//    Melissa A. Hines, Cornell University, Melissa.Hines@cornell.edu
 
Menu "Macros"
    "Generate Bohr Orbital"
    "Generate H Orbital"
    "Modify Isosurface"
End
 
Proc GenerateHOrbital(n, l, m, genPointCloud)
variable n, l, m, genPointCloud
Prompt n, "n:"
Prompt l, "l:"
Prompt m, "m:"
Prompt genPointCloud, "Generate Point Cloud?", popup "Yes;No"
    
    makeWavefunctions(0, 0, n, l, m, genPointCloud==1)
End
 
Proc GenerateBohrOrbital(n, amplitude)
variable n, amplitude=0.2
 
    make/n=256/o circle_x, circle_y, bohrOrbital_x, bohrOrbital_y; 
    SetScale/I x 0,2*pi,"", circle_x,circle_y,bohrOrbital_x,bohrOrbital_y
    circle_x = cos(x);circle_y = sin(x)
    bohrOrbital_x = (1+amplitude*cos(n*x))*cos(x);bohrOrbital_y =(1+amplitude*cos(n*x))*sin(x)
    
    if(strlen(WinList("bohrOrbitalGraph", ";","")) < 2)
        Execute "bohrOrbitalGraph()"
    endif
 
 
End
 
Proc ModifyIsosurface(theSurface, larger, factor)
variable theSurface, larger, factor=2
Prompt theSurface, "Which isosurface?", popup "Psi;Psi2"
Prompt larger, "Which direction?", popup "Larger;Smaller"
Prompt factor, "How much?"
 
    PauseUpdate
    variable oldIsoValue, multiplier
    
    multiplier = (larger < 2) ? 1/factor : factor
    
    if(theSurface < 2)  // Modify Psi
        oldIsoValue = currentIsoValue("GizmoPsi", "posSurface")
    
        DoWindow/F GizmoPsi
        ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={isoValue,oldIsoValue*multiplier}
        ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={isoValue,oldIsoValue*multiplier}
    else
        oldIsoValue = currentIsoValue("GizmoPsi2", "psi2Surface")
    
        DoWindow/F GizmoPsi2
        ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={isoValue,oldIsoValue*multiplier}
    endif
End
 
// Calculate H atom wavefunction using real orbitals defined at
//    https://en.wikipedia.org/wiki/Atomic_orbital#Real_orbitals
Function calcPsi(n, l, m, rr, theta, phi)
variable n, l, m, rr, theta, phi
 
    if(m < 0)
        return sqrt(2)*(-1)^m * Rnl(n, l, rr) * imag(sphericalHarmonics(l,-m,theta,phi))
    elseif(m > 0)
        return sqrt(2)*(-1)^m * Rnl(n, l, rr) * real(sphericalHarmonics(l,m,theta,phi))
    else
        return Rnl(n, l, rr) * real(sphericalHarmonics(l,0,theta,phi))
    endif
End
 
// Calculate H atom radial wavefunction as defined at https://en.wikipedia.org/wiki/Hydrogen_atom#:~:text=The%20normalized%20position%20wavefunctions
Function Rnl(n, l, r)
variable n, l, r
 
    variable out, a0 = 0.529, rho
    
    rho = 2*r/n/a0
    out = sqrt((2/n/a0)^3*factorial(n - l - 1)/(2 * n * factorial(n + l))) * exp(-rho/2)*(rho)^(l) * LaguerreA(n-l-1, 2*l+1, rho)
    return out 
End
 
// This function calculates the radial wavefunction and displays graphs of psi, psi^2, and 4 pi r^2 psi^2.
// Three dimensional waves representing psi^2 and positive and negative regions of psi are generated. These
//   are displayed in Gizmo plots. The isosurfaces may need tweaking to generate a pleasing size.
// Finally (if requested) a Monte Carlo algorithm is used to generate a point cloud representing psi.
Function makeWavefunctions(pts, range, n, l, m, doMakeCloud)
// pts = number of points in sqr box. 75 seems to be a good number. Use 0 to autoscale.
// range = Box is defined over the region x, y, z = (-range, range). Use 0 to autoscale.
// n, l, m: Usual hydrogenic quantum numbers
// doMakeCloud = (0, 1) depending on whether the point cloud should be generated.
variable pts, range, n, l, m, doMakeCloud
 
    variable i,j,k,xx,yy,zz,rr,rho,phi,theta, psi
    
    // Validate the quantum numbers
    if( (n < 1) || (l >= n) || (l < 0) || (abs(m) > l))
        Print "Invalid quantum numbers"
        return -1
    endif
    
    // Autosizing if pts == 0
    if(pts < 1)
        pts = 75
    endif
    variable center=floor(pts/2)    // Use odd number of points
    
    // Autoscaling if range == 0
    if(!exists("radialPsi"))
        make/n=512/o radialPsi, radialPsi2, radialProbability, zero    
    endif
    wave radialPsi, radialPsi2, radialProbability, zero
    if(range < 0.01)        
        range = calcRange(150, n, l)    // Set a huge range and do a rough graph
        range = calcRange(range, n, l)  // Refine the range
    endif  
    
    // Update radial wavefunction
    SetScale/I x 0,range,"", radialPsi,radialPsi2,radialProbability,zero
    radialPsi = Rnl(n,l,x)
    radialPsi2 = radialPsi^2
    radialProbability = 4*pi*x^2*radialPsi2
    
    // If the radial graphs are not displayed, display them
    if(strlen(WinList("radialPsiGraph", ";","")) < 2)
        Execute "radialPsiGraph()"
    endif
    if(strlen(WinList("radialPsi2Graph", ";","")) < 2)
        Execute "radialPsi2Graph()"
    endif
    if(strlen(WinList("radialProbabilityGraph", ";","")) < 2)
        Execute "radialProbabilityGraph()"
    endif
        
 
    pts = 2*floor(pts/2) + 1
    
    make/o/n=(pts, pts, pts) ddd_psi2, ddd_psiPos, ddd_psiNeg
    SetScale/I x -range,range,"", ddd_psi2, ddd_psiPos, ddd_psiNeg
    SetScale/I y -range,range,"", ddd_psi2, ddd_psiPos, ddd_psiNeg
    SetScale/I z -range,range,"", ddd_psi2, ddd_psiPos, ddd_psiNeg 
    for(k=0;k<pts;k+=1)
        zz=range * (k-center)/center 
        for(j=0;j<pts;j+=1)
            yy=range * (j-center)/center
            for(i=0;i<pts;i+=1)
                xx=range * (i-center)/center
                
                // compute spherical polar coords
                rr=sqrt(xx^2 + yy^2 + zz^2)
                phi=atan2(yy,xx)
                theta=acos(zz/rr)
                
                psi = calcPsi(n, l, m, rr, theta, phi)
                if(psi > 0)
                    ddd_psiPos[i][j][k] = psi
                    ddd_psiNeg[i][j][k] = 0
                else
                    ddd_psiPos[i][j][k] = 0
                    ddd_psiNeg[i][j][k] = -psi
                endif
                ddd_psi2[i][j][k] = psi^2
            endfor
        endfor
    endfor
    
    if(strlen(WinList("GizmoPsi", ";","")) < 2)
        Execute "GizmoPsi()"
    endif
    if(strlen(WinList("GizmoPsi2", ";","")) < 2)
        Execute "GizmoPsi2()"
    endif
 
    wavestats/q ddd_psiPos
    DoWindow/F GizmoPsi
    ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={isoValue,V_max/5}
    ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={isoValue,V_max/5}
 
    wavestats/q ddd_psi2
    DoWindow/F GizmoPsi2
    ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={isoValue,V_max/50}
    
    if(doMakeCloud)
        if(strlen(WinList("GizmoPointCloud", ";","")) > 2)
            DoWindow/F GizmoPointCloud
            ModifyGizmo stopUpdates
        endif       
        makeCloud(n, l, m, range, 30000)
        if(strlen(WinList("GizmoPointCloud", ";","")) > 2)
            ModifyGizmo resumeUpdates
        else 
            Execute "GizmoPointCloud()"
        endif
    endif
    
    wave W_coef, W_sigma
    KillWaves/Z W_coef, W_sigma, scaledWave, M_colors 
End
 
// Calculates an optimal range for the wavefunctions based on the outermost maximum in the radial distribution function
Function calcRange(roughRange, n, l)
variable roughRange, n, l
 
    wave radialPsi, radialPsi2, radialProbability, zero
 
    // Set a huge range and do a rough graph
    SetScale/I x 0,roughRange,"", radialPsi,radialPsi2,radialProbability,zero
    radialPsi = Rnl(n,l,x)
    radialPsi2 = radialPsi^2
    radialProbability = 4*pi*x^2*radialPsi2
    
    // Fit the max in the radialProbabily to a Gaussian
    wavestats/Q radialProbability
    K0 = 0;K1 = V_max;K2 = V_maxLoc;
    CurveFit/H="1110"/Q gauss radialProbability
    wave W_coef
    return ceil(W_coef[2] + 1.5 * W_coef[3])
End
 
// Returns the currently plotted isoValue for a Gizmo isosurface
Function currentIsoValue(gizmoName, isoSurfaceName)
string gizmoName, isoSurfaceName
 
    string matchStr, theStr
    variable cur = 0
    
    GetGizmo/n=$gizmoName objectList
    wave/T TW_gizmoObjectList
    
    matchStr = "*ModifyGizmo ModifyObject="+isoSurfaceName+",objectType=isoSurface,property={ isoValue,*"   
    do
        if(stringmatch(TW_gizmoObjectList[cur], matchStr))
            theStr = TW_gizmoObjectList[cur]
            theStr = theStr[strsearch(theStr, "isoValue,", 0)+9,inf]
            theStr = theStr[0, strlen(theStr)-2]
            KillWaves TW_gizmoObjectList
            return str2num(theStr)
        endif
        cur += 1
    while(cur < numpnts(TW_gizmoObjectList))
    KillWaves TW_gizmoObjectList
    return NaN  
End
 
Function colorXYZ(n, l, m, xx, yy, zz)
variable n, l, m, xx, yy, zz
 
    variable rr, phi, theta
    rr=sqrt(xx^2 + yy^2 + zz^2)
    phi=atan2(yy,xx)
    theta=acos(zz/rr)
    return sign(calcPsi(n, l, m, rr, theta, phi))
 
End
 
Function acceptOnePnt(n, l, m, xx, yy, zz, numAccepted)
variable n, l, m, xx, yy, zz, numAccepted
 
    wave pointCloud, colorPnts
    pointCloud[numAccepted][0] = xx; pointCloud[numAccepted][1] = yy; pointCloud[numAccepted][2] = zz;
    colorPnts[numAccepted] = colorXYZ(n, l, m, xx, yy, zz)
    numAccepted += 1
    return numAccepted
End
 
Function acceptPnts(n, l, m, xx, yy, zz, numAccepted)
variable n, l, m, xx, yy, zz, numAccepted
 
    // Take advatage of the symmetry of the orbitals to calculate faster
    numAccepted = acceptOnePnt(n, l, m, xx, yy, zz, numAccepted)
    numAccepted = acceptOnePnt(n, l, m, -xx, yy, zz, numAccepted)
    numAccepted = acceptOnePnt(n, l, m, xx, -yy, zz, numAccepted)
    numAccepted = acceptOnePnt(n, l, m, xx, yy, -zz, numAccepted)
    numAccepted = acceptOnePnt(n, l, m, -xx, -yy, zz, numAccepted)
    numAccepted = acceptOnePnt(n, l, m, -xx, yy, -zz, numAccepted)
    numAccepted = acceptOnePnt(n, l, m, -xx, -yy, -zz, numAccepted)
    numAccepted = acceptOnePnt(n, l, m, -xx, -yy, -zz, numAccepted)
    return numAccepted
End
 
// This function uses a Monte Carlo algorithm to generate a probabalistic point cloud representing the wavefunction.
// The positive and negative components of the wave function are colored red and blue, respectively.
Function makeCloud(n, l, m, range, numAccepts)
variable n, l, m, range, numAccepts
// range = Box is initiallydefined over the region x, y, z = (-range, range). Autoscales after 10% complete
 
    variable xx, yy, zz, rr, phi, theta, numTries, numAccepted,magnitude, kMax, maxRange, rescale
    numAccepts = 8 * ceil(numAccepts/8)
    make/n=(numAccepts, 3)/o pointCloud
    pointCloud = 0
    make/o/n=(numAccepts) colorPnts
    numAccepted = 0
    numTries = 0
    rescale = 1
    
    // Find the maximum value of the wavefuction over the selected range
    kMax = findMax(n, l, m, numAccepts, range)
    
    // The efficiency of the algorithm depends on an optimal setting of the range variable.
    // We use the input range for 10% of the tries, then reset based on the max value
    // found to that point
    maxRange = -1
    do
        xx = enoise(range); yy = enoise(range); zz = enoise(range)
        rr=sqrt(xx^2 + yy^2 + zz^2)
        phi=atan2(yy,xx)
        theta=acos(zz/rr)
        magnitude = calcPsi(n, l, m, rr, theta, phi)^2
        if(abs(magnitude) > abs(enoise(kMax)))
            numAccepted = acceptPnts(n, l, m, xx, yy, zz, numAccepted)
            if(rescale && max(xx, yy, zz) > maxRange)
                maxRange = max(xx, yy, zz)
            endif
        endif
        numTries += 1
        if(rescale && numAccepted > 0.1 * numAccepts)
            range = maxRange * 1.15
            rescale = 0
            print "New range =", range
        endif
    while(numAccepted < numAccepts)
    
    // To create a color wave for a scatter in Gizmo
    ColorTab2Wave Rainbow
    wave M_colors
    duplicate/o colorPnts, scaledWave
    Variable theMin=WaveMin(scaledWave)
    Variable theMax=WaveMax(scaledWave)
    Variable nor=(DimSize(M_colors,0)-1)/2
    MatrixOP/O scaledWave=nor*(scaledWave-theMin)
    M_colors/=65535
    
    make/o/n=(numAccepts,4) colorWave=1 // alpha will be 1.
    colorWave[][0]= M_colors[scaledWave[p]][0]
    colorWave[][1]= M_colors[scaledWave[p]][1]
    colorWave[][2]= M_colors[scaledWave[p]][2]
    
    // If calculating radialPsi^2, the following line should be approx 1
    //print "The integral is ", numAccepted/numTries * 8 * range^3 * kMax
    // print numTries, numAccepted
 
End
 
Function findMax(n, l, m, numTries, range)
variable n, l, m, numTries, range
 
    variable theMax = 0, cnt = 0, xx, yy, zz, rr, phi, theta, magnitude
    do
        xx = enoise(range); yy = enoise(range); zz = enoise(range)
        rr=sqrt(xx^2 + yy^2 + zz^2)
        phi=atan2(yy,xx)
        theta=acos(zz/rr)
        
        magnitude = abs(calcPsi(n, l, m, rr, theta, phi))
        if(magnitude > theMax)
            theMax = magnitude
        endif
        cnt += 1
    while(cnt < numTries)
 
    return theMax
End
Window GizmoPsi() : GizmoPlot
    PauseUpdate; Silent 1       // building window...
    // Building Gizmo 9 window...
    NewGizmo/W=(35,40,550,500)
    ModifyGizmo startRecMacro=901
    ModifyGizmo scalingOption=63
    AppendToGizmo isoSurface=root:ddd_psiPos,name=posSurface
    ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={ surfaceColorType,0}
    ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={ lineColorType,0}
    ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={ lineWidthType,0}
    ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={ fillMode,2}
    ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={ lineWidth,1}
    ModifyGizmo ModifyObject=posSurface,objectType=isoSurface,property={ isoValue,0.01}
    ModifyGizmo modifyObject=posSurface,objectType=Surface,property={calcNormals,1}
        ModifyGizmo setObjectAttribute={posSurface,diffusePos}
        ModifyGizmo setObjectAttribute={posSurface,shininess0}
        ModifyGizmo setObjectAttribute={posSurface,specular}
    AppendToGizmo Axes=boxAxes,name=axes0
    ModifyGizmo ModifyObject=axes0,objectType=Axes,property={-1,axisScalingMode,1}
    ModifyGizmo ModifyObject=axes0,objectType=Axes,property={0,ticks,3}
    ModifyGizmo ModifyObject=axes0,objectType=Axes,property={1,ticks,3}
    ModifyGizmo ModifyObject=axes0,objectType=Axes,property={2,ticks,3}
    ModifyGizmo modifyObject=axes0,objectType=Axes,property={-1,Clipped,0}
    AppendToGizmo isoSurface=root:ddd_psiNeg,name=negSurface
    ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={ surfaceColorType,0}
    ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={ lineColorType,0}
    ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={ lineWidthType,0}
    ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={ fillMode,2}
    ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={ lineWidth,1}
    ModifyGizmo ModifyObject=negSurface,objectType=isoSurface,property={ isoValue,0.01}
    ModifyGizmo modifyObject=negSurface,objectType=Surface,property={calcNormals,1}
        ModifyGizmo setObjectAttribute={negSurface,diffuseNeg}
        ModifyGizmo setObjectAttribute={negSurface,shininess0}
        ModifyGizmo setObjectAttribute={negSurface,specular}
    AppendToGizmo freeAxesCue={0,0,0,1},name=freeAxesCue0
    ModifyGizmo modifyObject=freeAxesCue0,objectType=freeAxisCue,property={colorType,0}
    AppendToGizmo light=Directional,name=light0
    ModifyGizmo modifyObject=light0,objectType=light,property={ position,-0.184655,-0.414741,0.891007,0.000000}
    ModifyGizmo modifyObject=light0,objectType=light,property={ direction,-0.184655,-0.414741,0.891007}
    ModifyGizmo modifyObject=light0,objectType=light,property={ specular,1.000000,1.000000,1.000000,1.000000}
    AppendToGizmo attribute diffuse={1,0,0,1,1032},name=diffusePos
    AppendToGizmo attribute diffuse={1.5259e-05,0.244434,1,1,1032},name=diffuseNeg
    AppendToGizmo attribute shininess={42,42},name=shininess0
    AppendToGizmo attribute specular={1,1,1,1,1032},name=specular
    ModifyGizmo setDisplayList=0, object=freeAxesCue0
    ModifyGizmo setDisplayList=1, object=light0
    ModifyGizmo setDisplayList=2, object=posSurface
    ModifyGizmo setDisplayList=3, object=negSurface
    ModifyGizmo autoscaling=1
    ModifyGizmo currentGroupObject=""
    ShowTools
    ModifyGizmo showInfo
    ModifyGizmo infoWindow={551,31,1185,418}
    ModifyGizmo SETQUATERNION={0.000000,-0.000000,0.000000,1.000000}
    ModifyGizmo endRecMacro
    Execute/Q/Z "SetWindow kwTopWin sizeLimit={46,234,inf,inf}" // sizeLimit requires Igor 7 or later
EndMacro
 
Window GizmoPsi2() : GizmoPlot
    PauseUpdate; Silent 1       // building window...
    // Building Gizmo 9 window...
    NewGizmo/W=(213,605,728,1065)
    ModifyGizmo startRecMacro=901
    ModifyGizmo scalingOption=63
    AppendToGizmo isoSurface=root:ddd_psi2,name=psi2Surface
    ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={ surfaceColorType,0}
    ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={ lineColorType,0}
    ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={ lineWidthType,0}
    ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={ fillMode,2}
    ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={ lineWidth,1}
    ModifyGizmo ModifyObject=psi2Surface,objectType=isoSurface,property={ isoValue,0.000225374}
    ModifyGizmo modifyObject=psi2Surface,objectType=Surface,property={calcNormals,1}
        ModifyGizmo setObjectAttribute={psi2Surface,diffuse}
        ModifyGizmo setObjectAttribute={psi2Surface,specular}
        ModifyGizmo setObjectAttribute={psi2Surface,shininess}
    AppendToGizmo freeAxesCue={0,0,0,1},name=freeAxesCue0
    ModifyGizmo modifyObject=freeAxesCue0,objectType=freeAxisCue,property={colorType,0}
    AppendToGizmo light=Directional,name=light0
    ModifyGizmo modifyObject=light0,objectType=light,property={ position,0.294889,0.694714,0.656059,0.000000}
    ModifyGizmo modifyObject=light0,objectType=light,property={ direction,0.294889,0.694714,0.656059}
    ModifyGizmo modifyObject=light0,objectType=light,property={ specular,1.000000,1.000000,1.000000,1.000000}
    AppendToGizmo attribute diffuse={1,0.250019,0.250019,1,1032},name=diffuse
    AppendToGizmo attribute specular={1,1,0,1,1032},name=specular
    AppendToGizmo attribute shininess={30,30},name=shininess
    ModifyGizmo setDisplayList=0, object=freeAxesCue0
    ModifyGizmo setDisplayList=1, object=light0
    ModifyGizmo setDisplayList=2, object=psi2Surface
    ModifyGizmo setDisplayList=3, opName=clearColor0, operation=clearColor, data={1,1,1,1}
    ModifyGizmo autoscaling=1
    ModifyGizmo currentGroupObject=""
    ShowTools
    ModifyGizmo showInfo
    ModifyGizmo infoWindow={782,750,1405,1094}
    ModifyGizmo SETQUATERNION={0.000000,0.000000,0.000000,1.000000}
    ModifyGizmo endRecMacro
    Execute/Q/Z "SetWindow kwTopWin sizeLimit={46,234,inf,inf}" // sizeLimit requires Igor 7 or later
EndMacro
 
Window GizmoPointCloud() : GizmoPlot
    PauseUpdate; Silent 1       // building window...
    // Building Gizmo 9 window...
    NewGizmo/W=(947,721,1512,1219)
    ModifyGizmo startRecMacro=901
    ModifyGizmo scalingOption=63
    AppendToGizmo Scatter=root:pointCloud,name=thePoints
    ModifyGizmo ModifyObject=thePoints,objectType=scatter,property={ scatterColorType,1}
    ModifyGizmo ModifyObject=thePoints,objectType=scatter,property={ markerType,0}
    ModifyGizmo ModifyObject=thePoints,objectType=scatter,property={ sizeType,0}
    ModifyGizmo ModifyObject=thePoints,objectType=scatter,property={ rotationType,0}
    ModifyGizmo ModifyObject=thePoints,objectType=scatter,property={ Shape,2}
    ModifyGizmo ModifyObject=thePoints,objectType=scatter,property={ size,0.05}
    ModifyGizmo ModifyObject=thePoints,objectType=scatter,property={ colorWave,root:colorWave}
    AppendToGizmo freeAxesCue={0,0,0,1},name=freeAxesCue0
    ModifyGizmo modifyObject=freeAxesCue0,objectType=freeAxisCue,property={colorType,0}
    ModifyGizmo setDisplayList=0, object=freeAxesCue0
    ModifyGizmo setDisplayList=1, object=thePoints
    ModifyGizmo autoscaling=1
    ModifyGizmo currentGroupObject=""
    ShowTools
    ModifyGizmo showInfo
    ModifyGizmo infoWindow={804,539,1398,783}
    ModifyGizmo SETQUATERNION={-0.080336,0.084591,0.010790,0.993114}
    ModifyGizmo endRecMacro
    Execute/Q/Z "SetWindow kwTopWin sizeLimit={46,234,inf,inf}" // sizeLimit requires Igor 7 or later
EndMacro
 
Window radialPsiGraph() : Graph
    PauseUpdate; Silent 1       // building window...
    Display /W=(4,523,399,731) radialPsi,zero
    ModifyGraph gFont="Helvetica"
    ModifyGraph lStyle(zero)=1
    ModifyGraph rgb=(0,0,0)
    ModifyGraph mirror=2
    ModifyGraph nticks(left)=0
    ModifyGraph font="Helvetica"
    ModifyGraph fSize=12
    ModifyGraph lblMargin(left)=11
    ModifyGraph lblLatPos(left)=-1
    ModifyGraph btLen=4
    Label left "ψ"
    Label bottom "\\f02r\\f00 (Å)"
EndMacro
 
Window radialPsi2Graph() : Graph
    PauseUpdate; Silent 1       // building window...
    Display /W=(0,771,395,979) radialPsi2
    ModifyGraph gFont="Helvetica"
    ModifyGraph rgb=(0,0,0)
    ModifyGraph mirror=2
    ModifyGraph nticks(left)=0
    ModifyGraph font="Helvetica"
    ModifyGraph fSize=12
    ModifyGraph lblMargin(left)=10
    ModifyGraph btLen=4
    Label left \\S2\\M"
    Label bottom "\\f02r\\f00 (Å)"
EndMacro
 
Window radialProbabilityGraph() : Graph
    PauseUpdate; Silent 1       // building window...
    Display /W=(1,1015,396,1223) radialProbability
    ModifyGraph gFont="Helvetica"
    ModifyGraph rgb=(0,0,0)
    ModifyGraph mirror=2
    ModifyGraph nticks(left)=0
    ModifyGraph font="Helvetica"
    ModifyGraph fSize=14
    ModifyGraph lblMargin(left)=11
    ModifyGraph btLen=4
    Label left "4 π \\f02r\\f00\\S2\\M ψ\\S2\\M"
    Label bottom "\\f02r\\f00 (Å)"
EndMacro
 
Window bohrOrbitalGraph() : Graph
    PauseUpdate; Silent 1       // building window...
    Display /W=(35,520,424,903) circle_y vs circle_x
    AppendToGraph bohrOrbital_y vs bohrOrbital_x
    ModifyGraph gFont="Helvetica",height={Plan,1,left,bottom}
    ModifyGraph lStyle(circle_y)=1
    ModifyGraph rgb=(0,0,0)
    ModifyGraph nticks=0
    ModifyGraph font="Helvetica"
    ModifyGraph axThick=0
EndMacro

 

Point Cloud Representation of 4d x^2–y^2 wave function 4d x^2–y^2 orbital (psi^2) 4d x^2–y^2 wave function (psi) Example of H Atom Orbitals (5.77 MB) H Orbitals Procedure file (20.83 KB)

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More