29 Unit 5: Paths of Severe Storms 5E
Why do storms follow the paths they do, and could those paths shift?
Earth & Space Science
HS-ESS2-8 Time: 6–11 Days 🧠 Quiz & Assessment ↓
30 Engage: The Investigative Phenomenon
30.1 🌍 Storm Tracks: 2018–2020
Maps from 2018–2020 show that blizzards and hurricanes exhibit clear patterns in where they start and the direction they travel.
30.1.1 🤔 Key Observations:
- 🌀 Hurricanes form over warm tropical oceans and move westward, then curve northeast
- 🌨️ Blizzards track along the East Coast, moving from southwest to northeast
- 🗺️ Neither storm type occurs randomly — they follow predictable pathways
Driving Question: Why do severe storms follow specific paths, and what could cause those paths to change?
30.1.2 📝 Pattern Spotting
Look at the storm track maps below. Before we explain the science, write down:
- What geographic patterns do you notice in storm tracks?
- What direction do most storms move in the mid-latitudes?
- Why do you think hurricanes start near the equator but blizzards start in the mid-latitudes?
31 Explore: Mapping Storm Trajectories
31.1 🔬 Investigation: Where Do Storms Go?
Let’s visualize real storm trajectory patterns and look for the underlying cause of these paths.
Code
function buildQuiz(id, questions) {
const outer = html`<div style="font-family:'Inter',sans-serif; max-width:720px; margin:18px auto;"></div>`;
const toggle = html`<button style="display:inline-flex;align-items:center;gap:8px;padding:10px 22px;border:2px solid #c7d2fe;border-radius:30px;background:linear-gradient(135deg,#eef2ff 0%,#e8f4fd 100%);color:#4338ca;font-weight:700;font-size:0.95em;cursor:pointer;transition:all 0.25s ease;box-shadow:0 2px 8px rgba(67,56,202,0.12);"><span style="font-size:1.15em;">✅</span><span>Check Your Understanding</span><span class="quiz-chevron" style="display:inline-block;transition:transform 0.3s ease;font-size:0.8em;">▶</span></button>`;
const body = html`<div style="display:none; margin-top:12px; border:1.5px solid #c7d2fe; border-radius:14px; overflow:hidden; background:white;"></div>`;
const closeBtn = html`<div style="padding:12px 18px; background:#eef2ff; cursor:pointer; display:flex; justify-content:space-between; align-items:center;"><span style="font-weight:600; color:#4338ca;">🧠 Knowledge Check</span><span style="color:#6366f1; font-size:0.85em;">▲ Hide</span></div>`;
let isOpen = false;
toggle.onclick = () => {
isOpen = !isOpen;
body.style.display = isOpen ? "block" : "none";
toggle.querySelector(".quiz-chevron").style.transform = isOpen ? "rotate(90deg)" : "";
};
closeBtn.onclick = () => { isOpen = false; body.style.display = "none"; toggle.querySelector(".quiz-chevron").style.transform = ""; };
body.appendChild(closeBtn);
questions.forEach((q, qi) => {
const card = html`<div id="${id}-q${qi}" style="padding:18px 22px; border-top:1px solid #e0e7ff;"></div>`;
card.appendChild(html`<div style="font-weight:700; color:#1e1b4b; margin-bottom:12px; line-height:1.5;">${qi+1}. ${q.q}</div>`);
const optWrap = html`<div style="display:flex; flex-direction:column; gap:8px;"></div>`;
const feedback = html`<div style="margin-top:12px; padding:12px; border-radius:10px; display:none;"></div>`;
q.options.forEach((opt, oi) => {
const btn = html`<button style="text-align:left; padding:10px 16px; border-radius:10px; border:2px solid #e0e7ff; background:#f5f7ff; cursor:pointer; font-size:0.95em; color:#1e1b4b; transition:all 0.2s;">${opt}</button>`;
btn.onmouseenter = () => { if(!btn.disabled) btn.style.background = "#e0e7ff"; };
btn.onmouseleave = () => { if(!btn.disabled && !btn.chosen) btn.style.background = "#f5f7ff"; };
btn.onclick = () => {
card.querySelectorAll("button").forEach(b => { b.disabled = true; b.chosen = false; });
btn.chosen = true;
const correct = oi === q.correct;
btn.style.background = correct ? "#dcfce7" : "#fee2e2";
btn.style.borderColor = correct ? "#22c55e" : "#ef4444";
if (!correct) {
card.querySelectorAll("button")[q.correct].style.background = "#dcfce7";
card.querySelectorAll("button")[q.correct].style.borderColor = "#22c55e";
}
feedback.style.display = "block";
feedback.style.background = correct ? "#f0fdf4" : "#fff1f2";
feedback.style.borderLeft = `4px solid ${correct ? "#22c55e" : "#ef4444"}`;
feedback.innerHTML = `${q.emoji || (correct ? "✅" : "❌")} <strong>${correct ? "Correct!" : "Not quite."}</strong> ${q.explanation}`;
};
optWrap.appendChild(btn);
});
card.appendChild(optWrap);
card.appendChild(feedback);
body.appendChild(card);
});
outer.appendChild(toggle);
outer.appendChild(body);
return outer;
}Code
function buildUnitQuiz(id, title, questions) {
const outer = html`<div id="${id}" style="font-family:'Inter',sans-serif; max-width:720px; margin:18px auto;"></div>`;
const header = html`<div style="background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;border-radius:14px 14px 0 0;padding:18px 24px;">
<div style="font-size:1.1em;font-weight:700;display:flex;align-items:center;gap:8px;"><span style="font-size:1.2em;">📝</span> ${title}</div>
<div style="font-size:0.85em;opacity:0.85;margin-top:4px;">Select an answer for each question.</div>
</div>`;
const body = html`<div style="border:1.5px solid #c7d2fe;border-top:none;border-radius:0 0 14px 14px;overflow:hidden;background:#f8f9ff;padding:16px;"></div>`;
questions.forEach((qq, qi) => {
const card = document.createElement("div");
card.style.cssText = "background:#fff;border-radius:12px;padding:16px 20px;margin-bottom:14px;box-shadow:0 2px 8px rgba(0,0,0,.08);";
card.innerHTML = `<p style="font-weight:700;margin:0 0 10px;color:#1e1b4b;">${qi+1}. ${qq.q}</p>`;
qq.options.forEach((opt, oi) => {
const btn = document.createElement("button");
btn.textContent = opt;
btn.style.cssText = "display:block;width:100%;text-align:left;padding:10px 14px;margin:6px 0;border:2px solid #e2e8f0;border-radius:8px;background:#fff;color:#1e1b4b;cursor:pointer;font-size:.95em;transition:border-color .2s,background .2s;";
btn.onmouseover = () => { if(!card.dataset.answered){ btn.style.borderColor="#667eea";btn.style.background="#f0f0ff"; }};
btn.onmouseout = () => { if(!card.dataset.answered){ btn.style.borderColor="#e2e8f0";btn.style.background="#fff"; }};
btn.onclick = () => {
if(card.dataset.answered) return;
card.dataset.answered = "true";
card.querySelectorAll("button").forEach(b => {
b.style.cursor="default"; b.onmouseover=null; b.onmouseout=null;
b.style.borderColor="#e2e8f0"; b.style.background="#f8fafc"; b.style.color="#475569";
});
const fb = card.querySelector(".uq-fb");
if(oi === qq.correct){
btn.style.borderColor="#48bb78";btn.style.background="#f0fff4";btn.style.color="#276749";btn.style.fontWeight="700";
fb.innerHTML = "✅ Correct! " + qq.explanation;
fb.style.color="#276749";fb.style.background="#f0fff4";
} else {
btn.style.borderColor="#fc8181";btn.style.background="#fff5f5";btn.style.color="#9b2c2c";btn.style.fontWeight="700";
const correctBtn = card.querySelectorAll("button")[qq.correct];
correctBtn.style.borderColor="#48bb78";correctBtn.style.background="#f0fff4";correctBtn.style.color="#276749";correctBtn.style.fontWeight="700";
fb.innerHTML = "❌ " + qq.explanation;
fb.style.color="#9b2c2c";fb.style.background="#fff5f5";
}
fb.style.display="block";fb.style.padding="10px 12px";fb.style.borderRadius="8px";fb.style.marginTop="8px";fb.style.fontSize="0.9em";fb.style.lineHeight="1.5";
};
card.appendChild(btn);
});
const fb = document.createElement("div");
fb.className = "uq-fb";
fb.style.display = "none";
card.appendChild(fb);
body.appendChild(card);
});
outer.appendChild(header);
outer.appendChild(body);
return outer;
}Code
Code
{
const topojson = await require("topojson-client@3");
const world = await fetch("https://cdn.jsdelivr.net/npm/world-atlas@2/land-50m.json").then(r => r.json());
const land = topojson.feature(world, world.objects.land);
// Hurricane tracks [lon, lat] — classic Atlantic recurvature patterns
const hurricaneTracksData = [
[[-45,13],[-52,16],[-58,19],[-64,22],[-69,26],[-72,30],[-72,35],[-70,39],[-65,43]],
[[-84,23],[-81,26],[-78,29],[-74,32],[-71,36],[-69,41],[-65,46]],
[[-75,16],[-79,20],[-80,24],[-77,28],[-74,33],[-70,38],[-66,43]]
];
// Nor'easter tracks [lon, lat] — forming in Gulf/SE states, tracking up the East Coast
const blizzardTracksData = [
[[-89,30],[-85,33],[-80,36],[-76,39],[-73,41],[-70,44],[-67,48],[-62,52]],
[[-91,32],[-87,35],[-83,38],[-78,40],[-75,42],[-72,45],[-68,50]],
[[-87,31],[-83,34],[-79,37],[-75,39],[-72,42],[-69,46],[-65,51]]
];
const nycDot = [{lon: -74, lat: 40.7}];
const marks = [
Plot.geo({type:"Sphere"}, {fill:"#1b263b"}),
Plot.geo(land, {fill:"#2d5016", stroke:"#4caf50", strokeWidth:0.5}),
Plot.dot(nycDot, {x:"lon", y:"lat", r:5, fill:"#f44336", stroke:"white", strokeWidth:1.5}),
Plot.text(nycDot, {x:"lon", y:"lat", text:["NYC"], fill:"#f44336", fontWeight:"bold", fontSize:11, dx:8})
];
if (stormTypeMap === "Atlantic Hurricanes" || stormTypeMap === "Both") {
const colors = ["#e74c3c","#c0392b","#e67e22"];
hurricaneTracksData.forEach((pts, i) => {
marks.push(Plot.line(pts, {x:d=>d[0], y:d=>d[1], stroke:colors[i], strokeWidth:2.5, curve:"catmull-rom", strokeDasharray:"8,3"}));
marks.push(Plot.dot([pts[0]], {x:d=>d[0], y:d=>d[1], r:5, fill:colors[i]}));
marks.push(Plot.text([pts[pts.length-1]], {x:d=>d[0], y:d=>d[1], text:["🌀"], fontSize:16}));
});
}
if (stormTypeMap === "Northeast Blizzards" || stormTypeMap === "Both") {
const bcolors = ["#3498db","#2980b9","#1abc9c"];
blizzardTracksData.forEach((pts, i) => {
marks.push(Plot.line(pts, {x:d=>d[0], y:d=>d[1], stroke:bcolors[i], strokeWidth:2.5, curve:"catmull-rom"}));
marks.push(Plot.dot([pts[0]], {x:d=>d[0], y:d=>d[1], r:5, fill:bcolors[i]}));
marks.push(Plot.text([pts[pts.length-1]], {x:d=>d[0], y:d=>d[1], text:["🌨️"], fontSize:16}));
});
}
return Plot.plot({
title: "Storm Track Patterns — Atlantic Hurricanes & Northeast Blizzards",
subtitle: "Both storm types curve SW → NE across the mid-latitudes",
width: 750,
height: 480,
projection: {
type: "equirectangular",
domain: {type:"MultiPoint", coordinates:[[-105,5],[-35,68]]}
},
style: {background:"#1b263b", color:"#eee", fontSize:"12px"},
marks
});
}31.1.1 💡 Key Observation
Despite forming in very different locations and for very different reasons, both hurricanes (once they curve north) and blizzards travel in the same general direction: from southwest to northeast across the mid-latitudes.
This is NOT a coincidence. Something is steering these storms.
Code
buildQuiz("storm-tracks-map", [
{
q: "The storm track map shows that both Atlantic hurricanes (after recurving) and Nor'easters travel from southwest to northeast. What does this reveal?",
options: [
"It is a coincidence — the two storm types have no connection to each other",
"Both storm types are steered by the same mid-latitude westerly winds once they enter the 30°–60°N latitude band",
"Ocean tides push both storm types in the same direction along the coast",
"Hurricanes and blizzards form in the same location and follow identical paths"
],
correct: 1,
explanation: "Despite forming by completely different mechanisms, both hurricanes (once they recurve north of ~30°N) and Nor'easters are steered by the prevailing westerlies — the dominant surface winds in the mid-latitudes. This is why both storm types consistently track from SW to NE across the eastern U.S."
},
{
q: "On the map, hurricane tracks show a characteristic curve: they first move westward near the tropics, then curve northeastward as they enter higher latitudes. What drives this recurvature?",
options: [
"The Gulf Stream ocean current deflects them northeastward",
"The Moon's gravity pulls tropical storms poleward",
"Near the equator, the trade winds push storms west; once past ~30°N, the westerlies take over and steer them northeast",
"Hurricanes run out of warm water and reverse direction"
],
correct: 2,
explanation: "This classic recurvature reflects the hand-off between two global wind belts. In the tropics (0°–30°N), easterly trade winds push storms westward. Once a hurricane moves north of the subtropical high (around 30°N), it encounters the mid-latitude westerlies — blowing from west to east — which pick up the storm and steer it northeastward. It's the same steering mechanism that moves all mid-latitude weather systems."
}
])32 Explain: The Global Wind Engine
32.1 🌬️ Why Does the Wind Blow the Way It Does?
To understand storm paths, we need to understand the global circulation of the atmosphere — the “engine” that steers weather systems around the planet.
32.2 Uneven Solar Heating: The Root Cause
The Sun doesn’t heat Earth evenly. The equator receives far more solar energy per unit area than the poles because of the angle at which sunlight hits the surface.
32.3 🧪 Air Mass Origins Lab
Where air masses form determines their character — and their character determines the weather they bring. Use the interactive lab below to investigate how insolation angle and surface type at each source region combine to produce different air masses.
Code
viewof airMassApp = {
// 1. Create the main container
const container = document.createElement("div");
// 2. Inject embedded CSS for styling (Replaces Tailwind)
container.innerHTML = `
<style>
.am-widget {
display: flex;
flex-direction: row;
font-family: system-ui, -apple-system, sans-serif;
background-color: #f8fafc;
border: 1px solid #e2e8f0;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 1000px;
margin: 0 auto;
box-sizing: border-box;
}
.am-widget * { box-sizing: border-box; }
.am-map-area {
flex: 1 1 60%;
position: relative;
min-height: 500px;
background-color: #e0f2fe;
overflow: hidden;
}
.am-info-area {
flex: 1 1 40%;
background-color: #ffffff;
padding: 32px;
border-left: 1px solid #e2e8f0;
overflow-y: auto;
}
.am-controls {
position: absolute;
top: 20px;
left: 20px;
z-index: 10;
display: flex;
gap: 8px;
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(4px);
padding: 8px;
border-radius: 8px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
border: 1px solid #e2e8f0;
}
.am-btn {
padding: 8px 20px;
border: none;
border-radius: 6px;
font-weight: 700;
cursor: pointer;
transition: all 0.2s ease;
font-size: 14px;
}
.am-btn-winter.active { background-color: #3b82f6; color: white; box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3); }
.am-btn-summer.active { background-color: #f97316; color: white; box-shadow: 0 2px 4px rgba(249, 115, 22, 0.3); }
.am-btn:not(.active) { background-color: #f1f5f9; color: #64748b; }
.am-btn:not(.active):hover { background-color: #e2e8f0; }
.am-blob {
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 16px;
border-radius: 9999px;
border: 4px solid;
transition: all 0.7s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
min-width: 150px;
min-height: 110px;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2);
transform: translate(-50%, -50%);
}
.am-blob:hover {
z-index: 20 !important;
transform: translate(-50%, -50%) scale(1.1) !important;
}
/* Fix hover glitch: children are transparent to pointer events so
mouseleave only fires when the cursor truly leaves the blob container */
.am-blob > * { pointer-events: none; }
/* Visual ring for tap-to-pin selection (mobile & desktop) */
.am-blob--pinned {
box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.85), 0 10px 15px -3px rgba(0,0,0,0.25) !important;
z-index: 25 !important;
transform: translate(-50%, -50%) scale(1.08) !important;
}
.am-blob-label { font-size: 26px; font-weight: 900; line-height: 1; text-shadow: 0 1px 2px rgba(0,0,0,0.1); }
.am-blob-name { font-size: 13px; font-weight: 700; text-align: center; margin-top: 6px; line-height: 1.2; }
.am-blob-desc { font-size: 12px; opacity: 0.9; margin-top: 2px; }
.am-arrow {
position: absolute;
bottom: -30px;
width: 32px;
height: 32px;
opacity: 0.7;
transition: transform 0.5s ease;
}
@media (max-width: 768px) {
.am-widget { flex-direction: column; }
.am-map-area { min-height: 380px; border-bottom: 1px solid #e2e8f0; }
.am-info-area { border-left: none; padding: 20px; }
}
@media (max-width: 500px) {
.am-blob { min-width: 110px; min-height: 85px; padding: 10px; }
.am-blob-label { font-size: 20px; }
.am-blob-name { font-size: 11px; }
.am-blob-desc { font-size: 10px; }
}
</style>
<div class="am-widget">
<div class="am-map-area">
<div class="am-controls">
<button class="am-btn am-btn-winter active" id="btn-winter">Winter</button>
<button class="am-btn am-btn-summer" id="btn-summer">Summer</button>
</div>
<!-- Stylized Map Background -->
<svg viewBox="0 0 800 600" style="width:100%; height:100%; position:absolute; top:0; left:0; z-index:0; pointer-events:none;" preserveAspectRatio="xMidYMid slice">
<path d="M0,150 L800,150 M0,300 L800,300 M0,450 L800,450" stroke="#bae6fd" stroke-width="1" stroke-dasharray="5,5" />
<path d="M200,0 L200,600 M400,0 L400,600 M600,0 L600,600" stroke="#bae6fd" stroke-width="1" stroke-dasharray="5,5" />
<g filter="drop-shadow(0px 10px 15px rgba(0,0,0,0.1))">
<path d="M 120 80 C 200 40, 400 40, 600 80 C 680 120, 700 250, 650 350 C 600 450, 500 480, 450 550 C 400 600, 350 550, 300 480 C 250 400, 200 350, 150 300 C 100 250, 50 150, 120 80 Z" fill="#dcfce7" stroke="#86efac" stroke-width="3" />
</g>
</svg>
<!-- Interactive Blobs Container -->
<div id="blobs-container" style="position:absolute; inset:0; z-index:1; pointer-events:auto;"></div>
</div>
<!-- Information Panel Container -->
<div class="am-info-area" id="info-panel"></div>
</div>
`;
// 3. Data Definitions
const airMassesData = {
cA: { label: 'cA', name: 'Continental arctic', desc: 'Very cold, very dry', temp: 'Very Cold', moisture: 'Very Dry', color: '#1e293b', bg: '#f1f5f9', border: '#cbd5e1', arrow: '90deg', winter: { top: '8%', left: '50%', o: 1 }, summer: { top: '-10%', left: '50%', o: 0 }, behavior: "Forms over the frozen Arctic regions during winter and brings bitter cold to the continent." },
cP: { label: 'cP', name: 'Continental polar', desc: 'Cold, dry', temp: 'Cold', moisture: 'Dry', color: '#1e3a8a', bg: '#dbeafe', border: '#93c5fd', arrow: '90deg', winter: { top: '28%', left: '50%', o: 1 }, summer: { top: '18%', left: '50%', o: 1 }, behavior: "Originating over northern Canada and Alaska, it sweeps southward bringing cool to cold, dry weather." },
mP_pac: { label: 'mP', name: 'Maritime polar (Pacific)', desc: 'Cool, humid', temp: 'Cool', moisture: 'Humid', color: 'white', bg: '#38bdf8', border: '#0284c7', arrow: '45deg', winter: { top: '35%', left: '15%', o: 1 }, summer: { top: '40%', left: '10%', o: 1 }, behavior: "Forming over cold oceans, it brings cool, moist air to the coastal regions, often resulting in fog or precipitation." },
mP_atl: { label: 'mP', name: 'Maritime polar (Atlantic)', desc: 'Cool, humid', temp: 'Cool', moisture: 'Humid', color: 'white', bg: '#38bdf8', border: '#0284c7', arrow: '135deg', winter: { top: '30%', left: '80%', o: 1 }, summer: { top: '45%', left: '85%', o: 1 }, behavior: "Forming over cold oceans, it brings cool, moist air to the coastal regions, often resulting in fog or precipitation." },
mT_pac: { label: 'mT', name: 'Maritime tropical (Pacific)', desc: 'Warm, humid', temp: 'Warm', moisture: 'Humid', color: 'white', bg: '#fb923c', border: '#ea580c', arrow: '-45deg', winter: { top: '75%', left: '20%', o: 1 }, summer: { top: '85%', left: '25%', o: 1 }, behavior: "Originating over warm tropical waters, it is responsible for the hot, humid conditions often felt in the regions it affects." },
mT_atl: { label: 'mT', name: 'Maritime tropical (Gulf/Atlantic)', desc: 'Warm, humid', temp: 'Warm', moisture: 'Humid', color: 'white', bg: '#f97316', border: '#c2410c', arrow: '-135deg', winter: { top: '70%', left: '70%', o: 1 }, summer: { top: '80%', left: '65%', o: 1 }, behavior: "Originating over warm tropical waters, it is responsible for the hot, humid conditions often felt in the eastern and southern parts of the continent." },
cT: { label: 'cT', name: 'Continental tropical', desc: 'Hot, dry', temp: 'Hot', moisture: 'Dry', color: 'white', bg: '#f59e0b', border: '#b45309', arrow: '-90deg', winter: { top: '85%', left: '42%', o: 0 }, summer: { top: '70%', left: '42%', o: 1 }, behavior: "Developing over the desert southwest and northern Mexico during summer, it brings intense heat and dry conditions." }
};
const defaultInfoHTML = `
<h2 style="margin:0 0 16px 0; color:#0f172a; font-size: 24px; font-weight: 900;">Air-Mass Source Regions for North America</h2>
<p style="color:#475569; line-height:1.6; font-size:16px;">Source regions are largely confined to subtropical and subpolar locations. The middle latitudes are where cold and warm air masses clash, often because the converging winds of a traveling cyclone draw them together, meaning this zone lacks the conditions necessary to be a source region.</p>
<div style="background-color:#f1f5f9; padding:16px; border-radius:8px; border-left:4px solid #cbd5e1; margin-top:20px;">
<p style="color:#475569; line-height:1.5; font-style:italic; margin:0; font-size: 14px;">The differences between polar and arctic are relatively small and serve to indicate the degree of coldness. By comparing the winter and summer maps, it is clear that the extent and temperature characteristics fluctuate.</p>
</div>
<div style="margin-top:32px; text-align:center; padding:24px; background-color:#eef2ff; border-radius:12px; border:1px solid #e0e7ff;">
<div style="font-size:32px; margin-bottom:8px;">👆</div>
<strong style="color:#3730a3; display:block; margin-bottom:8px;">Interactive Mode</strong>
<span style="font-size:14px; color:#4f46e5;">Tap a bubble to pin its details — tap again to deselect. On desktop, hover to preview. Toggle seasons to see how air masses shift!</span>
</div>
`;
// 4. Setup DOM elements and Logic
const blobsContainer = container.querySelector('#blobs-container');
const infoPanel = container.querySelector('#info-panel');
const btnWinter = container.querySelector('#btn-winter');
const btnSummer = container.querySelector('#btn-summer');
let currentSeason = 'winter';
function updateInfo(key) {
if (!key) {
infoPanel.innerHTML = defaultInfoHTML;
return;
}
const data = airMassesData[key];
infoPanel.innerHTML = `
<div style="animation: fadeIn 0.3s ease-in-out;">
<div style="display:inline-block; padding:4px 12px; border-radius:999px; font-size:12px; font-weight:800; letter-spacing:0.05em; background:${data.bg}; color:${data.color}; border:1px solid ${data.border}; margin-bottom:16px;">AIR MASS SELECTED</div>
<h2 style="margin:0 0 4px 0; color:#0f172a; font-size:36px; font-weight:900; display:flex; align-items:baseline; gap:8px;">
${data.label} <span style="font-size:20px; color:#64748b; font-weight:600;">Region</span>
</h2>
<h3 style="margin:0 0 24px 0; color:#475569; font-size:20px;">${data.name}</h3>
<div style="display:flex; gap:16px; margin-bottom:24px;">
<div style="flex:1; background:#f8fafc; padding:16px; border-radius:12px; border:1px solid #e2e8f0;">
<div style="font-size:11px; font-weight:800; color:#64748b; text-transform:uppercase; margin-bottom:4px;">Temperature</div>
<div style="font-size:20px; font-weight:800; color:#0f172a;">${data.temp}</div>
</div>
<div style="flex:1; background:#f8fafc; padding:16px; border-radius:12px; border:1px solid #e2e8f0;">
<div style="font-size:11px; font-weight:800; color:#64748b; text-transform:uppercase; margin-bottom:4px;">Moisture</div>
<div style="font-size:20px; font-weight:800; color:#0f172a;">${data.moisture}</div>
</div>
</div>
<h4 style="margin:0 0 8px 0; color:#0f172a; font-size:18px;">Behavior</h4>
<p style="color:#475569; line-height:1.6; margin-bottom:12px;">The <strong style="color:#0f172a;">${data.name}</strong> air mass is characterized by its <strong>${data.desc.toLowerCase()}</strong> conditions.</p>
<p style="color:#475569; line-height:1.6;">${data.behavior}</p>
</div>
<style>
@keyframes fadeIn { from { opacity: 0; transform: translateX(10px); } to { opacity: 1; transform: translateX(0); } }
</style>
`;
}
// Initial panel render
updateInfo(null);
// Track which blob (if any) is pinned via tap/click
let pinnedKey = null;
// Generate Blobs
Object.keys(airMassesData).forEach(key => {
const data = airMassesData[key];
const blob = document.createElement('div');
blob.className = 'am-blob';
blob.style.backgroundColor = data.bg;
blob.style.borderColor = data.border;
blob.style.color = data.color;
blob.innerHTML = `
<div class="am-blob-label">${data.label}</div>
<div class="am-blob-name">${data.name}</div>
<div class="am-blob-desc">${data.desc}</div>
<svg class="am-arrow" style="transform: rotate(${data.arrow})" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<path d="M5 12h14M12 5l7 7-7 7"/>
</svg>
`;
// Desktop hover — only preview when nothing is pinned
blob.addEventListener('mouseenter', () => { if (!pinnedKey) updateInfo(key); });
blob.addEventListener('mouseleave', () => { if (!pinnedKey) updateInfo(null); });
// Click / tap: toggle pin so info panel persists on mobile
blob.addEventListener('click', () => {
if (pinnedKey === key) {
pinnedKey = null;
blob.classList.remove('am-blob--pinned');
updateInfo(null);
} else {
if (pinnedKey) airMassesData[pinnedKey].element.classList.remove('am-blob--pinned');
pinnedKey = key;
blob.classList.add('am-blob--pinned');
updateInfo(key);
}
});
blobsContainer.appendChild(blob);
data.element = blob; // Store reference for updating later
});
function updatePositions() {
Object.keys(airMassesData).forEach(key => {
const data = airMassesData[key];
const pos = data[currentSeason];
data.element.style.top = pos.top;
data.element.style.left = pos.left;
data.element.style.opacity = pos.o;
data.element.style.pointerEvents = pos.o === 0 ? 'none' : 'auto';
// If a pinned blob becomes invisible in the new season, unpin it
if (pinnedKey === key && pos.o === 0) {
pinnedKey = null;
data.element.classList.remove('am-blob--pinned');
updateInfo(null);
}
});
}
// Initial Position render
updatePositions();
// Button Listeners
btnWinter.addEventListener('click', () => {
currentSeason = 'winter';
btnWinter.classList.add('active');
btnSummer.classList.remove('active');
updatePositions();
});
btnSummer.addEventListener('click', () => {
currentSeason = 'summer';
btnSummer.classList.add('active');
btnWinter.classList.remove('active');
updatePositions();
});
// Return the fully constructed DOM element to Observable
return container;
}Code
buildQuiz("air-mass-origins", [
{
q: "A cP (continental Polar) air mass forms over northern Canada in January. Which set of properties best describes it?",
options: [
"Warm and humid — it picks up moisture from Canadian lakes",
"Cold and dry — it forms over frozen land far from any ocean moisture source",
"Cool and humid — the cold temperatures cause condensation at the surface",
"Hot and dry — polar regions have very low humidity and intense sunlight in summer"
],
correct: 1,
explanation: "'c' = continental (forms over land → dry) and 'P' = polar (cold latitude). Continental Polar air masses are the primary source of cold, dry air that sweeps across the U.S. in winter. They lack moisture because they never pass over a significant water body, so they bring cold, clear conditions rather than heavy snowfall on their own."
},
{
q: "What air mass provides the critical moisture source that fuels major East Coast blizzards and Nor'easters?",
options: [
"cP — continental Polar air from Canada",
"cA — continental Arctic air from the Arctic icecap",
"mT — maritime Tropical air from the Gulf of Mexico and western Atlantic",
"mP — maritime Polar air from the North Atlantic"
],
correct: 2,
explanation: "The mT (maritime Tropical) air mass — warm, moisture-laden air from the Gulf of Mexico and subtropical Atlantic — is the fuel for East Coast snowstorms. When this warm, wet air collides with invading cP air at a frontal boundary, the warm air is forced aloft, cools, and precipitates as heavy snow. Without the Gulf moisture, the same cold air mass would produce only light flurries."
}
])32.4 Convection Cells: Nature’s Heat Redistributors
This uneven heating drives enormous convection cells in the atmosphere — rising warm air near the equator and sinking cool air at higher latitudes. Hover over different latitude bands on the globe below to learn about each zone.
Code
// placeholder — kept so downstream OJS cells that reference d3 still resolve
{
const width = 1;
const height = 1;
const svg = d3.create("svg").attr("width", width).attr("height", height).attr("viewBox", `0 0 ${width} ${height}`);
svg.append("rect").attr("width", width).attr("height", height).attr("fill", "none");
svg.append("text").attr("x", 1).attr("y", 1).text("");
return svg.node();
}32.4.1 Atmospheric Cross-Section
The diagram below shows a vertical slice of the atmosphere from equator to pole. Click any cell to learn more.
Code
Code
{
const W = Math.min(width, 720), H = 360;
const svg = d3.create("svg")
.attr("width", W).attr("height", H)
.attr("viewBox", `0 0 ${W} ${H}`)
.style("font-family", "sans-serif").style("display", "block");
const groundY = H - 44, ceilY = 24;
const latX = lat => (lat / 90) * W;
// Sky background (no gradients — solid rect + layered rects for depth)
svg.append("rect").attr("width", W).attr("height", groundY).attr("fill", "#1e3a5f").attr("rx", 8);
svg.append("rect").attr("width", W).attr("y", groundY * 0.6).attr("height", groundY * 0.4).attr("fill", "#2e5f8a").attr("opacity", 0.5);
// Ground: biome bands (equator → desert → temperate → polar)
const biomes = [
{ x1: 0, x2: latX(15), color: "#2d7d32" }, // tropical
{ x1: latX(15), x2: latX(35), color: "#b8a040" }, // subtropical/desert
{ x1: latX(35), x2: latX(60), color: "#4a7c3f" }, // temperate
{ x1: latX(60), x2: W, color: "#cfe8f5" }, // polar
];
biomes.forEach(b => svg.append("rect")
.attr("x", b.x1).attr("y", groundY).attr("width", b.x2 - b.x1).attr("height", H - groundY)
.attr("fill", b.color));
// Cell definitions
const cells = [
{ name: "Hadley", lat1: 0, lat2: 30, riseAt: 0, sinkAt: 30, color: "#f87171" },
{ name: "Ferrel", lat1: 30, lat2: 60, riseAt: 60, sinkAt: 30, color: "#fbbf24" },
{ name: "Polar", lat1: 60, lat2: 90, riseAt: 60, sinkAt: 90, color: "#60a5fa" },
];
// Cell highlight fills
cells.forEach(c => {
const isSelected = selectedCell === c.name;
svg.append("rect")
.attr("x", latX(c.lat1)).attr("y", ceilY)
.attr("width", latX(c.lat2) - latX(c.lat1))
.attr("height", groundY - ceilY)
.attr("fill", c.color)
.attr("opacity", isSelected ? 0.22 : 0.07);
});
// Vertical dividers
[30, 60].forEach(lat => {
svg.append("line")
.attr("x1", latX(lat)).attr("y1", ceilY)
.attr("x2", latX(lat)).attr("y2", groundY)
.attr("stroke", "rgba(255,255,255,0.3)").attr("stroke-width", 1)
.attr("stroke-dasharray", "4,4");
});
// Circulation arrows (rise → top → sink → bottom)
const arrow = (svg, x1, y1, x2, y2, color) => {
svg.append("line")
.attr("x1", x1).attr("y1", y1).attr("x2", x2).attr("y2", y2)
.attr("stroke", color).attr("stroke-width", 2);
const angle = Math.atan2(y2 - y1, x2 - x1);
const size = 7;
const arrowX = x2, arrowY = y2;
svg.append("polygon")
.attr("points", [
[arrowX, arrowY],
[arrowX - size * Math.cos(angle - 0.4), arrowY - size * Math.sin(angle - 0.4)],
[arrowX - size * Math.cos(angle + 0.4), arrowY - size * Math.sin(angle + 0.4)],
].map(p => p.join(",")).join(" "))
.attr("fill", color);
};
cells.forEach(c => {
const isSelected = selectedCell === c.name;
const col = isSelected ? c.color : "rgba(255,255,255,0.5)";
const rX = latX(c.riseAt), sX = latX(c.sinkAt);
const midX = (rX + sX) / 2;
const topY = ceilY + 4, botY = groundY - 4;
// Rise column
arrow(svg, rX, botY, rX, topY, col);
// Top horizontal
arrow(svg, rX, topY, sX, topY, col);
// Sink column
arrow(svg, sX, topY, sX, botY, col);
// Bottom horizontal
arrow(svg, sX, botY, rX, botY, col);
});
// Pressure belts
const belts = [
{ lat: 0, label: "L", title: "ITCZ", bg: "#7dd3fc", fg: "#0c4a6e" },
{ lat: 30, label: "H", title: "Desert", bg: "#fca5a5", fg: "#7f1d1d" },
{ lat: 60, label: "L", title: "Storms", bg: "#7dd3fc", fg: "#0c4a6e" },
{ lat: 90, label: "H", title: "Polar", bg: "#fca5a5", fg: "#7f1d1d" },
];
belts.forEach(b => {
const x = latX(b.lat);
svg.append("circle").attr("cx", x).attr("cy", groundY - 14).attr("r", 13)
.attr("fill", b.bg).attr("stroke", "white").attr("stroke-width", 1);
svg.append("text").attr("x", x).attr("y", groundY - 10)
.attr("text-anchor", "middle").attr("font-size", 11).attr("font-weight", "bold")
.attr("fill", b.fg).text(b.label);
svg.append("text").attr("x", x).attr("y", groundY + 8)
.attr("text-anchor", "middle").attr("font-size", 8.5).attr("fill", "rgba(255,255,255,0.85)")
.attr("font-weight", "bold").text(b.title);
});
// Surface wind labels
const winds = [
{ lat: 15, label: "← Trades", color: "#f87171" },
{ lat: 45, label: "Westerlies →", color: "#fbbf24" },
{ lat: 75, label: "← Polar E.", color: "#93c5fd" },
];
winds.forEach(w => {
svg.append("text").attr("x", latX(w.lat)).attr("y", groundY - 32)
.attr("text-anchor", "middle").attr("font-size", 9.5).attr("font-weight", "bold")
.attr("fill", w.color).text(w.label);
});
// Cell name labels at top
cells.forEach(c => {
svg.append("text").attr("x", latX((c.lat1 + c.lat2) / 2)).attr("y", ceilY + 14)
.attr("text-anchor", "middle").attr("font-size", 11).attr("font-weight", "bold")
.attr("fill", "white").text(c.name + " Cell");
});
// Latitude ticks at bottom
[0, 30, 60, 90].forEach(lat => {
svg.append("text").attr("x", latX(lat)).attr("y", H - 2)
.attr("text-anchor", "middle").attr("font-size", 10).attr("fill", "rgba(255,255,255,0.8)")
.attr("font-weight", "bold").text(lat + "°N");
});
// Info box for selected cell
const info = {
Hadley: "Warm air rises at the equator (ITCZ), travels aloft to 30°N, sinks creating subtropical deserts. Surface flow = NE Trade Winds.",
Ferrel: "Driven by its neighbors. Air rises at 60°, sinks at 30°. Surface flow = Westerlies (SW→NE). Steers mid-latitude storms.",
Polar: "Cold dense air sinks at poles, flows equatorward. Rises at 60° (Polar Front). Collision with Westerlies generates storm systems.",
};
if (selectedCell !== "None" && info[selectedCell]) {
const cell = cells.find(c => c.name === selectedCell);
const bx = 6, by = ceilY + 22, bw = W - 12, bh = 42;
svg.append("rect").attr("x", bx).attr("y", by).attr("width", bw).attr("height", bh)
.attr("fill", "rgba(0,0,0,0.72)").attr("rx", 6)
.attr("stroke", cell.color).attr("stroke-width", 1.5);
svg.append("text").attr("x", bx + 10).attr("y", by + 14)
.attr("font-size", 10).attr("font-weight", "bold").attr("fill", cell.color)
.text(selectedCell + " Cell");
// Simple text wrap
const words = info[selectedCell].split(" ");
let line = "", lx = bx + 10, ly = by + 28;
words.forEach(w => {
const test = line ? line + " " + w : w;
if (test.length > 100) {
svg.append("text").attr("x", lx).attr("y", ly)
.attr("font-size", 9).attr("fill", "#cbd5e1").text(line);
line = w; ly += 11;
} else line = test;
});
if (line) svg.append("text").attr("x", lx).attr("y", ly)
.attr("font-size", 9).attr("fill", "#cbd5e1").text(line);
}
return svg.node();
}32.4.2 💡 Key Concept: Three Circulation Cells
| Cell | Latitude | Surface Winds | Key Feature |
|---|---|---|---|
| Hadley | 0°–30° | Trade Winds (NE in NH) | Rising air at equator → heavy rain; sinking at 30° → deserts |
| Ferrel | 30°–60° | Westerlies | Driven by Hadley & Polar cells; steers mid-latitude weather from W→E |
| Polar | 60°–90° | Polar Easterlies | Cold, dry air sinking at poles |
NYC is at ~41°N — right in the Ferrel Cell’s westerlies. This is why storms affecting our city generally move from southwest to northeast!
Code
buildQuiz("circulation-cells", [
{
q: "NYC is at approximately 41°N latitude. Which atmospheric circulation cell directly governs the surface winds that steer storms through the Northeast United States?",
options: [
"Hadley Cell — the largest and most powerful circulation cell",
"Polar Cell — cold dense air sinking from the North Pole",
"Ferrel Cell — the mid-latitude cell whose surface westerlies dominate the 30°–60°N band",
"Walker Cell — the Pacific Ocean circulation driven by ENSO"
],
correct: 2,
explanation: "NYC at 41°N sits squarely in the Ferrel Cell (30°–60°N). The surface winds in this cell blow from the southwest — the mid-latitude westerlies. These winds are the 'storm highway' that steers both Nor'easters and recurving hurricanes from southwest to northeast along the East Coast. This is not a coincidence; it is the direct result of global atmospheric circulation."
},
{
q: "The world's great subtropical deserts (Sahara, Arabian, Mojave, Australian Outback) are all found near 30°N or 30°S. What circulation process creates desert conditions at these latitudes?",
options: [
"Rising air at 30° cools and produces heavy rainfall, washing away all soil nutrients",
"The Hadley Cell's sinking air at 30° compresses, warms adiabatically, and inhibits cloud formation and precipitation",
"The Coriolis effect deflects rain-bearing clouds away from 30° latitude",
"Ocean currents are warm at 30°, so moisture evaporates before it can fall as rain"
],
correct: 1,
explanation: "The Hadley Cell drives warm moist air upward at the equator (creating the ITCZ's heavy rainfall), then it flows poleward at altitude, cools, and sinks back down at ~30°N and 30°S. This sinking (subsiding) air compresses and warms adiabatically — exactly the opposite of the lifting process that creates clouds. The result: persistent high pressure, cloud-free skies, and very little precipitation. These are called the 'subtropical highs' or 'horse latitudes.'"
}
])32.5 The Coriolis Effect: Why Winds Curve
If Earth didn’t rotate, winds would blow straight from high to low pressure. But Earth does rotate, and this deflects moving air:
- Northern Hemisphere: winds curve to the RIGHT
- Southern Hemisphere: winds curve to the LEFT
Code
{
const width = 400;
const height = 400;
const svg = d3.create("svg").attr("width", width).attr("height", height).attr("viewBox", `0 0 ${width} ${height}`);
// Earth from above (North Pole view)
const cx = 200, cy = 200, r = 160;
svg.append("circle").attr("cx", cx).attr("cy", cy).attr("r", r).attr("fill", "#e3f2fd").attr("stroke", "#1565c0").attr("stroke-width", 2);
svg.append("text").attr("x", cx).attr("y", cy).attr("text-anchor", "middle").attr("font-size", 14).attr("font-weight", "bold").text("N. Pole (top view)");
svg.append("text").attr("x", cx).attr("y", cy + 20).attr("text-anchor", "middle").attr("font-size", 20).text("↺");
svg.append("text").attr("x", cx).attr("y", cy + 40).attr("text-anchor", "middle").attr("font-size", 11).attr("fill", "#636e72").text("Earth rotates CCW");
if (!showCoriolis) {
// Straight path (no Coriolis)
svg.append("line").attr("x1", cx).attr("y1", cy - r + 20).attr("x2", cx).attr("y2", cy + r - 20)
.attr("stroke", "#2ecc71").attr("stroke-width", 3).attr("marker-end", "url(#arrowGreen)");
svg.append("text").attr("x", cx + 15).attr("y", cy - 30).attr("font-size", 12).attr("fill", "#2ecc71").text("Expected path");
svg.append("text").attr("x", cx + 15).attr("y", cy - 15).attr("font-size", 12).attr("fill", "#2ecc71").text("(no rotation)");
} else {
// Curved path (with Coriolis)
svg.append("path").attr("d", `M ${cx},${cy - r + 20} Q ${cx + 80},${cy} ${cx + 40},${cy + r - 40}`)
.attr("stroke", "#e74c3c").attr("stroke-width", 3).attr("fill", "none").attr("marker-end", "url(#arrowRed)");
svg.append("text").attr("x", cx + 90).attr("y", cy - 10).attr("font-size", 12).attr("fill", "#e74c3c").text("Actual path");
svg.append("text").attr("x", cx + 90).attr("y", cy + 5).attr("font-size", 12).attr("fill", "#e74c3c").text("(deflected RIGHT)");
// Ghost straight path
svg.append("line").attr("x1", cx).attr("y1", cy - r + 20).attr("x2", cx).attr("y2", cy + r - 20)
.attr("stroke", "#2ecc71").attr("stroke-width", 1).attr("stroke-dasharray", "5,3");
}
const defs = svg.append("defs");
defs.append("marker").attr("id", "arrowGreen").attr("viewBox", "0 0 10 10").attr("refX", 5).attr("refY", 5)
.attr("markerWidth", 6).attr("markerHeight", 6).attr("orient", "auto-start-reverse")
.append("path").attr("d", "M 0 0 L 10 5 L 0 10 z").attr("fill", "#2ecc71");
defs.append("marker").attr("id", "arrowRed").attr("viewBox", "0 0 10 10").attr("refX", 5).attr("refY", 5)
.attr("markerWidth", 6).attr("markerHeight", 6).attr("orient", "auto-start-reverse")
.append("path").attr("d", "M 0 0 L 10 5 L 0 10 z").attr("fill", "#e74c3c");
return svg.node();
}32.5.1 💡 Key Concept: Coriolis Effect + Pressure Gradient = Surface Winds
- Without Coriolis: wind blows straight from H → L pressure
- With Coriolis (NH): wind is deflected right → curves clockwise around High pressure, counter-clockwise around Low pressure
- This is why tropical trade winds blow from the northeast (not straight south) and mid-latitude westerlies blow from the southwest (not straight north)
Code
buildQuiz("coriolis-winds", [
{
q: "In the Northern Hemisphere, the Coriolis effect deflects moving air to the right. As air rushes inward toward a low-pressure center, what rotation pattern results?",
options: [
"Clockwise rotation — air is deflected right as it spirals inward",
"Counterclockwise rotation — each rightward deflection curves the inward-flowing air into a CCW spiral",
"No rotation — the pressure gradient force overpowers the Coriolis effect at low pressure",
"Clockwise at the surface, counterclockwise aloft — the two forces cancel at altitude"
],
correct: 1,
explanation: "Imagine air rushing inward from all directions toward a low. In the Northern Hemisphere, each parcel is deflected to its right. Air coming from the south gets pushed west; air from the north gets pushed east; air from the east gets pushed north — together these rightward deflections create a counterclockwise (cyclonic) spin. This is why ALL Northern Hemisphere low-pressure systems — hurricanes, Nor'easters, blizzard-producers — rotate counterclockwise."
},
{
q: "Without Earth's rotation, air would flow straight from high pressure to low pressure. The Coriolis effect is why trade winds blow from the NORTHEAST in the Northern Hemisphere tropics instead of straight south. Which statement best explains this?",
options: [
"The trade winds start moving south toward the ITCZ; the Coriolis effect deflects them to the right (westward), making them blow from the northeast",
"Oceans in the Northern Hemisphere heat up faster on the east side, pushing winds from east to west",
"The Moon's gravity pulls tropical air masses eastward, adding an eastward component to southward flow",
"Mountain ranges in the tropics block straight southward flow and redirect it to the northeast"
],
correct: 0,
explanation: "At the surface in the tropics, air flows toward the low pressure of the ITCZ (roughly southward in the Northern Hemisphere). The Coriolis effect deflects this moving air to the right — which in the Northern Hemisphere means westward. A southward wind deflected right becomes a wind with a westward component: it ends up blowing FROM the northeast (traveling southwest). This is the origin of the northeast trade winds that Columbus used to sail to the Americas."
}
])32.6 The Jet Stream: The Storm Highway
At the boundary between the Ferrel and Polar cells (~60°N, but it meanders), there is an extremely fast river of air flowing from west to east at high altitude: the jet stream.
Code
Code
{
const width = 750;
const height = 350;
const svg = d3.create("svg").attr("width", width).attr("height", height).attr("viewBox", `0 0 ${width} ${height}`);
svg.append("rect").attr("width", width).attr("height", height).attr("fill", "#f0f4ff").attr("rx", 10);
// US outline simplified
svg.append("rect").attr("x", 50).attr("y", 100).attr("width", 650).attr("height", 200).attr("fill", "#e8f5e9").attr("rx", 5);
svg.append("text").attr("x", 100).attr("y", 130).attr("font-size", 11).attr("fill", "#4caf50").text("🇨🇦 CANADA (cold air)");
svg.append("text").attr("x", 100).attr("y", 280).attr("font-size", 11).attr("fill", "#ef5350").text("🌴 SOUTH (warm air)");
// Latitude reference
svg.append("text").attr("x", 710).attr("y", 155).attr("font-size", 10).attr("fill", "#999").text("50°N");
svg.append("text").attr("x", 710).attr("y", 205).attr("font-size", 10).attr("fill", "#999").text("40°N");
svg.append("text").attr("x", 710).attr("y", 255).attr("font-size", 10).attr("fill", "#999").text("30°N");
if (jetStreamPattern === "Normal Pattern") {
svg.append("path")
.attr("d", "M 50,190 Q 200,170 350,195 Q 500,220 650,185 L 700,185")
.attr("stroke", "#1565c0").attr("stroke-width", 5).attr("fill", "none");
svg.append("text").attr("x", 375).attr("y", 160).attr("text-anchor", "middle").attr("font-size", 14).attr("font-weight", "bold").attr("fill", "#1565c0")
.text("Polar Jet Stream (~200 mph)");
svg.append("text").attr("x", 375).attr("y", 330).attr("text-anchor", "middle").attr("font-size", 13)
.text("Gentle waves → storms track steadily from west to east");
// Storm riding the jet
svg.append("text").attr("x", 400).attr("y", 205).attr("font-size", 20).text("🌀");
svg.append("text").attr("x", 430).attr("y", 210).attr("font-size", 11).attr("fill", "#e74c3c").text("Storm steered by jet →");
} else if (jetStreamPattern === "Wavy Pattern (Blocking)") {
svg.append("path")
.attr("d", "M 50,190 Q 130,130 210,220 Q 290,300 370,180 Q 450,100 530,240 Q 610,310 700,190")
.attr("stroke", "#e74c3c").attr("stroke-width", 5).attr("fill", "none");
svg.append("text").attr("x", 375).attr("y", 80).attr("text-anchor", "middle").attr("font-size", 14).attr("font-weight", "bold").attr("fill", "#e74c3c")
.text("Amplified Jet Stream (deep waves)");
// Annotations
svg.append("text").attr("x", 210).attr("y", 260).attr("text-anchor", "middle").attr("font-size", 11).text("❄️ Cold trough");
svg.append("text").attr("x", 370).attr("y", 150).attr("text-anchor", "middle").attr("font-size", 11).text("🔥 Warm ridge");
svg.append("text").attr("x", 530).attr("y", 280).attr("text-anchor", "middle").attr("font-size", 11).text("❄️ Cold trough");
svg.append("text").attr("x", 375).attr("y", 330).attr("text-anchor", "middle").attr("font-size", 13)
.text("Deep waves → cold air plunges south, warm air pushes north → extreme weather STALLS");
} else {
svg.append("path")
.attr("d", "M 50,195 Q 130,140 210,225 Q 290,300 370,180 Q 450,100 530,240 Q 610,310 700,190")
.attr("stroke", "#e74c3c").attr("stroke-width", 4).attr("fill", "none").attr("stroke-dasharray", "8,4");
svg.append("path")
.attr("d", "M 50,190 Q 200,170 350,195 Q 500,220 650,185 L 700,185")
.attr("stroke", "#1565c0").attr("stroke-width", 2).attr("fill", "none").attr("stroke-dasharray", "3,3");
svg.append("text").attr("x", 375).attr("y", 80).attr("text-anchor", "middle").attr("font-size", 14).attr("font-weight", "bold").attr("fill", "#6c5ce7")
.text("Climate Change → More Frequent Amplified Patterns?");
svg.append("text").attr("x", 200).attr("y", 155).attr("font-size", 11).attr("fill", "#1565c0").text("--- Historical pattern");
svg.append("text").attr("x", 200).attr("y", 175).attr("font-size", 11).attr("fill", "#e74c3c").text("- - Future projection");
svg.append("text").attr("x", 375).attr("y", 330).attr("text-anchor", "middle").attr("font-size", 13)
.text("Arctic amplification may lead to more frequent blocking patterns → more extreme storms");
}
return svg.node();
}32.6.1 💡 Key Concept: The Jet Stream Steers Storms
- The polar jet stream is a band of fast-moving air (100–200+ mph) at ~30,000 ft altitude
- It forms at the boundary between cold polar and warm tropical air
- Mid-latitude storms ride the jet stream from west to east
- Stronger temperature gradient → faster, straighter jet → predictable storm tracks
- Weaker gradient (Arctic amplification) → slower, wavier jet → storms can stall, creating extended extreme events
Code
buildQuiz("jet-stream", [
{
q: "The jet stream visualization shows that under 'Wavy Pattern (Blocking),' cold troughs plunge south while warm ridges push north. What weather consequence does this produce for the mid-latitudes?",
options: [
"Mild, stable weather across all latitudes as temperatures even out",
"Faster storm movement, so extreme weather clears quickly",
"Cold Arctic air can penetrate deep into the southern U.S., and storms can stall in one location producing prolonged extreme events",
"The jet stream disappears entirely during blocking, so no storms can form"
],
correct: 2,
explanation: "A normal (zonal) jet stream moves storms quickly from west to east. But when the jet develops large meanders — deep troughs and ridges — it slows down. Cold air can plunge far south through the troughs (producing polar vortex outbreaks), and weather systems can become 'blocked,' stalling in one location for days or weeks. This is why some blizzards and heat waves persist far longer than average: the steering mechanism has effectively stalled."
},
{
q: "Arctic amplification refers to the Arctic warming 2–4× faster than the global average. How does this specifically affect the polar jet stream?",
options: [
"A warmer Arctic creates stronger temperature contrasts, accelerating the jet stream and making storms faster",
"The reduced temperature contrast between the Arctic and mid-latitudes weakens the jet stream's speed and makes it develop larger, slower meanders",
"Arctic amplification has no measurable effect on the jet stream — they operate independently",
"The jet stream shifts to the equator as the Arctic warms, removing storms from the mid-latitudes entirely"
],
correct: 1,
explanation: "The jet stream is powered by the temperature contrast between cold polar air and warm tropical air — just as a heat engine requires a temperature difference to do work. Arctic amplification reduces this contrast (the poles warm faster than the tropics). A weaker temperature gradient = a less energetic, slower jet stream with larger Rossby wave meanders. This is why climate scientists connect Arctic warming to more frequent 'weather whiplash' — extreme cold outbreaks alternating with warm spells."
}
])33 Elaborate: Precipitation Patterns & Climate Connections
33.1 🌧️ Where Does It Rain (and Snow)?
Global circulation doesn’t just create wind patterns — it determines where on Earth gets rain and where stays dry.
33.2 Rising Air = Rain, Sinking Air = Dry
Code
precipPatternData = [
{lat: 0, name: "Equator (ITCZ)", precip: 2000, type: "Rising air → heavy rain", emoji: "🌧️"},
{lat: 15, name: "15°N", precip: 1200, type: "Transition", emoji: "🌤️"},
{lat: 30, name: "30°N (Horse latitudes)", precip: 300, type: "Sinking air → DESERTS", emoji: "🏜️"},
{lat: 45, name: "45°N (Mid-latitudes)", precip: 1000, type: "Frontal lifting → moderate rain", emoji: "🌦️"},
{lat: 60, name: "60°N (Polar front)", precip: 800, type: "Rising air → rain/snow", emoji: "🌨️"},
{lat: 75, name: "75°N", precip: 250, type: "Cold sinking air → dry", emoji: "❄️"},
{lat: 90, name: "90°N (Pole)", precip: 100, type: "Polar desert", emoji: "🧊"}
]
Plot.plot({
title: "Average Annual Precipitation by Latitude",
subtitle: "Rising air = wet; Sinking air = dry",
width: 700,
height: 380,
x: {label: "Latitude (°N)", domain: [0, 90]},
y: {label: "Annual Precipitation (mm)", domain: [0, 2200]},
marks: [
Plot.barY(precipPatternData, {x: "lat", y: "precip", fill: d => d.precip > 800 ? "#3498db" : d.precip > 400 ? "#f39c12" : "#e74c3c", dx: -3,
tip: true}),
Plot.text(precipPatternData, {x: "lat", y: d => d.precip + 80, text: "emoji", fontSize: 20}),
Plot.text(precipPatternData, {x: "lat", y: d => d.precip + 150, text: "type", fontSize: 10})
]
})33.2.1 📝 Connecting Circulation to Precipitation
- Why does the equator receive so much rainfall? (Hint: think about the Hadley Cell)
- Why are the world’s great deserts located near 30°N/S? (Sahara, Arabian, Mojave…)
- NYC is at ~41°N. What type of precipitation mechanism dominates there?
- If global wind patterns shifted northward due to warming, how might precipitation patterns change for NYC?
34 Elaborate: Shifting Storm Paths
34.1 🌡️ Could Climate Change Move Storm Tracks?
If the temperature gradient between the equator and poles changes, the circulation cells — and the jet stream — could shift. What would that mean for storms?
Code
Code
{
const width = 700;
const height = 400;
const svg = d3.create("svg").attr("width", width).attr("height", height).attr("viewBox", `0 0 ${width} ${height}`);
svg.append("rect").attr("width", width).attr("height", height).attr("fill", "#f8f9fa").attr("rx", 10);
svg.append("text").attr("x", 350).attr("y", 30).attr("text-anchor", "middle").attr("font-size", 16).attr("font-weight", "bold")
.text(`Storm Track Shift with ${warmingScenario}°C Warming`);
// Latitude axis
svg.append("line").attr("x1", 60).attr("y1", 360).attr("x2", 660).attr("y2", 360).attr("stroke", "#2d3436").attr("stroke-width", 2);
const latLabels = ["20°N", "30°N", "40°N", "50°N", "60°N", "70°N"];
latLabels.forEach((l, i) => {
const x = 80 + i * 110;
svg.append("text").attr("x", x).attr("y", 380).attr("text-anchor", "middle").attr("font-size", 11).text(l);
});
// Current storm track density (bell curve around 40-45°N)
const currentPeak = 300; // x position for 40°N
const shift = warmingScenario * 25; // shift northward with warming
// Historical curve
const points = d3.range(80, 640, 5).map(x => {
const y = 300 * Math.exp(-0.5 * Math.pow((x - currentPeak) / 100, 2));
return {x, y};
});
svg.append("path")
.attr("d", d3.line().x(d => d.x).y(d => 350 - d.y).curve(d3.curveBasis)(points))
.attr("stroke", "#3498db").attr("stroke-width", 2).attr("fill", "#3498db").attr("fill-opacity", 0.15)
.attr("stroke-dasharray", warmingScenario > 0 ? "5,3" : "0");
if (warmingScenario > 0) {
// Shifted curve
const shiftedPoints = d3.range(80, 640, 5).map(x => {
const y = 280 * Math.exp(-0.5 * Math.pow((x - currentPeak - shift) / 120, 2));
return {x, y};
});
svg.append("path")
.attr("d", d3.line().x(d => d.x).y(d => 350 - d.y).curve(d3.curveBasis)(shiftedPoints))
.attr("stroke", "#e74c3c").attr("stroke-width", 3).attr("fill", "#e74c3c").attr("fill-opacity", 0.2);
}
// NYC line
svg.append("line").attr("x1", 310).attr("y1", 50).attr("x2", 310).attr("y2", 355).attr("stroke", "#2d3436").attr("stroke-width", 1).attr("stroke-dasharray", "3,3");
svg.append("text").attr("x", 310).attr("y", 45).attr("text-anchor", "middle").attr("font-size", 12).attr("font-weight", "bold").text("NYC (41°N)");
// Legend
svg.append("line").attr("x1", 450).attr("y1", 70).attr("x2", 500).attr("y2", 70).attr("stroke", "#3498db").attr("stroke-width", 2).attr("stroke-dasharray", warmingScenario > 0 ? "5,3" : "0");
svg.append("text").attr("x", 510).attr("y", 74).attr("font-size", 11).text("Historical track density");
if (warmingScenario > 0) {
svg.append("line").attr("x1", 450).attr("y1", 90).attr("x2", 500).attr("y2", 90).attr("stroke", "#e74c3c").attr("stroke-width", 3);
svg.append("text").attr("x", 510).attr("y", 94).attr("font-size", 11).attr("fill", "#e74c3c").text(`Projected (+${warmingScenario}°C)`);
}
// Impact note
if (warmingScenario >= 2) {
svg.append("rect").attr("x", 100).attr("y", 270).attr("width", 500).attr("height", 50).attr("fill", "#fff3e0").attr("rx", 8);
svg.append("text").attr("x", 350).attr("y", 293).attr("text-anchor", "middle").attr("font-size", 13).attr("font-weight", "bold").attr("fill", "#e65100")
.text("⚠️ Storm tracks shift poleward — NYC may see fewer but potentially stronger storms");
}
return svg.node();
}🌍 As the planet warms, the jet stream and storm tracks are projected to shift poleward — changing which regions get storms and how intense they are! 🌍
Code
buildQuiz("precip-storm-shift", [
{
q: "The annual precipitation chart shows that regions near 30°N/S (Horse Latitudes) receive far less rainfall than the equator or the mid-latitudes. What atmospheric process explains this dryness?",
options: [
"Increased solar radiation at 30° evaporates rainfall before it reaches the ground",
"The Hadley Cell transports moisture away from 30° toward the equator",
"Sinking (subsiding) air in the Hadley Cell compresses and warms adiabatically, inhibiting cloud formation and suppressing precipitation",
"Ocean currents near 30° are too cold to supply evaporated moisture to the atmosphere"
],
correct: 2,
explanation: "The Hadley Cell drives warm air upward at the ITCZ (creating heavy equatorial rain), but that air must come back down somewhere — and it sinks at ~30°N/S. Sinking air is compressed as it descends into higher atmospheric pressure, warming adiabatically. Warm, compressed air has a very high capacity to hold water vapor without condensing — so clouds dissipate and precipitation is suppressed. This is why every major subtropical desert (Sahara, Arabian, Sonoran, Australian Outback) sits near 30°."
},
{
q: "The warming scenario simulator shows storm tracks shifting poleward with increasing temperature. At 4°C of warming, how would NYC's storm exposure most likely change?",
options: [
"NYC would see more storms as the poleward shift brings tropical storm systems further north",
"The storm track bell curve shifts north of NYC, meaning fewer storms hit the city but those that do arrive from a more northerly angle",
"Storm tracks would disappear entirely above 40°N as the jet stream weakens",
"NYC would experience more westward-tracking storms as the westerlies reverse direction"
],
correct: 1,
explanation: "When the peak storm track density shifts poleward (northward), regions at the southern edge of the current storm belt — like NYC at 41°N — could see fewer total storm events. However, any storms that do still track through the region may be more intense, because a warmer atmosphere holds more moisture (Clausius-Clapeyron) and warmer oceans supply more energy. The pattern is 'fewer but potentially more extreme' — the same paradox seen in NYC's blizzard data."
}
])35 Elaborate: ENSO — The Pacific’s Weather Remote Control
35.1 🌊 El Niño–Southern Oscillation (ENSO)
ENSO is a cyclical shift in Pacific Ocean temperatures and wind patterns that reorganizes storm tracks, precipitation, and hurricane activity across the entire planet. It is the single most powerful short-term driver of global weather variability — and climate change is making it more extreme.
35.1.1 🔑 Key Connections: ENSO and Storm Paths
- El Niño → fewer Atlantic hurricanes (increased wind shear) but more Eastern Pacific hurricanes
- La Niña → more Atlantic hurricanes (reduced wind shear) — 2005, 2010, 2020 seasons were all La Niña years
- El Niño → southern U.S. jet stream dips south, steering storms across the Gulf States into Florida
- La Niña → jet stream shifts north, routing storms across the Pacific Northwest and Great Plains
- ENSO cycles every 2–7 years and account for ~30% of year-to-year weather variability
- Climate change is projected to make extreme El Niño and La Niña events more frequent as the Pacific Ocean warms
Code
buildQuiz("enso-patterns", [
{
q: "During El Niño, Atlantic hurricane activity typically DECREASES even while Eastern Pacific hurricane activity increases. What causes the Atlantic suppression?",
options: [
"El Niño cools the Atlantic Ocean, removing the warm water energy hurricanes need",
"El Niño shifts the ITCZ north of the Atlantic, preventing tropical disturbances from forming",
"El Niño increases upper-level wind shear over the Atlantic, which tears apart developing hurricanes before they can organize",
"El Niño makes the Atlantic trade winds stronger, pushing storms away from the U.S. coast"
],
correct: 2,
explanation: "When El Niño shifts the Walker Circulation, it alters upper-level wind patterns over the Atlantic — creating stronger winds aloft that produce vertical wind shear. Wind shear is a hurricane's enemy: the difference in wind speed/direction between the surface and the upper atmosphere literally rips apart the developing storm's warm core. This is why El Niño years (like 1997–98 and 2023–24) tend to be quiet Atlantic hurricane seasons despite being brutally active in the Eastern Pacific."
},
{
q: "The historical ONI chart shows La Niña conditions in 2010–11. Weather records show the 2010 Atlantic hurricane season had 19 named storms — one of the most active ever. The Pacific Northwest had a wet, stormy winter in 2010–11. How does La Niña explain both observations?",
options: [
"La Niña is a coincidence — it does not actually affect storm patterns",
"La Niña warms the Atlantic and Pacific simultaneously, generating more storms everywhere",
"La Niña reduces Atlantic wind shear (favoring hurricanes) AND shifts the jet stream northward, routing more winter storms into the Pacific Northwest — opposite effects from El Niño",
"La Niña cools the Pacific Northwest, causing more snow to fall regardless of storm frequency"
],
correct: 2,
explanation: "La Niña is El Niño's mirror image. Where El Niño suppresses Atlantic hurricanes with increased shear, La Niña reduces that shear — creating favorable conditions for Atlantic hurricane development. And where El Niño steers the jet stream south across the U.S. (wetter South, drier North), La Niña shifts the jet northward — sending more Pacific storm systems into the Northwest. The same Pacific temperature anomaly creates completely different effects in different regions, illustrating the power of ENSO teleconnections."
}
])36 Evaluate: Putting It All Together
36.1 ✅ Assessment: Storm Paths, Wind, and Climate
You now have all the pieces to explain why storms follow the paths they do — and how those paths might shift. Let’s test your understanding!
🗺️ Storm Paths Myths vs. Facts
Think you know global winds and storm tracks? Is each statement a MYTH or a FACT?
36.1.1 🧠 Comprehensive Unit Quiz
Test your complete understanding of storm paths, global winds, and climate connections!
Code
buildUnitQuiz("storm-paths-unit-quiz", "🧠 Comprehensive Unit Quiz", [
{
q: "What is the FUNDAMENTAL cause of global atmospheric circulation and all surface wind patterns on Earth?",
options: [
"Earth's magnetic field creating pressure gradients near the poles",
"Uneven solar heating — the equator receives far more energy than the poles, creating temperature and pressure differences that drive air movement",
"The Moon's gravitational pull creating tidal forces in the atmosphere",
"Ocean evaporation pumping water vapor upward to power the global wind engine"
],
correct: 1,
explanation: "Everything flows from this: the equator intercepts sunlight at a steep angle (high energy density) while the poles receive sunlight at a shallow angle (spread over more area, less energy). This creates a permanent temperature gradient. Warm equatorial air rises, creating low pressure; cool polar air sinks, creating high pressure. This pressure difference drives air movement — all the wind on Earth traces back to this fundamental imbalance."
},
{
q: "Which atmospheric circulation cell directly controls the prevailing surface winds across New York City (41°N) and the rest of the northeastern United States?",
options: [
"Hadley Cell — the dominant equatorial convection cell",
"Polar Cell — cold air descending from the Arctic",
"Ferrel Cell — the mid-latitude cell producing westerly surface winds between 30°–60°N",
"Walker Cell — the Pacific equatorial circulation driven by sea surface temperatures"
],
correct: 2,
explanation: "The Ferrel Cell occupies 30°–60° latitude. Its surface winds blow from the southwest — the mid-latitude westerlies. NYC at 41°N sits squarely within this belt. These westerlies are the 'storm conveyor belt' that steers every Nor'easter, blizzard, and recurving hurricane from southwest to northeast across the eastern U.S. Understanding the Ferrel Cell is the key to explaining why NYC storms always seem to come from the southwest."
},
{
q: "In the Northern Hemisphere, the Coriolis effect deflects moving air to the right. Low-pressure systems in the Northern Hemisphere therefore rotate:",
options: [
"Clockwise — air deflected right as it spirals inward creates CW rotation",
"Counterclockwise — each rightward deflection of inward-flowing air adds up to a CCW spiral",
"In alternating directions — clockwise during El Niño, counterclockwise during La Niña",
"There is no rotation — the pressure gradient force overpowers Coriolis at the surface"
],
correct: 1,
explanation: "Picture air rushing from all directions toward a low-pressure center. In the Northern Hemisphere, each moving parcel is deflected to its right. Air flowing in from the south gets pushed west. Air from the north gets pushed east. Air from the east gets pushed north. The net result of all these rightward deflections is a counterclockwise rotation — cyclonic flow. This is why every Northern Hemisphere storm system (hurricanes, mid-latitude cyclones, blizzard-producers) rotates counterclockwise."
},
{
q: "A continental Polar (cP) air mass from Canada provides the cold temperatures for a major Nor'easter, but WHY does the storm produce heavy snowfall rather than just cold, clear weather?",
options: [
"cP air masses carry large amounts of moisture frozen from Canadian lakes",
"The cold cP air itself generates precipitation as it compresses and cools the atmosphere",
"A maritime Tropical (mT) air mass from the Gulf of Mexico provides the moisture — when it collides with the cP air at a front, warm moist air is lifted, cooled, and precipitates as snow",
"Heavy snowfall requires only very cold temperatures — the cP air alone is sufficient"
],
correct: 2,
explanation: "Cold air alone does NOT produce heavy snow — it is actually very dry. The heaviest snowstorms require TWO ingredients: (1) cold air below freezing (cP from Canada) to keep precipitation frozen, and (2) abundant moisture (mT from the Gulf/Atlantic) to provide the water vapor. When these collide at a frontal boundary, the warm moist air is forced upward, cools adiabatically, and condenses/freezes as heavy snowfall. Remove the Gulf moisture source and the same cold air produces only light flurries."
},
{
q: "During El Niño, which of the following best describes the combined effect on U.S. weather?",
options: [
"Wetter everywhere — more moisture in the atmosphere increases precipitation nationwide",
"Warmer/drier northern tier (Great Plains, Pacific Northwest), wetter southern tier (Gulf States, California); Atlantic hurricane season suppressed",
"Colder/wetter northern tier, drier southern tier; more Atlantic hurricanes due to warmer waters",
"El Niño only affects South America and has no significant teleconnections to the continental U.S."
],
correct: 1,
explanation: "El Niño shifts the subtropical jet stream southward across the U.S., routing more Pacific moisture into the southern tier (California floods, Gulf Coast rain). Meanwhile, the northern U.S. and Great Plains tend toward warmer and drier conditions. In the Atlantic, El Niño increases upper-level wind shear, suppressing hurricane development. The 1997–98 El Niño perfectly illustrates this: California floods, reduced Atlantic hurricane season, mild winter in the northern Plains."
},
{
q: "The jet stream simulation shows 'Wavy Pattern (Blocking)' with deep troughs and ridges. What specific weather hazards does this create for the mid-latitudes?",
options: [
"Faster storm movement only — storms are more intense but clear out within hours",
"Cold Arctic air can plunge far south through troughs while warm air surges north in ridges — AND storms can stall in one location, creating prolonged extreme events",
"Blocking eliminates storm formation entirely by disrupting the temperature gradients needed for cyclogenesis",
"Only drought is affected — blocking patterns have no influence on cold or winter storm events"
],
correct: 1,
explanation: "Rossby wave blocking creates two simultaneous hazards. First, spatial: deep troughs can push Arctic air into normally mild regions (e.g., sub-zero temperatures in Texas). Second, temporal: a blocked jet stream moves slowly — weather systems can stall over one area for days or weeks instead of passing through. This turns what would be a 2-day snowstorm into a week-long blizzard, or a 3-day heat wave into a deadly 2-week heat dome. Blocking is why some weather events become catastrophic while otherwise similar events remain routine."
},
{
q: "The global precipitation chart shows that areas near 30°N/S (Sahara, Arabian Desert, Australian Outback) are extremely dry. What is the direct atmospheric cause?",
options: [
"30° latitudes receive the most direct sunlight, drying out the surface through intense evaporation",
"The Coriolis effect deflects moisture-bearing winds away from 30° toward the equator and poles",
"The descending branch of the Hadley Cell brings sinking air that compresses, warms adiabatically, and inhibits cloud formation and precipitation",
"Ocean currents at 30°N/S are cold, preventing evaporation and reducing moisture in the air"
],
correct: 2,
explanation: "The Hadley Cell completes a circuit: warm moist air rises at the ITCZ (equatorial rain belt), travels poleward aloft, then SINKS back to the surface near 30°N/S. This sinking (subsiding) air is compressed as it descends into higher atmospheric pressure. Compression warms the air adiabatically — and warmer air can hold more moisture without condensing. The result: persistent high pressure, dissipating clouds, very low precipitation. The 'subtropical high' or 'horse latitudes' are the direct surface signature of this Hadley Cell sinking branch."
},
{
q: "La Niña strengthens the trade winds, cooling the eastern Pacific. Based on the ENSO teleconnections, which pair of outcomes would you expect in the United States during a strong La Niña winter?",
options: [
"Wetter southern U.S. and fewer Atlantic hurricanes — the opposite of El Niño in both cases",
"Drier southern U.S. (drought risk) AND more active Atlantic hurricane season the following summer",
"Warmer winter across the entire U.S. and reduced storm activity in all regions",
"La Niña has identical effects to El Niño — the direction of the SST anomaly does not matter"
],
correct: 1,
explanation: "La Niña is El Niño's mirror image in both effects. Where El Niño pushes the jet stream south (wetter Gulf States), La Niña shifts it north (drier South, wetter Pacific Northwest). And where El Niño suppresses Atlantic hurricanes with increased shear, La Niña REDUCES Atlantic shear — creating favorable conditions for hurricane development. The brutal 2010 Atlantic season (19 named storms, including Katia, Igor, and Julia) occurred during La Niña. Texas's catastrophic 2011 drought was also La Niña-driven."
},
{
q: "Arctic amplification describes the Arctic warming 2–4× faster than the global average. Through what mechanism does this specifically affect storm behavior in the mid-latitudes?",
options: [
"A warmer Arctic melts sea ice, releasing methane that directly heats the mid-latitude troposphere",
"The reduced temperature contrast between the Arctic and tropics weakens the polar jet stream, causing it to develop slower, larger Rossby wave meanders that can stall storms and allow polar air to penetrate deep into the mid-latitudes",
"Arctic amplification increases evaporation from the Arctic Ocean, supplying extra moisture to mid-latitude storm systems",
"The Arctic warming creates a permanent high-pressure center that deflects all mid-latitude storms toward Europe"
],
correct: 1,
explanation: "The polar jet stream is essentially a thermal wind — it exists because of the temperature contrast between cold polar and warm tropical air. When the Arctic warms faster, this contrast weakens. A weaker contrast = a less energetic jet that slows down and develops larger meanders. These deeper Rossby wave troughs can dip far south, bringing Arctic air into the southern U.S. (polar vortex events). The simultaneous stalling of these patterns means extreme weather lingers rather than moving through. This is the mechanistic link between Arctic warming and mid-latitude weather extremes."
},
{
q: "Climate models project that mid-latitude storm tracks will shift poleward as the planet warms. What does this mean for a city like New York City at 41°N?",
options: [
"NYC will experience more storms as the poleward shift brings tropical weather patterns northward",
"NYC may see fewer total storm events (storm track shifts north of 41°N), but any storms that do still impact the region could be more intense due to higher atmospheric moisture content",
"NYC will be unaffected — poleward shifts only change storm tracks by 1–2 degrees of latitude, which is negligible",
"Storm tracks will shift toward NYC as they move poleward from the subtropical regions"
],
correct: 1,
explanation: "If the peak storm track density shifts poleward, regions at the southern edge of the current storm belt — like NYC — could see fewer overall storm events. But 'fewer' does not mean 'weaker.' A warmer atmosphere holds more water vapor (Clausius-Clapeyron: ~7% more per degree of warming), and warmer oceans supply more energy. So any storm that does track over NYC could carry more moisture and produce heavier precipitation than historical events. This 'fewer but more intense' pattern is already visible in the NYC snowfall data — declining seasonal totals but record single-storm amounts in recent decades."
}
])37 Summary: Key Takeaways
| Concept | Key Idea |
|---|---|
| Uneven heating | Equator gets more solar energy → drives convection cells |
| Convection cells | Hadley, Ferrel, Polar cells redistribute heat globally |
| Coriolis effect | Earth’s rotation deflects winds → creates prevailing wind patterns |
| Westerlies | Dominant winds in 30°–60° latitude → steer storms SW → NE |
| Jet stream | Fast upper-level winds at cell boundaries → storm “highway” |
| Arctic amplification | Reduced gradient → wavier jet stream → storms may stall or shift |
| Storm tracks | Both hurricanes and blizzards are steered by the same global winds |
Next up: We’ll investigate how hurricanes form and why they only occur during certain months. 🌀