@geotechcli/core 0.4.56 → 0.4.58
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/brain.d.ts +5 -1
- package/dist/agents/brain.d.ts.map +1 -1
- package/dist/agents/brain.js +34 -13
- package/dist/agents/brain.js.map +1 -1
- package/dist/agents/fem-tools.js +8 -3
- package/dist/agents/fem-tools.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 +438 -0
- package/dist/fem/demo.js.map +1 -1
- package/dist/fem/index.d.ts +1 -1
- package/dist/fem/index.d.ts.map +1 -1
- package/dist/fem/index.js +1 -1
- package/dist/fem/index.js.map +1 -1
- package/dist/fem/routing.d.ts +9 -0
- package/dist/fem/routing.d.ts.map +1 -1
- package/dist/fem/routing.js +116 -9
- package/dist/fem/routing.js.map +1 -1
- package/dist/fem/types.d.ts +67 -5
- package/dist/fem/types.d.ts.map +1 -1
- package/dist/fem/validation.d.ts.map +1 -1
- package/dist/fem/validation.js +207 -12
- package/dist/fem/validation.js.map +1 -1
- package/dist/fem/webgl.d.ts.map +1 -1
- package/dist/fem/webgl.js +30 -7
- package/dist/fem/webgl.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.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 +62 -0
- package/dist/verifier/findings.js.map +1 -1
- package/package.json +1 -1
package/dist/fem/routing.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildRaftDemoAnalysisCase, } from './demo.js';
|
|
1
|
+
import { buildExcavationDemoAnalysisCase, buildRaftDemoAnalysisCase, } from './demo.js';
|
|
2
2
|
import { validateFemAnalysisCase } from './validation.js';
|
|
3
3
|
const CAPABILITIES = [
|
|
4
4
|
{
|
|
@@ -18,15 +18,16 @@ const CAPABILITIES = [
|
|
|
18
18
|
{
|
|
19
19
|
objective: 'excavation-deformation',
|
|
20
20
|
label: 'Staged excavation deformation preview',
|
|
21
|
-
status: '
|
|
21
|
+
status: 'implemented-demo',
|
|
22
22
|
analysisType: 'static_3d_staged_elastic',
|
|
23
|
-
deterministicBackend:
|
|
24
|
-
description: '
|
|
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
25
|
requiredEvidence: ['stratigraphy', 'groundwater condition', 'wall geometry', 'support levels', 'elastic stiffness basis'],
|
|
26
26
|
requiredUserInputs: ['excavation length', 'excavation width', 'final depth', 'stage depths', 'wall/support assumptions'],
|
|
27
27
|
visualizationFields: ['surface settlement', 'horizontal displacement', 'wall deflection proxy', 'stage slider', 'support overlays'],
|
|
28
|
-
reviewGates: ['
|
|
28
|
+
reviewGates: ['experimental-only', 'unsupported-wall-design', 'groundwater-coupling-required-review', 'not-basal-heave-verification', 'not-design-calculation'],
|
|
29
29
|
limitations: ['No wall design, basal heave design, seepage, consolidation, or nonlinear soil response.'],
|
|
30
|
+
command: 'geotech fem demo excavation --experimental',
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
33
|
objective: 'shaft-deformation',
|
|
@@ -77,6 +78,9 @@ function requirePositive(value, label, missing) {
|
|
|
77
78
|
missing.push(label);
|
|
78
79
|
return undefined;
|
|
79
80
|
}
|
|
81
|
+
function roundStageDepth(value) {
|
|
82
|
+
return Math.round(value * 10) / 10;
|
|
83
|
+
}
|
|
80
84
|
export function listFemCapabilities(objective) {
|
|
81
85
|
return CAPABILITIES.filter((capability) => objective == null || capability.objective === objective);
|
|
82
86
|
}
|
|
@@ -111,7 +115,7 @@ export function prepareFemAnalysisCaseDraft(input) {
|
|
|
111
115
|
evidenceRefs: input.evidenceRefs ?? [],
|
|
112
116
|
};
|
|
113
117
|
}
|
|
114
|
-
if (capability.objective !== 'foundation-settlement') {
|
|
118
|
+
if (capability.objective !== 'foundation-settlement' && capability.objective !== 'excavation-deformation') {
|
|
115
119
|
return {
|
|
116
120
|
schemaVersion: 'fem-analysis-case-draft.v1',
|
|
117
121
|
objective: capability.objective,
|
|
@@ -125,6 +129,105 @@ export function prepareFemAnalysisCaseDraft(input) {
|
|
|
125
129
|
evidenceRefs: input.evidenceRefs ?? [],
|
|
126
130
|
};
|
|
127
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
|
+
}
|
|
128
231
|
const missing = [];
|
|
129
232
|
const useDemoDefaults = input.useDemoDefaults === true;
|
|
130
233
|
const raftLengthM = input.geometry?.raftLengthM ?? (useDemoDefaults ? 8 : undefined);
|
|
@@ -152,9 +255,13 @@ export function prepareFemAnalysisCaseDraft(input) {
|
|
|
152
255
|
analysisCase.caseId = 'raft-settlement-draft';
|
|
153
256
|
analysisCase.title = 'Experimental 3D FEM raft settlement draft';
|
|
154
257
|
analysisCase.createdBy = 'geotechcli-fem-routing';
|
|
155
|
-
analysisCase.geometry.raft
|
|
156
|
-
|
|
157
|
-
|
|
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;
|
|
158
265
|
analysisCase.geometry.domain.lengthM = input.geometry?.domainLengthM ?? Math.max(checkedRaftLengthM * 3, analysisCase.geometry.domain.lengthM);
|
|
159
266
|
analysisCase.geometry.domain.widthM = input.geometry?.domainWidthM ?? Math.max(checkedRaftWidthM * 3, analysisCase.geometry.domain.widthM);
|
|
160
267
|
analysisCase.geometry.domain.depthM = input.geometry?.domainDepthM ?? Math.max(checkedRaftLengthM, checkedRaftWidthM, analysisCase.geometry.domain.depthM);
|
package/dist/fem/routing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/fem/routing.ts"],"names":[],"mappings":"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"}
|
|
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,39 @@ 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[];
|
|
146
|
+
}
|
|
147
|
+
export interface FemResultField {
|
|
148
|
+
id: string;
|
|
149
|
+
label: string;
|
|
150
|
+
unit: string;
|
|
151
|
+
location: 'surface_nodes' | 'outline_nodes' | 'envelope';
|
|
152
|
+
quantity: 'displacement' | 'reaction' | 'load' | 'stage_count';
|
|
153
|
+
component?: 'x' | 'y' | 'z' | 'magnitude';
|
|
154
|
+
signConvention?: string;
|
|
155
|
+
}
|
|
156
|
+
export interface FemResultStep {
|
|
157
|
+
id: string;
|
|
158
|
+
label: string;
|
|
159
|
+
index: number;
|
|
160
|
+
analysisStageId?: string;
|
|
161
|
+
depthM?: number;
|
|
162
|
+
}
|
|
163
|
+
export interface FemResultDataset {
|
|
164
|
+
id: string;
|
|
165
|
+
fieldId: string;
|
|
166
|
+
stepId?: string;
|
|
167
|
+
values: number[];
|
|
168
|
+
stride: 1 | 3;
|
|
169
|
+
source: 'visualization.disp' | 'visualization.frame' | 'envelope';
|
|
119
170
|
}
|
|
120
171
|
export interface FemResultEnvelope {
|
|
121
172
|
maxSettlementMm: number;
|
|
@@ -123,6 +174,14 @@ export interface FemResultEnvelope {
|
|
|
123
174
|
totalLoadKn: number;
|
|
124
175
|
reactionKn: number;
|
|
125
176
|
reactionBalanceRatio: number;
|
|
177
|
+
maxSurfaceSettlementMm?: number;
|
|
178
|
+
maxHorizontalDisplacementMm?: number;
|
|
179
|
+
maxWallDeflectionMm?: number;
|
|
180
|
+
maxBasalHeaveMm?: number;
|
|
181
|
+
totalExcavatedWeightKn?: number;
|
|
182
|
+
supportReactionKn?: number;
|
|
183
|
+
boundaryReactionKn?: number;
|
|
184
|
+
stageCount?: number;
|
|
126
185
|
}
|
|
127
186
|
export interface FemResultManifest {
|
|
128
187
|
schemaVersion: 'fem-result-manifest.v0';
|
|
@@ -130,7 +189,7 @@ export interface FemResultManifest {
|
|
|
130
189
|
title: string;
|
|
131
190
|
generatedAt: string;
|
|
132
191
|
backend: {
|
|
133
|
-
id: 'builtin-elastic3d-demo';
|
|
192
|
+
id: 'builtin-elastic3d-demo' | 'builtin-staged-excavation-demo';
|
|
134
193
|
label: string;
|
|
135
194
|
deterministic: true;
|
|
136
195
|
version: string;
|
|
@@ -148,6 +207,9 @@ export interface FemResultManifest {
|
|
|
148
207
|
};
|
|
149
208
|
envelope: FemResultEnvelope;
|
|
150
209
|
visualization: FemVisualizationMesh;
|
|
210
|
+
resultFields?: FemResultField[];
|
|
211
|
+
steps?: FemResultStep[];
|
|
212
|
+
datasets?: FemResultDataset[];
|
|
151
213
|
assumptions: FemAssumption[];
|
|
152
214
|
limitations: string[];
|
|
153
215
|
}
|
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;
|
|
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;AAsNpB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,oBAAoB,CAiJvF;AAsDD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CAsE3F"}
|
package/dist/fem/validation.js
CHANGED
|
@@ -14,6 +14,9 @@ function summary(findings) {
|
|
|
14
14
|
function isRecord(value) {
|
|
15
15
|
return typeof value === 'object' && value !== null;
|
|
16
16
|
}
|
|
17
|
+
function isNonEmptyString(value) {
|
|
18
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
19
|
+
}
|
|
17
20
|
function isFemAnalysisCaseShape(value) {
|
|
18
21
|
if (!isRecord(value))
|
|
19
22
|
return false;
|
|
@@ -22,7 +25,7 @@ function isFemAnalysisCaseShape(value) {
|
|
|
22
25
|
const groundwater = value.groundwater;
|
|
23
26
|
return (isRecord(geometry) &&
|
|
24
27
|
isRecord(geometry.domain) &&
|
|
25
|
-
isRecord(geometry.raft) &&
|
|
28
|
+
(isRecord(geometry.raft) || isRecord(geometry.excavation)) &&
|
|
26
29
|
isRecord(mesh) &&
|
|
27
30
|
isRecord(groundwater) &&
|
|
28
31
|
Array.isArray(value.materials) &&
|
|
@@ -31,6 +34,131 @@ function isFemAnalysisCaseShape(value) {
|
|
|
31
34
|
Array.isArray(value.limitations) &&
|
|
32
35
|
Array.isArray(value.evidenceRefs));
|
|
33
36
|
}
|
|
37
|
+
function pushUniqueStringFinding(findings, seen, value, code, label) {
|
|
38
|
+
if (!isNonEmptyString(value)) {
|
|
39
|
+
findings.push(finding('blocker', `${code}.missing`, `${label} must be a non-empty string.`));
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
if (seen.has(value)) {
|
|
43
|
+
findings.push(finding('blocker', `${code}.duplicate`, `${label} "${value}" is duplicated.`));
|
|
44
|
+
}
|
|
45
|
+
seen.add(value);
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function validateOptionalResultMetadata(findings, manifest, nodeCount, outlineNodeCount) {
|
|
49
|
+
const { resultFields, steps, datasets } = manifest;
|
|
50
|
+
if (resultFields != null && !Array.isArray(resultFields)) {
|
|
51
|
+
findings.push(finding('blocker', 'result.fields.shape-invalid', 'resultFields must be an array when present.'));
|
|
52
|
+
}
|
|
53
|
+
if (steps != null && !Array.isArray(steps)) {
|
|
54
|
+
findings.push(finding('blocker', 'result.steps.shape-invalid', 'steps must be an array when present.'));
|
|
55
|
+
}
|
|
56
|
+
if (datasets != null && !Array.isArray(datasets)) {
|
|
57
|
+
findings.push(finding('blocker', 'result.datasets.shape-invalid', 'datasets must be an array when present.'));
|
|
58
|
+
}
|
|
59
|
+
if (!Array.isArray(resultFields) && !Array.isArray(steps) && !Array.isArray(datasets)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const validFieldLocations = new Set(['surface_nodes', 'outline_nodes', 'envelope']);
|
|
63
|
+
const validFieldQuantities = new Set(['displacement', 'reaction', 'load', 'stage_count']);
|
|
64
|
+
const validDatasetSources = new Set(['visualization.disp', 'visualization.frame', 'envelope']);
|
|
65
|
+
const fieldIds = new Set();
|
|
66
|
+
const stepIds = new Set();
|
|
67
|
+
const datasetIds = new Set();
|
|
68
|
+
const excavationStageIds = new Set(manifest.analysisCase.geometry.excavation?.stages.map((stage) => stage.id) ?? []);
|
|
69
|
+
const stepIdByIndex = new Map();
|
|
70
|
+
const fieldLocations = new Map();
|
|
71
|
+
if (Array.isArray(resultFields)) {
|
|
72
|
+
for (const [index, fieldInfo] of resultFields.entries()) {
|
|
73
|
+
const id = pushUniqueStringFinding(findings, fieldIds, fieldInfo.id, `result.fields.${index}.id`, 'Result field id');
|
|
74
|
+
if (!isNonEmptyString(fieldInfo.label)) {
|
|
75
|
+
findings.push(finding('blocker', `result.fields.${index}.label.missing`, 'Result field label must be a non-empty string.'));
|
|
76
|
+
}
|
|
77
|
+
if (!isNonEmptyString(fieldInfo.unit)) {
|
|
78
|
+
findings.push(finding('blocker', `result.fields.${index}.unit.missing`, 'Result field unit must be a non-empty string.'));
|
|
79
|
+
}
|
|
80
|
+
if (!validFieldLocations.has(fieldInfo.location)) {
|
|
81
|
+
findings.push(finding('blocker', `result.fields.${index}.location.invalid`, `Unsupported result field location: ${String(fieldInfo.location)}.`));
|
|
82
|
+
}
|
|
83
|
+
if (!validFieldQuantities.has(fieldInfo.quantity)) {
|
|
84
|
+
findings.push(finding('blocker', `result.fields.${index}.quantity.invalid`, `Unsupported result field quantity: ${String(fieldInfo.quantity)}.`));
|
|
85
|
+
}
|
|
86
|
+
if (id)
|
|
87
|
+
fieldLocations.set(id, fieldInfo.location);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (Array.isArray(steps)) {
|
|
91
|
+
for (const [index, step] of steps.entries()) {
|
|
92
|
+
const id = pushUniqueStringFinding(findings, stepIds, step.id, `result.steps.${index}.id`, 'Result step id');
|
|
93
|
+
if (!isNonEmptyString(step.label)) {
|
|
94
|
+
findings.push(finding('blocker', `result.steps.${index}.label.missing`, 'Result step label must be a non-empty string.'));
|
|
95
|
+
}
|
|
96
|
+
if (!Number.isInteger(step.index) || step.index < 0) {
|
|
97
|
+
findings.push(finding('blocker', `result.steps.${index}.index.invalid`, 'Result step index must be an integer greater than or equal to zero.'));
|
|
98
|
+
}
|
|
99
|
+
else if (id) {
|
|
100
|
+
stepIdByIndex.set(step.index, id);
|
|
101
|
+
}
|
|
102
|
+
if (step.analysisStageId && !excavationStageIds.has(step.analysisStageId)) {
|
|
103
|
+
findings.push(finding('blocker', `result.steps.${index}.stage-unknown`, `Result step references unknown excavation stage ${step.analysisStageId}.`));
|
|
104
|
+
}
|
|
105
|
+
if (step.depthM != null && (!Number.isFinite(step.depthM) || step.depthM < 0)) {
|
|
106
|
+
findings.push(finding('blocker', `result.steps.${index}.depth-invalid`, 'Result step depth must be finite and non-negative when present.'));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (Array.isArray(datasets)) {
|
|
111
|
+
for (const [index, dataset] of datasets.entries()) {
|
|
112
|
+
pushUniqueStringFinding(findings, datasetIds, dataset.id, `result.datasets.${index}.id`, 'Result dataset id');
|
|
113
|
+
if (!fieldIds.has(dataset.fieldId)) {
|
|
114
|
+
findings.push(finding('blocker', `result.datasets.${index}.field-unknown`, `Result dataset references unknown field ${String(dataset.fieldId)}.`));
|
|
115
|
+
}
|
|
116
|
+
if (dataset.stepId != null && !stepIds.has(dataset.stepId)) {
|
|
117
|
+
findings.push(finding('blocker', `result.datasets.${index}.step-unknown`, `Result dataset references unknown step ${String(dataset.stepId)}.`));
|
|
118
|
+
}
|
|
119
|
+
if (!Array.isArray(dataset.values) || dataset.values.length === 0) {
|
|
120
|
+
findings.push(finding('blocker', `result.datasets.${index}.values.empty`, 'Result dataset values must be a non-empty array.'));
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (dataset.values.some((value) => !Number.isFinite(value))) {
|
|
124
|
+
findings.push(finding('blocker', `result.datasets.${index}.values.non-finite`, 'Result dataset contains non-finite values.'));
|
|
125
|
+
}
|
|
126
|
+
if (dataset.stride !== 1 && dataset.stride !== 3) {
|
|
127
|
+
findings.push(finding('blocker', `result.datasets.${index}.stride.invalid`, 'Result dataset stride must be 1 or 3.'));
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (dataset.values.length % dataset.stride !== 0) {
|
|
131
|
+
findings.push(finding('blocker', `result.datasets.${index}.stride-count-invalid`, 'Result dataset value length must be divisible by stride.'));
|
|
132
|
+
}
|
|
133
|
+
if (!validDatasetSources.has(dataset.source)) {
|
|
134
|
+
findings.push(finding('blocker', `result.datasets.${index}.source.invalid`, `Unsupported result dataset source: ${String(dataset.source)}.`));
|
|
135
|
+
}
|
|
136
|
+
const location = fieldLocations.get(dataset.fieldId);
|
|
137
|
+
const valueCount = dataset.values.length / dataset.stride;
|
|
138
|
+
if (location === 'surface_nodes' && valueCount !== nodeCount) {
|
|
139
|
+
findings.push(finding('blocker', `result.datasets.${index}.surface-count-mismatch`, 'Surface-node dataset values must match visualization base node count.'));
|
|
140
|
+
}
|
|
141
|
+
if (location === 'outline_nodes' && valueCount !== outlineNodeCount) {
|
|
142
|
+
findings.push(finding('blocker', `result.datasets.${index}.outline-count-mismatch`, 'Outline-node dataset values must match outline node count.'));
|
|
143
|
+
}
|
|
144
|
+
if (dataset.source === 'envelope' && dataset.values.length !== 1) {
|
|
145
|
+
findings.push(finding('blocker', `result.datasets.${index}.envelope-count-invalid`, 'Envelope datasets must contain exactly one value.'));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (Array.isArray(resultFields) && Array.isArray(steps) && Array.isArray(datasets) && Array.isArray(manifest.visualization.frames)) {
|
|
150
|
+
const datasetKeys = new Set(datasets.map((dataset) => `${dataset.fieldId}:${dataset.stepId ?? ''}`));
|
|
151
|
+
for (const [index, frame] of manifest.visualization.frames.entries()) {
|
|
152
|
+
if (!fieldIds.has(frame.field)) {
|
|
153
|
+
findings.push(finding('blocker', `result.frames.${index}.field-metadata-missing`, `Frame field ${frame.field} has no resultFields metadata.`));
|
|
154
|
+
}
|
|
155
|
+
const stepId = stepIdByIndex.get(frame.stageIndex ?? 0);
|
|
156
|
+
if (stepId && !datasetKeys.has(`${frame.field}:${stepId}`)) {
|
|
157
|
+
findings.push(finding('blocker', `result.frames.${index}.dataset-missing`, `Frame ${frame.field}/${stepId} has no matching dataset metadata.`));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
34
162
|
function isFemResultManifestShape(value) {
|
|
35
163
|
if (!isRecord(value))
|
|
36
164
|
return false;
|
|
@@ -59,7 +187,7 @@ export function validateFemAnalysisCase(caseFile) {
|
|
|
59
187
|
finding('blocker', 'schema.shape-invalid', 'FEM analysis case is missing required geometry, mesh, groundwater, or array fields.'),
|
|
60
188
|
]);
|
|
61
189
|
}
|
|
62
|
-
const { domain, raft } = caseFile.geometry;
|
|
190
|
+
const { domain, raft, excavation } = caseFile.geometry;
|
|
63
191
|
const material = caseFile.materials[0];
|
|
64
192
|
const load = caseFile.loads[0];
|
|
65
193
|
if (caseFile.schemaVersion !== 'fem-analysis-case.v0') {
|
|
@@ -68,23 +196,71 @@ export function validateFemAnalysisCase(caseFile) {
|
|
|
68
196
|
if (!caseFile.experimental) {
|
|
69
197
|
findings.push(finding('blocker', 'mode.experimental-required', 'FEM cases must be explicitly marked experimental.'));
|
|
70
198
|
}
|
|
71
|
-
if (caseFile.objective
|
|
199
|
+
if (!['foundation_settlement', 'excavation_deformation'].includes(caseFile.objective)) {
|
|
72
200
|
findings.push(finding('blocker', 'objective.unsupported', `Unsupported FEM objective: ${caseFile.objective}.`));
|
|
73
201
|
}
|
|
74
|
-
if (caseFile.analysisType !== 'static_3d_small_strain') {
|
|
202
|
+
if (caseFile.objective === 'foundation_settlement' && caseFile.analysisType !== 'static_3d_small_strain') {
|
|
203
|
+
findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
|
|
204
|
+
}
|
|
205
|
+
if (caseFile.objective === 'excavation_deformation' && caseFile.analysisType !== 'static_3d_staged_elastic') {
|
|
75
206
|
findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
|
|
76
207
|
}
|
|
77
208
|
if (domain.lengthM <= 0 || domain.widthM <= 0 || domain.depthM <= 0) {
|
|
78
209
|
findings.push(finding('blocker', 'geometry.domain-invalid', 'Domain dimensions must be positive.'));
|
|
79
210
|
}
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
211
|
+
if (caseFile.objective === 'foundation_settlement') {
|
|
212
|
+
if (!raft) {
|
|
213
|
+
findings.push(finding('blocker', 'geometry.raft-missing', 'Foundation-settlement cases require raft geometry.'));
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
if (raft.lengthM <= 0 || raft.widthM <= 0 || raft.thicknessM <= 0) {
|
|
217
|
+
findings.push(finding('blocker', 'geometry.raft-invalid', 'Raft dimensions must be positive.'));
|
|
218
|
+
}
|
|
219
|
+
if (domain.lengthM < raft.lengthM * 3 || domain.widthM < raft.widthM * 3) {
|
|
220
|
+
findings.push(finding('review', 'geometry.domain-small', 'Domain is less than three raft widths in plan; boundary influence should be reviewed.'));
|
|
221
|
+
}
|
|
222
|
+
if (domain.depthM < Math.max(raft.lengthM, raft.widthM)) {
|
|
223
|
+
findings.push(finding('review', 'geometry.depth-shallow', 'Domain depth is less than the controlling raft dimension; settlement influence depth should be reviewed.'));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
85
226
|
}
|
|
86
|
-
if (
|
|
87
|
-
|
|
227
|
+
if (caseFile.objective === 'excavation_deformation') {
|
|
228
|
+
if (!excavation) {
|
|
229
|
+
findings.push(finding('blocker', 'geometry.excavation-missing', 'Excavation-deformation cases require excavation geometry.'));
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
if (excavation.lengthM <= 0 ||
|
|
233
|
+
excavation.widthM <= 0 ||
|
|
234
|
+
excavation.finalDepthM <= 0 ||
|
|
235
|
+
excavation.wallToeDepthM <= excavation.finalDepthM) {
|
|
236
|
+
findings.push(finding('blocker', 'geometry.excavation-invalid', 'Excavation dimensions and wall toe depth must be positive and physically ordered.'));
|
|
237
|
+
}
|
|
238
|
+
if (domain.lengthM < excavation.lengthM * 2.5 || domain.widthM < excavation.widthM * 2.5) {
|
|
239
|
+
findings.push(finding('review', 'geometry.excavation-domain-small', 'Domain is less than 2.5 excavation widths in plan; boundary influence should be reviewed.'));
|
|
240
|
+
}
|
|
241
|
+
if (domain.depthM < excavation.wallToeDepthM * 1.35) {
|
|
242
|
+
findings.push(finding('review', 'geometry.excavation-depth-shallow', 'Domain depth is close to the wall toe; excavation influence depth should be reviewed.'));
|
|
243
|
+
}
|
|
244
|
+
if (excavation.stages.length === 0) {
|
|
245
|
+
findings.push(finding('blocker', 'stages.missing', 'Excavation cases require at least one construction stage.'));
|
|
246
|
+
}
|
|
247
|
+
let previousDepth = 0;
|
|
248
|
+
for (const stage of excavation.stages) {
|
|
249
|
+
if (!Number.isFinite(stage.depthM) || stage.depthM <= previousDepth || stage.depthM > excavation.finalDepthM) {
|
|
250
|
+
findings.push(finding('blocker', 'stages.depth-invalid', 'Excavation stage depths must increase and stay within the final excavation depth.'));
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
if (stage.supportLevelM != null && (!Number.isFinite(stage.supportLevelM) || stage.supportLevelM < 0 || stage.supportLevelM > stage.depthM)) {
|
|
254
|
+
findings.push(finding('blocker', 'stages.support-invalid', 'Support levels must be finite and no deeper than the active excavation stage.'));
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
previousDepth = stage.depthM;
|
|
258
|
+
}
|
|
259
|
+
if (previousDepth !== excavation.finalDepthM) {
|
|
260
|
+
findings.push(finding('review', 'stages.final-depth-review', 'Last excavation stage does not exactly match the final depth; staging requires review.'));
|
|
261
|
+
}
|
|
262
|
+
findings.push(finding('review', 'excavation.design-excluded', 'Excavation preview excludes retaining wall design, basal heave, seepage, consolidation, and nonlinear soil response.'));
|
|
263
|
+
}
|
|
88
264
|
}
|
|
89
265
|
if (!material) {
|
|
90
266
|
findings.push(finding('blocker', 'material.missing', 'At least one material is required.'));
|
|
@@ -101,11 +277,17 @@ export function validateFemAnalysisCase(caseFile) {
|
|
|
101
277
|
}
|
|
102
278
|
}
|
|
103
279
|
if (!load) {
|
|
104
|
-
findings.push(finding('blocker', 'load.missing', 'A raft pressure load is required.'));
|
|
280
|
+
findings.push(finding('blocker', 'load.missing', caseFile.objective === 'foundation_settlement' ? 'A raft pressure load is required.' : 'An excavation surcharge/load assumption is required.'));
|
|
105
281
|
}
|
|
106
282
|
else if (!Number.isFinite(load.pressureKpa) || load.pressureKpa <= 0) {
|
|
107
283
|
findings.push(finding('blocker', 'load.pressure-invalid', 'Uniform pressure must be positive.'));
|
|
108
284
|
}
|
|
285
|
+
else if (caseFile.objective === 'foundation_settlement' && load.target !== 'raft') {
|
|
286
|
+
findings.push(finding('blocker', 'load.target-invalid', 'Foundation-settlement load must target the raft.'));
|
|
287
|
+
}
|
|
288
|
+
else if (caseFile.objective === 'excavation_deformation' && load.target !== 'excavation_surcharge') {
|
|
289
|
+
findings.push(finding('blocker', 'load.target-invalid', 'Excavation-deformation load must target excavation_surcharge.'));
|
|
290
|
+
}
|
|
109
291
|
const { divisionsX, divisionsY, divisionsZ } = caseFile.mesh;
|
|
110
292
|
if (divisionsX < 2 || divisionsY < 2 || divisionsZ < 1) {
|
|
111
293
|
findings.push(finding('blocker', 'mesh.too-coarse', 'Mesh divisions must be at least 2 x 2 x 1.'));
|
|
@@ -188,6 +370,19 @@ export function validateFemResultManifest(manifest) {
|
|
|
188
370
|
findings.push(finding('blocker', 'result.outline.node-count-mismatch', 'Outline displacement vectors must match outline nodes.'));
|
|
189
371
|
}
|
|
190
372
|
pushIndexArrayFindings(findings, 'outlineIdx', visualization.outlineIdx, outlineNodeCount, 2);
|
|
373
|
+
if (Array.isArray(visualization.frames)) {
|
|
374
|
+
for (const [index, frame] of visualization.frames.entries()) {
|
|
375
|
+
pushFiniteArrayFindings(findings, `frames.${index}.disp`, frame.disp, 3);
|
|
376
|
+
pushFiniteArrayFindings(findings, `frames.${index}.color`, frame.color, 3);
|
|
377
|
+
if (frame.disp.length / 3 !== nodeCount) {
|
|
378
|
+
findings.push(finding('blocker', `result.frames.${index}.disp.node-count-mismatch`, 'Frame displacement vectors must match base nodes.'));
|
|
379
|
+
}
|
|
380
|
+
if (frame.color.length / 3 !== nodeCount) {
|
|
381
|
+
findings.push(finding('blocker', `result.frames.${index}.color.node-count-mismatch`, 'Frame color vectors must match base nodes.'));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
validateOptionalResultMetadata(findings, manifest, nodeCount, outlineNodeCount);
|
|
191
386
|
const caseValidation = validateFemAnalysisCase(manifest.analysisCase);
|
|
192
387
|
findings.push(...caseValidation.findings);
|
|
193
388
|
return summary(findings);
|