Skip to content

๐ŸŽถ Molecule resonance frequencies

JavaScriptThree.js

Why does water vapor absorb in so many wavelengths? Due to its non-linear shape, it oscillates in many ways! See below how frantically a water molecule may respond to an alternating electric field.

๐ŸŽฏ Resonance frequencies of water
๐Ÿง  Original h2o.py by Paul Francis
๐Ÿ A VPython demo is available as well, see water_molecule.py

Source

Why is carbon dioxide so important to global warming?

The global warming / greenhouse effect is mainly due to particular resonance of the carbon dioxide molecules. In this animation, a carbon dioxide molecule is exposed to an alternating electric field. Discover which frequencies the molecule responds to and if so, how.

๐ŸŽฏ Resonance frequencies of carbon dioxide
๐Ÿง  Original co2.py by Paul Francis
๐Ÿ A VPython demo is available as well, see carbon_dioxide.py

Source

The carbon dioxide and water molecules are modeled as a three-body system consisting of one central and two outer atoms. For carbon dioxide, the equilibrium configuration is linear, with the carbon atom between the two oxygen atoms.

For the bond potential, we use Hookeโ€™s law:

Fโ†’=โˆ’k(rโˆ’r0)r^\overrightarrow{F}=-k\left(r-r_0\right)\hat{\mathbf{r}}

where rr is the current bond length and r0r_0 is the equilibrium bond length.

For the angular interaction, let

vโ†’1=rโ†’outer1โˆ’rโ†’central\overrightarrow{v}_1=\overrightarrow{r}_{outer_1}- \overrightarrow{r}_{central}

and

vโ†’2=rโ†’outer2โˆ’rโ†’central\overrightarrow{v}_2 = \overrightarrow{r}_{outer_2}- \overrightarrow{r}_{central}

Because the equilibrium configuration is linear, the angular displacement is measured as the deviation from a straight line:

ฮธ=arccosโก(vโ†’1โ‹…(โˆ’vโ†’2)โˆฃvโ†’1โˆฃโˆฃvโ†’2โˆฃ)\theta = \arccos \left( \frac{ \overrightarrow{v}_1\cdot(-\overrightarrow{v}_2) }{ |\overrightarrow{v}_1| |\overrightarrow{v}_2| } \right)

Thus, ฮธ=0\theta=0 corresponds to a perfectly linear molecule. A bent molecule has ฮธ>0\theta>0.

The direction of the bending force is determined from the sum of the two bond vectors:

b^=vโ†’1+vโ†’2โˆฃvโ†’1+vโ†’2โˆฃ\hat{\mathbf{b}}=\frac{ \overrightarrow{v}_1+\overrightarrow{v}_2 }{ |\overrightarrow{v}_1+\overrightarrow{v}_2| }

The force applied to each outer atom is

Fโ†’outer=โˆ’ktr0ฮธb^\boxed{ \overrightarrow{F}_{outer} = -k_t r_0\theta \hat{\mathbf{b}} }

while the central atom receives the compensating force

Fโ†’central=โˆ’2Fโ†’outer\boxed{\overrightarrow{F}_{central} =-2\overrightarrow{F}_{outer}}

The angular interaction is therefore a three-body force: the force on each atom depends on the positions of both bonds simultaneously. In the JavaScript implementation, the bending force is consequently applied to both bonds together, for example for carbon dioxide:

co2.bond1.and(co2.bond2).apply(bendForce);

This implementation follows the force formulation used in the original VPython examples. In particular, for CO2 the angular displacement is defined as the deviation from linearity rather than as the difference from an equilibrium angle of ฯ€\pi.

Finally, the interaction with the external electric field is modeled using the electric force

Fโ†’=qEโ†’\boxed{\overrightarrow{F} = q\overrightarrow{E}}

where qq is the charge of the atom and Eโ†’\overrightarrow{E} is the local electric field.

At each simulation step, the Coulomb, bond-stretching, and angular forces are first accumulated on all three atoms. Only after all forces have been applied are the atoms integrated forward in time.