CMH-17 Composite Allowables (structures/composites/cmh17-allowables)
Use when the task is statistically based composite material design
allowables: A-basis and B-basis values from coupon test samples,
one-sided normal tolerance k-factors, coupon pooling across batches
and environments, and laminate-level allowables derived from lamina
allowables with knockdown factors. This leaf is the composite
counterpart of structures/materials/mmpsd-allowables (which treats
metals); it is also distinct from
structures/composites/laminate-stiffness, which computes the elastic
stiffness matrix rather than strength design values.
Domain quick reference
- A-basis: 95% confidence that 99% of the population exceeds the
value; B-basis: 95% confidence that 90% exceeds the value.
- One-sided normal tolerance k-factor (Owen/Odeh approximation):
z_c = 1.6448536269514722 (0.95 confidence); z_p = 2.3263478740408408
for A-basis content or 1.2815515655446004 for B-basis;
a = 1 - z_c^2/(2(n-1)); b = z_p^2 - z_c^2/n;
k = (z_p + sqrt(z_p^2 - a*b))/a.
- Allowable = sample mean - k * sample standard deviation.
- Common minimum samples: 10 for A-basis, 6 for B-basis; verify
against the current CMH-17 edition.
- Pooling: combine coupon batches (batches, environments) into one
effective sample; the pooled mean is the overall mean and the pooled
standard deviation is the within-batch pooled value
(sum((n_i - 1) s_i^2) / sum(n_i - 1))^0.5. The larger effective
sample count lowers the k-factor.
- Knockdown factors: environmental conditioning (hot/wet), barely
visible impact damage (BVID), and open hole features reduce the
lamina allowable to the laminate allowable; the combined factor is
the product of the individual factors, each in (0, 1].
- Where strength data are Weibull distributed, the content quantile
eta * (-ln(p))^(1/beta) from a two-parameter Weibull MLE fit is used
in place of the normal tolerance method.
- CMH-17 is the Composite Materials Handbook (proprietary, published
by SAE); name and paraphrase only, per standards-map.yaml and
research/briefs/06-legal-export-control.md. FAR-25 is the public
airworthiness context for transport category strength substantiation.
Workflow
- Gather the coupon test sample per material, batch, environment,
and property of interest; record the sample count.
- Check the sample count against the basis minimum with
check_sample_count.
- For a single batch, compute the k-factor with
k_factor_one_sided and the allowable with allowable_from_sample.
- For pooled data, call pooled_allowable with the batch list to get
the pooled mean, pooled standard deviation, effective n, k-factor,
and pooled allowable.
- For Weibull-distributed strength data, fit the two-parameter
Weibull with weibull_mle and derive the content quantile or basis
value with weibull_content_value / weibull_basis.
- Apply the environmental, BVID, and open hole knockdown factors to
each lamina allowable with knockdown to get the laminate
allowable.
- Assemble the lamina and laminate allowable table with
build_allowable_table; each row carries the basis designation and
the confidence/content statement from basis_statement.
- Confirm the deterministic checks with the contract test
scripts/test_cmh17_allowables.py.
Basis value statistics
The A- and B-basis design values follow the standard one-sided normal
tolerance approach: the allowable sits k sample standard deviations
below the sample mean. Because the k-factor grows as the sample
shrinks, small coupon samples produce conservative (low) allowables;
meeting the minimum sample count is the first validation step.
Pooling is the composite-specific refinement: coupon batches from
different panels, batches, or environments are combined into one
effective sample. The pooled standard deviation weights each batch by
its degrees of freedom, so batch-to-batch scatter is retained without
inflating the estimate by between-batch spread, and the larger
effective n reduces the k-factor and raises the allowable relative to
any single batch alone.
For strength distributions that are not normal, the two-parameter
Weibull fit provides the content quantile: with shape beta and scale
eta from the MLE, the value exceeded by fraction p of the population
is eta * (-ln(p))^(1/beta). The sample-size shrink (1 - 1/n) applied
in weibull_basis is a conservative engineering adjustment; the
authoritative confidence factors are the published CMH-17 values
(referenced, not reproduced).
Knockdown model
Laminate allowables are derived from lamina allowables by multiplying
the lamina value by each applicable knockdown factor, in (0, 1]:
- environmental conditioning factor: hot/wet conditioned strength
reduction (for example 0.9 for a wet elevated temperature case);
- barely visible impact damage (BVID) factor: compression and shear
strength reduction after impact (for example 0.85 for a
compression-dominated case);
- open hole factor: strength reduction at fastener holes (for example
0.95 for an open hole tension case).
Combined knockdown = env * bvid * hole; laminate allowable = lamina
allowable * combined. Each factor must be strictly between 0 and 1;
unit factors leave the allowable unchanged.
Worked example
A tension lamina coupon sample of 7 values is
[100, 102, 104, 106, 108, 110, 112] MPa. For B-basis:
- n = 7, mean = 106.0, sample standard deviation about 4.32.
- k_factor_one_sided(7, "B") is between 2.0 and 2.8; the allowable is
mean - k * sd, positive and below the sample mean.
- With the environmental factor 0.9, BVID factor 0.85, and open hole
factor 0.95, the combined knockdown is 0.9 * 0.85 * 0.95 = 0.72675
and the laminate allowable is about 27% below the lamina allowable.
- The table row carries the statement "B-basis: 95% confidence, 90%
content".
If the 7-value sample is split into batches of 4 and 3 across two
environments, pooling combines them into one effective sample of 7:
the pooled standard deviation stays within the batch spreads, the
k-factor is driven by the total n, and the pooled allowable is
computed from the overall mean.
Pitfalls
- Using the allowable below the minimum sample count: A-basis needs
about 10 coupons and B-basis about 6 (verify against the current
CMH-17 edition); smaller samples grow the k-factor and the value
loses its statistical meaning.
- Pooling when batches disagree: the pooled standard deviation is the
within-batch value sum((n_i - 1) s_i^2) / sum(n_i - 1), so it
retains batch scatter only if the batches are genuinely combinable;
pooling between-batch spread inflates the estimate.
- Applying the normal tolerance method to Weibull strength data: for
Weibull-distributed properties use the two-parameter MLE content
quantile eta * (-ln(p))^(1/beta), not the normal k-factor.
- Multiplying knockdown factors outside (0, 1]: each factor must be
strictly between 0 and 1; a factor at or above 1 (or at or below 0)
breaks the combined knockdown 0.9 * 0.85 * 0.95 = 0.72675 chain.
- Confusing the basis statements: A-basis is 95% confidence / 99%
content and B-basis is 95% confidence / 90% content; the table row
statement must match the requested basis.
- Forgetting this is lamina-to-laminate: the knockdown path derives
laminate allowables from lamina allowables; the elastic stiffness
side (not strength design values) belongs to laminate-stiffness,
and the metal counterpart is materials/mmpsd-allowables.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_cmh17_allowables.py
The test covers the k-factor bands and monotonicity, minimum sample
counts, allowables below the sample mean, pooling behavior (k shrinks
with effective n, pooled sd within batch spreads), Weibull content
values and basis values, knockdown reduction, the allowable table
builder, and invalid-input edge cases.
Compliance
- Standards referenced, not reproduced: CMH-17 (proprietary, SAE
publication) name + paraphrase only; mmpsd and far-25 resolve in
standards-map.yaml, both reference-only.
- compliance: STANDARDS-REF, gated: false.
1---2name: cmh17-allowables3description: Use when the task is composite allowables, basis values, coupon pooling, or laminate knockdown factors for polymer matrix composites. Compute composite material design allowables per the CMH-17 method: determine A-basis and B-basis values from coupon test data using the one-sided normal tolerance k-factor approximation, pool coupon batches across environments to enlarge the effective data set, and apply knockdown factors for environmental conditioning, barely visible impact damage, and open hole features to derive laminate-level allowables from lamina allowables. Produce the lamina and laminate allowable table with basis designation and the confidence and content statement, and validate the counts against the minimums. Trigger: composite allowables, cmh-17, a-basis, b-basis, tolerance k-factors, coupon pooling, laminate allowables, knockdown factors, environmental conditioning, open hole.4license: Apache-2.05---67# CMH-17 Composite Allowables (structures/composites/cmh17-allowables)89Use when the task is statistically based composite material design10allowables: A-basis and B-basis values from coupon test samples,11one-sided normal tolerance k-factors, coupon pooling across batches12and environments, and laminate-level allowables derived from lamina13allowables with knockdown factors. This leaf is the composite14counterpart of structures/materials/mmpsd-allowables (which treats15metals); it is also distinct from16structures/composites/laminate-stiffness, which computes the elastic17stiffness matrix rather than strength design values.1819## Domain quick reference2021- A-basis: 95% confidence that 99% of the population exceeds the22 value; B-basis: 95% confidence that 90% exceeds the value.23- One-sided normal tolerance k-factor (Owen/Odeh approximation):24 z_c = 1.6448536269514722 (0.95 confidence); z_p = 2.326347874040840825 for A-basis content or 1.2815515655446004 for B-basis;26 a = 1 - z_c^2/(2(n-1)); b = z_p^2 - z_c^2/n;27 k = (z_p + sqrt(z_p^2 - a*b))/a.28- Allowable = sample mean - k * sample standard deviation.29- Common minimum samples: 10 for A-basis, 6 for B-basis; verify30 against the current CMH-17 edition.31- Pooling: combine coupon batches (batches, environments) into one32 effective sample; the pooled mean is the overall mean and the pooled33 standard deviation is the within-batch pooled value34 (sum((n_i - 1) s_i^2) / sum(n_i - 1))^0.5. The larger effective35 sample count lowers the k-factor.36- Knockdown factors: environmental conditioning (hot/wet), barely37 visible impact damage (BVID), and open hole features reduce the38 lamina allowable to the laminate allowable; the combined factor is39 the product of the individual factors, each in (0, 1].40- Where strength data are Weibull distributed, the content quantile41 eta * (-ln(p))^(1/beta) from a two-parameter Weibull MLE fit is used42 in place of the normal tolerance method.43- CMH-17 is the Composite Materials Handbook (proprietary, published44 by SAE); name and paraphrase only, per standards-map.yaml and45 research/briefs/06-legal-export-control.md. FAR-25 is the public46 airworthiness context for transport category strength substantiation.4748## Workflow49501. Gather the coupon test sample per material, batch, environment,51 and property of interest; record the sample count.522. Check the sample count against the basis minimum with53 check_sample_count.543. For a single batch, compute the k-factor with55 k_factor_one_sided and the allowable with allowable_from_sample.564. For pooled data, call pooled_allowable with the batch list to get57 the pooled mean, pooled standard deviation, effective n, k-factor,58 and pooled allowable.595. For Weibull-distributed strength data, fit the two-parameter60 Weibull with weibull_mle and derive the content quantile or basis61 value with weibull_content_value / weibull_basis.626. Apply the environmental, BVID, and open hole knockdown factors to63 each lamina allowable with knockdown to get the laminate64 allowable.657. Assemble the lamina and laminate allowable table with66 build_allowable_table; each row carries the basis designation and67 the confidence/content statement from basis_statement.688. Confirm the deterministic checks with the contract test69 scripts/test_cmh17_allowables.py.7071## Basis value statistics7273The A- and B-basis design values follow the standard one-sided normal74tolerance approach: the allowable sits k sample standard deviations75below the sample mean. Because the k-factor grows as the sample76shrinks, small coupon samples produce conservative (low) allowables;77meeting the minimum sample count is the first validation step.7879Pooling is the composite-specific refinement: coupon batches from80different panels, batches, or environments are combined into one81effective sample. The pooled standard deviation weights each batch by82its degrees of freedom, so batch-to-batch scatter is retained without83inflating the estimate by between-batch spread, and the larger84effective n reduces the k-factor and raises the allowable relative to85any single batch alone.8687For strength distributions that are not normal, the two-parameter88Weibull fit provides the content quantile: with shape beta and scale89eta from the MLE, the value exceeded by fraction p of the population90is eta * (-ln(p))^(1/beta). The sample-size shrink (1 - 1/n) applied91in weibull_basis is a conservative engineering adjustment; the92authoritative confidence factors are the published CMH-17 values93(referenced, not reproduced).9495## Knockdown model9697Laminate allowables are derived from lamina allowables by multiplying98the lamina value by each applicable knockdown factor, in (0, 1]:99100- environmental conditioning factor: hot/wet conditioned strength101 reduction (for example 0.9 for a wet elevated temperature case);102- barely visible impact damage (BVID) factor: compression and shear103 strength reduction after impact (for example 0.85 for a104 compression-dominated case);105- open hole factor: strength reduction at fastener holes (for example106 0.95 for an open hole tension case).107108Combined knockdown = env * bvid * hole; laminate allowable = lamina109allowable * combined. Each factor must be strictly between 0 and 1;110unit factors leave the allowable unchanged.111112## Worked example113114A tension lamina coupon sample of 7 values is115[100, 102, 104, 106, 108, 110, 112] MPa. For B-basis:116117- n = 7, mean = 106.0, sample standard deviation about 4.32.118- k_factor_one_sided(7, "B") is between 2.0 and 2.8; the allowable is119 mean - k * sd, positive and below the sample mean.120- With the environmental factor 0.9, BVID factor 0.85, and open hole121 factor 0.95, the combined knockdown is 0.9 * 0.85 * 0.95 = 0.72675122 and the laminate allowable is about 27% below the lamina allowable.123- The table row carries the statement "B-basis: 95% confidence, 90%124 content".125126If the 7-value sample is split into batches of 4 and 3 across two127environments, pooling combines them into one effective sample of 7:128the pooled standard deviation stays within the batch spreads, the129k-factor is driven by the total n, and the pooled allowable is130computed from the overall mean.131132133## Pitfalls134135- Using the allowable below the minimum sample count: A-basis needs136 about 10 coupons and B-basis about 6 (verify against the current137 CMH-17 edition); smaller samples grow the k-factor and the value138 loses its statistical meaning.139- Pooling when batches disagree: the pooled standard deviation is the140 within-batch value sum((n_i - 1) s_i^2) / sum(n_i - 1), so it141 retains batch scatter only if the batches are genuinely combinable;142 pooling between-batch spread inflates the estimate.143- Applying the normal tolerance method to Weibull strength data: for144 Weibull-distributed properties use the two-parameter MLE content145 quantile eta * (-ln(p))^(1/beta), not the normal k-factor.146- Multiplying knockdown factors outside (0, 1]: each factor must be147 strictly between 0 and 1; a factor at or above 1 (or at or below 0)148 breaks the combined knockdown 0.9 * 0.85 * 0.95 = 0.72675 chain.149- Confusing the basis statements: A-basis is 95% confidence / 99%150 content and B-basis is 95% confidence / 90% content; the table row151 statement must match the requested basis.152- Forgetting this is lamina-to-laminate: the knockdown path derives153 laminate allowables from lamina allowables; the elastic stiffness154 side (not strength design values) belongs to laminate-stiffness,155 and the metal counterpart is materials/mmpsd-allowables.156## Behavior contract (gate 3)157158Run the deterministic contract test (stdlib unittest, offline):159160 python3 scripts/test_cmh17_allowables.py161162The test covers the k-factor bands and monotonicity, minimum sample163counts, allowables below the sample mean, pooling behavior (k shrinks164with effective n, pooled sd within batch spreads), Weibull content165values and basis values, knockdown reduction, the allowable table166builder, and invalid-input edge cases.167168## Compliance169170- Standards referenced, not reproduced: CMH-17 (proprietary, SAE171 publication) name + paraphrase only; mmpsd and far-25 resolve in172 standards-map.yaml, both reference-only.173- compliance: STANDARDS-REF, gated: false.