Annus Mirabilis · Interactive critical edition in preparation

Gas ionization bounds and counting model

Ionize a gas with ultraviolet light one quantum at a time.

Gas ionization by light

Gas ionization bounds and counting model

Static worked example

Model note
  • Incident radiant power (incidentPower), Frequency (frequency), Ionization energy per molecule (ionizationEnergyPerMolecule), Share of the light absorbed (absorptionEfficiency) and Exposure time (duration): Host calculation, by the site's own reference code. Computed in lq09.acceptedInputs.
  • Absorbed light energy (absorbedLightEnergy), Incident quantum rate (quantumRate), Absorbed quantum rate (absorbedQuantumRate), Ionization event rate (ionizationRate), Molecules ionized during the exposure (ionizationCount) and Ionized gram-molecules (ionizedGramMolecules): Host calculation, by the site's own reference code. Computed in photoelectric.ionizationCount.
  • Quantum energy (quantumEnergy), Energy of one quantum, hν (quantumEnergyEv), Threshold frequency (thresholdFrequency), Threshold wavelength, below which one quantum can ionize (thresholdWavelengthNm), Energy left over, hν − J (negative when short) (excessEnergyEv) and Whether one quantum can ionize a molecule (singleQuantumAllowed): Host calculation, by the site's own reference code. Computed in photoelectric.ionizationBounds.
  • Computed from the settings last applied (settings revision 1, result 1).
  • Not modeled: Secondary ionization and cascade ionization by energetic photoelectrons in dense gases; Multi-photon ionization processes occurring at extreme optical field intensities; Molecular dissociation channels competing with direct ionization without charge separation; Collisional de-excitation and recombination kinetics over extended reaction times; Spatial beam divergence, gas column pressure gradients, and non-uniform absorption profiles; Detailed autoionization resonances and vibrational-electronic coupling manifolds.

Predict before the numbers

A quantum's energy hν is below the energy J needed to ionize one molecule. How many molecules does the light ionize, one quantum at a time?

Three relations the model could have

Predict before the numbers

Under the paper's assumption that all absorbed light ionizes, what happens to the number of ionized molecules if you double the radiant power?

Three relations the model could have

The result appears when you choose, say you have one in mind, or skip.

2901.59 THz: one quantum carries 12.00 eV

1.00 μW

Try
Experiment settings ionization energy, absorption, exposure, what absorbed light does

10.00 eV

Worked example: a quantum of 2901.6 THz light carries 12 eV, 2 eV more than the 10 eV ionization energy, so molecules are ionized at 2.6 × 10¹¹ per second.

Can one quantum ionize a molecule?

hν = 12.00 eV; ionization energy per molecule 10.00 eV ; threshold ν₀ = 2418.0 THz, λ₀ = 124.0 nm

0 eV10.0 eVhν = 12.00 eV2.00 eV to sparehν ≥ J: one quantum can ionize

Quanta in, molecules ionized, each second

Einstein’s hypothesis: every absorbed quantum ionizes one molecule.

Arriving5.20 × 1011​/sAbsorbed2.60 × 1011​/sIonizing2.60 × 1011​/sevents each second

Values at these settings

QuantityValue
Frequency ν2901.59 THz
Ionization energy per molecule, J10.00 eV
Energy of one quantum, hν12 eV
Energy left over, hν − J2 eV
Light energy absorbed, L5.000 × 10−7 J
Quanta absorbed each second2.601 × 1011
Molecules ionized each second2.601 × 1011
Gram-molecules ionized, j4.318 × 10−13 mol

Einstein’s 1905 checks in §9

Lenard, 1900: the longest wavelength that ionizes air. About 190 nm, so Rβν = ca. 6,4 · 1012 Erg per gram-equivalent, as printed. That is 6.65 volts per unit charge, a figure derived here, not printed. With modern constants, 190 nm is 6.53 eV per molecule.

Stark, 1902: the smallest measured ionization voltage for air, at platinum anodes, ca. 10 Volt, so λ₀ ≈ 126 nm; J = 9.6 × 1012 erg per gram-equivalent.

What this model leaves out

  • Secondary ionization and cascade ionization by energetic photoelectrons in dense gases
  • Multi-photon ionization processes occurring at extreme optical field intensities
  • Molecular dissociation channels competing with direct ionization without charge separation
  • Collisional de-excitation and recombination kinetics over extended reaction times
  • Spatial beam divergence, gas column pressure gradients, and non-uniform absorption profiles
  • Detailed autoionization resonances and vibrational-electronic coupling manifolds
The rule this laboratory evaluates

From src/physics/reference/photoelectric.ts, the audited TypeScript reference evaluator.

// Paper 1, §9: one quantum, one ionization.
// Threshold frequency: nu_0 = J / h
// If nu < nu_0: no single-quantum ionization; the count is not applicable.
// If nu >= nu_0:
//   every absorbed quantum ionizes:  j = L / (R*beta*nu), or N_ion = L / (h*nu)
//   a declared share a ionizes:      N_ion = a * L / (h*nu)
//   the share is unknown:            underdetermined, at most N_abs = L / (h*nu)

If ultraviolet light ionizes a gas one quantum at a time, each quantum must carry at least the work needed to ionize one molecule, and the number of molecules ionized should equal the number of quanta absorbed. Einstein proposed the second statement as a test worth making.

§9 assumes that in the ionization of a gas by ultraviolet light each absorbed light quantum ionizes one gas molecule. Two consequences follow. First, the ionization work per gram-equivalent, J, cannot exceed the energy of the absorbed quanta: Rβν ≥ J, or per molecule hν ≥ J. Second, absorbed light energy L ionizes j = L/(Rβν) gram-molecules, for any gas that shows no appreciable absorption without ionization at that frequency. The instrument works both at its defaults: J = 10 eV per molecule, light of 2901.59 THz whose quanta carry 12.0 eV, 2.0 eV more than needed, so the threshold is 2418 THz, a wavelength of 124 nm. With 1 μW of light, half of it absorbed, for 1 s, L = 5 × 10−7 J, and 2.60 × 1011 quanta are absorbed; if each ionizes one molecule, 2.60 × 1011 molecules are ionized, 4.32 × 10−13 gram-molecules. If only a declared share ionizes, the count is that share of the quanta, 7.80 × 1010 for a share of 0.3. If the share is unknown, the lab reports the count as not fixed, with the absorbed quanta as its upper limit, and never more ions than quanta. Below the threshold, at 2000 THz (8.27 eV), no single quantum can ionize, and the count is not applicable rather than zero. A named gas must come with a cited source for its ionization energy.

Modern qualifications

Einstein compared the first consequence with two measurements. Lenard's largest wavelength effective in ionizing air, about 1.9 × 10−5 cm, gives Rβν = 6.4 × 1012 erg per gram-equivalent, about 6.5 eV per molecule, as an upper limit for J; Stark's smallest ionization voltage for air, about 10 volts at platinum anodes, gives the upper limit 9.6 × 1012, which Einstein called nearly equal, while noting in a footnote that inside the gas the ionization voltage for negative ions is five times larger. The count j = L/(Rβν) was offered as the test he thought most important, not as a result. Modern first ionization energies of oxygen and nitrogen molecules, about 12.1 and 15.6 eV, exceed both limits, so what Lenard and Stark measured cannot have been the single-quantum ionization of those molecules that §9 assumed. The lab's default of 10 eV follows Stark's figure.

Show the code

The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.

ionizationCount · src/physics/reference/photoelectric.ts · this site’s source, as built · sha256:b9faf7cd99d516b3082ef66c3793b0bc08fdc6c5c1b8fe35cd73b2da43f238cb

This function computes the listed outputs when it runs.

In words

The evaluator behind this laboratory. It checks the frequency against the ionization energy, resolves the incident and absorbed powers through the absorption efficiency, multiplies the absorbed power by the duration to get the absorbed energy, divides that by h nu for the number of absorbed quanta, and then lets the absorption mode decide what may be said about ionization. Every number it returns carries its own status, so the quanta can be a value on a page where the ionization count is a refusal.

Implementation

/**
 * Ionization count and rate evaluator (Paper 1, §9, LQ-09).
 * Computes absorbed light energy L = P_abs * t, absorbed quanta rate dot_N_abs = P_abs / (h*nu),
 * and ionization counts/rates under the three epistemic absorption modes:
 * - "all-absorbed-ionizes": j = L / (R*beta*nu) or N_ion = L / (h*nu)
 * - "declared-fraction": N_ion = a * L / (h*nu)
 * - "unknown": underdetermined with N_abs as an upper bound.
 * Below threshold (h*nu < J_mol), ionization count and rate are strictly not-applicable.
 */
export function ionizationCount(input: IonizationCountInput): IonizationCountResult {
  const {
    nu,
    ionizationEnergyJoules,
    ionizationEnergyEv,
    absorbedPowerWatts: rawAbsPower,
    incidentPowerWatts: rawIncPower,
    absorptionEfficiency: rawEta,
    durationSeconds = 1.0,
    absorptionMode = "all-absorbed-ionizes",
    declaredFraction = 1.0,
    gasCitation,
    set,
  } = input;

  const bounds = ionizationBounds({
    nu,
    ionizationEnergyJoules,
    ionizationEnergyEv,
    gasCitation,
    set,
  });

  if (bounds.status === "outside-domain") {
    const refusal = outsideDomain(
      bounds.refusalCode ?? "outside-domain",
      "model",
      bounds.verdictReason,
    );
    return Object.freeze({
      status: "outside-domain",
      bounds,
      incidentPowerWatts: rawIncPower ?? 0,
      absorbedPowerWatts: rawAbsPower ?? 0,
      durationSeconds,
      absorbedLightEnergyJoules: 0,
      incidentQuantumRatePerSecond: refusal,
      absorbedQuantumRatePerSecond: refusal,
      absorbedQuantaCount: refusal,
      ionizationRatePerSecond: refusal,
      ionizationCountMolecules: refusal,
      ionizedGramMolecules: refusal,
      ionsPerAbsorbedQuantumUpperBound: 1.0,
      absorptionConditionLabel: "outside-domain",
      reason: bounds.verdictReason,
    });
  }

  // Resolve powers
  let pOpt = 0;
  let pAbs = 0;
  const eta = rawEta !== undefined ? rawEta : 1.0;

  if (rawAbsPower !== undefined) {
    pAbs = rawAbsPower;
    pOpt = rawIncPower !== undefined ? rawIncPower : eta > 0 ? pAbs / eta : pAbs;
  } else if (rawIncPower !== undefined) {
    pOpt = rawIncPower;
    pAbs = eta * pOpt;
  }

  if (pOpt < 0 || pAbs < 0 || !Number.isFinite(pOpt) || !Number.isFinite(pAbs)) {
    const refusal = outsideDomain(
      "negative-power",
      "physical",
      "Power values must be non-negative finite numbers.",
    );
    return Object.freeze({
      status: "outside-domain",
      bounds,
      incidentPowerWatts: pOpt,
      absorbedPowerWatts: pAbs,
      durationSeconds,
      absorbedLightEnergyJoules: 0,
      incidentQuantumRatePerSecond: refusal,
      absorbedQuantumRatePerSecond: refusal,
      absorbedQuantaCount: refusal,
      ionizationRatePerSecond: refusal,
      ionizationCountMolecules: refusal,
      ionizedGramMolecules: refusal,
      ionsPerAbsorbedQuantumUpperBound: 1.0,
      absorptionConditionLabel: "outside-domain",
      reason: "Power values must be non-negative finite numbers.",
    });
  }

  if (eta < 0 || eta > 1 || !Number.isFinite(eta)) {
    const refusal = outsideDomain(
      "invalid-absorption-efficiency",
      "model",
      "Absorption efficiency must lie in [0, 1].",
    );
    return Object.freeze({
      status: "outside-domain",
      bounds,
      incidentPowerWatts: pOpt,
      absorbedPowerWatts: pAbs,
      durationSeconds,
      absorbedLightEnergyJoules: 0,
      incidentQuantumRatePerSecond: refusal,
      absorbedQuantumRatePerSecond: refusal,
      absorbedQuantaCount: refusal,
      ionizationRatePerSecond: refusal,
      ionizationCountMolecules: refusal,
      ionizedGramMolecules: refusal,
      ionsPerAbsorbedQuantumUpperBound: 1.0,
      absorptionConditionLabel: "outside-domain",
      reason: "Absorption efficiency must lie in [0, 1].",
    });
  }

  if (durationSeconds < 0 || !Number.isFinite(durationSeconds)) {
    const refusal = outsideDomain(
      "negative-duration",
      "physical",
      "Duration must be non-negative.",
    );
    return Object.freeze({
      status: "outside-domain",
      bounds,
      incidentPowerWatts: pOpt,
      absorbedPowerWatts: pAbs,
      durationSeconds,
      absorbedLightEnergyJoules: 0,
      incidentQuantumRatePerSecond: refusal,
      absorbedQuantumRatePerSecond: refusal,
      absorbedQuantaCount: refusal,
      ionizationRatePerSecond: refusal,
      ionizationCountMolecules: refusal,
      ionizedGramMolecules: refusal,
      ionsPerAbsorbedQuantumUpperBound: 1.0,
      absorptionConditionLabel: "outside-domain",
      reason: "Duration must be non-negative.",
    });
  }

  const h = getPlanckConstant(set);
  const na = getAvogadroConstant(set);
  const eqJ = h * nu;

  const incQRate = eqJ > 0 ? pOpt / eqJ : 0;
  const absQRate = eqJ > 0 ? pAbs / eqJ : 0;
  const lAbs = pAbs * durationSeconds;
  const absQCount = eqJ > 0 ? lAbs / eqJ : 0;

  const incQRateRes = ok(incQRate, "s^-1");
  const absQRateRes = ok(absQRate, "s^-1");
  const absQCountRes = ok(absQCount);

  // Sub-threshold check
  if (!bounds.singleQuantumAllowed) {
    const notApp = notApplicable("no single-quantum ionization under this hypothesis");
    return Object.freeze({
      status: "not-applicable",
      bounds,
      incidentPowerWatts: pOpt,
      absorbedPowerWatts: pAbs,
      durationSeconds,
      absorbedLightEnergyJoules: lAbs,
      incidentQuantumRatePerSecond: incQRateRes,
      absorbedQuantumRatePerSecond: absQRateRes,
      absorbedQuantaCount: absQCountRes,
      ionizationRatePerSecond: notApp,
      ionizationCountMolecules: notApp,
      ionizedGramMolecules: notApp,
      ionsPerAbsorbedQuantumUpperBound: 1.0,
      absorptionConditionLabel: "below-threshold",
      reason: "Incident photon energy h*nu is below the ionization threshold J_mol.",
    });
  }

  // Supra-threshold regimes
  if (absorptionMode === "unknown") {
    const underdet = underdetermined("sub-quantum-efficiency", [
      "ionization-efficiency-fraction",
      "non-ionizing-absorption-channels",
    ]);
    return Object.freeze({
      status: "underdetermined",
      bounds,
      incidentPowerWatts: pOpt,
      absorbedPowerWatts: pAbs,
      durationSeconds,
      absorbedLightEnergyJoules: lAbs,
      incidentQuantumRatePerSecond: incQRateRes,
      absorbedQuantumRatePerSecond: absQRateRes,
      absorbedQuantaCount: absQCountRes,
      ionizationRatePerSecond: underdet,
      ionizationCountMolecules: underdet,
      ionizedGramMolecules: underdet,
      ionsPerAbsorbedQuantumUpperBound: 1.0,
      absorptionConditionLabel: "unknown-absorption",
      reason: `Unknown fraction of absorbed energy goes to non-ionizing channels; count is bounded above by absorbed quanta N_abs = ${absQCount.toExponential(4)}.`,
    });
  }

  if (absorptionMode === "declared-fraction") {
    if (declaredFraction < 0 || declaredFraction > 1 || !Number.isFinite(declaredFraction)) {
      const refusal = outsideDomain(
        "invalid-fraction",
        "model",
        "Declared ionization fraction must lie in [0, 1].",
      );
      return Object.freeze({
        status: "outside-domain",
        bounds,
        incidentPowerWatts: pOpt,
        absorbedPowerWatts: pAbs,
        durationSeconds,
        absorbedLightEnergyJoules: lAbs,
        incidentQuantumRatePerSecond: incQRateRes,
        absorbedQuantumRatePerSecond: absQRateRes,
        absorbedQuantaCount: absQCountRes,
        ionizationRatePerSecond: refusal,
        ionizationCountMolecules: refusal,
        ionizedGramMolecules: refusal,
        ionsPerAbsorbedQuantumUpperBound: 1.0,
        absorptionConditionLabel: "outside-domain",
        reason: "Declared ionization fraction must lie in [0, 1].",
      });
    }

    const ionRate = declaredFraction * absQRate;
    const ionCount = declaredFraction * absQCount;
    const jMol = na > 0 ? ionCount / na : 0;

    return Object.freeze({
      status: "value",
      bounds,
      incidentPowerWatts: pOpt,
      absorbedPowerWatts: pAbs,
      durationSeconds,
      absorbedLightEnergyJoules: lAbs,
      incidentQuantumRatePerSecond: incQRateRes,
      absorbedQuantumRatePerSecond: absQRateRes,
      absorbedQuantaCount: absQCountRes,
      ionizationRatePerSecond: ok(ionRate, "s^-1"),
      ionizationCountMolecules: ok(ionCount),
      ionizedGramMolecules: ok(jMol, "mol"),
      ionsPerAbsorbedQuantumUpperBound: 1.0,
      absorptionConditionLabel: "declared-fraction",
      reason: `Declared fraction a = ${declaredFraction.toFixed(4)} of absorbed light quanta produce ionization.`,
    });
  }

  // Primary paper hypothesis: all absorbed light ionizes
  const ionRate = absQRate;
  const ionCount = absQCount;
  const jMol = na > 0 ? ionCount / na : 0;

  return Object.freeze({
    status: "value",
    bounds,
    incidentPowerWatts: pOpt,
    absorbedPowerWatts: pAbs,
    durationSeconds,
    absorbedLightEnergyJoules: lAbs,
    incidentQuantumRatePerSecond: incQRateRes,
    absorbedQuantumRatePerSecond: absQRateRes,
    absorbedQuantaCount: absQCountRes,
    ionizationRatePerSecond: ok(ionRate, "s^-1"),
    ionizationCountMolecules: ok(ionCount),
    ionizedGramMolecules: ok(jMol, "mol"),
    ionsPerAbsorbedQuantumUpperBound: 1.0,
    absorptionConditionLabel: "all-absorbed-ionizes",
    reason:
      "Under Einstein's §9 hypothesis that every absorbed light quantum ionizes one molecule: j = L / (R*beta*nu).",
  });
}

The explanation

Full explanation

Each quantum must carry at least the work needed to ionize one molecule, which sets a frequency threshold, and the number of molecules ionized should equal the number of quanta absorbed. Einstein proposed that count as a test worth making.

Show every step of the investigation

Choose a gas with a cited ionization energy, set the frequency and the absorbed energy, and read whether the quanta clear the threshold and how many molecules they could ionize. A gas without a citation is refused rather than given a number.

An explanatory model, not an observation of nature. This embed starts from the laboratory’s worked defaults, not a saved run. Presentation options change the surrounding guide, never the numerical inputs.