@geotechcli/core 0.4.55 → 0.4.57

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.
Files changed (41) hide show
  1. package/dist/agents/fem-tools.d.ts +2 -0
  2. package/dist/agents/fem-tools.d.ts.map +1 -0
  3. package/dist/agents/fem-tools.js +162 -0
  4. package/dist/agents/fem-tools.js.map +1 -0
  5. package/dist/agents/provider-operating-contract.js +3 -2
  6. package/dist/agents/provider-operating-contract.js.map +1 -1
  7. package/dist/agents/runtime-bootstrap.d.ts +1 -0
  8. package/dist/agents/runtime-bootstrap.d.ts.map +1 -1
  9. package/dist/agents/runtime-bootstrap.js +1 -0
  10. package/dist/agents/runtime-bootstrap.js.map +1 -1
  11. package/dist/agents/swarm-planner.js +3 -3
  12. package/dist/agents/swarm-planner.js.map +1 -1
  13. package/dist/agents/swarm.d.ts.map +1 -1
  14. package/dist/agents/swarm.js +8 -0
  15. package/dist/agents/swarm.js.map +1 -1
  16. package/dist/fem/demo.d.ts +2 -0
  17. package/dist/fem/demo.d.ts.map +1 -1
  18. package/dist/fem/demo.js +327 -0
  19. package/dist/fem/demo.js.map +1 -1
  20. package/dist/fem/index.d.ts +2 -1
  21. package/dist/fem/index.d.ts.map +1 -1
  22. package/dist/fem/index.js +2 -1
  23. package/dist/fem/index.js.map +1 -1
  24. package/dist/fem/routing.d.ts +71 -0
  25. package/dist/fem/routing.d.ts.map +1 -0
  26. package/dist/fem/routing.js +309 -0
  27. package/dist/fem/routing.js.map +1 -0
  28. package/dist/fem/types.d.ts +40 -5
  29. package/dist/fem/types.d.ts.map +1 -1
  30. package/dist/fem/validation.d.ts.map +1 -1
  31. package/dist/fem/validation.js +78 -12
  32. package/dist/fem/validation.js.map +1 -1
  33. package/dist/fem/webgl.d.ts.map +1 -1
  34. package/dist/fem/webgl.js +23 -5
  35. package/dist/fem/webgl.js.map +1 -1
  36. package/dist/meta/metadata.json +1 -1
  37. package/dist/verifier/findings.d.ts +1 -1
  38. package/dist/verifier/findings.d.ts.map +1 -1
  39. package/dist/verifier/findings.js +108 -0
  40. package/dist/verifier/findings.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,309 @@
1
+ import { buildExcavationDemoAnalysisCase, buildRaftDemoAnalysisCase, } from './demo.js';
2
+ import { validateFemAnalysisCase } from './validation.js';
3
+ const CAPABILITIES = [
4
+ {
5
+ objective: 'foundation-settlement',
6
+ label: 'Foundation / raft settlement preview',
7
+ status: 'implemented-demo',
8
+ analysisType: 'static_3d_small_strain',
9
+ deterministicBackend: 'builtin-elastic3d-demo',
10
+ description: 'Experimental deterministic 3D elastic settlement preview for a uniformly loaded raft.',
11
+ requiredEvidence: ['GroundModel strata', 'elastic modulus or SPT/lab correlation basis', 'unit weight', 'groundwater assumption'],
12
+ requiredUserInputs: ['raft length', 'raft width', 'service pressure', 'foundation level / embedment'],
13
+ visualizationFields: ['vertical displacement', 'settlement basin', 'mesh wireframe', 'load patch'],
14
+ reviewGates: ['experimental-only', 'linear-elastic-only', 'groundwater-not-coupled', 'not-design-calculation'],
15
+ limitations: ['No plasticity, consolidation, construction staging, or pore pressure coupling.'],
16
+ command: 'geotech fem demo raft --experimental',
17
+ },
18
+ {
19
+ objective: 'excavation-deformation',
20
+ label: 'Staged excavation deformation preview',
21
+ status: 'implemented-demo',
22
+ analysisType: 'static_3d_staged_elastic',
23
+ deterministicBackend: 'builtin-staged-excavation-demo',
24
+ description: 'Experimental deterministic staged excavation deformation preview for settlement trough, wall deflection proxy, and support reaction review.',
25
+ requiredEvidence: ['stratigraphy', 'groundwater condition', 'wall geometry', 'support levels', 'elastic stiffness basis'],
26
+ requiredUserInputs: ['excavation length', 'excavation width', 'final depth', 'stage depths', 'wall/support assumptions'],
27
+ visualizationFields: ['surface settlement', 'horizontal displacement', 'wall deflection proxy', 'stage slider', 'support overlays'],
28
+ reviewGates: ['experimental-only', 'unsupported-wall-design', 'groundwater-coupling-required-review', 'not-basal-heave-verification', 'not-design-calculation'],
29
+ limitations: ['No wall design, basal heave design, seepage, consolidation, or nonlinear soil response.'],
30
+ command: 'geotech fem demo excavation --experimental',
31
+ },
32
+ {
33
+ objective: 'shaft-deformation',
34
+ label: 'Shaft / pit deformation preview',
35
+ status: 'planned',
36
+ analysisType: 'static_3d_staged_elastic',
37
+ deterministicBackend: null,
38
+ description: 'Planned circular or polygonal shaft deformation preview using the staged excavation contract.',
39
+ requiredEvidence: ['shaft geometry', 'stratigraphy', 'groundwater condition', 'support assumptions'],
40
+ requiredUserInputs: ['shaft diameter/shape', 'final depth', 'support sequence', 'groundwater handling'],
41
+ visualizationFields: ['radial ground movement', 'surface settlement', 'support reaction proxy'],
42
+ reviewGates: ['planned-only', 'not-design-calculation'],
43
+ limitations: ['No production solver or code acceptance check is available yet.'],
44
+ },
45
+ {
46
+ objective: 'tunnel-volume-loss-settlement',
47
+ label: 'Tunnel volume-loss settlement preview',
48
+ status: 'planned',
49
+ analysisType: 'empirical_3d_settlement_surface',
50
+ deterministicBackend: null,
51
+ description: 'Planned deterministic 3D settlement surface from prescribed tunnel volume loss.',
52
+ requiredEvidence: ['tunnel geometry', 'cover depth', 'ground class', 'volume-loss assumption'],
53
+ requiredUserInputs: ['diameter', 'axis depth', 'alignment', 'volume loss', 'trough width parameter'],
54
+ visualizationFields: ['settlement trough', 'building influence corridor', 'alignment overlay'],
55
+ reviewGates: ['planned-only', 'volume-loss-assumption-review', 'not-fem-solver'],
56
+ limitations: ['Empirical preview only; not a tunnel lining or ground loss design model.'],
57
+ },
58
+ {
59
+ objective: 'pile-group-elastic-interaction',
60
+ label: 'Pile group elastic interaction preview',
61
+ status: 'planned',
62
+ analysisType: 'static_3d_soil_structure_screening',
63
+ deterministicBackend: null,
64
+ description: 'Planned pile group displacement and interaction preview after pile/soil spring contracts are stable.',
65
+ requiredEvidence: ['pile layout', 'pile geometry', 'stratigraphy', 'stiffness/capacity basis'],
66
+ requiredUserInputs: ['pile diameter', 'pile length', 'pile spacing', 'load case', 'pile head condition'],
67
+ visualizationFields: ['pile head settlement', 'interaction contours', 'load share proxy'],
68
+ reviewGates: ['planned-only', 'pile-soil-interface-review', 'not-design-calculation'],
69
+ limitations: ['No pile group solver or code acceptance check is available yet.'],
70
+ },
71
+ ];
72
+ function finitePositive(value) {
73
+ return typeof value === 'number' && Number.isFinite(value) && value > 0;
74
+ }
75
+ function requirePositive(value, label, missing) {
76
+ if (finitePositive(value))
77
+ return value;
78
+ missing.push(label);
79
+ return undefined;
80
+ }
81
+ function roundStageDepth(value) {
82
+ return Math.round(value * 10) / 10;
83
+ }
84
+ export function listFemCapabilities(objective) {
85
+ return CAPABILITIES.filter((capability) => objective == null || capability.objective === objective);
86
+ }
87
+ export function getFemCapability(objective) {
88
+ return CAPABILITIES.find((capability) => capability.objective === objective);
89
+ }
90
+ export function prepareFemAnalysisCaseDraft(input) {
91
+ const capability = getFemCapability(input.objective);
92
+ if (!capability) {
93
+ return {
94
+ schemaVersion: 'fem-analysis-case-draft.v1',
95
+ objective: input.objective,
96
+ capability: {
97
+ objective: input.objective,
98
+ label: 'Unknown FEM route',
99
+ status: 'planned',
100
+ analysisType: 'unknown',
101
+ deterministicBackend: null,
102
+ description: 'The requested FEM route is not registered in geotechCLI.',
103
+ requiredEvidence: [],
104
+ requiredUserInputs: [],
105
+ visualizationFields: [],
106
+ reviewGates: ['unknown-fem-route'],
107
+ limitations: ['No FEM contract exists for this route.'],
108
+ },
109
+ implemented: false,
110
+ canAutoProceed: false,
111
+ recommendedAction: 'contract-only',
112
+ missingUserInputs: ['supported FEM objective'],
113
+ assumptions: [],
114
+ reviewGates: ['unknown-fem-route'],
115
+ evidenceRefs: input.evidenceRefs ?? [],
116
+ };
117
+ }
118
+ if (capability.objective !== 'foundation-settlement' && capability.objective !== 'excavation-deformation') {
119
+ return {
120
+ schemaVersion: 'fem-analysis-case-draft.v1',
121
+ objective: capability.objective,
122
+ capability,
123
+ implemented: false,
124
+ canAutoProceed: false,
125
+ recommendedAction: 'contract-only',
126
+ missingUserInputs: capability.requiredUserInputs,
127
+ assumptions: [],
128
+ reviewGates: capability.reviewGates,
129
+ evidenceRefs: input.evidenceRefs ?? [],
130
+ };
131
+ }
132
+ if (capability.objective === 'excavation-deformation') {
133
+ const missing = [];
134
+ const useDemoDefaults = input.useDemoDefaults === true;
135
+ const lengthM = input.geometry?.excavationLengthM ?? (useDemoDefaults ? 18 : undefined);
136
+ const widthM = input.geometry?.excavationWidthM ?? (useDemoDefaults ? 12 : undefined);
137
+ const finalDepthM = input.geometry?.excavationFinalDepthM ?? (useDemoDefaults ? 8 : undefined);
138
+ const checkedLengthM = requirePositive(lengthM, 'excavation length', missing);
139
+ const checkedWidthM = requirePositive(widthM, 'excavation width', missing);
140
+ const checkedFinalDepthM = requirePositive(finalDepthM, 'final excavation depth', missing);
141
+ if (!checkedLengthM || !checkedWidthM || !checkedFinalDepthM) {
142
+ return {
143
+ schemaVersion: 'fem-analysis-case-draft.v1',
144
+ objective: capability.objective,
145
+ capability,
146
+ implemented: true,
147
+ canAutoProceed: false,
148
+ recommendedAction: 'collect-inputs',
149
+ missingUserInputs: missing,
150
+ assumptions: [],
151
+ reviewGates: ['missing-user-inputs', ...capability.reviewGates],
152
+ evidenceRefs: input.evidenceRefs ?? [],
153
+ recommendedCommand: capability.command,
154
+ };
155
+ }
156
+ const analysisCase = buildExcavationDemoAnalysisCase();
157
+ analysisCase.caseId = 'excavation-deformation-draft';
158
+ analysisCase.title = 'Experimental 3D FEM staged excavation deformation draft';
159
+ analysisCase.createdBy = 'geotechcli-fem-routing';
160
+ analysisCase.evidenceRefs = input.evidenceRefs ?? [];
161
+ analysisCase.materials.forEach((material) => {
162
+ material.evidenceRefs = input.evidenceRefs ?? [];
163
+ });
164
+ if (analysisCase.geometry.excavation) {
165
+ analysisCase.geometry.excavation.lengthM = checkedLengthM;
166
+ analysisCase.geometry.excavation.widthM = checkedWidthM;
167
+ analysisCase.geometry.excavation.finalDepthM = checkedFinalDepthM;
168
+ analysisCase.geometry.excavation.wallToeDepthM = input.geometry?.wallToeDepthM ?? Math.max(checkedFinalDepthM * 1.55, analysisCase.geometry.excavation.wallToeDepthM);
169
+ analysisCase.geometry.excavation.wallType = input.excavation?.wallType ?? analysisCase.geometry.excavation.wallType;
170
+ if (Array.isArray(input.excavation?.stageDepthsM) && input.excavation.stageDepthsM.length > 0) {
171
+ const supportLevels = input.excavation.supportLevelsM ?? [];
172
+ analysisCase.geometry.excavation.stages = input.excavation.stageDepthsM.map((depthM, index) => ({
173
+ id: `stage-${index + 1}`,
174
+ label: `Stage ${index + 1} - excavate to ${depthM.toFixed(1)} m`,
175
+ depthM,
176
+ supportLevelM: supportLevels[index],
177
+ }));
178
+ }
179
+ else {
180
+ analysisCase.geometry.excavation.stages = analysisCase.geometry.excavation.stages.map((stage, index, stages) => ({
181
+ ...stage,
182
+ depthM: index === stages.length - 1
183
+ ? checkedFinalDepthM
184
+ : Math.min(checkedFinalDepthM, roundStageDepth(checkedFinalDepthM * ((index + 1) / stages.length))),
185
+ }));
186
+ }
187
+ }
188
+ analysisCase.geometry.domain.lengthM = input.geometry?.domainLengthM ?? Math.max(checkedLengthM * 2.8, analysisCase.geometry.domain.lengthM);
189
+ analysisCase.geometry.domain.widthM = input.geometry?.domainWidthM ?? Math.max(checkedWidthM * 2.8, analysisCase.geometry.domain.widthM);
190
+ analysisCase.geometry.domain.depthM = input.geometry?.domainDepthM ?? Math.max(checkedFinalDepthM * 2.75, analysisCase.geometry.domain.depthM);
191
+ if (finitePositive(input.load?.pressureKpa))
192
+ analysisCase.loads[0].pressureKpa = input.load.pressureKpa;
193
+ if (finitePositive(input.material?.elasticModulusKpa))
194
+ analysisCase.materials[0].elasticModulusKpa = input.material.elasticModulusKpa;
195
+ if (typeof input.material?.poissonRatio === 'number')
196
+ analysisCase.materials[0].poissonRatio = input.material.poissonRatio;
197
+ if (finitePositive(input.material?.unitWeightKnM3))
198
+ analysisCase.materials[0].unitWeightKnM3 = input.material.unitWeightKnM3;
199
+ if (input.groundwater?.condition) {
200
+ analysisCase.groundwater.condition = input.groundwater.condition;
201
+ }
202
+ if (typeof input.groundwater?.depthM === 'number') {
203
+ analysisCase.groundwater.depthM = input.groundwater.depthM;
204
+ }
205
+ if (input.groundwater?.note) {
206
+ analysisCase.groundwater.note = input.groundwater.note;
207
+ }
208
+ const validation = validateFemAnalysisCase(analysisCase);
209
+ const reviewGates = [
210
+ ...capability.reviewGates,
211
+ ...validation.findings
212
+ .filter((finding) => finding.severity !== 'info')
213
+ .map((finding) => finding.code),
214
+ ];
215
+ return {
216
+ schemaVersion: 'fem-analysis-case-draft.v1',
217
+ objective: capability.objective,
218
+ capability,
219
+ implemented: true,
220
+ canAutoProceed: false,
221
+ recommendedAction: 'run-experimental-demo',
222
+ missingUserInputs: [],
223
+ assumptions: analysisCase.assumptions,
224
+ reviewGates: [...new Set(reviewGates)],
225
+ evidenceRefs: analysisCase.evidenceRefs,
226
+ analysisCase,
227
+ validation,
228
+ recommendedCommand: capability.command,
229
+ };
230
+ }
231
+ const missing = [];
232
+ const useDemoDefaults = input.useDemoDefaults === true;
233
+ const raftLengthM = input.geometry?.raftLengthM ?? (useDemoDefaults ? 8 : undefined);
234
+ const raftWidthM = input.geometry?.raftWidthM ?? (useDemoDefaults ? 8 : undefined);
235
+ const pressureKpa = input.load?.pressureKpa ?? (useDemoDefaults ? 150 : undefined);
236
+ const checkedRaftLengthM = requirePositive(raftLengthM, 'raft length', missing);
237
+ const checkedRaftWidthM = requirePositive(raftWidthM, 'raft width', missing);
238
+ const checkedPressureKpa = requirePositive(pressureKpa, 'service pressure', missing);
239
+ if (!checkedRaftLengthM || !checkedRaftWidthM || !checkedPressureKpa) {
240
+ return {
241
+ schemaVersion: 'fem-analysis-case-draft.v1',
242
+ objective: capability.objective,
243
+ capability,
244
+ implemented: true,
245
+ canAutoProceed: false,
246
+ recommendedAction: 'collect-inputs',
247
+ missingUserInputs: missing,
248
+ assumptions: [],
249
+ reviewGates: ['missing-user-inputs', ...capability.reviewGates],
250
+ evidenceRefs: input.evidenceRefs ?? [],
251
+ recommendedCommand: capability.command,
252
+ };
253
+ }
254
+ const analysisCase = buildRaftDemoAnalysisCase();
255
+ analysisCase.caseId = 'raft-settlement-draft';
256
+ analysisCase.title = 'Experimental 3D FEM raft settlement draft';
257
+ analysisCase.createdBy = 'geotechcli-fem-routing';
258
+ const raft = analysisCase.geometry.raft;
259
+ if (!raft) {
260
+ throw new Error('Built-in raft draft is missing raft geometry.');
261
+ }
262
+ raft.lengthM = checkedRaftLengthM;
263
+ raft.widthM = checkedRaftWidthM;
264
+ raft.thicknessM = input.geometry?.raftThicknessM ?? raft.thicknessM;
265
+ analysisCase.geometry.domain.lengthM = input.geometry?.domainLengthM ?? Math.max(checkedRaftLengthM * 3, analysisCase.geometry.domain.lengthM);
266
+ analysisCase.geometry.domain.widthM = input.geometry?.domainWidthM ?? Math.max(checkedRaftWidthM * 3, analysisCase.geometry.domain.widthM);
267
+ analysisCase.geometry.domain.depthM = input.geometry?.domainDepthM ?? Math.max(checkedRaftLengthM, checkedRaftWidthM, analysisCase.geometry.domain.depthM);
268
+ analysisCase.loads[0].pressureKpa = checkedPressureKpa;
269
+ analysisCase.evidenceRefs = input.evidenceRefs ?? [];
270
+ analysisCase.materials[0].evidenceRefs = input.evidenceRefs ?? [];
271
+ if (finitePositive(input.material?.elasticModulusKpa))
272
+ analysisCase.materials[0].elasticModulusKpa = input.material.elasticModulusKpa;
273
+ if (typeof input.material?.poissonRatio === 'number')
274
+ analysisCase.materials[0].poissonRatio = input.material.poissonRatio;
275
+ if (finitePositive(input.material?.unitWeightKnM3))
276
+ analysisCase.materials[0].unitWeightKnM3 = input.material.unitWeightKnM3;
277
+ if (input.groundwater?.condition) {
278
+ analysisCase.groundwater.condition = input.groundwater.condition;
279
+ }
280
+ if (typeof input.groundwater?.depthM === 'number') {
281
+ analysisCase.groundwater.depthM = input.groundwater.depthM;
282
+ }
283
+ if (input.groundwater?.note) {
284
+ analysisCase.groundwater.note = input.groundwater.note;
285
+ }
286
+ const validation = validateFemAnalysisCase(analysisCase);
287
+ const reviewGates = [
288
+ ...capability.reviewGates,
289
+ ...validation.findings
290
+ .filter((finding) => finding.severity !== 'info')
291
+ .map((finding) => finding.code),
292
+ ];
293
+ return {
294
+ schemaVersion: 'fem-analysis-case-draft.v1',
295
+ objective: capability.objective,
296
+ capability,
297
+ implemented: true,
298
+ canAutoProceed: false,
299
+ recommendedAction: 'run-experimental-demo',
300
+ missingUserInputs: [],
301
+ assumptions: analysisCase.assumptions,
302
+ reviewGates: [...new Set(reviewGates)],
303
+ evidenceRefs: analysisCase.evidenceRefs,
304
+ analysisCase,
305
+ validation,
306
+ recommendedCommand: capability.command,
307
+ };
308
+ }
309
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/fem/routing.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- export type FemObjective = 'foundation_settlement';
2
- export type FemAnalysisType = 'static_3d_small_strain';
1
+ export type FemObjective = 'foundation_settlement' | 'excavation_deformation';
2
+ export type FemAnalysisType = 'static_3d_small_strain' | 'static_3d_staged_elastic';
3
3
  export type FemAssumptionConfidence = 'measured' | 'inferred' | 'review';
4
4
  export type FemFindingSeverity = 'info' | 'review' | 'blocker';
5
5
  export interface FemUnits {
@@ -48,10 +48,27 @@ export interface FemRaftGeometry {
48
48
  centerXM: number;
49
49
  centerYM: number;
50
50
  }
51
+ export interface FemExcavationStage {
52
+ id: string;
53
+ label: string;
54
+ depthM: number;
55
+ supportLevelM?: number;
56
+ }
57
+ export interface FemExcavationGeometry {
58
+ type: 'braced_excavation';
59
+ lengthM: number;
60
+ widthM: number;
61
+ finalDepthM: number;
62
+ centerXM: number;
63
+ centerYM: number;
64
+ wallToeDepthM: number;
65
+ wallType: 'diaphragm_wall' | 'secant_pile_wall' | 'soldier_pile_lagging' | 'unsupported_screening';
66
+ stages: FemExcavationStage[];
67
+ }
51
68
  export interface FemPressureLoad {
52
69
  id: string;
53
70
  type: 'uniform_pressure';
54
- target: 'raft';
71
+ target: 'raft' | 'excavation_surcharge';
55
72
  pressureKpa: number;
56
73
  evidenceRefs: FemEvidenceRef[];
57
74
  assumptions: FemAssumption[];
@@ -85,7 +102,8 @@ export interface FemAnalysisCase {
85
102
  units: FemUnits;
86
103
  geometry: {
87
104
  domain: FemBoxDomain;
88
- raft: FemRaftGeometry;
105
+ raft?: FemRaftGeometry;
106
+ excavation?: FemExcavationGeometry;
89
107
  };
90
108
  materials: FemMaterial[];
91
109
  loads: FemPressureLoad[];
@@ -116,6 +134,15 @@ export interface FemVisualizationMesh {
116
134
  outlineBase: number[];
117
135
  outlineDisp: number[];
118
136
  outlineIdx: number[];
137
+ frames?: FemVisualizationFrame[];
138
+ }
139
+ export interface FemVisualizationFrame {
140
+ field: string;
141
+ fieldLabel: string;
142
+ stageIndex?: number;
143
+ stageLabel?: string;
144
+ disp: number[];
145
+ color: number[];
119
146
  }
120
147
  export interface FemResultEnvelope {
121
148
  maxSettlementMm: number;
@@ -123,6 +150,14 @@ export interface FemResultEnvelope {
123
150
  totalLoadKn: number;
124
151
  reactionKn: number;
125
152
  reactionBalanceRatio: number;
153
+ maxSurfaceSettlementMm?: number;
154
+ maxHorizontalDisplacementMm?: number;
155
+ maxWallDeflectionMm?: number;
156
+ maxBasalHeaveMm?: number;
157
+ totalExcavatedWeightKn?: number;
158
+ supportReactionKn?: number;
159
+ boundaryReactionKn?: number;
160
+ stageCount?: number;
126
161
  }
127
162
  export interface FemResultManifest {
128
163
  schemaVersion: 'fem-result-manifest.v0';
@@ -130,7 +165,7 @@ export interface FemResultManifest {
130
165
  title: string;
131
166
  generatedAt: string;
132
167
  backend: {
133
- id: 'builtin-elastic3d-demo';
168
+ id: 'builtin-elastic3d-demo' | 'builtin-staged-excavation-demo';
134
169
  label: string;
135
170
  deterministic: true;
136
171
  version: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fem/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fem/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/fem/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAEjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAoEpB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,oBAAoB,CAiFvF;AAsDD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CAuD3F"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/fem/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAEjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAoEpB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,oBAAoB,CAiJvF;AAsDD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CAoE3F"}
@@ -22,7 +22,7 @@ function isFemAnalysisCaseShape(value) {
22
22
  const groundwater = value.groundwater;
23
23
  return (isRecord(geometry) &&
24
24
  isRecord(geometry.domain) &&
25
- isRecord(geometry.raft) &&
25
+ (isRecord(geometry.raft) || isRecord(geometry.excavation)) &&
26
26
  isRecord(mesh) &&
27
27
  isRecord(groundwater) &&
28
28
  Array.isArray(value.materials) &&
@@ -59,7 +59,7 @@ export function validateFemAnalysisCase(caseFile) {
59
59
  finding('blocker', 'schema.shape-invalid', 'FEM analysis case is missing required geometry, mesh, groundwater, or array fields.'),
60
60
  ]);
61
61
  }
62
- const { domain, raft } = caseFile.geometry;
62
+ const { domain, raft, excavation } = caseFile.geometry;
63
63
  const material = caseFile.materials[0];
64
64
  const load = caseFile.loads[0];
65
65
  if (caseFile.schemaVersion !== 'fem-analysis-case.v0') {
@@ -68,23 +68,71 @@ export function validateFemAnalysisCase(caseFile) {
68
68
  if (!caseFile.experimental) {
69
69
  findings.push(finding('blocker', 'mode.experimental-required', 'FEM cases must be explicitly marked experimental.'));
70
70
  }
71
- if (caseFile.objective !== 'foundation_settlement') {
71
+ if (!['foundation_settlement', 'excavation_deformation'].includes(caseFile.objective)) {
72
72
  findings.push(finding('blocker', 'objective.unsupported', `Unsupported FEM objective: ${caseFile.objective}.`));
73
73
  }
74
- if (caseFile.analysisType !== 'static_3d_small_strain') {
74
+ if (caseFile.objective === 'foundation_settlement' && caseFile.analysisType !== 'static_3d_small_strain') {
75
+ findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
76
+ }
77
+ if (caseFile.objective === 'excavation_deformation' && caseFile.analysisType !== 'static_3d_staged_elastic') {
75
78
  findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
76
79
  }
77
80
  if (domain.lengthM <= 0 || domain.widthM <= 0 || domain.depthM <= 0) {
78
81
  findings.push(finding('blocker', 'geometry.domain-invalid', 'Domain dimensions must be positive.'));
79
82
  }
80
- if (raft.lengthM <= 0 || raft.widthM <= 0 || raft.thicknessM <= 0) {
81
- findings.push(finding('blocker', 'geometry.raft-invalid', 'Raft dimensions must be positive.'));
82
- }
83
- if (domain.lengthM < raft.lengthM * 3 || domain.widthM < raft.widthM * 3) {
84
- findings.push(finding('review', 'geometry.domain-small', 'Domain is less than three raft widths in plan; boundary influence should be reviewed.'));
83
+ if (caseFile.objective === 'foundation_settlement') {
84
+ if (!raft) {
85
+ findings.push(finding('blocker', 'geometry.raft-missing', 'Foundation-settlement cases require raft geometry.'));
86
+ }
87
+ else {
88
+ if (raft.lengthM <= 0 || raft.widthM <= 0 || raft.thicknessM <= 0) {
89
+ findings.push(finding('blocker', 'geometry.raft-invalid', 'Raft dimensions must be positive.'));
90
+ }
91
+ if (domain.lengthM < raft.lengthM * 3 || domain.widthM < raft.widthM * 3) {
92
+ findings.push(finding('review', 'geometry.domain-small', 'Domain is less than three raft widths in plan; boundary influence should be reviewed.'));
93
+ }
94
+ if (domain.depthM < Math.max(raft.lengthM, raft.widthM)) {
95
+ findings.push(finding('review', 'geometry.depth-shallow', 'Domain depth is less than the controlling raft dimension; settlement influence depth should be reviewed.'));
96
+ }
97
+ }
85
98
  }
86
- if (domain.depthM < Math.max(raft.lengthM, raft.widthM)) {
87
- findings.push(finding('review', 'geometry.depth-shallow', 'Domain depth is less than the controlling raft dimension; settlement influence depth should be reviewed.'));
99
+ if (caseFile.objective === 'excavation_deformation') {
100
+ if (!excavation) {
101
+ findings.push(finding('blocker', 'geometry.excavation-missing', 'Excavation-deformation cases require excavation geometry.'));
102
+ }
103
+ else {
104
+ if (excavation.lengthM <= 0 ||
105
+ excavation.widthM <= 0 ||
106
+ excavation.finalDepthM <= 0 ||
107
+ excavation.wallToeDepthM <= excavation.finalDepthM) {
108
+ findings.push(finding('blocker', 'geometry.excavation-invalid', 'Excavation dimensions and wall toe depth must be positive and physically ordered.'));
109
+ }
110
+ if (domain.lengthM < excavation.lengthM * 2.5 || domain.widthM < excavation.widthM * 2.5) {
111
+ findings.push(finding('review', 'geometry.excavation-domain-small', 'Domain is less than 2.5 excavation widths in plan; boundary influence should be reviewed.'));
112
+ }
113
+ if (domain.depthM < excavation.wallToeDepthM * 1.35) {
114
+ findings.push(finding('review', 'geometry.excavation-depth-shallow', 'Domain depth is close to the wall toe; excavation influence depth should be reviewed.'));
115
+ }
116
+ if (excavation.stages.length === 0) {
117
+ findings.push(finding('blocker', 'stages.missing', 'Excavation cases require at least one construction stage.'));
118
+ }
119
+ let previousDepth = 0;
120
+ for (const stage of excavation.stages) {
121
+ if (!Number.isFinite(stage.depthM) || stage.depthM <= previousDepth || stage.depthM > excavation.finalDepthM) {
122
+ findings.push(finding('blocker', 'stages.depth-invalid', 'Excavation stage depths must increase and stay within the final excavation depth.'));
123
+ break;
124
+ }
125
+ if (stage.supportLevelM != null && (!Number.isFinite(stage.supportLevelM) || stage.supportLevelM < 0 || stage.supportLevelM > stage.depthM)) {
126
+ findings.push(finding('blocker', 'stages.support-invalid', 'Support levels must be finite and no deeper than the active excavation stage.'));
127
+ break;
128
+ }
129
+ previousDepth = stage.depthM;
130
+ }
131
+ if (previousDepth !== excavation.finalDepthM) {
132
+ findings.push(finding('review', 'stages.final-depth-review', 'Last excavation stage does not exactly match the final depth; staging requires review.'));
133
+ }
134
+ findings.push(finding('review', 'excavation.design-excluded', 'Excavation preview excludes retaining wall design, basal heave, seepage, consolidation, and nonlinear soil response.'));
135
+ }
88
136
  }
89
137
  if (!material) {
90
138
  findings.push(finding('blocker', 'material.missing', 'At least one material is required.'));
@@ -101,11 +149,17 @@ export function validateFemAnalysisCase(caseFile) {
101
149
  }
102
150
  }
103
151
  if (!load) {
104
- findings.push(finding('blocker', 'load.missing', 'A raft pressure load is required.'));
152
+ findings.push(finding('blocker', 'load.missing', caseFile.objective === 'foundation_settlement' ? 'A raft pressure load is required.' : 'An excavation surcharge/load assumption is required.'));
105
153
  }
106
154
  else if (!Number.isFinite(load.pressureKpa) || load.pressureKpa <= 0) {
107
155
  findings.push(finding('blocker', 'load.pressure-invalid', 'Uniform pressure must be positive.'));
108
156
  }
157
+ else if (caseFile.objective === 'foundation_settlement' && load.target !== 'raft') {
158
+ findings.push(finding('blocker', 'load.target-invalid', 'Foundation-settlement load must target the raft.'));
159
+ }
160
+ else if (caseFile.objective === 'excavation_deformation' && load.target !== 'excavation_surcharge') {
161
+ findings.push(finding('blocker', 'load.target-invalid', 'Excavation-deformation load must target excavation_surcharge.'));
162
+ }
109
163
  const { divisionsX, divisionsY, divisionsZ } = caseFile.mesh;
110
164
  if (divisionsX < 2 || divisionsY < 2 || divisionsZ < 1) {
111
165
  findings.push(finding('blocker', 'mesh.too-coarse', 'Mesh divisions must be at least 2 x 2 x 1.'));
@@ -188,6 +242,18 @@ export function validateFemResultManifest(manifest) {
188
242
  findings.push(finding('blocker', 'result.outline.node-count-mismatch', 'Outline displacement vectors must match outline nodes.'));
189
243
  }
190
244
  pushIndexArrayFindings(findings, 'outlineIdx', visualization.outlineIdx, outlineNodeCount, 2);
245
+ if (Array.isArray(visualization.frames)) {
246
+ for (const [index, frame] of visualization.frames.entries()) {
247
+ pushFiniteArrayFindings(findings, `frames.${index}.disp`, frame.disp, 3);
248
+ pushFiniteArrayFindings(findings, `frames.${index}.color`, frame.color, 3);
249
+ if (frame.disp.length / 3 !== nodeCount) {
250
+ findings.push(finding('blocker', `result.frames.${index}.disp.node-count-mismatch`, 'Frame displacement vectors must match base nodes.'));
251
+ }
252
+ if (frame.color.length / 3 !== nodeCount) {
253
+ findings.push(finding('blocker', `result.frames.${index}.color.node-count-mismatch`, 'Frame color vectors must match base nodes.'));
254
+ }
255
+ }
256
+ }
191
257
  const caseValidation = validateFemAnalysisCase(manifest.analysisCase);
192
258
  findings.push(...caseValidation.findings);
193
259
  return summary(findings);