Skip to content

Commit 801f6a9

Browse files
sbryngelsonclaude
andcommitted
Add gallery cards, SEO improvements, and per-page dates
- Add 3 new simulation gallery cards (earplug, orifice, particle cloud) - Add JSON-LD structured data to landing page for rich search results - Add per-page meta description to Doxygen header template - Switch sitemap from txt to xml format for better SEO - Add inject-dates.py build step for per-page last-updated dates - Use full git history in docs CI for accurate file dates Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0e6bdcf commit 801f6a9

10 files changed

Lines changed: 80 additions & 4 deletions

File tree

.github/workflows/docs.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ jobs:
1515

1616
steps:
1717
- uses: actions/checkout@v4
18+
with:
19+
fetch-depth: 0 # Full history for per-page last-updated dates
1820

1921
# We build doxygen from source because of
2022
# https://github.com/doxygen/doxygen/issues/9016
@@ -51,7 +53,7 @@ jobs:
5153
base-url-path: https://mflowcode.github.io/
5254
path-to-root: build/install/docs/mfc
5355
include-pdf: false
54-
sitemap-format: txt
56+
sitemap-format: xml
5557

5658
- name: Output stats
5759
run: |

.lychee.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ accept = ["200", "429"]
1717
verbose = "error"
1818

1919
# Exclude sitemap from link checking (it contains pre-publish production URLs)
20-
exclude_path = ["**/sitemap.txt"]
20+
exclude_path = ["**/sitemap.xml"]

CMakeLists.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,24 @@ if (MFC_DOCUMENTATION)
806806
GEN_DOCS(post_process "MFC: Post-Process")
807807
GEN_DOCS(documentation "MFC")
808808

809+
# Inject per-page last-updated dates into documentation markdown files.
810+
# Runs after auto-generated .md files exist, before Doxygen processes them.
811+
# Uses a stamp file so it only runs once per build.
812+
add_custom_command(
813+
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/inject-dates.stamp"
814+
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/docs/documentation/examples.md"
815+
"${CMAKE_CURRENT_SOURCE_DIR}/docs/documentation/case_constraints.md"
816+
"${CMAKE_CURRENT_SOURCE_DIR}/docs/documentation/physics_constraints.md"
817+
"${CMAKE_CURRENT_SOURCE_DIR}/docs/documentation/cli-reference.md"
818+
"${CMAKE_CURRENT_SOURCE_DIR}/docs/documentation/parameters.md"
819+
COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/docs/inject-dates.py"
820+
"${CMAKE_CURRENT_SOURCE_DIR}"
821+
COMMAND "${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/inject-dates.stamp"
822+
COMMENT "Injecting page dates into documentation"
823+
)
824+
add_custom_target(inject_page_dates DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/inject-dates.stamp")
825+
add_dependencies(documentation_doxygen inject_page_dates)
826+
809827
# > Copy Resources (main landing page & assets)
810828
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/docs/res"
811829
DESTINATION "docs/mfc")

docs/header.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
<meta name="viewport" content="width=device-width, initial-scale=1"/>
1919
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
2020
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
21-
<meta name=”keywords” content="exascale, fluid dynamics, cfd, computational fluid dynamics, compressible, hpc, bryngelson, colonius, subgrid, multiphase, frontier, summit, el capitan, aurora, amd gpu, gpu, nvidia"/>
21+
<meta name="description" content="$title — MFC documentation. Open-source exascale multiphase flow solver." />
22+
<meta name="keywords" content="exascale, fluid dynamics, cfd, computational fluid dynamics, compressible, hpc, bryngelson, colonius, subgrid, multiphase, frontier, summit, el capitan, aurora, amd gpu, gpu, nvidia"/>
2223
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
2324
<script type="text/javascript" src="$relpath^jquery.js"></script>
2425
<script type="text/javascript" src="$relpath^dynsections.js"></script>

docs/index.html

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,27 @@
2323
<meta property="og:url" content="https://mflowcode.github.io" />
2424
<meta property="og:type" content="website" />
2525
<meta name="twitter:card" content="summary_large_image" />
26+
<script type="application/ld+json">
27+
{
28+
"@context": "https://schema.org",
29+
"@type": "SoftwareApplication",
30+
"name": "MFC",
31+
"alternateName": "Multi-Component Flow Code",
32+
"description": "Open-source exascale multiphase flow solver. 2025 Gordon Bell Prize Finalist. Scales to 200+ trillion grid points on 43,000+ GPUs.",
33+
"url": "https://mflowcode.github.io",
34+
"applicationCategory": "Scientific Computing",
35+
"operatingSystem": "Linux, macOS",
36+
"license": "https://opensource.org/licenses/MIT",
37+
"programmingLanguage": ["Fortran", "Python"],
38+
"codeRepository": "https://github.com/MFlowCode/MFC",
39+
"author": {
40+
"@type": "Organization",
41+
"name": "MFlowCode",
42+
"url": "https://github.com/MFlowCode"
43+
},
44+
"award": "2025 ACM Gordon Bell Prize Finalist"
45+
}
46+
</script>
2647
<script src="https://cdn.tailwindcss.com"></script>
2748
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
2849
<link rel="icon" type="image/x-icon" href="res/icon.ico">
@@ -43,9 +64,12 @@
4364
{ name: "Cavitation fragments kidney stone", image: "res/simulations/d.png", computer: "Summit", computerUrl: "https://www.olcf.ornl.gov/summit/", accelerators: "576 V100s", walltime: "30 min", source: "https://doi.org/10.48550/arXiv.2305.09163" },
4465
{ name: "Kidney stone stress waves", image: "res/simulations/l.png", computer: "Bridges2", computerUrl: "https://www.psc.edu/resources/bridges-2/", accelerators: "8 V100s", walltime: "20m", source: "https://www.youtube.com/watch?v=Q2L0J68qnRw" },
4566
{ name: "Whale bubble net feeding", image: "res/simulations/p.png", computer: "Delta", computerUrl: "https://www.ncsa.illinois.edu/research/project-highlights/delta/", accelerators: "128 A100s", walltime: "30m", source: "https://www.youtube.com/watch?v=6EpP6tdCZSA" },
67+
{ name: "Earplug acoustics (kinetic energy)", image: "res/simulations/q.png", computer: "Delta", computerUrl: "https://www.ncsa.illinois.edu/research/project-highlights/delta/", accelerators: "8 A100s", walltime: "5h", source: "https://www.youtube.com/watch?v=xSW5wZkdbrc" },
68+
{ name: "Circular orifice (1 kHz)", image: "res/simulations/r.png", computer: "Delta", computerUrl: "https://www.ncsa.illinois.edu/research/project-highlights/delta/", accelerators: "16 A100s", walltime: "5h", source: "https://www.youtube.com/watch?v=jOhJ_c7eco4" },
4669
// Bubble dynamics
4770
{ name: "Collapsing bubbles (pressure)", image: "res/simulations/b.png", computer: "Summit", computerUrl: "https://www.olcf.ornl.gov/summit/", accelerators: "216 V100s", walltime: "3h", source: "https://doi.org/10.48550/arXiv.2305.09163" },
4871
{ name: "Collapsing bubbles (streamlines)", image: "res/simulations/c.png", computer: "Summit", computerUrl: "https://www.olcf.ornl.gov/summit/", accelerators: "216 V100s", walltime: "3h", source: "https://doi.org/10.48550/arXiv.2305.09163" },
72+
{ name: "Euler-Lagrange particle cloud", image: "res/simulations/s.png", computer: "Phoenix", computerUrl: "https://www.pace.gatech.edu/", accelerators: "8 A100s", walltime: "<1h", source: "https://www.youtube.com/watch?v=RoT-yC5Lxmg" },
4973
// Fundamentals
5074
{ name: "Breakup of vibrated interface", image: "res/simulations/f.png", computer: "Summit", computerUrl: "https://www.olcf.ornl.gov/summit/", accelerators: "128 V100s", walltime: "4h", source: "https://www.youtube.com/watch?v=XQ3g1oSg8mc" },
5175
{ name: "Viscous Taylor-Green vortex", image: "res/simulations/h.png", computer: "Delta", computerUrl: "https://www.ncsa.illinois.edu/research/project-highlights/delta/", accelerators: "128 A100s", walltime: "17h", source: "https://www.youtube.com/watch?v=7i2h08dlDQw" },

docs/inject-dates.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env python3
2+
"""Inject last-updated dates into docs before Doxygen runs.
3+
4+
Usage: python3 inject-dates.py [source_dir]
5+
source_dir defaults to current directory.
6+
"""
7+
import subprocess
8+
import sys
9+
from pathlib import Path
10+
from datetime import date
11+
12+
src_dir = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(".")
13+
docs_dir = src_dir / "docs" / "documentation"
14+
15+
for md_file in sorted(docs_dir.glob("*.md")):
16+
if "Page last updated:" in md_file.read_text():
17+
continue
18+
19+
result = subprocess.run(
20+
["git", "log", "-1", "--format=%as", "--", str(md_file)],
21+
capture_output=True, text=True,
22+
cwd=str(src_dir),
23+
)
24+
page_date = result.stdout.strip() or str(date.today())
25+
26+
with open(md_file, "a") as f:
27+
f.write(
28+
f"\n\n<div style='text-align:center; font-size:0.75rem; "
29+
f"color:#888; padding:16px 0 0;'>"
30+
f"Page last updated: {page_date}</div>\n"
31+
)

docs/res/simulations/q.png

202 KB
Loading

docs/res/simulations/r.png

113 KB
Loading

docs/res/simulations/s.png

3.91 MB
Loading

docs/robots.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
User-agent: *
22
Allow: /
33

4-
Sitemap: https://mflowcode.github.io/sitemap.txt
4+
Sitemap: https://mflowcode.github.io/sitemap.xml

0 commit comments

Comments
 (0)