Skip to content

Commit d0b2cab

Browse files
aeronautyclaude
andcommitted
chore: bump versions to 1.1.3/1.1.5 and add What's New + ShowMe for Re modes
- UI version 1.1.2 → 1.1.3, Python version 1.1.4 → 1.1.5 - Add changelog entry for Mode 1/2/3 Reynolds type selector with tour slide - Add ShowMe micro-tour (reTypeModes) for guided walkthrough of the feature - Document re_type and reynolds_eff in Python API docs (python-api.mdx) - Add data-tour attribute for ShowMe targeting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent ff24bf7 commit d0b2cab

7 files changed

Lines changed: 106 additions & 6 deletions

File tree

docs-site/docs/python-api.mdx

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,26 @@ for defl in [0, 5, 10, 15]:
137137
polar = f.polar(alpha=(-4, 14, 1.0), Re=1e6)
138138
```
139139

140+
### Variable-Reynolds modes (Type 2 & 3)
141+
142+
XFOIL supports three Reynolds number constraint types for polar sweeps.
143+
Pass `re_type=` to `solve()` or `polar()`:
144+
145+
| Mode | Constraint | Effective Re | Use case |
146+
| --- | --- | --- | --- |
147+
| 1 (default) | Constant Re | Re | Standard wind-tunnel polar |
148+
| 2 | Fixed Re·√CL | Re / √\|CL\| | Aircraft cruise (lift = weight) |
149+
| 3 | Fixed Re·CL | Re / \|CL\| | Propeller / turbomachinery blades |
150+
151+
```python
152+
# Mode 2: as CL changes, speed adjusts → effective Re varies
153+
result = foil.solve(alpha=5.0, Re=1e6, re_type=2)
154+
print(result.reynolds_eff) # effective Re after Mode 2 adjustment
155+
156+
# Full polar with variable Re
157+
polar = foil.polar(alpha=(-5, 15, 0.5), Re=1e6, re_type=2)
158+
```
159+
140160
### Inviscid analysis
141161

142162
```python
@@ -240,8 +260,9 @@ are byte-identical.
240260
| `.panel_coords` | Repaneled coordinates `list[(x, y)]` |
241261
| `.hash` | SHA-256 hash of panel coords (cache key) |
242262
| `.with_flap(hinge_x, deflection, hinge_y_frac, n_panels)` | Return new Airfoil with flap deflected |
243-
| `.solve(alpha, Re, mach, ncrit, max_iter, viscous, store)` | Single-point analysis |
244-
| `.polar(alpha, Re, mach, ncrit, max_iter, viscous, store, parallel)` | Sweep over alpha range (parallel by default) |
263+
| `.solve(alpha, Re, mach, ncrit, max_iter, viscous, store, re_type)` | Single-point analysis (`re_type`: 1, 2, or 3) |
264+
| `.polar(alpha, Re, mach, ncrit, max_iter, viscous, store, parallel, re_type)` | Sweep over alpha range (parallel by default) |
265+
| `.bl_distribution(alpha, Re, mach, ncrit, max_iter, re_type)` | Boundary-layer distribution at a single alpha |
245266

246267
### SolveResult
247268

@@ -256,7 +277,8 @@ are byte-identical.
256277
| `.x_tr_upper` | `float` | Transition x/c, upper surface |
257278
| `.x_tr_lower` | `float` | Transition x/c, lower surface |
258279
| `.alpha` | `float` | Angle of attack (degrees) |
259-
| `.reynolds` | `float` | Reynolds number |
280+
| `.reynolds` | `float` | Reynolds number (nominal) |
281+
| `.reynolds_eff` | `float \| None` | Effective Reynolds after Mode 2/3 adjustment |
260282
| `.mach` | `float` | Mach number |
261283
| `.ncrit` | `float` | e^N transition criterion |
262284
| `.ld` | `float \| None` | Lift-to-drag ratio |

flexfoil-ui/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "flexfoil-ui",
33
"private": true,
44
"license": "MIT",
5-
"version": "1.1.2",
5+
"version": "1.1.3",
66
"type": "module",
77
"scripts": {
88
"dev": "vite",

flexfoil-ui/src/components/panels/SolvePanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,7 @@ export function SolvePanel() {
896896
)}
897897

898898
{isViscous && (
899-
<div className="form-group">
899+
<div className="form-group" data-tour="solve-re-type">
900900
<div className="form-label">Mode</div>
901901
<div style={{ display: 'flex', gap: '4px', marginBottom: '4px' }}>
902902
{([1, 2, 3] as ReType[]).map((m) => (

flexfoil-ui/src/lib/version.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,33 @@ export interface ChangelogEntry {
2828
}
2929

3030
export const CHANGELOG: ChangelogEntry[] = [
31+
{
32+
version: '1.1.3',
33+
date: '2026-03-23',
34+
items: [
35+
{ category: 'added', text: 'Reynolds type mode selector (Mode 1/2/3) in the Solve panel — choose between constant Re, fixed Re·√CL, or fixed Re·CL for polar sweeps', showMeTourId: 'showMe:reTypeModes' },
36+
{ category: 'added', text: 'Mode 2 (fixed Re·√CL): effective Reynolds varies inversely with √CL — models flight conditions where lift equals weight and speed adjusts' },
37+
{ category: 'added', text: 'Mode 3 (fixed Re·CL): effective Reynolds varies inversely with CL — for propeller blades and turbomachinery sections' },
38+
{ category: 'added', text: 'Python API: re_type parameter on solve(), polar(), and bl_distribution() — pass re_type=2 or re_type=3 for variable-Re analysis' },
39+
{ category: 'added', text: 'Python API: reynolds_eff field on SolveResult — reports the effective Reynolds after Mode 2/3 adjustment' },
40+
{ category: 'changed', text: 'Mode 1 (constant Re) remains the default — existing workflows are unaffected' },
41+
],
42+
tourSlides: [
43+
{
44+
title: 'Reynolds Type Modes',
45+
description: 'Choose how Reynolds number varies during a polar sweep',
46+
icon: '🔄',
47+
items: [
48+
'Mode 1: constant Re (default) — standard fixed-Re polar',
49+
'Mode 2: fixed Re·√CL — Re varies with flight speed as CL changes',
50+
'Mode 3: fixed Re·CL — for propeller and turbomachinery conditions',
51+
'Available in single-point solves, polar sweeps, and multi-parameter sweeps',
52+
],
53+
goTo: { panel: 'solve', label: 'Open Solve panel' },
54+
showMeTourId: 'showMe:reTypeModes',
55+
},
56+
],
57+
},
3158
{
3259
version: '1.1.2',
3360
date: '2026-03-20',

flexfoil-ui/src/onboarding/showMe/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { dataAnalysisShowMe } from './dataAnalysis';
1414
import { solverQueueShowMe } from './solverQueue';
1515
import { seligDatabaseShowMe } from './seligDatabase';
1616
import { smartGroupShowMe } from './smartGroup';
17+
import { reTypeModesShowMe } from './reTypeModes';
1718

1819
export const showMeTours: Record<string, TourStep[]> = {
1920
'showMe:flapDesign': flapDesignShowMe,
@@ -22,6 +23,7 @@ export const showMeTours: Record<string, TourStep[]> = {
2223
'showMe:solverQueue': solverQueueShowMe,
2324
'showMe:seligDatabase': seligDatabaseShowMe,
2425
'showMe:smartGroup': smartGroupShowMe,
26+
'showMe:reTypeModes': reTypeModesShowMe,
2527
};
2628

2729
export {
@@ -31,4 +33,5 @@ export {
3133
solverQueueShowMe,
3234
seligDatabaseShowMe,
3335
smartGroupShowMe,
36+
reTypeModesShowMe,
3437
};
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Show Me: Reynolds Type Modes (1/2/3)
3+
*
4+
* Short guided tour showing the Mode 1/2/3 selector in the Solve panel.
5+
* Launched from the "What's New" changelog dialog.
6+
*/
7+
8+
import type { TourStep } from '../tours';
9+
10+
export const reTypeModesShowMe: TourStep[] = [
11+
{
12+
element: '[data-tour="solve-mode"]',
13+
focusPanel: 'solve',
14+
popover: {
15+
title: 'Viscous Solver',
16+
description:
17+
'Make sure the <strong>Viscous</strong> solver is active — Mode selection only applies to viscous analysis.',
18+
side: 'left',
19+
align: 'start',
20+
},
21+
},
22+
{
23+
element: '[data-tour="solve-re-type"]',
24+
focusPanel: 'solve',
25+
popover: {
26+
title: 'Reynolds Type Modes',
27+
description:
28+
'<strong>Mode 1</strong> (default): constant Re. ' +
29+
'<strong>Mode 2</strong>: fixed Re·√CL — Re varies with speed as CL changes (aircraft cruise). ' +
30+
'<strong>Mode 3</strong>: fixed Re·CL — for propeller or turbomachinery blades.',
31+
side: 'left',
32+
align: 'start',
33+
},
34+
},
35+
{
36+
element: '[data-tour="solve-alpha"]',
37+
focusPanel: 'solve',
38+
popover: {
39+
title: 'Try It',
40+
description:
41+
'Set a mode, enter an angle of attack, and click <strong>Run</strong>. ' +
42+
'In Mode 2 or 3, the effective Reynolds number will vary with CL — you\'ll see different drag predictions compared to Mode 1.',
43+
side: 'left',
44+
align: 'start',
45+
},
46+
challengeId: 'run-solve',
47+
},
48+
];

packages/flexfoil-python/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
44

55
[project]
66
name = "flexfoil"
7-
version = "1.1.4"
7+
version = "1.1.5"
88
description = "Airfoil analysis in Python — XFOIL-faithful solver with a local web UI"
99
readme = "README.md"
1010
license = { text = "MIT" }

0 commit comments

Comments
 (0)