Appendix 6_2
Private Sub cmdEradL_Click()
'**********
'Compute the energy flux per cycle through a spherical surface surrounding
'an oscillating pair of charges, separated by a distance L that varies
'from .5 lambda to 3 lambda.
'**********
'Physical and mathematical constants
Const c As Double = 299792000# 'Speed of light
Const epsilon0 As Double = 0.00000000000885 'Permittivity constant
Const pi As Double = 3.14159265358979
Const Steps As Long = 100
Const q As Double = 1
Const lambda As Double = 0.1 'wavelength (meters)
Const omega As Double = 2 * pi * c / lambda 'angular frequency
Const freq As Double = omega / (2 * pi) 'frequency
Const tau As Double = 1 / freq 'period
Const deltat As Double = tau / Steps 'time interval between epochs
Const Amp As Double = 0.1 * c / omega 'amplitude (meters)
Const LMin As Double = 0.5 * lambda 'minimum separation
Const Lmax As Double = 3 * lambda 'maximum separation
Const deltaL As Double = (Lmax - LMin) / Steps 'interval between separations
Const dtheta As Double = pi / Steps 'interval between angles over sphere
Const Radius As Double = 2 * (Lmax / 2 + Amp) 'spherical radius
'Variables
Dim theta As Double 'angle between x-axis and point on sphere (in xy-plane)
Dim Py, Px As Double 'coordinates of point on sphere
Dim TimeIndex, ThetaIndex, LIndex As Long 'Loop index
Dim t(Steps) As Double 'Current time
Dim tr As Double 'Retarded time
Dim dt As Double 't - tr
Dim dtmin As Double 'Minimum value for dt
Dim dtmax As Double 'Maximum value for dt
Dim xr1, xr2 As Double 'Retarded positions (on x-axis)
Dim vrx1, vrx2 As Double 'Retarded velocities
Dim arx1, arx2 As Double 'Retarded accelerations
Dim Drx1, Drx2 As Double 'x-components of vectors Dr
Dim Dry1, Dry2 As Double 'y-components of vectors Dr
Dim Dr1, Dr2 As Double 'magnitudes of vectors Dr
Dim ux1, ux2 As Double 'x-components of vectors u
Dim uy1, uy2 As Double 'y-components of vectors u
Dim Ex1, Ex2, Ex As Double 'x-components of electric field vectors
Dim Ey1, Ey2, Ey As Double 'y-components of electric field vectors
Dim Bz1, Bz2, Bz As Double 'z-components of magnetic field vectors
Dim Sx As Double 'x-component of Poynting vector at point on sphere
Dim Sy As Double 'y-component of Poynting vector
Dim unitx, unity, dA As Double 'unit vectors and spherical area increment
Dim EFluxRate(Steps), EFlux(Steps) As Double 'Enery flux at different angles
Dim Snormal As Double 'normal component of Poynting vector
Dim L(Steps) As Double 'separation of q1 and q2
Dim EradL(Steps) As Double 'energy flux per cycle at separation L
Dim RadWork As Double 'Work per cycle to counteract rad react forces
Dim ERadInt(Steps) As Double 'Total work minus RadWork
'Zero out each value of Erad(L)
For LIndex = 0 To Steps - 1
EradL(LIndex) = 0
Next LIndex
'Compute Erad(L) for each separation from the Minimum to the Maximum L.
For LIndex = 0 To Steps - 1
Debug.Print LIndex
'Set the separation for this loop.
L(LIndex) = LMin + LIndex * deltaL
'Zero out the energy fluxes for each epoch, present separation.
For TimeIndex = 0 To Steps - 1
EFlux(TimeIndex) = 0
Next TimeIndex
'Compute the energy flux through the spherical surface, for each time
'interval.
For TimeIndex = 0 To Steps - 1 'time epochs
t(TimeIndex) = TimeIndex * deltat
'Zero out the energy flux rates for each theta interval.
For ThetaIndex = 0 To Steps - 1
EFluxRate(ThetaIndex) = 0
Next ThetaIndex
'Compute the energy flux rate through each theta interval.
For ThetaIndex = 0 To Steps - 1
theta = ThetaIndex * dtheta + dtheta / 2
unitx = Cos(theta)
unity = Sin(theta)
Px = Radius * Cos(theta)
Py = Radius * Sin(theta)
dA = 2 * pi * Py * Radius * dtheta
'First do q1.
dtmin = 0
dtmax = 2 * Radius / c
Do
dt = (dtmax + dtmin) / 2
tr = t(TimeIndex) - dt
xr1 = -L(LIndex) / 2 + Amp * Sin(omega * tr)
Drx1 = Px - xr1
Dry1 = Py
Dr1 = Sqr(Drx1 ^ 2 + Dry1 ^ 2)
If Abs(c * dt - Dr1) < 2 ^ (-30) Then Exit Do
If c * dt - Dr1 > 0 Then
dtmax = dt
Else
dtmin = dt
End If
Loop
vrx1 = omega * Amp * Cos(omega * tr)
arx1 = -(omega ^ 2) * Amp * Sin(omega * tr)
'Then do q2.
dtmin = 0
dtmax = 2 * Radius / c
Do
dt = (dtmax + dtmin) / 2
tr = t(TimeIndex) - dt
xr2 = L(LIndex) / 2 + Amp * Sin(omega * tr)
Drx2 = Px - xr2
Dry2 = Py
Dr2 = Sqr(Drx2 ^ 2 + Dry2 ^ 2)
If Abs(c * dt - Dr2) < 2 ^ (-30) Then Exit Do
If c * dt - Dr2 > 0 Then
dtmax = dt
Else
dtmin = dt
End If
Loop
vrx2 = omega * Amp * Cos(omega * tr)
arx2 = -(omega ^ 2) * Amp * Sin(omega * tr)
'Compute the components of vectors u.
ux1 = c * Drx1 / Dr1 - vrx1
uy1 = c * Dry1 / Dr1
ux2 = c * Drx2 / Dr2 - vrx2
uy2 = c * Dry2 / Dr2
'Compute the electric and magnetic field components
Ex1 = q / (4 * pi * epsilon0) * Dr1 / (Drx1 * ux1 + Dry1 * uy1) ^ 3 * (ux1 * (c ^ 2 - vrx1 ^ 2) + Dry1 * (-uy1 * arx1))
Ey1 = q / (4 * pi * epsilon0) * Dr1 / (Drx1 * ux1 + Dry1 * uy1) ^ 3 * (uy1 * (c ^ 2 - vrx1 ^ 2) - Drx1 * (-uy1 * arx1))
Bz1 = 1 / (c * Dr1) * (Drx1 * Ey1 - Dry1 * Ex1)
Ex2 = q / (4 * pi * epsilon0) * Dr2 / (Drx2 * ux2 + Dry2 * uy2) ^ 3 * (ux2 * (c ^ 2 - vrx2 ^ 2) + Dry2 * (-uy2 * arx2))
Ey2 = q / (4 * pi * epsilon0) * Dr2 / (Drx2 * ux2 + Dry2 * uy2) ^ 3 * (uy2 * (c ^ 2 - vrx2 ^ 2) - Drx2 * (-uy2 * arx2))
Bz2 = 1 / (c * Dr2) * (Drx2 * Ey2 - Dry2 * Ex2)
'Sum the field components for the 2 charges.
Ex = Ex1 + Ex2
Ey = Ey1 + Ey2
Bz = Bz1 + Bz2
'Compute the Poynting vector components, using the net E and B
'field components.
Sx = epsilon0 * c ^ 2 * (Ey * Bz)
Sy = epsilon0 * c ^ 2 * (-Ex * Bz)
'Find the Poynting vector component that is normal to the
'spherical surface.
Snormal = Sx * unitx + Sy * unity
EFluxRate(ThetaIndex) = EFluxRate(ThetaIndex) + Snormal * dA
'Repeat for the next angle theta.
Next ThetaIndex
'Now update the running sum of energy fluxes.
For ThetaIndex = 0 To Steps - 1
EFlux(TimeIndex) = EFlux(TimeIndex) + EFluxRate(ThetaIndex) * deltat
Next ThetaIndex
Next TimeIndex
'Once the energy fluxes for each time interval has been computed, add
'the energy fluxes to Erad for the current separation.
For TimeIndex = 0 To Steps - 1
EradL(LIndex) = EradL(LIndex) + EFlux(TimeIndex)
Next TimeIndex
Next LIndex
'Having computed Erad(L), optionally subtract out the (constant) work expended
'to counteract the radiation reaction force.
RadWork = q ^ 2 * omega ^ 3 * Amp ^ 2 / (3 * epsilon0 * c ^ 3)
For LIndex = 0 To Steps - 1
ERadInt(LIndex) = EradL(LIndex) - RadWork
Next LIndex
'After computing all the energy fluxes over the entire range of L,
'output the values for plotting purposes.
Open "c:\winmcad\ERad.prn" For Output As 1
For LIndex = 0 To Steps - 1
Write #1, L(LIndex) / lambda, EradL(LIndex), ERadInt(LIndex)
Next LIndex
Close 1
MsgBox ("Ready for plotting.")
End Sub