@geotechcli/core 0.4.94 → 0.4.96
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/fem/demo.d.ts +2 -0
- package/dist/fem/demo.d.ts.map +1 -1
- package/dist/fem/demo.js +517 -0
- package/dist/fem/demo.js.map +1 -1
- package/dist/fem/engineering-evidence.d.ts +60 -0
- package/dist/fem/engineering-evidence.d.ts.map +1 -1
- package/dist/fem/engineering-evidence.js +189 -1
- package/dist/fem/engineering-evidence.js.map +1 -1
- package/dist/fem/ground-model-draft.d.ts.map +1 -1
- package/dist/fem/ground-model-draft.js +27 -0
- package/dist/fem/ground-model-draft.js.map +1 -1
- package/dist/fem/index.d.ts +3 -2
- package/dist/fem/index.d.ts.map +1 -1
- package/dist/fem/index.js +3 -2
- package/dist/fem/index.js.map +1 -1
- package/dist/fem/nonlinear-column-solver.d.ts +6 -0
- package/dist/fem/nonlinear-column-solver.d.ts.map +1 -0
- package/dist/fem/nonlinear-column-solver.js +231 -0
- package/dist/fem/nonlinear-column-solver.js.map +1 -0
- package/dist/fem/production-readiness.js +5 -5
- package/dist/fem/production-readiness.js.map +1 -1
- package/dist/fem/routing.d.ts +12 -0
- package/dist/fem/routing.d.ts.map +1 -1
- package/dist/fem/routing.js +149 -12
- package/dist/fem/routing.js.map +1 -1
- package/dist/fem/types.d.ts +37 -6
- package/dist/fem/types.d.ts.map +1 -1
- package/dist/fem/validation.d.ts.map +1 -1
- package/dist/fem/validation.js +142 -10
- package/dist/fem/validation.js.map +1 -1
- package/dist/fem/webgl.js +1 -1
- package/dist/ingest/document-evidence-packet.d.ts +16 -16
- package/dist/ingest/geotech-document-benchmark.d.ts +1 -0
- package/dist/ingest/geotech-document-benchmark.d.ts.map +1 -1
- package/dist/ingest/geotech-document-benchmark.js +1 -0
- package/dist/ingest/geotech-document-benchmark.js.map +1 -1
- package/dist/meta/metadata.json +1 -1
- package/dist/verifier/findings.js +18 -9
- package/dist/verifier/findings.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { runDruckerPragerMaterialPoint, runTerzaghiConsolidationTimeStepper, } from './engineering-evidence.js';
|
|
2
|
+
import { runBuiltinStagedSettlementConsolidationDemo } from './demo.js';
|
|
3
|
+
import { validateFemAnalysisCase } from './validation.js';
|
|
4
|
+
function round(value, digits = 6) {
|
|
5
|
+
const factor = 10 ** digits;
|
|
6
|
+
return Math.round(value * factor) / factor;
|
|
7
|
+
}
|
|
8
|
+
function nonNegativeFinite(value, fallback) {
|
|
9
|
+
return Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
10
|
+
}
|
|
11
|
+
function buildUniformAxialStrainIncrements(axialStrain, increments) {
|
|
12
|
+
const step = axialStrain / increments;
|
|
13
|
+
return Array.from({ length: increments }, () => [step, 0, 0]);
|
|
14
|
+
}
|
|
15
|
+
function mobilizedStrengthRatio(materialPoint) {
|
|
16
|
+
const step = materialPoint.finalStep;
|
|
17
|
+
const denominator = Math.max(materialPoint.mapping.rho * step.principalEffectiveStressKpa.reduce((total, value) => total + value, 0) +
|
|
18
|
+
materialPoint.mapping.compressionInterceptKpa, 1e-9);
|
|
19
|
+
return Math.min(1, Math.max(0, step.deviatoricStressNormKpa / denominator));
|
|
20
|
+
}
|
|
21
|
+
function updateEnvelopeDatasets(datasets, updates) {
|
|
22
|
+
if (!datasets)
|
|
23
|
+
return undefined;
|
|
24
|
+
return datasets.map((dataset) => {
|
|
25
|
+
const value = updates[dataset.fieldId];
|
|
26
|
+
if (dataset.source !== 'envelope' || value == null)
|
|
27
|
+
return dataset;
|
|
28
|
+
return {
|
|
29
|
+
...dataset,
|
|
30
|
+
values: [round(value, 6)],
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function buildMaterialPoint(caseFile, axialStrain, incrementCount, initialPrincipalEffectiveStressKpa, policy) {
|
|
35
|
+
const material = caseFile.materials[0];
|
|
36
|
+
const poissonRatio = material.poissonRatio;
|
|
37
|
+
const columnElasticModulusKpa = material.constrainedModulusKpa
|
|
38
|
+
? material.constrainedModulusKpa * ((1 + poissonRatio) * (1 - 2 * poissonRatio)) / (1 - poissonRatio)
|
|
39
|
+
: material.elasticModulusKpa;
|
|
40
|
+
return runDruckerPragerMaterialPoint({
|
|
41
|
+
initialPrincipalEffectiveStressKpa,
|
|
42
|
+
principalStrainIncrements: buildUniformAxialStrainIncrements(axialStrain, incrementCount),
|
|
43
|
+
elasticModulusKpa: columnElasticModulusKpa,
|
|
44
|
+
poissonRatio,
|
|
45
|
+
frictionAngleDeg: material.frictionAngleDeg ?? 30,
|
|
46
|
+
cohesionKpa: material.cohesionKpa ?? 0,
|
|
47
|
+
dilationAngleDeg: 0,
|
|
48
|
+
policy,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function solveLoadControlledColumnStage(input) {
|
|
52
|
+
const { caseFile, targetLoadKpa, initialPrincipalEffectiveStressKpa, incrementCount, policy } = input;
|
|
53
|
+
if (targetLoadKpa <= 0) {
|
|
54
|
+
const materialPoint = buildMaterialPoint(caseFile, 0, incrementCount, initialPrincipalEffectiveStressKpa, policy);
|
|
55
|
+
return { axialStrain: 0, materialPoint, residualRatio: 0, iterations: 0 };
|
|
56
|
+
}
|
|
57
|
+
const material = caseFile.materials[0];
|
|
58
|
+
const modulus = Math.max(material.constrainedModulusKpa ?? material.elasticModulusKpa, 1);
|
|
59
|
+
const targetVerticalStressKpa = initialPrincipalEffectiveStressKpa[0] + targetLoadKpa;
|
|
60
|
+
const maxIterations = policy?.maxIterations ?? 40;
|
|
61
|
+
let lower = 0;
|
|
62
|
+
let upper = Math.max(targetLoadKpa / modulus, 1e-5);
|
|
63
|
+
let upperPoint = buildMaterialPoint(caseFile, upper, incrementCount, initialPrincipalEffectiveStressKpa, policy);
|
|
64
|
+
for (let guard = 0; guard < 16 && upperPoint.finalStep.principalEffectiveStressKpa[0] < targetVerticalStressKpa; guard += 1) {
|
|
65
|
+
upper *= 2;
|
|
66
|
+
upperPoint = buildMaterialPoint(caseFile, upper, incrementCount, initialPrincipalEffectiveStressKpa, policy);
|
|
67
|
+
}
|
|
68
|
+
let bestPoint = upperPoint;
|
|
69
|
+
let bestStrain = upper;
|
|
70
|
+
let bestResidual = Math.abs(upperPoint.finalStep.principalEffectiveStressKpa[0] - targetVerticalStressKpa) /
|
|
71
|
+
Math.max(targetLoadKpa, 1e-9);
|
|
72
|
+
let iterations = 0;
|
|
73
|
+
for (iterations = 1; iterations <= maxIterations; iterations += 1) {
|
|
74
|
+
const mid = (lower + upper) / 2;
|
|
75
|
+
const point = buildMaterialPoint(caseFile, mid, incrementCount, initialPrincipalEffectiveStressKpa, policy);
|
|
76
|
+
const verticalStress = point.finalStep.principalEffectiveStressKpa[0];
|
|
77
|
+
const residual = Math.abs(verticalStress - targetVerticalStressKpa) / Math.max(targetLoadKpa, 1e-9);
|
|
78
|
+
if (residual < bestResidual) {
|
|
79
|
+
bestResidual = residual;
|
|
80
|
+
bestPoint = point;
|
|
81
|
+
bestStrain = mid;
|
|
82
|
+
}
|
|
83
|
+
if (residual <= (policy?.forceBalanceTolerance ?? 1e-3))
|
|
84
|
+
break;
|
|
85
|
+
if (verticalStress < targetVerticalStressKpa) {
|
|
86
|
+
lower = mid;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
upper = mid;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
axialStrain: bestStrain,
|
|
94
|
+
materialPoint: bestPoint,
|
|
95
|
+
residualRatio: bestResidual,
|
|
96
|
+
iterations,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export function runBuiltinNonlinearConsolidationColumnSolver(caseFile, options = {}) {
|
|
100
|
+
const validation = validateFemAnalysisCase(caseFile);
|
|
101
|
+
if (validation.status === 'blocked') {
|
|
102
|
+
throw new Error(`Cannot run nonlinear consolidation column solver: ${validation.findings.map((item) => item.message).join('; ')}`);
|
|
103
|
+
}
|
|
104
|
+
if (caseFile.objective !== 'staged_settlement_consolidation') {
|
|
105
|
+
throw new Error('The nonlinear consolidation column solver only supports staged_settlement_consolidation cases.');
|
|
106
|
+
}
|
|
107
|
+
const consolidation = caseFile.geometry.consolidation;
|
|
108
|
+
const material = caseFile.materials[0];
|
|
109
|
+
if (!consolidation || !material) {
|
|
110
|
+
throw new Error('The nonlinear consolidation column solver requires consolidation geometry and at least one material.');
|
|
111
|
+
}
|
|
112
|
+
const policy = options.policy;
|
|
113
|
+
const phi = material.frictionAngleDeg ?? 30;
|
|
114
|
+
const k0 = Math.max(0.2, Math.min(1.2, 1 - Math.sin((phi * Math.PI) / 180)));
|
|
115
|
+
const initialVerticalEffectiveStressKpa = Math.max(1, material.unitWeightKnM3 * consolidation.layerThicknessM * 0.5);
|
|
116
|
+
const initialPrincipalEffectiveStressKpa = [
|
|
117
|
+
initialVerticalEffectiveStressKpa,
|
|
118
|
+
initialVerticalEffectiveStressKpa * k0,
|
|
119
|
+
initialVerticalEffectiveStressKpa * k0,
|
|
120
|
+
];
|
|
121
|
+
const incrementCount = Math.max(4, Math.min(80, caseFile.mesh.divisionsZ * 4));
|
|
122
|
+
const stageSolutions = [];
|
|
123
|
+
let cumulativeLoadKpa = 0;
|
|
124
|
+
let cumulativeTimeYears = 0;
|
|
125
|
+
let cumulativeSettlementMm = 0;
|
|
126
|
+
let previousDrainedStrain = 0;
|
|
127
|
+
let maxSolverResidualRatio = 0;
|
|
128
|
+
let maxYieldResidualRatio = 0;
|
|
129
|
+
let solverIterations = 0;
|
|
130
|
+
for (const [stageIndex, stage] of consolidation.stages.entries()) {
|
|
131
|
+
cumulativeLoadKpa += stage.loadKpa;
|
|
132
|
+
cumulativeTimeYears += stage.durationYears;
|
|
133
|
+
const loadSolution = solveLoadControlledColumnStage({
|
|
134
|
+
caseFile,
|
|
135
|
+
targetLoadKpa: cumulativeLoadKpa,
|
|
136
|
+
initialPrincipalEffectiveStressKpa,
|
|
137
|
+
incrementCount,
|
|
138
|
+
policy,
|
|
139
|
+
});
|
|
140
|
+
const drainedSettlementIncrementMm = Math.max(0, (loadSolution.axialStrain - previousDrainedStrain) * consolidation.layerThicknessM * 1000);
|
|
141
|
+
previousDrainedStrain = Math.max(previousDrainedStrain, loadSolution.axialStrain);
|
|
142
|
+
const localTimes = Array.from({ length: 8 }, (_, index) => stage.durationYears * ((index + 1) / 8));
|
|
143
|
+
const consolidationStep = runTerzaghiConsolidationTimeStepper({
|
|
144
|
+
layerThicknessM: consolidation.layerThicknessM,
|
|
145
|
+
drainage: consolidation.drainage,
|
|
146
|
+
coefficientOfConsolidationM2PerYear: material.coefficientOfConsolidationM2PerYear ?? 1,
|
|
147
|
+
initialExcessPorePressureKpa: Math.max(stage.loadKpa, 1e-6),
|
|
148
|
+
primarySettlementMm: drainedSettlementIncrementMm,
|
|
149
|
+
timeStepsYears: localTimes,
|
|
150
|
+
nodeCount: Math.max(21, Math.min(101, caseFile.mesh.divisionsZ * 8 + 1)),
|
|
151
|
+
policy,
|
|
152
|
+
});
|
|
153
|
+
cumulativeSettlementMm += consolidationStep.finalStep.settlementMm;
|
|
154
|
+
const plasticSettlementMm = Math.max(0, loadSolution.materialPoint.plasticStrainPrincipal[0] * consolidation.layerThicknessM * 1000);
|
|
155
|
+
const yieldResidualRatio = loadSolution.materialPoint.finalStep.state === 'plastic'
|
|
156
|
+
? loadSolution.materialPoint.finalStep.yieldResidualRatio
|
|
157
|
+
: 0;
|
|
158
|
+
maxSolverResidualRatio = Math.max(maxSolverResidualRatio, loadSolution.residualRatio);
|
|
159
|
+
maxYieldResidualRatio = Math.max(maxYieldResidualRatio, yieldResidualRatio);
|
|
160
|
+
solverIterations += loadSolution.iterations;
|
|
161
|
+
stageSolutions.push({
|
|
162
|
+
stageIndex,
|
|
163
|
+
stageId: stage.id,
|
|
164
|
+
cumulativeLoadKpa: round(cumulativeLoadKpa, 6),
|
|
165
|
+
cumulativeTimeYears: round(cumulativeTimeYears, 6),
|
|
166
|
+
axialStrain: round(loadSolution.axialStrain, 10),
|
|
167
|
+
settlementMm: round(cumulativeSettlementMm, 6),
|
|
168
|
+
plasticSettlementMm: round(plasticSettlementMm, 6),
|
|
169
|
+
degreeOfConsolidation: consolidationStep.finalStep.degreeOfConsolidation,
|
|
170
|
+
averageExcessPorePressureKpa: consolidationStep.finalStep.averageExcessPorePressureKpa,
|
|
171
|
+
mobilizedStrengthRatio: round(mobilizedStrengthRatio(loadSolution.materialPoint), 8),
|
|
172
|
+
solverIterations: loadSolution.iterations,
|
|
173
|
+
residualRatio: round(loadSolution.residualRatio, 12),
|
|
174
|
+
yieldResidualRatio: round(yieldResidualRatio, 12),
|
|
175
|
+
materialPoint: loadSolution.materialPoint,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const finalStage = stageSolutions[stageSolutions.length - 1];
|
|
179
|
+
const totalLoadKn = consolidation.stages.reduce((total, stage) => total + stage.loadKpa * consolidation.surfaceAreaM2, 0);
|
|
180
|
+
const finalSettlementMm = nonNegativeFinite(finalStage?.settlementMm, 0);
|
|
181
|
+
const plasticSettlementMm = Math.max(...stageSolutions.map((stage) => stage.plasticSettlementMm), 0);
|
|
182
|
+
const maxMobilizedStrengthRatio = Math.max(...stageSolutions.map((stage) => stage.mobilizedStrengthRatio), 0);
|
|
183
|
+
const maxExcessPorePressureKpa = Math.max(...stageSolutions.map((stage) => stage.averageExcessPorePressureKpa), 0);
|
|
184
|
+
const baseManifest = runBuiltinStagedSettlementConsolidationDemo(caseFile);
|
|
185
|
+
const envelope = {
|
|
186
|
+
...baseManifest.envelope,
|
|
187
|
+
maxSettlementMm: round(finalSettlementMm, 3),
|
|
188
|
+
minSettlementMm: 0,
|
|
189
|
+
totalLoadKn: round(totalLoadKn, 4),
|
|
190
|
+
reactionKn: round(totalLoadKn, 4),
|
|
191
|
+
reactionBalanceRatio: 1,
|
|
192
|
+
finalSettlementMm: round(finalSettlementMm, 3),
|
|
193
|
+
plasticSettlementMm: round(plasticSettlementMm, 3),
|
|
194
|
+
finalDegreeOfConsolidation: finalStage?.degreeOfConsolidation ?? 0,
|
|
195
|
+
maxExcessPorePressureKpa: round(maxExcessPorePressureKpa, 4),
|
|
196
|
+
maxMobilizedStrengthRatio: round(maxMobilizedStrengthRatio, 6),
|
|
197
|
+
solverLoadSteps: consolidation.stages.length,
|
|
198
|
+
solverIterations,
|
|
199
|
+
maxSolverResidualRatio: round(maxSolverResidualRatio, 12),
|
|
200
|
+
maxYieldResidualRatio: round(maxYieldResidualRatio, 12),
|
|
201
|
+
nonlinearPlasticStrain: round(finalStage?.materialPoint.finalStep.equivalentPlasticStrain ?? 0, 12),
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
...baseManifest,
|
|
205
|
+
title: `${baseManifest.title} - nonlinear column solver`,
|
|
206
|
+
backend: {
|
|
207
|
+
id: 'builtin-nonlinear-column-v0',
|
|
208
|
+
label: 'Built-in nonlinear 1D consolidation column solver',
|
|
209
|
+
deterministic: true,
|
|
210
|
+
version: '0.1.0',
|
|
211
|
+
},
|
|
212
|
+
envelope,
|
|
213
|
+
datasets: updateEnvelopeDatasets(baseManifest.datasets, {
|
|
214
|
+
final_settlement: envelope.finalSettlementMm,
|
|
215
|
+
plastic_settlement: envelope.plasticSettlementMm,
|
|
216
|
+
final_degree_of_consolidation: envelope.finalDegreeOfConsolidation,
|
|
217
|
+
max_excess_pore_pressure: envelope.maxExcessPorePressureKpa,
|
|
218
|
+
max_mobilized_strength_ratio: envelope.maxMobilizedStrengthRatio,
|
|
219
|
+
reaction_balance_ratio: envelope.reactionBalanceRatio,
|
|
220
|
+
total_load: envelope.totalLoadKn,
|
|
221
|
+
}),
|
|
222
|
+
limitations: [
|
|
223
|
+
'Nonlinear 1D column solver preview only; not a production 2D/3D geotechnical FEM design model.',
|
|
224
|
+
'Solves vertical load-controlled column equilibrium with Drucker-Prager/Mohr-Coulomb-compatible material-point return mapping.',
|
|
225
|
+
'Uses Terzaghi 1D consolidation for time-rate settlement; no global pore-pressure DOF or Biot matrix coupling is assembled.',
|
|
226
|
+
'Independent published/commercial solver benchmarks and reviewer approval enforcement are still required before production design use.',
|
|
227
|
+
...baseManifest.limitations,
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=nonlinear-column-solver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonlinear-column-solver.js","sourceRoot":"","sources":["../../src/fem/nonlinear-column-solver.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ const ALL_PRODUCTION_FEATURES = [
|
|
|
13
13
|
const FEATURE_REQUIREMENTS = {
|
|
14
14
|
'nonlinear-plasticity': {
|
|
15
15
|
status: 'kernel-verified',
|
|
16
|
-
currentCoverage: '
|
|
16
|
+
currentCoverage: 'Deterministic nonlinear material-point coverage now includes a Mohr-Coulomb triaxial strength cap plus a Drucker-Prager/Mohr-Coulomb-compatible principal-stress return-mapping kernel with yield residual and plastic strain state checks. It is not coupled to a global 2D/3D plasticity solver or plastic strain field.',
|
|
17
17
|
requiredForAcceptance: [
|
|
18
18
|
'constitutive models accepted for geotechnical use, such as Mohr-Coulomb/Hardening Soil or equivalent',
|
|
19
19
|
'stress-path, yield, plastic strain, and convergence validation fixtures',
|
|
@@ -27,15 +27,15 @@ const FEATURE_REQUIREMENTS = {
|
|
|
27
27
|
},
|
|
28
28
|
consolidation: {
|
|
29
29
|
status: 'kernel-verified',
|
|
30
|
-
currentCoverage: 'A deterministic 1D Terzaghi backward-Euler consolidation kernel is benchmarked against analytical average consolidation
|
|
30
|
+
currentCoverage: 'A deterministic 1D Terzaghi backward-Euler consolidation kernel is benchmarked against analytical average consolidation and exposed through a human-reviewed staged-settlement/consolidation preview route. A new nonlinear 1D column backend solves staged vertical equilibrium with Drucker-Prager material-point return mapping, but it is not a full 2D/3D coupled Biot FEM backend.',
|
|
31
31
|
requiredForAcceptance: [
|
|
32
32
|
'time-stepping consolidation backend with drainage boundary controls',
|
|
33
33
|
'Cv, mv/Cc, drainage path, stage duration, and monitoring calibration schema',
|
|
34
34
|
'settlement-time benchmark fixtures and tolerance envelopes',
|
|
35
35
|
],
|
|
36
36
|
blockedUntil: [
|
|
37
|
-
'
|
|
38
|
-
'drainage-boundary-validation-approved',
|
|
37
|
+
'2d-3d-coupled-consolidation-fem-backend-implemented',
|
|
38
|
+
'drainage-boundary-validation-approved-against-project-conditions',
|
|
39
39
|
'settlement-time-benchmark-suite-approved-against-published-or-commercial-references',
|
|
40
40
|
],
|
|
41
41
|
},
|
|
@@ -55,7 +55,7 @@ const FEATURE_REQUIREMENTS = {
|
|
|
55
55
|
},
|
|
56
56
|
'advanced-staged-construction': {
|
|
57
57
|
status: 'preview-only',
|
|
58
|
-
currentCoverage: 'Excavation
|
|
58
|
+
currentCoverage: 'Excavation and staged-consolidation previews include deterministic stage visualization and load histories; staged consolidation can also run a nonlinear 1D column backend. Production construction sequencing, activation/deactivation, and 2D/3D nonlinear path-dependence remain unavailable.',
|
|
59
59
|
requiredForAcceptance: [
|
|
60
60
|
'construction-stage activation/deactivation model with support installation/removal',
|
|
61
61
|
'stage-specific boundary, load, groundwater, and material state transitions',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production-readiness.js","sourceRoot":"","sources":["../../src/fem/production-readiness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA0B,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,8BAA8B,GAE/B,MAAM,2BAA2B,CAAC;AA0CnC,MAAM,uBAAuB,GAA2B;IACtD,sBAAsB;IACtB,eAAe;IACf,gCAAgC;IAChC,8BAA8B;IAC9B,gBAAgB;IAChB,0CAA0C;IAC1C,kCAAkC;IAClC,mCAAmC;CACpC,CAAC;AAEF,MAAM,oBAAoB,GAAmF;IAC3G,sBAAsB,EAAE;QACtB,MAAM,EAAE,iBAAiB;QACzB,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"production-readiness.js","sourceRoot":"","sources":["../../src/fem/production-readiness.ts"],"names":[],"mappings":"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"}
|
package/dist/fem/routing.d.ts
CHANGED
|
@@ -45,12 +45,19 @@ export interface PrepareFemAnalysisCaseDraftInput {
|
|
|
45
45
|
tunnelCenterYM?: number;
|
|
46
46
|
tunnelVolumeLossPercent?: number;
|
|
47
47
|
troughWidthParameterK?: number;
|
|
48
|
+
consolidationLayerThicknessM?: number;
|
|
49
|
+
consolidationSurfaceAreaM2?: number;
|
|
48
50
|
};
|
|
49
51
|
excavation?: {
|
|
50
52
|
stageDepthsM?: number[];
|
|
51
53
|
supportLevelsM?: number[];
|
|
52
54
|
wallType?: 'diaphragm_wall' | 'secant_pile_wall' | 'soldier_pile_lagging' | 'unsupported_screening';
|
|
53
55
|
};
|
|
56
|
+
consolidation?: {
|
|
57
|
+
stageLoadsKpa?: number[];
|
|
58
|
+
stageDurationsYears?: number[];
|
|
59
|
+
drainage?: 'single' | 'double';
|
|
60
|
+
};
|
|
54
61
|
load?: {
|
|
55
62
|
pressureKpa?: number;
|
|
56
63
|
};
|
|
@@ -58,6 +65,11 @@ export interface PrepareFemAnalysisCaseDraftInput {
|
|
|
58
65
|
elasticModulusKpa?: number;
|
|
59
66
|
poissonRatio?: number;
|
|
60
67
|
unitWeightKnM3?: number;
|
|
68
|
+
constrainedModulusKpa?: number;
|
|
69
|
+
frictionAngleDeg?: number;
|
|
70
|
+
cohesionKpa?: number;
|
|
71
|
+
coefficientOfConsolidationM2PerYear?: number;
|
|
72
|
+
hydraulicConductivityMPerS?: number;
|
|
61
73
|
};
|
|
62
74
|
groundwater?: {
|
|
63
75
|
condition?: 'not_modelled' | 'below_domain' | 'specified';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/fem/routing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/fem/routing.ts"],"names":[],"mappings":"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"}
|
package/dist/fem/routing.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildExcavationDemoAnalysisCase, buildRaftDemoAnalysisCase, buildTunnelVolumeLossDemoAnalysisCase, } from './demo.js';
|
|
1
|
+
import { buildExcavationDemoAnalysisCase, buildRaftDemoAnalysisCase, buildStagedSettlementConsolidationDemoAnalysisCase, buildTunnelVolumeLossDemoAnalysisCase, } from './demo.js';
|
|
2
2
|
import { validateFemAnalysisCase } from './validation.js';
|
|
3
3
|
const CAPABILITIES = [
|
|
4
4
|
{
|
|
@@ -146,19 +146,21 @@ const CAPABILITIES = [
|
|
|
146
146
|
{
|
|
147
147
|
objective: 'staged-settlement-consolidation',
|
|
148
148
|
label: 'Staged settlement / consolidation preview',
|
|
149
|
-
status: '
|
|
150
|
-
executionMode: '
|
|
149
|
+
status: 'implemented-demo',
|
|
150
|
+
executionMode: 'human-reviewed-preview',
|
|
151
151
|
agentRunAllowed: false,
|
|
152
|
-
analysisType: '
|
|
153
|
-
deterministicBackend:
|
|
154
|
-
description: '
|
|
152
|
+
analysisType: 'time_dependent_1d_consolidation',
|
|
153
|
+
deterministicBackend: 'builtin-staged-consolidation-1d',
|
|
154
|
+
description: 'Experimental deterministic 1D staged consolidation preview using Terzaghi time stepping and Mohr-Coulomb material-point strength gates.',
|
|
155
155
|
requiredEvidence: ['compressibility/consolidation parameters', 'stratigraphy', 'groundwater or drainage condition', 'load/stage evidence', 'settlement monitoring if available'],
|
|
156
156
|
requiredUserInputs: ['load or fill stages', 'stage durations', 'foundation footprint', 'drainage path assumptions', 'target settlement or monitoring triggers'],
|
|
157
|
-
visualizationFields: ['settlement vs time', 'degree of consolidation', 'stage load history', '
|
|
158
|
-
reviewGates: ['
|
|
159
|
-
limitations: ['No
|
|
160
|
-
command: 'geotech fem draft staged-settlement-consolidation --input <json>',
|
|
161
|
-
|
|
157
|
+
visualizationFields: ['settlement vs time', 'degree of consolidation envelope', 'stage load history', 'mobilized strength review gate'],
|
|
158
|
+
reviewGates: ['experimental-only', '1d-consolidation-only', 'mohr-coulomb-material-point-only', 'time-rate-review-required', 'not-design-calculation'],
|
|
159
|
+
limitations: ['No 2D/3D coupled Biot FEM, seepage field, embankment geometry, creep, secondary compression, or monitoring calibration solver is available yet.'],
|
|
160
|
+
command: 'geotech fem draft staged-settlement-consolidation --input <json> --case-output <analysis_case.json>',
|
|
161
|
+
demoCommand: 'geotech fem demo consolidation --experimental',
|
|
162
|
+
draftCommandTemplate: 'geotech fem draft staged-settlement-consolidation --input <json> --case-output <analysis_case.json>',
|
|
163
|
+
runCommandTemplate: 'geotech fem run <analysis_case.json> --experimental --reviewed',
|
|
162
164
|
},
|
|
163
165
|
];
|
|
164
166
|
function finitePositive(value) {
|
|
@@ -297,7 +299,8 @@ export function prepareFemAnalysisCaseDraft(input) {
|
|
|
297
299
|
}
|
|
298
300
|
if (capability.objective !== 'foundation-settlement' &&
|
|
299
301
|
capability.objective !== 'excavation-deformation' &&
|
|
300
|
-
capability.objective !== 'tunnel-volume-loss-settlement'
|
|
302
|
+
capability.objective !== 'tunnel-volume-loss-settlement' &&
|
|
303
|
+
capability.objective !== 'staged-settlement-consolidation') {
|
|
301
304
|
return {
|
|
302
305
|
schemaVersion: 'fem-analysis-case-draft.v1',
|
|
303
306
|
objective: capability.objective,
|
|
@@ -313,6 +316,140 @@ export function prepareFemAnalysisCaseDraft(input) {
|
|
|
313
316
|
contractReadiness: contractReadinessFor(capability),
|
|
314
317
|
};
|
|
315
318
|
}
|
|
319
|
+
if (capability.objective === 'staged-settlement-consolidation') {
|
|
320
|
+
const missing = [];
|
|
321
|
+
const useDemoDefaults = input.useDemoDefaults === true;
|
|
322
|
+
const layerThicknessM = input.geometry?.consolidationLayerThicknessM ?? (useDemoDefaults ? 10 : undefined);
|
|
323
|
+
const surfaceAreaM2 = input.geometry?.consolidationSurfaceAreaM2 ?? (useDemoDefaults ? 200 : undefined);
|
|
324
|
+
const stageLoadsInput = input.consolidation?.stageLoadsKpa ?? (useDemoDefaults ? [45, 35, 20] : undefined);
|
|
325
|
+
const stageDurationsInput = input.consolidation?.stageDurationsYears ?? (useDemoDefaults ? [0.5, 1, 2] : undefined);
|
|
326
|
+
const drainage = input.consolidation?.drainage ?? (useDemoDefaults ? 'double' : undefined);
|
|
327
|
+
const checkedLayerThicknessM = requirePositive(layerThicknessM, 'consolidation layer thickness', missing);
|
|
328
|
+
const checkedSurfaceAreaM2 = requirePositive(surfaceAreaM2, 'consolidation tributary surface area', missing);
|
|
329
|
+
if (!stageLoadsInput)
|
|
330
|
+
missing.push('stage loads');
|
|
331
|
+
if (!stageDurationsInput)
|
|
332
|
+
missing.push('stage durations');
|
|
333
|
+
const stageLoadsKpa = parseOptionalFiniteArray(stageLoadsInput, 'valid stage loads', missing, { positive: true });
|
|
334
|
+
const stageDurationsYears = parseOptionalFiniteArray(stageDurationsInput, 'valid stage durations', missing, { positive: true });
|
|
335
|
+
if (drainage !== 'single' && drainage !== 'double')
|
|
336
|
+
missing.push('drainage condition');
|
|
337
|
+
if (stageLoadsKpa && stageDurationsYears && stageLoadsKpa.length !== stageDurationsYears.length) {
|
|
338
|
+
missing.push('matching stage load and duration counts');
|
|
339
|
+
}
|
|
340
|
+
if (!checkedLayerThicknessM ||
|
|
341
|
+
!checkedSurfaceAreaM2 ||
|
|
342
|
+
!stageLoadsKpa ||
|
|
343
|
+
!stageDurationsYears ||
|
|
344
|
+
stageLoadsKpa.length !== stageDurationsYears.length ||
|
|
345
|
+
(drainage !== 'single' && drainage !== 'double')) {
|
|
346
|
+
return {
|
|
347
|
+
schemaVersion: 'fem-analysis-case-draft.v1',
|
|
348
|
+
objective: capability.objective,
|
|
349
|
+
capability,
|
|
350
|
+
implemented: true,
|
|
351
|
+
canAutoProceed: false,
|
|
352
|
+
recommendedAction: 'collect-inputs',
|
|
353
|
+
missingUserInputs: [...new Set(missing)],
|
|
354
|
+
assumptions: [],
|
|
355
|
+
reviewGates: ['missing-user-inputs', ...capability.reviewGates],
|
|
356
|
+
evidenceRefs: input.evidenceRefs ?? [],
|
|
357
|
+
recommendedCommand: draftCommandFor(capability),
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
const analysisCase = buildStagedSettlementConsolidationDemoAnalysisCase();
|
|
361
|
+
analysisCase.caseId = 'staged-settlement-consolidation-draft';
|
|
362
|
+
analysisCase.title = 'Experimental 1D staged settlement consolidation draft';
|
|
363
|
+
analysisCase.createdBy = 'geotechcli-fem-routing';
|
|
364
|
+
analysisCase.evidenceRefs = input.evidenceRefs ?? [];
|
|
365
|
+
analysisCase.materials.forEach((material) => {
|
|
366
|
+
material.evidenceRefs = input.evidenceRefs ?? [];
|
|
367
|
+
});
|
|
368
|
+
if (analysisCase.geometry.consolidation) {
|
|
369
|
+
analysisCase.geometry.consolidation.layerThicknessM = checkedLayerThicknessM;
|
|
370
|
+
analysisCase.geometry.consolidation.surfaceAreaM2 = checkedSurfaceAreaM2;
|
|
371
|
+
analysisCase.geometry.consolidation.drainage = drainage;
|
|
372
|
+
analysisCase.geometry.consolidation.stages = stageLoadsKpa.map((loadKpa, index) => ({
|
|
373
|
+
id: `stage-${index + 1}`,
|
|
374
|
+
label: `Stage ${index + 1} - ${loadKpa.toFixed(1)} kPa for ${stageDurationsYears[index].toFixed(2)} years`,
|
|
375
|
+
loadKpa,
|
|
376
|
+
durationYears: stageDurationsYears[index],
|
|
377
|
+
}));
|
|
378
|
+
}
|
|
379
|
+
analysisCase.geometry.domain.lengthM = input.geometry?.domainLengthM ?? Math.max(24, Math.sqrt(checkedSurfaceAreaM2) * 1.8);
|
|
380
|
+
analysisCase.geometry.domain.widthM = input.geometry?.domainWidthM ?? Math.max(12, Math.sqrt(checkedSurfaceAreaM2) * 0.9);
|
|
381
|
+
analysisCase.geometry.domain.depthM = input.geometry?.domainDepthM ?? Math.max(checkedLayerThicknessM * 1.2, analysisCase.geometry.domain.depthM);
|
|
382
|
+
analysisCase.loads = stageLoadsKpa.map((pressureKpa, index) => ({
|
|
383
|
+
id: `stage-${index + 1}-load`,
|
|
384
|
+
type: 'uniform_pressure',
|
|
385
|
+
target: 'ground_surface',
|
|
386
|
+
pressureKpa,
|
|
387
|
+
evidenceRefs: input.evidenceRefs ?? [],
|
|
388
|
+
assumptions: [
|
|
389
|
+
{
|
|
390
|
+
id: `stage-${index + 1}-load-assumption`,
|
|
391
|
+
parameter: 'staged surface pressure',
|
|
392
|
+
value: pressureKpa,
|
|
393
|
+
unit: 'kPa',
|
|
394
|
+
basis: 'User-provided staged consolidation load for experimental preview.',
|
|
395
|
+
confidence: 'review',
|
|
396
|
+
reviewRequired: true,
|
|
397
|
+
},
|
|
398
|
+
],
|
|
399
|
+
}));
|
|
400
|
+
const material = analysisCase.materials[0];
|
|
401
|
+
if (finitePositive(input.material?.elasticModulusKpa))
|
|
402
|
+
material.elasticModulusKpa = input.material.elasticModulusKpa;
|
|
403
|
+
if (typeof input.material?.poissonRatio === 'number')
|
|
404
|
+
material.poissonRatio = input.material.poissonRatio;
|
|
405
|
+
if (finitePositive(input.material?.unitWeightKnM3))
|
|
406
|
+
material.unitWeightKnM3 = input.material.unitWeightKnM3;
|
|
407
|
+
if (finitePositive(input.material?.constrainedModulusKpa))
|
|
408
|
+
material.constrainedModulusKpa = input.material.constrainedModulusKpa;
|
|
409
|
+
if (typeof input.material?.frictionAngleDeg === 'number')
|
|
410
|
+
material.frictionAngleDeg = input.material.frictionAngleDeg;
|
|
411
|
+
if (typeof input.material?.cohesionKpa === 'number' && Number.isFinite(input.material.cohesionKpa) && input.material.cohesionKpa >= 0) {
|
|
412
|
+
material.cohesionKpa = input.material.cohesionKpa;
|
|
413
|
+
}
|
|
414
|
+
if (finitePositive(input.material?.coefficientOfConsolidationM2PerYear)) {
|
|
415
|
+
material.coefficientOfConsolidationM2PerYear = input.material.coefficientOfConsolidationM2PerYear;
|
|
416
|
+
}
|
|
417
|
+
if (finitePositive(input.material?.hydraulicConductivityMPerS))
|
|
418
|
+
material.hydraulicConductivityMPerS = input.material.hydraulicConductivityMPerS;
|
|
419
|
+
if (input.groundwater?.condition) {
|
|
420
|
+
analysisCase.groundwater.condition = input.groundwater.condition;
|
|
421
|
+
}
|
|
422
|
+
if (typeof input.groundwater?.depthM === 'number') {
|
|
423
|
+
analysisCase.groundwater.depthM = input.groundwater.depthM;
|
|
424
|
+
}
|
|
425
|
+
if (input.groundwater?.note) {
|
|
426
|
+
analysisCase.groundwater.note = input.groundwater.note;
|
|
427
|
+
}
|
|
428
|
+
const validation = validateFemAnalysisCase(analysisCase);
|
|
429
|
+
const reviewGates = [
|
|
430
|
+
...capability.reviewGates,
|
|
431
|
+
...validation.findings
|
|
432
|
+
.filter((finding) => finding.severity !== 'info')
|
|
433
|
+
.map((finding) => finding.code),
|
|
434
|
+
];
|
|
435
|
+
return {
|
|
436
|
+
schemaVersion: 'fem-analysis-case-draft.v1',
|
|
437
|
+
objective: capability.objective,
|
|
438
|
+
capability,
|
|
439
|
+
implemented: true,
|
|
440
|
+
canAutoProceed: false,
|
|
441
|
+
recommendedAction: actionForValidation(validation),
|
|
442
|
+
missingUserInputs: validation.status === 'blocked' ? validation.findings
|
|
443
|
+
.filter((finding) => finding.severity === 'blocker')
|
|
444
|
+
.map((finding) => finding.code) : [],
|
|
445
|
+
assumptions: analysisCase.assumptions,
|
|
446
|
+
reviewGates: [...new Set(reviewGates)],
|
|
447
|
+
evidenceRefs: analysisCase.evidenceRefs,
|
|
448
|
+
analysisCase,
|
|
449
|
+
validation,
|
|
450
|
+
recommendedCommand: commandForValidation(capability, validation),
|
|
451
|
+
};
|
|
452
|
+
}
|
|
316
453
|
if (capability.objective === 'tunnel-volume-loss-settlement') {
|
|
317
454
|
const missing = [];
|
|
318
455
|
const useDemoDefaults = input.useDemoDefaults === true;
|