|
| 1 | +# Blog Posts for underworldcode.org (Ghost) |
| 2 | + |
| 3 | +Building blocks for the two GMD papers and the 3.0.0 release announcement. |
| 4 | +Each post is self-contained but feeds into larger pieces. |
| 5 | + |
| 6 | +## Status Key |
| 7 | +- **draft**: outline or raw notes exist |
| 8 | +- **ready**: content written, needs review |
| 9 | +- **published**: live on underworldcode.org |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +## The Release Anchor |
| 14 | + |
| 15 | +1. **"Underworld3 Reaches 3.0.0"** |
| 16 | + Status: draft (uw3-release-announcement.md — to be written last) |
| 17 | + Feeds into: index for all other posts |
| 18 | + Content: What changed since 0.99/JOSS. New features, fixed bugs, API changes. |
| 19 | + Links out to the explanatory posts below. |
| 20 | + |
| 21 | +## Origin Story |
| 22 | + |
| 23 | +2. **"Our Journey from Underworld2 to Underworld3"** |
| 24 | + Status: **published** (2026-03-23) |
| 25 | + Feeds into: Paper 1 introduction, release post |
| 26 | + Content: UW1 and UW2 as the same engine in different clothes. Why we rewrote: |
| 27 | + PETSc maturity, StGermain liability, hex-only meshes, SWIG agony, SNES unlock. |
| 28 | + What SymPy gave us. What UW3 can do that UW2 could not (curved BCs, coordinates, |
| 29 | + constitutive models without C, swappable time derivatives). |
| 30 | + |
| 31 | +## Symbolic Machinery (→ Paper 1) |
| 32 | + |
| 33 | +3. **"How Underworld3 Turns SymPy into C"** |
| 34 | + Status: **published** (2026-04-01) |
| 35 | + Feeds into: Paper 1 core (sections 4–6) |
| 36 | + Content: The six-stage JIT pipeline: strong form templates, automatic Jacobians, |
| 37 | + symbolic wrappers, unwrapping/non-dimensionalisation, C code generation, |
| 38 | + per-function caching, PETSc callback registration. |
| 39 | + URL: https://www.underworldcode.org/how-underworld3-turns-sympy-into-c/ |
| 40 | + |
| 41 | +4. **"Automatic Jacobians for Free"** |
| 42 | + Status: not started |
| 43 | + Feeds into: Paper 1 (solver integration) |
| 44 | + Content: How symbolic differentiation eliminates hand-coded Newton derivatives. |
| 45 | + Why this was impossible in UW2 (opaque C Functions). SNES integration. |
| 46 | + |
| 47 | +5. **"Constitutive Models as Symbolic Objects"** |
| 48 | + Status: not started |
| 49 | + Feeds into: Paper 1 (constitutive models) |
| 50 | + Content: Composable rheology: viscous, plastic, elastic, transverse isotropic. |
| 51 | + How SymPy lets you mix and simplify material laws interactively. |
| 52 | + Contrast with UW2's fn.rheology (one C class per model). |
| 53 | + |
| 54 | +6. **"Constants That Aren't Constant"** |
| 55 | + Status: not started |
| 56 | + Feeds into: Paper 1 (expression system) |
| 57 | + Content: The PetscDS constants mechanism for routing UWexpressions to C variables. |
| 58 | + Why this matters for time-dependent coefficients (BDF/AM ramp, continuation). |
| 59 | + |
| 60 | +7. **"Time Derivatives You Can See"** |
| 61 | + Status: not started |
| 62 | + Feeds into: Paper 1 (time discretisation) |
| 63 | + Content: The DDt hierarchy: Lagrangian, Semi-Lagrangian, Eulerian, Symbolic. |
| 64 | + How BDF/AM schemes appear as symbolic rewrites. Contrast with UW2's fixed RK4. |
| 65 | + |
| 66 | +8. **"Natural Mathematical Syntax in Scientific Python"** |
| 67 | + Status: not started |
| 68 | + Feeds into: Paper 1 (mathematical objects) |
| 69 | + Content: The MathematicalMixin: why `density * velocity` works. |
| 70 | + How operator overloading connects to SymPy's Matrix API. |
| 71 | + |
| 72 | +## Units & Scaling (→ Paper 1) |
| 73 | + |
| 74 | +9. **"Physical Units in Computational Geodynamics"** |
| 75 | + Status: not started |
| 76 | + Feeds into: Paper 1 (units system) |
| 77 | + Content: The Pint-based units system. String input, object storage, |
| 78 | + transparent container principle. Why units not dimensionality. |
| 79 | + |
| 80 | +10. **"Non-dimensionalisation Without Tears"** |
| 81 | + Status: not started |
| 82 | + Feeds into: Paper 1 (units system) |
| 83 | + Content: Reference quantities, nondimensional unwrapping mode, |
| 84 | + solver works in scaled space while user thinks in physical units. |
| 85 | + |
| 86 | +## Particles & Surfaces (→ Paper 2) |
| 87 | + |
| 88 | +11. **"Finding Particles in a Parallel Mesh"** |
| 89 | + Status: not started |
| 90 | + Feeds into: Paper 2 core |
| 91 | + Content: How particle-to-processor assignment works: DMSwarm migration, |
| 92 | + spatial indexing, the handshake between PETSc's mesh decomposition and |
| 93 | + particle ownership. What happens when particles cross processor boundaries. |
| 94 | + |
| 95 | +12. **"Particles That Know Calculus"** |
| 96 | + Status: not started |
| 97 | + Feeds into: Paper 2 (proxy variables) |
| 98 | + Content: Swarm variables as first-class symbolic objects. Proxy mesh |
| 99 | + variables via RBF projection. How particle data participates in weak forms. |
| 100 | + |
| 101 | +13. **"Stress Has a History"** |
| 102 | + Status: not started |
| 103 | + Feeds into: Paper 2 (material history) |
| 104 | + Content: Viscoelastic stress storage and advection. Explicit stress |
| 105 | + history architecture. Order-1 vs order-2 validation. |
| 106 | + |
| 107 | +14. **"Ghost Boundaries Done Right"** |
| 108 | + Status: not started |
| 109 | + Feeds into: Paper 2 (boundary integrals) |
| 110 | + Content: Internal and external boundary integrals in parallel. |
| 111 | + The ownership problem, PETSc patches, MPI-correct integration. |
| 112 | + |
| 113 | +15. **"Tracking Interfaces in Large Deformation"** |
| 114 | + Status: not started |
| 115 | + Feeds into: Paper 2 (surfaces) |
| 116 | + Content: Material interfaces, level-set weighted composites, |
| 117 | + population control. |
| 118 | + |
| 119 | +## Geometry & Meshing (→ Paper 2) |
| 120 | + |
| 121 | +16. **"Meshing for Planetary Scale"** |
| 122 | + Status: not started |
| 123 | + Feeds into: Paper 2 (meshing) |
| 124 | + Content: Cubed-sphere construction, RegionalSphericalBox, |
| 125 | + geodetic projections. Why lat-lon grids have singularities. |
| 126 | + |
| 127 | +17. **"Geographic Meshes for Regional Geodynamics"** |
| 128 | + Status: not started |
| 129 | + Feeds into: Paper 2 (meshing) |
| 130 | + Content: Ellipsoidal Earth geometry with topography, |
| 131 | + RegionalGeographicBox, boundary labelling, coordinate transforms. |
| 132 | + Real-world regional modelling with proper geodesy. |
| 133 | + |
| 134 | +18. **"Symbolic Geometry: Differential Operators in Curvilinear Coordinates"** |
| 135 | + Status: not started |
| 136 | + Feeds into: Paper 1 or 2 (coordinates) |
| 137 | + Content: How gradient/divergence/curl auto-adjust for |
| 138 | + spherical/cylindrical via the coordinate system factory. |
| 139 | + |
| 140 | +19. **"Adaptive Meshes That Follow the Physics"** |
| 141 | + Status: not started |
| 142 | + Feeds into: Paper 2 (adaptivity) |
| 143 | + Content: Metric-tensor-based adaptation, swarm-mediated variable |
| 144 | + transfer during remeshing. |
| 145 | + |
| 146 | +## Infrastructure & Craft |
| 147 | + |
| 148 | +20. **"Mesh Variables and PETSc Vectors: Keeping Arrays in Sync"** |
| 149 | + Status: not started |
| 150 | + Feeds into: Paper 1 & 2 |
| 151 | + Content: The self-validating data cache, NDArray_With_Callback, |
| 152 | + why `with mesh.access()` is gone and direct `.data[...]` works now. |
| 153 | + Contrast with UW2's context managers. |
| 154 | + |
| 155 | +21. **"Safe Parallelism Without MPI Expertise"** |
| 156 | + Status: not started |
| 157 | + Feeds into: Paper 2 |
| 158 | + Content: uw.pprint(), selective_ranks(), why PETSc handles the |
| 159 | + hard parts. The MPICH-on-macOS scaling bug story. |
| 160 | + |
| 161 | +22. **"From Notebook to Supercomputer in Zero Edits"** |
| 162 | + Status: not started |
| 163 | + Feeds into: Paper 1 (introspection) |
| 164 | + Content: How the same Jupyter notebook runs on a laptop and |
| 165 | + 12,000 cores. Mathematical display, literate computing philosophy. |
| 166 | + |
| 167 | +23. **"Interactive 3D Geodynamics in a Browser"** |
| 168 | + Status: not started |
| 169 | + Feeds into: neither paper directly |
| 170 | + Content: PyVista/trame integration, P2 field visualisation, |
| 171 | + server proxy detection. Contrast with UW2's LavaVu. |
| 172 | + |
| 173 | +## Development Process |
| 174 | + |
| 175 | +24. **"AI and Scientific Software: What We Learned Rebuilding Underworld3"** |
| 176 | + Status: **published** (2026-03-23) |
| 177 | + Feeds into: standalone (high interest) |
| 178 | + Content: Co-evolution of code and AI tools. Four phases from first contact |
| 179 | + to productivity jumps. What works, what doesn't, the units system slog. |
| 180 | + URL: https://www.underworldcode.org/ai-and-scientific-software-what-we-learned-rebuilding-underworld3/ |
| 181 | + |
| 182 | +25. **"Notation Gymnastics in Continuum Mechanics"** |
| 183 | + Status: not started |
| 184 | + Feeds into: Paper 1 (tensors) |
| 185 | + Content: Voigt, Mandel, full tensor. Why Mandel preserves inner |
| 186 | + products. Dimension-independent indexing. |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +## Suggested Writing Order |
| 191 | + |
| 192 | +Priority based on: feeds into papers, standalone interest, dependency chain. |
| 193 | + |
| 194 | +| # | Post | Why first | |
| 195 | +|---|------|-----------| |
| 196 | +| 1 | Journey from UW2 to UW3 (#2) | Sets up everything else | |
| 197 | +| 2 | SymPy into C (#3) | Paper 1 centrepiece | |
| 198 | +| 3 | Finding particles (#11) | Paper 2 centrepiece | |
| 199 | +| 4 | Units (#9) | Foundation, standalone interest | |
| 200 | +| 5 | AI strategy (#24) | Standalone, high external interest | |
| 201 | +| 6 | Arrays in sync (#20) | Practical, bridges both papers | |
| 202 | +| 7 | Release announcement (#1) | Written last, links to all others | |
0 commit comments