The applet below is a very simple toy model that might be useful for exploring some aspects of the “Light Mill” or
“Crookes
Radiometer”, which was once thought to rotate due to radiation pressure. It’s now known that thermal effects associated
with residual gas drive the rotation, but the details remain somewhat contentious, as discussed in
this thread on the *n*-Category Café.
Some results obtained with this applet are collected on this companion page.

This applet performs a very simple, two-dimensional particle-based simulation; it certainly does *not* come remotely close to capturing the
actual physics of the real device. The units of distance are such that the outer radius of the container is 1; the units of time and mass are
arbitrary.

The **particles** have no internal degrees of freedom, and undergo instantaneous elastic collisions when they
come into contact with each other; the user can specify their number, mass, radius, and initial velocity. (No attempt is made to pre-distribute
the particle velocities thermally; they simply start out randomly oriented, with equal speeds; a small adjustment is made to eliminate any
total angular momentum that arises by chance.) The user can also select either random initial conditions that will be *different for each run*,
or one of several sets of random but *repeatable* conditions. Particles are shown as red when their velocity exceeds the RMS velocity, and
blue when their velocity is less than the RMS. The **grey lines** indicate the average velocity for particles within a grid of square regions
that turns with the rotor; the average is over particles within each region, and also over time, so it converges on a long-term average. (Each vector
points *away from* the small black point at one end of the line. Note that the lengths are dynamically re-scaled so that the longest vector
in the diagram at any moment is drawn with a fixed size.)

The **container walls** are treated as infinitely massive and thermally inert; the particles simply bounce off them elastically.

By default, the **rotor** turns on its bearings without friction (but see the note on an optional friction effect, below).
The user can choose the rotor’s inner and outer radii as a percentage of the container size, and specify its density.
The user also chooses an initial
*thermal energy density* to deposit in the rotor vanes; this is split equally between the black and white parts, but then
a constant, user-specified *energy flux density* adds to the thermal energy of the black sides, and reduces the thermal energy of the white sides.
(This fixed flux is meant as a very simple surrogate for the fact that the black side will grow warmer than the white side in the presence
of radiation. The applet itself does not model any radiation effects.
To avoid absurd side-effects, the flux is not allowed to lower the thermal energy of the white side to less than half its
initial value.)

When **a particle collides with a rotor vane**, the event is initially modelled as if the particle has struck a second free particle of equal mass
which is
moving normally to the vane, at a velocity consistent with the vane’s thermal energy (specifically, the *v* such that (1/2)*M*_{side}*v*^{2} = *E*_{side},
where *M*_{side} is just half the total rotor mass, and *E*_{side} is the thermal energy of the side that has been struck).
The incoming free particle is deflected on that basis, and
then a balancing change is made to the rotor’s angular velocity and thermal energy, so that total energy and total angular momentum are conserved.
This is a crude way of dealing with the interaction, but it allows the free particles to exchange kinetic energy with the vane’s thermal energy.

The **four histograms at the bottom** of the applet record, cumulatively, (1) the number of collisions; (2) the linear momentum transferred by particles to the rotor;
(3) the difference in transferred momentum between the black and white sides; and (4) the angular momentum transferred to the rotor, from the inner radius to the outer radius.
The white bars should be construed as having the opposite sign to the black, and the quantity “diff” shown above each histogram is the sum of the black bars minus the sum of the white bars.
The **histogram at the side** of the applet records the average
tangential velocity component of the particles, versus radial distance; as with the other histograms (and the average velocity field) it is based on
data that accumulates over time. All of these histograms are dynamically re-scaled so that the highest peak at any time is a fixed size.

Optionally, a very simple model of **kinetic friction** can be applied to the rotor’s bearing. If a non-zero “rotor friction parameter” *f*_{r} is
selected, then between particle collisions the rotor undergoes angular deceleration *f*_{r} in the direction opposite to its motion (never going past zero, of course),
and the lost kinetic energy is split equally between the thermal energies of the two sides of the vane. This model conserves total energy, but it will not conserve total
angular momentum. A choice of **infinite** rotor friction prevents the rotor from moving
at all; as with finite values, all the energy that would have gone into movement of the rotor is converted into heat.

Also, independently, a **particle/container friction parameter** *f*_{c} can be selected; this reduces the tangential component of the velocities
of particles that strike the circular walls, multiplying them by a factor of (1–*f*_{c}), but makes a compensatory boost to their radial velocity to ensure
conservation of energy. Of course real friction would heat up the container walls, but this crude model makes it possible to remove some angular momentum from circulating
particles without the need to add the extra complication of thermal properties for the walls. A choice of “infinite” friction here just corresponds to *f*_{c}=1,
i.e. it completely eliminates the tangential velocity component of any particle that strikes the walls.

Note that **changing any of the parameters** will cause the simulation to
restart from scratch, *with the exception of the energy flux*, which can be adjusted mid-simulation.