# Rough Wall Skin Friction

> Use when you must estimate the turbulent skin-friction on a rough flat plate: it computes the smooth-wall turbulent baseline Cf from the local Reynolds number, the friction velocity and the sand-roughness reynolds number k+; classifies the k-plus-regime as smooth, transitional or fully rough; evaluates the Schlichting fully-rough-cf correlation for the fetch; and selects the operative coefficient without iteration, the direct fully-rough value or a log-linear blend. Produces the regime class, k+ value, smooth baseline, rough or blended coefficient, operative coefficient with treatment note, and the trip-criterion verdict for roughness and trip-strip sizing on aerodynamic surfaces. Trigger: rough-wall-skin-friction, sand-roughness-height, equivalent-sand-roughness, roughness-reynolds-number, k-plus-regime, fully-rough-cf, trip-criterion, trip-strip-sizing.

- Skill: `ashfordeou/rough-wall-skin-friction` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add ashfordeou/rough-wall-skin-friction`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ashfordeou/rough-wall-skin-friction/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: ashfordeOU (https://skillmd.com/u/ashfordeou)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ashfordeou/rough-wall-skin-friction

---


# Rough Wall Skin Friction (aerodynamics/boundary-layer/rough-wall-skin-friction)

Use when the task is estimating the turbulent skin-friction coefficient
of a rough flat plate in incompressible flow from the equivalent
sand-roughness height: smooth-wall turbulent baseline, friction velocity,
roughness Reynolds number k+, surface regime classification, the
fully-rough-cf correlation and a non-iterative coefficient selection with
a documented log-linear blend, plus the trip-criterion test for a
roughness element or trip strip. This leaf implements the classical
roughness band model in pure Python, stdlib only, with the module
constants from the leaf spec (SMOOTH_K_PLUS = 5.0, FULLY_ROUGH_K_PLUS =
70.0, ROUGH_MIN_X_OVER_KS = 100.0, TRIP_RE_K = 600.0). It pairs with
aerodynamics/boundary-layer/boundary-layer-theory, whose smooth-plate
correlations supply the smooth-wall baseline anchor, and with
aerodynamics/drag-polars/parasite-drag, whose buildup can consume the
rough coefficient as the component Cf.

## Domain quick reference

- Smooth-wall turbulent baseline (1/7 power law):
  cf_smooth = 0.0592 / re_x**0.2, with re_x = rho * u_inf * x / mu the
  local Reynolds number at the fetch station x. The rough surface can
  only raise friction above this baseline.
- Friction velocity: u_tau = u_inf * sqrt(cf / 2), the shear velocity
  that scales the roughness.
- Roughness Reynolds number: k+ = rho * u_tau * k_s / mu, formed on the
  equivalent sand-roughness height k_s.
- Regime bands on k+ (classic thresholds): smooth below 5.0,
  transitional from 5.0 through 70.0, fully rough above 70.0. A
  hydraulically smooth surface keeps the smooth-wall coefficient; only a
  transitional or fully-rough surface needs a roughness correction.
- Fully-rough correlation (Schlichting, long-fetch form):
  cf_rough = (2.87 + 1.58 * log10(x / k_s))**(-2.5). Calibrated for long
  fetches, so x / k_s must reach the 100.0 validity floor; the value
  falls as the fetch grows.
- Transitional blend: log-linear in ln(k+) between cf_smooth at k+ 5.0
  and cf_rough at k+ 70.0, frac = (ln k+ - ln 5.0) / (ln 70.0 - ln 5.0)
  and cf = exp(ln cf_smooth + frac * (ln cf_rough - ln cf_smooth)),
  continuous and monotone in k+. The blend is a documented engineering
  approximation across the transitional band.
- Trip test: re_k = u * k / nu for an element of height k; trip is
  expected when re_k >= 600.0, the classical critical roughness
  Reynolds value (paraphrase of standard trip-sizing guidance).
- Units are SI throughout: kg/m3, m/s, Pa s, m.
- NACA-TR-824 frames the classical boundary-layer context; the relations
  above are standard engineering methodology, summary-only.

## Workflow

1. Fix the flow state and the fetch station: density rho, speed u_inf,
   dynamic viscosity mu (nu = mu / rho), the station x from the leading
   edge and the sand-roughness height k_s. Form re_x = rho * u_inf * x /
   mu.
2. Compute the smooth-wall turbulent baseline with
   smooth_turbulent_cf(re_x), the 1/7 power-law local friction that the
   roughness correction departs from.
3. Convert the baseline into a friction velocity with
   friction_velocity(u_inf, cf_smooth) = u_inf * sqrt(cf / 2).
4. Form the roughness Reynolds number with
   sand_roughness_reynolds(rho, u_tau, k_s, mu) = rho * u_tau * k_s / mu.
5. Classify the surface regime with classify_regime(k_s_plus): smooth,
   transitional or fully-rough on the 5.0 and 70.0 thresholds.
6. Evaluate the fully-rough correlation for the fetch with
   rough_wall_cf(x, k_s), valid only when x / k_s >= 100.0.
7. Select the operative coefficient without iteration:
   cf_with_roughness(re_x, x, k_s, rho, u_inf, mu) chains steps 2 through
   6 and returns the dict {regime, k_s_plus, cf_smooth,
   cf_rough_or_iterated, cf_used, note}. The smooth regime keeps
   cf_smooth (roughness hydraulically inactive), the fully-rough regime
   uses cf_rough directly, and the transitional regime takes the
   log-linear blend; cf_rough_or_iterated holds whatever the roughness
   treatment produces and cf_used equals it by construction. The note is
   the fixed treatment string for the regime.
8. Run the trip test on the roughness element with trip_criterion(u_inf,
   k, nu), comparing re_k = u_inf * k / nu against the 600.0 critical
   value (inclusive). This gates roughness and trip-strip sizing on
   aerodynamic surfaces.
9. Confirm the deterministic checks with the contract test
   scripts/test_rough_wall_skin_friction.py.

## Worked example

Standard air rho = 1.225 kg/m3, u_inf = 60 m/s, mu = 1.81e-5 Pa s
(nu = 1.47755e-5 m2/s), station x = 2.0 m. re_x = rho * u_inf * x / mu =
8.12155e6, baseline cf_smooth = 0.0592 * re_x**-0.2 = 2.45694e-3 and the
friction velocity u_tau = 2.10297 m/s.

- k_s = 0.3 mm: x / k_s = 6666.67, k+ = rho * u_tau * k_s / mu = 42.6984,
  so the k-plus-regime is transitional. The fully-rough-cf correlation
  value is 4.21783e-3 and the log-linear blend gives cf_used =
  3.81178e-3, between the smooth baseline and the fully rough value.
  trip_criterion: re_k = 1218.23, above 600, trip_expected True.
- k_s = 3 mm: x / k_s = 666.67, k+ = 426.984, fully-rough, and cf_used =
  cf_rough = 6.87032e-3, about 2.8 times the smooth baseline, the
  expected penalty for a heavily sanded surface at this short fetch.
  trip_criterion: re_k = 12182.3, trip_expected True. Fetch sensitivity
  of the same 3 mm roughness: at x = 6 m (x / k_s = 2000) the
  fully-rough-cf value drops to 5.37918e-3 and at x = 20 m (x / k_s =
  6666.67) to 4.21783e-3, the correlation falling as the fetch grows.
- Smooth reference: k_s = 1e-5 m gives k+ = 1.42328 (smooth) and cf_used
  = cf_smooth = 2.45694e-3; a small element k = 3e-5 m gives re_k =
  121.823, trip_expected False.
- Regime boundary checks: k+ = 4.999 smooth, k+ = 5.0 transitional, k+ =
  70.0 transitional, k+ = 70.001 fully-rough.

## Verification

- Confirm smooth_turbulent_cf(8.12155e6) = 2.45694e-3 within 1e-8 and
  that it rejects re_x <= 0.
- Confirm classify_regime boundaries: 4.999 smooth, 5.0 transitional,
  70.0 transitional, 70.001 fully-rough, and ValueError below zero.
- Confirm friction_velocity(60.0, 2.45694e-3) = 2.10297 within 1e-5 and
  the sqrt closed form.
- Confirm sand_roughness_reynolds returns k+ 42.6984 (0.3 mm) and
  426.984 (3 mm) within 1e-3, and the linearity identity: 10x k_s gives
  10x k+.
- Confirm rough_wall_cf(2.0, 3e-3) = 6.87032e-3, (2.0, 3e-4) =
  4.21783e-3, (6.0, 3e-3) = 5.37918e-3 and (20.0, 3e-3) = 4.21783e-3
  within 1e-7, monotone in x / k_s, with ValueError below the x / k_s =
  100.0 floor and on zero inputs.
- Confirm the cf_with_roughness report dicts for the transitional,
  fully-rough and smooth cases above, with exactly the six documented
  keys and fixed per-regime note strings.
- Confirm the blend endpoints: k+ 5.0 returns cf_smooth and k+ 70.0
  returns cf_rough exactly (within 1e-15), monotone between.
- Confirm the trip verdicts: re_k 1218.23 True, 121.823 False and the
  inclusive boundary at re_k = 600.0 True.
- Confirm every non-physical input raises ValueError: non-positive re_x,
  k_s_plus, u_inf, cf, rho, u_tau, mu, x, u, k, nu and re_k_crit.
- Run the contract test offline: python3
  scripts/test_rough_wall_skin_friction.py (30 tests, deterministic).

## Related leaves

- aerodynamics/boundary-layer/boundary-layer-theory: the smooth flat
  plate thickness and friction correlations that supply the smooth-wall
  baseline anchor of step 2; it takes no roughness-height input.
- aerodynamics/boundary-layer/boundary-layer-transition: natural
  transition prediction on a clean surface, the complementary question
  to the trip test when the surface is smooth.
- aerodynamics/boundary-layer/boundary-layer-separation: Thwaites and
  Stratford separation criteria for the same boundary-layer family, no
  friction coefficient.
- aerodynamics/high-speed/flat-plate-skin-friction-heating: the
  high-speed smooth-wall friction and heating counterpart; use it when
  the flow is compressible.
- aerodynamics/drag-polars/parasite-drag: the smooth-surface drag
  buildup that can consume the rough coefficient as the component Cf in
  a full-aircraft buildup.

## Pitfalls

- Calling a surface smooth from the sand-roughness height alone: the
  regime depends on k+, not on k_s; at the worked example the 0.3 mm
  grain is transitional (k+ 42.7) while the same grain at low speed or
  short fetch can be hydraulically smooth.
- Applying the fully-rough-cf correlation at a short fetch: below x / k_s
  = 100.0 the correlation saturates to unphysical values and the module
  rejects the input.
- Reading cf_used as the converged rough value when the baseline is
  smooth: the single-pass sequence never iterates, so in the smooth
  regime cf_rough_or_iterated is simply the smooth-wall baseline with
  the roughness hydraulically inactive.
- Treating the trip test as an onset location: the trip criterion is a
  threshold verdict on re_k, not a transition-onset distance; scatter in
  the actual onset is out of scope for this deterministic core.
- Mixing the regime thresholds: the transitional band is inclusive at
  both ends, k+ 5.0 and 70.0, and the blend is anchored exactly there.
- Sizing a trip strip with the roughness Reynolds of the surface grain
  instead of the element: the trip test uses the element height k in
  u * k / nu against the 600 critical value.

## Behavior contract (gate 3)

Run the deterministic contract test (stdlib unittest, offline):

    python3 scripts/test_rough_wall_skin_friction.py

The test covers the module constants, the step-2 smooth-wall baseline
anchor and its monotone Reynolds scaling, the step-3 friction velocity
anchor and closed form, the step-4 sand-roughness reynolds anchors and
the 10x height linearity identity, the step-5 k-plus-regime boundary
classifications, the step-6 fully-rough-cf anchors across three fetches
and the fetch-ratio floor, the step-7 transitional, fully-rough and
smooth report dicts with the exact six keys, determinism and fixed note
strings, the blend endpoint identities at k+ 5.0 and 70.0 with monotone
mid-band behavior, the step-8 trip-criterion anchors with the inclusive
600 boundary and the default critical constant, and ValueError rejection
of every non-physical input class. 30 tests, deterministic, exits 0.

## Compliance

- Standards referenced, not reproduced: NACA-TR-824 provides the
  classical boundary-layer context for the skin-friction and roughness
  correlations; the relations above are standard engineering
  methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.

