@geotechcli/core 0.4.107 → 0.4.109

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -199,6 +199,7 @@ export interface FemExcavationSupportDesignCheckInput {
199
199
  cohesionKpa: number;
200
200
  surchargeKpa?: number;
201
201
  waterTableDepthM?: number;
202
+ stageDepthsM?: number[];
202
203
  supportLevelsM: number[];
203
204
  allowableSupportLoadKnPerM: number;
204
205
  requiredPassiveSafetyFactor?: number;
@@ -212,16 +213,30 @@ export interface FemDesignCheck {
212
213
  unit?: string;
213
214
  status: 'accepted' | 'blocked';
214
215
  }
216
+ export interface FemExcavationSupportStageCheck {
217
+ id: string;
218
+ stageDepthM: number;
219
+ installedSupportLevelsM: number[];
220
+ activeEarthPressureKnPerM: number;
221
+ supportReactionDemandKnPerM: number;
222
+ supportCapacitySafetyFactor: number;
223
+ blockerCodes: string[];
224
+ status: 'accepted' | 'blocked';
225
+ }
215
226
  export interface FemExcavationSupportDesignCheckResult {
216
227
  schemaVersion: 'fem-excavation-support-design-check.v1';
217
228
  method: 'rankine-earth-pressure-support-screening';
229
+ designScope: 'screening-only-not-structural-design';
218
230
  activeEarthPressureKnPerM: number;
219
231
  passiveToeResistanceKnPerM: number;
220
232
  supportDemandKnPerM: number;
221
233
  supportCapacitySafetyFactor: number;
222
234
  passiveSafetyFactor: number;
223
235
  basalHeaveSafetyFactor: number;
236
+ stageChecks: FemExcavationSupportStageCheck[];
224
237
  checks: FemDesignCheck[];
238
+ acceptanceBlockers: string[];
239
+ productionBlockers: string[];
225
240
  status: 'accepted' | 'blocked';
226
241
  policy: FemConvergencePolicy;
227
242
  }
@@ -253,6 +268,51 @@ export interface FemReviewerApprovalValidation {
253
268
  blockerCodes: string[];
254
269
  warnings: string[];
255
270
  }
271
+ export type FemExternalBenchmarkSourceType = 'published-source' | 'commercial-solver' | 'open-source-solver';
272
+ export type FemExternalBenchmarkToleranceType = 'absolute' | 'relative' | 'absolute-or-relative';
273
+ export interface FemExternalBenchmarkPublishedCitation {
274
+ title: string;
275
+ authors: string[];
276
+ year: number;
277
+ publication?: string;
278
+ doi?: string;
279
+ url?: string;
280
+ section?: string;
281
+ }
282
+ export interface FemExternalBenchmarkReferenceSolverCitation {
283
+ name: string;
284
+ version: string;
285
+ vendor?: string;
286
+ analysisProcedure?: string;
287
+ elementType?: string;
288
+ }
289
+ export interface FemExternalBenchmarkReference {
290
+ id: string;
291
+ sourceType: FemExternalBenchmarkSourceType;
292
+ label: string;
293
+ citation: string;
294
+ publishedSource?: FemExternalBenchmarkPublishedCitation;
295
+ referenceSolver?: FemExternalBenchmarkReferenceSolverCitation;
296
+ }
297
+ export interface FemExternalBenchmarkQuantityRequirement {
298
+ id: string;
299
+ feature: FemEngineeringKernelFeature;
300
+ quantity: string;
301
+ unit: string;
302
+ tolerance: number;
303
+ toleranceType: FemExternalBenchmarkToleranceType;
304
+ requiredReferenceSourceTypes: FemExternalBenchmarkSourceType[];
305
+ }
306
+ export interface FemExternalBenchmarkAcceptanceContract {
307
+ schemaVersion: 'fem-external-benchmark-acceptance-metadata.v1';
308
+ status: 'metadata-ready' | 'blocked';
309
+ productionReadinessBlocked: boolean;
310
+ requiredSourceTypes: FemExternalBenchmarkSourceType[];
311
+ references: FemExternalBenchmarkReference[];
312
+ requiredQuantities: FemExternalBenchmarkQuantityRequirement[];
313
+ blockerCodes: string[];
314
+ acceptanceStatement: string;
315
+ }
256
316
  export interface FemEngineeringBenchmarkCase {
257
317
  id: string;
258
318
  feature: FemEngineeringKernelFeature;
@@ -271,10 +331,15 @@ export interface FemEngineeringEvidenceReport {
271
331
  productionReady: false;
272
332
  verifiedFeatures: FemEngineeringKernelFeature[];
273
333
  benchmarks: FemEngineeringBenchmarkCase[];
334
+ externalBenchmarkAcceptance: FemExternalBenchmarkAcceptanceContract;
274
335
  convergencePolicy: FemConvergencePolicy;
275
336
  remainingProductionBlockers: string[];
276
337
  releasePositioning: string;
277
338
  }
339
+ export declare function buildFemExternalBenchmarkAcceptanceContract(options?: {
340
+ references?: readonly FemExternalBenchmarkReference[];
341
+ requiredQuantities?: readonly FemExternalBenchmarkQuantityRequirement[];
342
+ }): FemExternalBenchmarkAcceptanceContract;
278
343
  export declare function evaluateFemTolerance(quantity: string, actual: number, expected: number, absoluteTolerance: number, options?: {
279
344
  relativeTolerance?: number;
280
345
  unit?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"engineering-evidence.d.ts","sourceRoot":"","sources":["../../src/fem/engineering-evidence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engineering-evidence.d.ts","sourceRoot":"","sources":["../../src/fem/engineering-evidence.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,66 @@ export const DEFAULT_FEM_CONVERGENCE_POLICY = {
8
8
  maxIterations: 40,
9
9
  minAcceptedSteps: 3,
10
10
  };
11
+ const REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES = [
12
+ 'published-source',
13
+ 'commercial-solver',
14
+ ];
15
+ const DEFAULT_EXTERNAL_BENCHMARK_REQUIRED_QUANTITIES = [
16
+ {
17
+ id: 'nonlinear-plane-strain-displacement-envelope',
18
+ feature: 'coupled-nonlinear-plane-strain',
19
+ quantity: 'nodal displacement envelope',
20
+ unit: 'mm',
21
+ tolerance: 0.05,
22
+ toleranceType: 'relative',
23
+ requiredReferenceSourceTypes: REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES,
24
+ },
25
+ {
26
+ id: 'global-reaction-force-balance',
27
+ feature: 'solver-convergence-and-tolerance',
28
+ quantity: 'reaction force and applied load balance',
29
+ unit: 'kN',
30
+ tolerance: 0.02,
31
+ toleranceType: 'relative',
32
+ requiredReferenceSourceTypes: REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES,
33
+ },
34
+ {
35
+ id: 'consolidation-settlement-time-curve',
36
+ feature: 'consolidation',
37
+ quantity: 'settlement-time curve and degree of consolidation',
38
+ unit: 'mm, ratio',
39
+ tolerance: 0.02,
40
+ toleranceType: 'absolute-or-relative',
41
+ requiredReferenceSourceTypes: REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES,
42
+ },
43
+ {
44
+ id: 'biot-pore-pressure-dissipation',
45
+ feature: 'coupled-biot-plane-strain',
46
+ quantity: 'excess pore-pressure dissipation curve',
47
+ unit: 'kPa',
48
+ tolerance: 0.05,
49
+ toleranceType: 'relative',
50
+ requiredReferenceSourceTypes: REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES,
51
+ },
52
+ {
53
+ id: 'seepage-head-flux-gradient',
54
+ feature: 'seepage-pore-pressure-coupling',
55
+ quantity: 'hydraulic head, flux, and gradient checks',
56
+ unit: 'm, m3/s, ratio',
57
+ tolerance: 0.03,
58
+ toleranceType: 'relative',
59
+ requiredReferenceSourceTypes: REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES,
60
+ },
61
+ {
62
+ id: 'support-reaction-and-stability-factors',
63
+ feature: 'support-design',
64
+ quantity: 'support reaction and stability safety-factor checks',
65
+ unit: 'kN, ratio',
66
+ tolerance: 0.05,
67
+ toleranceType: 'relative',
68
+ requiredReferenceSourceTypes: REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES,
69
+ },
70
+ ];
11
71
  function degToRad(degrees) {
12
72
  return (degrees * Math.PI) / 180;
13
73
  }
@@ -25,6 +85,144 @@ function round(value, digits = 6) {
25
85
  const scale = 10 ** digits;
26
86
  return Math.round(value * scale) / scale;
27
87
  }
88
+ function isNonEmptyString(value) {
89
+ return typeof value === 'string' && value.trim().length > 0;
90
+ }
91
+ function hasPublishedCitation(citation) {
92
+ return citation != null &&
93
+ isNonEmptyString(citation.title) &&
94
+ Array.isArray(citation.authors) &&
95
+ citation.authors.some((author) => isNonEmptyString(author)) &&
96
+ Number.isInteger(citation.year) &&
97
+ citation.year >= 1900 &&
98
+ (isNonEmptyString(citation.publication) ||
99
+ isNonEmptyString(citation.doi) ||
100
+ isNonEmptyString(citation.url));
101
+ }
102
+ function hasReferenceSolverCitation(citation) {
103
+ return citation != null &&
104
+ isNonEmptyString(citation.name) &&
105
+ isNonEmptyString(citation.version);
106
+ }
107
+ function copyExternalBenchmarkReference(reference) {
108
+ return {
109
+ ...reference,
110
+ ...(reference.publishedSource
111
+ ? {
112
+ publishedSource: {
113
+ ...reference.publishedSource,
114
+ authors: [...reference.publishedSource.authors],
115
+ },
116
+ }
117
+ : {}),
118
+ ...(reference.referenceSolver
119
+ ? {
120
+ referenceSolver: { ...reference.referenceSolver },
121
+ }
122
+ : {}),
123
+ };
124
+ }
125
+ function copyExternalBenchmarkQuantityRequirement(requirement) {
126
+ return {
127
+ ...requirement,
128
+ requiredReferenceSourceTypes: [...new Set(requirement.requiredReferenceSourceTypes)],
129
+ };
130
+ }
131
+ export function buildFemExternalBenchmarkAcceptanceContract(options = {}) {
132
+ const references = (options.references ?? []).map(copyExternalBenchmarkReference);
133
+ const requiredQuantities = (options.requiredQuantities ?? DEFAULT_EXTERNAL_BENCHMARK_REQUIRED_QUANTITIES)
134
+ .map(copyExternalBenchmarkQuantityRequirement);
135
+ const blockerCodes = [];
136
+ if (references.length === 0) {
137
+ blockerCodes.push('external-benchmark-reference-corpus-missing');
138
+ }
139
+ for (const [index, reference] of references.entries()) {
140
+ const referenceCode = isNonEmptyString(reference.id)
141
+ ? reference.id
142
+ : String(index);
143
+ if (!isNonEmptyString(reference.id)) {
144
+ blockerCodes.push(`external-benchmark.references.${index}.id-missing`);
145
+ }
146
+ if (!REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES.includes(reference.sourceType) &&
147
+ reference.sourceType !== 'open-source-solver') {
148
+ blockerCodes.push(`external-benchmark.references.${referenceCode}.source-type-invalid`);
149
+ }
150
+ if (!isNonEmptyString(reference.label)) {
151
+ blockerCodes.push(`external-benchmark.references.${referenceCode}.label-missing`);
152
+ }
153
+ if (!isNonEmptyString(reference.citation)) {
154
+ blockerCodes.push(`external-benchmark.references.${referenceCode}.citation-missing`);
155
+ }
156
+ if (reference.sourceType === 'published-source' && !hasPublishedCitation(reference.publishedSource)) {
157
+ blockerCodes.push(`external-benchmark.references.${referenceCode}.published-source-citation-missing`);
158
+ }
159
+ if ((reference.sourceType === 'commercial-solver' || reference.sourceType === 'open-source-solver') &&
160
+ !hasReferenceSolverCitation(reference.referenceSolver)) {
161
+ blockerCodes.push(`external-benchmark.references.${referenceCode}.reference-solver-citation-missing`);
162
+ }
163
+ }
164
+ const hasPublishedReference = references.some((reference) => reference.sourceType === 'published-source' &&
165
+ isNonEmptyString(reference.citation) &&
166
+ hasPublishedCitation(reference.publishedSource));
167
+ const hasReferenceSolver = references.some((reference) => (reference.sourceType === 'commercial-solver' || reference.sourceType === 'open-source-solver') &&
168
+ isNonEmptyString(reference.citation) &&
169
+ hasReferenceSolverCitation(reference.referenceSolver));
170
+ if (!hasPublishedReference) {
171
+ blockerCodes.push('external-benchmark-published-source-citation-missing');
172
+ }
173
+ if (!hasReferenceSolver) {
174
+ blockerCodes.push('external-benchmark-reference-solver-citation-missing');
175
+ }
176
+ if (requiredQuantities.length === 0) {
177
+ blockerCodes.push('external-benchmark-required-quantities-missing');
178
+ }
179
+ for (const [index, requirement] of requiredQuantities.entries()) {
180
+ const quantityCode = isNonEmptyString(requirement.id)
181
+ ? requirement.id
182
+ : String(index);
183
+ if (!isNonEmptyString(requirement.id)) {
184
+ blockerCodes.push(`external-benchmark.required-quantities.${index}.id-missing`);
185
+ }
186
+ if (!isNonEmptyString(requirement.quantity)) {
187
+ blockerCodes.push(`external-benchmark.required-quantities.${quantityCode}.quantity-missing`);
188
+ }
189
+ if (!isNonEmptyString(requirement.unit)) {
190
+ blockerCodes.push(`external-benchmark.required-quantities.${quantityCode}.unit-missing`);
191
+ }
192
+ if (!Number.isFinite(requirement.tolerance) || requirement.tolerance < 0) {
193
+ blockerCodes.push(`external-benchmark.required-quantities.${quantityCode}.tolerance-invalid`);
194
+ }
195
+ if (requirement.toleranceType !== 'absolute' &&
196
+ requirement.toleranceType !== 'relative' &&
197
+ requirement.toleranceType !== 'absolute-or-relative') {
198
+ blockerCodes.push(`external-benchmark.required-quantities.${quantityCode}.tolerance-type-invalid`);
199
+ }
200
+ if (!Array.isArray(requirement.requiredReferenceSourceTypes) ||
201
+ requirement.requiredReferenceSourceTypes.length === 0) {
202
+ blockerCodes.push(`external-benchmark.required-quantities.${quantityCode}.source-types-missing`);
203
+ }
204
+ else if (references.length > 0) {
205
+ const missingSourceTypes = requirement.requiredReferenceSourceTypes.filter((sourceType) => !references.some((reference) => reference.sourceType === sourceType));
206
+ if (missingSourceTypes.length > 0) {
207
+ blockerCodes.push(`external-benchmark.required-quantities.${quantityCode}.reference-source-types-missing`);
208
+ }
209
+ }
210
+ }
211
+ const uniqueBlockerCodes = [...new Set(blockerCodes)];
212
+ const productionReadinessBlocked = uniqueBlockerCodes.length > 0;
213
+ return {
214
+ schemaVersion: 'fem-external-benchmark-acceptance-metadata.v1',
215
+ status: productionReadinessBlocked ? 'blocked' : 'metadata-ready',
216
+ productionReadinessBlocked,
217
+ requiredSourceTypes: [...REQUIRED_EXTERNAL_BENCHMARK_SOURCE_TYPES],
218
+ references,
219
+ requiredQuantities,
220
+ blockerCodes: uniqueBlockerCodes,
221
+ acceptanceStatement: productionReadinessBlocked
222
+ ? 'External benchmark metadata is incomplete; production readiness remains blocked until published source citations, reference-solver citations, and required quantity tolerances are registered.'
223
+ : 'External benchmark metadata is ready for independent result comparison; this does not approve production FEM design use.',
224
+ };
225
+ }
28
226
  export function evaluateFemTolerance(quantity, actual, expected, absoluteTolerance, options = {}) {
29
227
  const error = Math.abs(actual - expected);
30
228
  const relativeError = Math.abs(expected) > 0 ? error / Math.abs(expected) : error;
@@ -494,13 +692,32 @@ export function runExcavationSupportDesignCheck(input) {
494
692
  if (!Number.isFinite(input.frictionAngleDeg) || input.frictionAngleDeg <= 0 || input.frictionAngleDeg >= 50) {
495
693
  throw new Error('frictionAngleDeg must be finite and between 0 and 50 degrees.');
496
694
  }
695
+ if (!Array.isArray(input.supportLevelsM)) {
696
+ throw new Error('supportLevelsM must be an array of finite support depths.');
697
+ }
698
+ for (const [index, level] of input.supportLevelsM.entries()) {
699
+ if (!Number.isFinite(level) || level < 0 || level > input.excavationDepthM) {
700
+ throw new Error(`supportLevelsM.${index} must be finite and between 0 and excavationDepthM.`);
701
+ }
702
+ }
703
+ const stageDepthsM = input.stageDepthsM ?? [input.excavationDepthM];
704
+ if (!Array.isArray(stageDepthsM) || stageDepthsM.length === 0) {
705
+ throw new Error('stageDepthsM must contain at least one staged excavation depth when provided.');
706
+ }
707
+ let previousStageDepthM = 0;
708
+ for (const [index, stageDepthM] of stageDepthsM.entries()) {
709
+ if (!Number.isFinite(stageDepthM) || stageDepthM <= previousStageDepthM || stageDepthM > input.excavationDepthM) {
710
+ throw new Error(`stageDepthsM.${index} must be finite, increasing, and no deeper than excavationDepthM.`);
711
+ }
712
+ previousStageDepthM = stageDepthM;
713
+ }
497
714
  const policy = input.policy ?? DEFAULT_FEM_CONVERGENCE_POLICY;
498
715
  const surchargeKpa = input.surchargeKpa ?? 0;
499
716
  const waterTableDepthM = input.waterTableDepthM ?? 999;
500
- const active = calculateLateralEarthPressure({
501
- wallHeight: input.excavationDepthM,
717
+ const activeForceForDepth = (depthM) => calculateLateralEarthPressure({
718
+ wallHeight: depthM,
502
719
  soilLayers: [{
503
- thickness: input.excavationDepthM,
720
+ thickness: depthM,
504
721
  unitWeight: input.unitWeightKnM3,
505
722
  cohesion: input.cohesionKpa,
506
723
  frictionAngle: input.frictionAngleDeg,
@@ -512,7 +729,8 @@ export function runExcavationSupportDesignCheck(input) {
512
729
  wallInclination: 0,
513
730
  waterTableDepth: waterTableDepthM,
514
731
  surcharge: surchargeKpa,
515
- });
732
+ }).totalForce;
733
+ const activeTotalForce = activeForceForDepth(input.excavationDepthM);
516
734
  const embedmentM = input.wallToeDepthM - input.excavationDepthM;
517
735
  const passive = calculateLateralEarthPressure({
518
736
  wallHeight: embedmentM,
@@ -530,19 +748,49 @@ export function runExcavationSupportDesignCheck(input) {
530
748
  waterTableDepth: 999,
531
749
  surcharge: 0,
532
750
  });
533
- const supportCount = input.supportLevelsM.filter((level) => Number.isFinite(level) && level >= 0 && level <= input.excavationDepthM).length;
751
+ const supportLevelsM = [...new Set(input.supportLevelsM)].sort((a, b) => a - b);
752
+ const supportCount = supportLevelsM.length;
534
753
  const supportDemandKnPerM = supportCount > 0
535
- ? active.totalForce / supportCount
536
- : active.totalForce;
754
+ ? activeTotalForce / supportCount
755
+ : activeTotalForce;
537
756
  const supportCapacitySafetyFactor = supportCount > 0
538
757
  ? input.allowableSupportLoadKnPerM / Math.max(supportDemandKnPerM, 1e-9)
539
758
  : 0;
540
- const passiveSafetyFactor = passive.totalForce / Math.max(active.totalForce, 1e-9);
759
+ const passiveSafetyFactor = passive.totalForce / Math.max(activeTotalForce, 1e-9);
541
760
  const basalHeaveSafetyFactor = input.cohesionKpa > 0
542
761
  ? (5.14 * input.cohesionKpa) / Math.max(input.unitWeightKnM3 * input.excavationDepthM + surchargeKpa, 1e-9)
543
762
  : 0;
544
763
  const requiredPassiveSafetyFactor = input.requiredPassiveSafetyFactor ?? 1.5;
545
764
  const requiredBasalHeaveSafetyFactor = input.requiredBasalHeaveSafetyFactor ?? 1.5;
765
+ const stagedSequenceCoversFinalDepth = Math.abs(stageDepthsM[stageDepthsM.length - 1] - input.excavationDepthM) <= 1e-9;
766
+ const stageChecks = stageDepthsM.map((stageDepthM, index) => {
767
+ const installedSupportLevelsM = supportLevelsM.filter((level) => level <= stageDepthM);
768
+ const activeEarthPressureKnPerM = activeForceForDepth(stageDepthM);
769
+ const supportReactionDemandKnPerM = installedSupportLevelsM.length > 0
770
+ ? activeEarthPressureKnPerM / installedSupportLevelsM.length
771
+ : activeEarthPressureKnPerM;
772
+ const stageSupportCapacitySafetyFactor = installedSupportLevelsM.length > 0
773
+ ? input.allowableSupportLoadKnPerM / Math.max(supportReactionDemandKnPerM, 1e-9)
774
+ : 0;
775
+ const blockerCodes = [];
776
+ if (installedSupportLevelsM.length === 0)
777
+ blockerCodes.push('support-level-missing');
778
+ if (stageSupportCapacitySafetyFactor < 1)
779
+ blockerCodes.push('support-reaction-demand-exceeds-allowable');
780
+ if (index === stageDepthsM.length - 1 && !stagedSequenceCoversFinalDepth) {
781
+ blockerCodes.push('final-stage-depth-mismatch');
782
+ }
783
+ return {
784
+ id: `stage-${index + 1}-support-reaction`,
785
+ stageDepthM: round(stageDepthM, 4),
786
+ installedSupportLevelsM: installedSupportLevelsM.map((level) => round(level, 4)),
787
+ activeEarthPressureKnPerM: round(activeEarthPressureKnPerM, 4),
788
+ supportReactionDemandKnPerM: round(supportReactionDemandKnPerM, 4),
789
+ supportCapacitySafetyFactor: round(stageSupportCapacitySafetyFactor, 4),
790
+ blockerCodes,
791
+ status: blockerCodes.length === 0 ? 'accepted' : 'blocked',
792
+ };
793
+ });
546
794
  const checks = [
547
795
  {
548
796
  id: 'support-capacity',
@@ -562,17 +810,38 @@ export function runExcavationSupportDesignCheck(input) {
562
810
  required: requiredBasalHeaveSafetyFactor,
563
811
  status: basalHeaveSafetyFactor >= requiredBasalHeaveSafetyFactor ? 'accepted' : 'blocked',
564
812
  },
813
+ {
814
+ id: 'staged-support-reaction-sequence',
815
+ actual: stageChecks.every((check) => check.status === 'accepted') && stagedSequenceCoversFinalDepth ? 1 : 0,
816
+ required: 1,
817
+ status: stageChecks.every((check) => check.status === 'accepted') && stagedSequenceCoversFinalDepth
818
+ ? 'accepted'
819
+ : 'blocked',
820
+ },
821
+ ];
822
+ const acceptanceBlockers = [
823
+ ...checks
824
+ .filter((check) => check.status === 'blocked')
825
+ .map((check) => `support-design.${check.id}`),
826
+ ...stageChecks.flatMap((check) => check.blockerCodes.map((code) => `${check.id}.${code}`)),
565
827
  ];
566
828
  return {
567
829
  schemaVersion: 'fem-excavation-support-design-check.v1',
568
830
  method: 'rankine-earth-pressure-support-screening',
569
- activeEarthPressureKnPerM: round(active.totalForce, 4),
831
+ designScope: 'screening-only-not-structural-design',
832
+ activeEarthPressureKnPerM: round(activeTotalForce, 4),
570
833
  passiveToeResistanceKnPerM: round(passive.totalForce, 4),
571
834
  supportDemandKnPerM: round(supportDemandKnPerM, 4),
572
835
  supportCapacitySafetyFactor: round(supportCapacitySafetyFactor, 4),
573
836
  passiveSafetyFactor: round(passiveSafetyFactor, 4),
574
837
  basalHeaveSafetyFactor: round(basalHeaveSafetyFactor, 4),
838
+ stageChecks,
575
839
  checks,
840
+ acceptanceBlockers: [...new Set(acceptanceBlockers)],
841
+ productionBlockers: [
842
+ 'jurisdiction-specific-wall-strut-anchor-structural-design-not-implemented',
843
+ 'screening-support-reaction-check-is-not-a-design-code-acceptance',
844
+ ],
576
845
  status: checks.every((check) => check.status === 'accepted') ? 'accepted' : 'blocked',
577
846
  policy,
578
847
  };
@@ -813,8 +1082,35 @@ export function runFemEngineeringEvidenceSuite(policy = DEFAULT_FEM_CONVERGENCE_
813
1082
  loadStepFractions: [0.25, 0.5, 0.75, 1],
814
1083
  });
815
1084
  const plasticStrainMonotonic = dpLoaded.loadSteps.every((step, index, steps) => index === 0 || step.maxEquivalentPlasticStrain >= steps[index - 1].maxEquivalentPlasticStrain);
1085
+ const dpUnloadReload = runPlaneStrainDruckerPragerLoadSteps({
1086
+ schemaVersion: 'fem-plane-strain-model.v1',
1087
+ nodes: dpElasticMesh.nodes,
1088
+ elements: dpElasticMesh.elements,
1089
+ materials: [{
1090
+ id: 'soil',
1091
+ elasticModulusKpa: 25_000,
1092
+ poissonRatio: 0.28,
1093
+ frictionAngleDeg: 32,
1094
+ cohesionKpa: 5,
1095
+ dilationAngleDeg: 0,
1096
+ }],
1097
+ boundaryConditions: dpElasticBottomNodes.flatMap((node) => [
1098
+ { nodeId: node.id, dof: 'ux' },
1099
+ { nodeId: node.id, dof: 'uy' },
1100
+ ]),
1101
+ nodalLoads: dpElasticTopNodes.map((node) => ({ nodeId: node.id, fyKn: -30 })),
1102
+ policy,
1103
+ }, {
1104
+ loadHistoryFactors: [0.5, 1, 0.1, 1],
1105
+ });
1106
+ const plasticStrainCarryover = dpUnloadReload.converged &&
1107
+ dpUnloadReload.loadSteps[1].maxEquivalentPlasticStrain > 0 &&
1108
+ dpUnloadReload.loadSteps[2].maxEquivalentPlasticStrain >= dpUnloadReload.loadSteps[1].maxEquivalentPlasticStrain &&
1109
+ dpUnloadReload.elements
1110
+ .flatMap((element) => element.gaussPoints)
1111
+ .some((point) => point.previousEquivalentPlasticStrain > 0);
816
1112
  benchmarks.push(benchmark('quad4-plane-strain-dp-global-newton-residual', 'solver-convergence-and-tolerance', 'internal-balance', 'residualNormRatio', dpLoaded.residualNormRatio, 0, policy.forceBalanceTolerance, 'Load-controlled mechanical nonlinear plane-strain kernel must satisfy global free-DOF residual tolerance.'));
817
- benchmarks.push(benchmark('quad4-plane-strain-dp-stage-state-carryover', 'coupled-nonlinear-plane-strain', 'internal-balance', 'plasticStrainMonotonic', dpLoaded.plasticGaussPointCount > 0 && plasticStrainMonotonic ? 1 : 0, 1, 0, 'Staged nonlinear plane-strain load steps must retain monotonic plastic-strain evidence across increasing load factors.'));
1113
+ benchmarks.push(benchmark('quad4-plane-strain-dp-stage-state-carryover', 'coupled-nonlinear-plane-strain', 'internal-balance', 'plasticStrainMonotonic', dpLoaded.plasticGaussPointCount > 0 && plasticStrainMonotonic && plasticStrainCarryover ? 1 : 0, 1, 0, 'Staged nonlinear plane-strain load steps must retain monotonic plastic-strain evidence and committed plastic-state carryover through unload/reload histories.'));
818
1114
  const dpCollapse = runPlaneStrainDruckerPragerLoadSteps({
819
1115
  schemaVersion: 'fem-plane-strain-model.v1',
820
1116
  nodes: dpElasticMesh.nodes,
@@ -1092,6 +1388,7 @@ export function runFemEngineeringEvidenceSuite(policy = DEFAULT_FEM_CONVERGENCE_
1092
1388
  cohesionKpa: 45,
1093
1389
  surchargeKpa: 10,
1094
1390
  waterTableDepthM: 99,
1391
+ stageDepthsM: [3, 6, 8],
1095
1392
  supportLevelsM: [1, 4],
1096
1393
  allowableSupportLoadKnPerM: 300,
1097
1394
  requiredPassiveSafetyFactor: 1.5,
@@ -1099,6 +1396,11 @@ export function runFemEngineeringEvidenceSuite(policy = DEFAULT_FEM_CONVERGENCE_
1099
1396
  policy,
1100
1397
  });
1101
1398
  benchmarks.push(benchmark('excavation-support-capacity-screening', 'support-design', 'internal-balance', 'supportStatusAccepted', support.status === 'accepted' ? 1 : 0, 1, 0, 'Support screening must pass support capacity, passive toe resistance, and basal-heave checks for the controlled fixture.'));
1399
+ benchmarks.push(benchmark('excavation-support-staged-reaction-sequence', 'support-design', 'internal-balance', 'stageSupportChecksAccepted', support.stageChecks.every((check) => check.status === 'accepted') &&
1400
+ support.acceptanceBlockers.length === 0 &&
1401
+ support.productionBlockers.includes('jurisdiction-specific-wall-strut-anchor-structural-design-not-implemented')
1402
+ ? 1
1403
+ : 0, 1, 0, 'Support screening must tie support reaction demand to staged excavation depths while preserving jurisdiction-specific structural design as a production blocker.'));
1102
1404
  const reviewerValidation = validateFemReviewerApprovalRecord({
1103
1405
  schemaVersion: 'fem-reviewer-approval.v1',
1104
1406
  recordId: 'review-fem-001',
@@ -1126,12 +1428,14 @@ export function runFemEngineeringEvidenceSuite(policy = DEFAULT_FEM_CONVERGENCE_
1126
1428
  .filter((item) => item.status === 'accepted')
1127
1429
  .map((item) => item.feature))];
1128
1430
  const status = benchmarks.every((item) => item.status === 'accepted') ? 'kernel-verified' : 'blocked';
1431
+ const externalBenchmarkAcceptance = buildFemExternalBenchmarkAcceptanceContract();
1129
1432
  return {
1130
1433
  schemaVersion: 'fem-engineering-evidence.v1',
1131
1434
  status,
1132
1435
  productionReady: false,
1133
1436
  verifiedFeatures,
1134
1437
  benchmarks,
1438
+ externalBenchmarkAcceptance,
1135
1439
  convergencePolicy: policy,
1136
1440
  remainingProductionBlockers: [
1137
1441
  'production-sparse-fem-solver-and-2d-3d-result-route-not-integrated-with-these-kernels',
@@ -1139,6 +1443,7 @@ export function runFemEngineeringEvidenceSuite(policy = DEFAULT_FEM_CONVERGENCE_
1139
1443
  'biot-u-p-route-backed-preview-is-not-production-sparse-solver',
1140
1444
  'support-design-is-screening-level-and-not-jurisdiction-specific-structural-design',
1141
1445
  'published-commercial-cross-solver-benchmark-corpus-not-approved',
1446
+ ...externalBenchmarkAcceptance.blockerCodes,
1142
1447
  'production-design-approval-scope-fails-closed-until-production-acceptance',
1143
1448
  'reviewer-approval-record-validator-exists-but-cli-run-does-not-enforce-persistence-for-every-run',
1144
1449
  ],