|
1 | 1 | --- |
2 | 2 | title: GFD Portal |
3 | 3 | --- |
4 | | - |
5 | | -<style> |
6 | | -*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } |
7 | | - |
8 | | -.gfd-wrap { |
9 | | - width: 100vw; |
10 | | - position: relative; |
11 | | - left: 50%; |
12 | | - margin-left: -50vw; |
13 | | - background: linear-gradient(160deg, #0f2744 0%, #0e3d5c 50%, #082f45 100%); |
14 | | - color: #e2e8f0; |
15 | | - padding: 3rem 1.5rem 4rem; |
16 | | - font-family: "Inter var", "Inter", system-ui, sans-serif; |
17 | | -} |
18 | | - |
19 | | -.gfd-inner { |
20 | | - max-width: 900px; |
21 | | - margin: 0 auto; |
22 | | -} |
23 | | - |
24 | | -.gfd-hero { |
25 | | - text-align: center; |
26 | | - margin-bottom: 3rem; |
27 | | -} |
28 | | -.gfd-hero h1 { |
29 | | - font-size: 2.2rem; |
30 | | - font-weight: 600; |
31 | | - letter-spacing: -0.01em; |
32 | | - color: #7dd3fc; |
33 | | - margin-bottom: 0.75rem; |
34 | | -} |
35 | | -.gfd-hero p { |
36 | | - font-size: 1rem; |
37 | | - color: #94a3b8; |
38 | | - line-height: 1.7; |
39 | | - max-width: 620px; |
40 | | - margin: 0 auto; |
41 | | -} |
42 | | - |
43 | | -.gfd-cards { |
44 | | - display: grid; |
45 | | - grid-template-columns: repeat(auto-fit, minmax(380px, 1fr)); |
46 | | - gap: 1.5rem; |
47 | | -} |
48 | | - |
49 | | -.gfd-card { |
50 | | - background: rgba(10, 25, 47, 0.7); |
51 | | - border: 1px solid rgba(255, 255, 255, 0.1); |
52 | | - border-radius: 12px; |
53 | | - padding: 1.75rem; |
54 | | - display: flex; |
55 | | - flex-direction: column; |
56 | | - gap: 1rem; |
57 | | - transition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease; |
58 | | - backdrop-filter: blur(6px); |
59 | | -} |
60 | | -.gfd-card:hover { |
61 | | - border-color: #06b6d4; |
62 | | - transform: translateY(-3px); |
63 | | - box-shadow: 0 8px 30px rgba(6, 182, 212, 0.15); |
64 | | -} |
65 | | - |
66 | | -.gfd-tag { |
67 | | - font-family: monospace; |
68 | | - font-size: 0.7rem; |
69 | | - text-transform: uppercase; |
70 | | - letter-spacing: 0.12em; |
71 | | - color: #06b6d4; |
72 | | - background: rgba(6, 182, 212, 0.1); |
73 | | - border: 1px solid rgba(6, 182, 212, 0.35); |
74 | | - border-radius: 4px; |
75 | | - padding: 2px 9px; |
76 | | - display: inline-block; |
77 | | - width: fit-content; |
78 | | -} |
79 | | - |
80 | | -.gfd-card h2 { |
81 | | - font-size: 1.15rem; |
82 | | - font-weight: 600; |
83 | | - color: #e2e8f0 !important; |
84 | | - line-height: 1.3; |
85 | | - margin: 0; |
86 | | -} |
87 | | - |
88 | | -.gfd-desc { |
89 | | - font-size: 0.9rem; |
90 | | - color: #94a3b8 !important; |
91 | | - line-height: 1.65; |
92 | | - flex-grow: 1; |
93 | | - margin: 0; |
94 | | -} |
95 | | - |
96 | | -.gfd-eq { |
97 | | - font-family: "Courier New", Courier, monospace; |
98 | | - font-size: 0.85rem; |
99 | | - color: #67e8f9; |
100 | | - background: rgba(6, 182, 212, 0.06); |
101 | | - border: 1px solid rgba(6, 182, 212, 0.2); |
102 | | - border-radius: 6px; |
103 | | - padding: 0.6rem 0.9rem; |
104 | | - line-height: 1.5; |
105 | | -} |
106 | | - |
107 | | -.gfd-highlights { |
108 | | - list-style: none !important; |
109 | | - padding: 0 !important; |
110 | | - margin: 0 !important; |
111 | | - display: flex; |
112 | | - flex-direction: column; |
113 | | - gap: 0.35rem; |
114 | | -} |
115 | | -.gfd-highlights li { |
116 | | - font-size: 0.875rem; |
117 | | - color: #94a3b8 !important; |
118 | | - padding-left: 1.1rem !important; |
119 | | - position: relative; |
120 | | - line-height: 1.5; |
121 | | - margin: 0 !important; |
122 | | -} |
123 | | -.gfd-highlights li::before { |
124 | | - content: "✦"; |
125 | | - position: absolute; |
126 | | - left: 0; |
127 | | - color: #06b6d4; |
128 | | - font-size: 0.6rem; |
129 | | - top: 0.25rem; |
130 | | -} |
131 | | - |
132 | | -.gfd-btn-link { |
133 | | - display: inline-block; |
134 | | - text-align: center; |
135 | | - padding: 0.6rem 1.3rem; |
136 | | - background: #0369a1; |
137 | | - color: #e0f2fe !important; |
138 | | - border-radius: 7px; |
139 | | - text-decoration: none !important; |
140 | | - font-size: 0.9rem; |
141 | | - font-weight: 500; |
142 | | - transition: background 0.2s ease; |
143 | | - align-self: flex-start; |
144 | | - margin-top: auto; |
145 | | -} |
146 | | -.gfd-btn-link:hover { |
147 | | - background: #0284c7; |
148 | | - color: #fff !important; |
149 | | -} |
150 | | - |
151 | | -.gfd-footer-note { |
152 | | - margin-top: 3.5rem; |
153 | | - text-align: center; |
154 | | - font-size: 0.8rem; |
155 | | - color: #475569; |
156 | | - line-height: 1.8; |
157 | | -} |
158 | | -.gfd-footer-note a { |
159 | | - color: #475569; |
160 | | - text-decoration: underline; |
161 | | - text-underline-offset: 2px; |
162 | | -} |
163 | | -.gfd-footer-note a:hover { color: #7dd3fc; } |
164 | | - |
165 | | -@media (max-width: 820px) { |
166 | | - .gfd-cards { grid-template-columns: 1fr; } |
167 | | - .gfd-hero h1 { font-size: 1.6rem; } |
168 | | -} |
169 | | -</style> |
170 | | - |
171 | | -<div class="gfd-wrap"> |
172 | | - <div class="gfd-inner"> |
173 | | - |
174 | | - <div class="gfd-hero"> |
175 | | - <h1>Geophysical Fluid Dynamics</h1> |
176 | | - <p>Interactive pedagogical notebooks exploring the mathematics and physics |
177 | | - of rotating, stratified geophysical flows. Each notebook runs entirely in |
178 | | - your browser via WebAssembly — no installation required.</p> |
179 | | - </div> |
180 | | - |
181 | | - <div class="gfd-cards"> |
182 | | - |
183 | | - <div class="gfd-card"> |
184 | | - <span class="gfd-tag">Convection</span> |
185 | | - <h2>Rayleigh-Bénard Convection & Lorenz Chaos</h2> |
186 | | - <p class="gfd-desc">2D thermal convection in a Boussinesq fluid heated from below. |
187 | | - Truncating the governing equations to three Fourier amplitudes yields the Lorenz (1963) |
188 | | - system — the canonical model of deterministic chaos and the original "butterfly effect."</p> |
189 | | - <div class="gfd-eq">Ra = g α ΔT H³ / (ν κ)</div> |
190 | | - <ul class="gfd-highlights"> |
191 | | - <li>Lattice-Boltzmann D2Q9 solver with real-time rendering</li> |
192 | | - <li>Lorenz attractor: sensitive dependence on initial conditions</li> |
193 | | - <li>Bifurcation from conduction → steady rolls → chaos</li> |
194 | | - <li>Nusselt number as a function of Rayleigh number</li> |
195 | | - </ul> |
196 | | - <a href="/gfd/rayleighbenard.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a> |
197 | | - </div> |
198 | | - |
199 | | - <div class="gfd-card"> |
200 | | - <span class="gfd-tag">Rotating Fluids</span> |
201 | | - <h2>Geostrophic Adjustment & Shallow Water Waves</h2> |
202 | | - <p class="gfd-desc">Linearised shallow water equations on a rotating beta-plane. |
203 | | - A Gaussian height perturbation simultaneously radiates fast inertia-gravity waves |
204 | | - and slowly adjusts toward geostrophic balance, with Rossby waves drifting westward |
205 | | - via the β-effect.</p> |
206 | | - <div class="gfd-eq">ω² = f² + c²(k² + l²) · L_R = c / f₀</div> |
207 | | - <ul class="gfd-highlights"> |
208 | | - <li>Pseudo-spectral RK4 solver on a doubly-periodic domain</li> |
209 | | - <li>Inertia-gravity vs. Rossby wave dispersion relations</li> |
210 | | - <li>Rossby deformation radius controls adjustment scale</li> |
211 | | - <li>KE / PE energy partition during geostrophic adjustment</li> |
212 | | - </ul> |
213 | | - <a href="/gfd/shallowwater.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a> |
214 | | - </div> |
215 | | - |
216 | | - <div class="gfd-card"> |
217 | | - <span class="gfd-tag">Turbulence</span> |
218 | | - <h2>2D Navier-Stokes Turbulence</h2> |
219 | | - <p class="gfd-desc">Decaying turbulence governed by the 2D incompressible Navier-Stokes |
220 | | - equations in vorticity-streamfunction form. Unlike 3D turbulence, energy cascades |
221 | | - <em>upscale</em> while enstrophy cascades to small scales — a consequence of the |
222 | | - additional conservation law in two dimensions.</p> |
223 | | - <div class="gfd-eq">∂ω/∂t + J(ψ, ω) = ν ∇²ω</div> |
224 | | - <ul class="gfd-highlights"> |
225 | | - <li>Pseudo-spectral solver with 2/3-rule dealiasing</li> |
226 | | - <li>Inverse energy cascade: k⁻⁵/³ power-law spectrum</li> |
227 | | - <li>Forward enstrophy cascade: k⁻³ spectrum</li> |
228 | | - <li>Vortex merging and coherent structure formation</li> |
229 | | - </ul> |
230 | | - <a href="/gfd/twodnavierstokes.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a> |
231 | | - </div> |
232 | | - |
233 | | - <div class="gfd-card"> |
234 | | - <span class="gfd-tag">Stratification</span> |
235 | | - <h2>Internal Gravity Waves</h2> |
236 | | - <p class="gfd-desc">Internal waves propagate through a stably stratified fluid, |
237 | | - carrying energy at angles set by the ratio of wave frequency to the Brunt-Väisälä |
238 | | - frequency. Their peculiar dispersion relation — energy and phase propagate |
239 | | - perpendicular to each other — makes them unlike any surface wave.</p> |
240 | | - <div class="gfd-eq">N² = -(g/ρ₀)(∂ρ/∂z) · ω = N cos θ</div> |
241 | | - <ul class="gfd-highlights"> |
242 | | - <li>Brunt-Väisälä (buoyancy) frequency and stable stratification</li> |
243 | | - <li>Angle-dependent dispersion: group velocity ⊥ phase velocity</li> |
244 | | - <li>Saint Andrews Cross wave-beam pattern</li> |
245 | | - <li>Wave reflection, focusing, and critical layers</li> |
246 | | - </ul> |
247 | | - <a href="/gfd/internalwaves.html" class="gfd-btn-link" target="_blank">▶ Open Notebook</a> |
248 | | - </div> |
249 | | - |
250 | | - </div> |
251 | | - |
252 | | - <div class="gfd-footer-note"> |
253 | | - Built with <a href="https://marimo.io" target="_blank">marimo</a> & |
254 | | - <a href="https://numpy.org" target="_blank">NumPy</a> · |
255 | | - Runs in-browser via <a href="https://pyodide.org" target="_blank">Pyodide</a> WebAssembly · |
256 | | - <a href="https://github.com/aneeshcs/aneeshcs.github.io" target="_blank">Source on GitHub</a> |
257 | | - </div> |
258 | | - |
259 | | - </div> |
260 | | -</div> |
0 commit comments