@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.
- package/dist/agents/fem-tools.d.ts +2 -0
- package/dist/agents/fem-tools.d.ts.map +1 -0
- package/dist/agents/fem-tools.js +162 -0
- package/dist/agents/fem-tools.js.map +1 -0
- package/dist/agents/provider-operating-contract.js +3 -2
- package/dist/agents/provider-operating-contract.js.map +1 -1
- package/dist/agents/runtime-bootstrap.d.ts +1 -0
- package/dist/agents/runtime-bootstrap.d.ts.map +1 -1
- package/dist/agents/runtime-bootstrap.js +1 -0
- package/dist/agents/runtime-bootstrap.js.map +1 -1
- package/dist/agents/swarm-planner.js +3 -3
- package/dist/agents/swarm-planner.js.map +1 -1
- package/dist/agents/swarm.d.ts.map +1 -1
- package/dist/agents/swarm.js +8 -0
- package/dist/agents/swarm.js.map +1 -1
- package/dist/fem/demo.d.ts +2 -0
- package/dist/fem/demo.d.ts.map +1 -1
- package/dist/fem/demo.js +327 -0
- package/dist/fem/demo.js.map +1 -1
- package/dist/fem/index.d.ts +2 -1
- package/dist/fem/index.d.ts.map +1 -1
- package/dist/fem/index.js +2 -1
- package/dist/fem/index.js.map +1 -1
- package/dist/fem/routing.d.ts +71 -0
- package/dist/fem/routing.d.ts.map +1 -0
- package/dist/fem/routing.js +309 -0
- package/dist/fem/routing.js.map +1 -0
- package/dist/fem/types.d.ts +40 -5
- package/dist/fem/types.d.ts.map +1 -1
- package/dist/fem/validation.d.ts.map +1 -1
- package/dist/fem/validation.js +78 -12
- package/dist/fem/validation.js.map +1 -1
- package/dist/fem/webgl.d.ts.map +1 -1
- package/dist/fem/webgl.js +23 -5
- package/dist/fem/webgl.js.map +1 -1
- package/dist/meta/metadata.json +1 -1
- package/dist/verifier/findings.d.ts +1 -1
- package/dist/verifier/findings.d.ts.map +1 -1
- package/dist/verifier/findings.js +108 -0
- package/dist/verifier/findings.js.map +1 -1
- 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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"}
|
package/dist/fem/types.d.ts
CHANGED
|
@@ -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
|
|
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;
|
package/dist/fem/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fem/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,uBAAuB,CAAC;
|
|
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,
|
|
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"}
|
package/dist/fem/validation.js
CHANGED
|
@@ -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
|
|
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 (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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 (
|
|
87
|
-
|
|
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);
|