@geotechcli/core 0.4.106 → 0.4.107
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.map +1 -1
- package/dist/fem/demo.js +4 -0
- package/dist/fem/demo.js.map +1 -1
- package/dist/fem/engineering-evidence.d.ts.map +1 -1
- package/dist/fem/engineering-evidence.js +8 -6
- package/dist/fem/engineering-evidence.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.map +1 -1
- package/dist/fem/nonlinear-column-solver.d.ts.map +1 -1
- package/dist/fem/nonlinear-column-solver.js +137 -6
- package/dist/fem/nonlinear-column-solver.js.map +1 -1
- package/dist/fem/plane-strain-assembly.d.ts +35 -0
- package/dist/fem/plane-strain-assembly.d.ts.map +1 -1
- package/dist/fem/plane-strain-assembly.js +109 -13
- package/dist/fem/plane-strain-assembly.js.map +1 -1
- package/dist/fem/production-readiness.d.ts.map +1 -1
- package/dist/fem/production-readiness.js +2 -1
- package/dist/fem/production-readiness.js.map +1 -1
- package/dist/fem/types.d.ts +49 -0
- package/dist/fem/types.d.ts.map +1 -1
- package/dist/fem/validation.d.ts.map +1 -1
- package/dist/fem/validation.js +166 -2
- package/dist/fem/validation.js.map +1 -1
- package/dist/meta/metadata.json +1 -1
- package/package.json +1 -1
|
@@ -87,6 +87,25 @@ export interface FemPlaneStrainDruckerPragerGaussPointResult extends FemPlaneStr
|
|
|
87
87
|
equivalentPlasticStrain: number;
|
|
88
88
|
state: 'elastic' | 'plastic';
|
|
89
89
|
}
|
|
90
|
+
export type FemPlaneStrainDruckerPragerTerminationReason = 'converged' | 'max_iterations' | 'force_residual_exceeded' | 'yield_residual_exceeded';
|
|
91
|
+
export interface FemPlaneStrainDruckerPragerResidualHistoryEntry {
|
|
92
|
+
iteration: number;
|
|
93
|
+
maxFreeResidualKn: number;
|
|
94
|
+
residualNormRatio: number;
|
|
95
|
+
forceBalanceTolerance: number;
|
|
96
|
+
reactionBalanceRatio: number;
|
|
97
|
+
maxYieldResidualRatio: number;
|
|
98
|
+
yieldResidualTolerance: number;
|
|
99
|
+
converged: boolean;
|
|
100
|
+
}
|
|
101
|
+
export interface FemPlaneStrainDruckerPragerFailure {
|
|
102
|
+
step: number;
|
|
103
|
+
loadFactor: number;
|
|
104
|
+
terminationReason: FemPlaneStrainDruckerPragerTerminationReason;
|
|
105
|
+
residualNormRatio: number;
|
|
106
|
+
maxYieldResidualRatio: number;
|
|
107
|
+
message: string;
|
|
108
|
+
}
|
|
90
109
|
export interface FemPlaneStrainDruckerPragerStepResult {
|
|
91
110
|
step: number;
|
|
92
111
|
loadFactor: number;
|
|
@@ -98,6 +117,8 @@ export interface FemPlaneStrainDruckerPragerStepResult {
|
|
|
98
117
|
maxEquivalentPlasticStrain: number;
|
|
99
118
|
plasticGaussPointCount: number;
|
|
100
119
|
converged: boolean;
|
|
120
|
+
terminationReason: FemPlaneStrainDruckerPragerTerminationReason;
|
|
121
|
+
residualHistory: FemPlaneStrainDruckerPragerResidualHistoryEntry[];
|
|
101
122
|
}
|
|
102
123
|
export interface FemPlaneStrainDruckerPragerResult {
|
|
103
124
|
schemaVersion: 'fem-plane-strain-drucker-prager-result.v1';
|
|
@@ -125,6 +146,8 @@ export interface FemPlaneStrainDruckerPragerResult {
|
|
|
125
146
|
maxEquivalentPlasticStrain: number;
|
|
126
147
|
plasticGaussPointCount: number;
|
|
127
148
|
converged: boolean;
|
|
149
|
+
status: 'converged' | 'nonconverged';
|
|
150
|
+
failure?: FemPlaneStrainDruckerPragerFailure;
|
|
128
151
|
policy: FemConvergencePolicy;
|
|
129
152
|
limitations: string[];
|
|
130
153
|
}
|
|
@@ -238,6 +261,7 @@ export interface FemPlaneStrainBiotStepResult {
|
|
|
238
261
|
freePorePressureResidualL1M3PerS: number;
|
|
239
262
|
massBalanceErrorRatio: number;
|
|
240
263
|
pressureAudit: FemPlaneStrainBiotPressureAudit;
|
|
264
|
+
pressureDiagnostics: FemPlaneStrainBiotPressureDiagnostics;
|
|
241
265
|
minPorePressureKpa: number;
|
|
242
266
|
maxPorePressureKpa: number;
|
|
243
267
|
maxVerticalSettlementM: number;
|
|
@@ -252,6 +276,8 @@ export interface FemPlaneStrainBiotNumericalContract {
|
|
|
252
276
|
totalStressRelation: 'sigma_total_xx_yy = sigma_effective_xx_yy - alpha_B * p; shear unchanged';
|
|
253
277
|
darcyFluxRelation: 'q = -k/gamma_water * grad(p)';
|
|
254
278
|
storageConvention: 'specificStorage1PerM is head-based; pressure storage uses Ss / gamma_water';
|
|
279
|
+
transientStepPolicy: 'fixed backward-Euler grid requires minAcceptedSteps and bounded step-growth ratio';
|
|
280
|
+
maxTimeStepGrowthRatio: number;
|
|
255
281
|
gammaWaterKpaPerM: number;
|
|
256
282
|
}
|
|
257
283
|
export interface FemPlaneStrainBiotPressureAudit {
|
|
@@ -263,6 +289,14 @@ export interface FemPlaneStrainBiotPressureAudit {
|
|
|
263
289
|
couplingRateSumM3PerS: number;
|
|
264
290
|
darcyFlowRateSumM3PerS: number;
|
|
265
291
|
}
|
|
292
|
+
export interface FemPlaneStrainBiotPressureDiagnostics {
|
|
293
|
+
averagePorePressureKpa: number;
|
|
294
|
+
averageFreePorePressureKpa: number;
|
|
295
|
+
porePressureDissipationRatio: number;
|
|
296
|
+
maxPorePressureChangeKpa: number;
|
|
297
|
+
maxPorePressureChangeRateKpaPerS: number;
|
|
298
|
+
pressureOvershootKpa: number;
|
|
299
|
+
}
|
|
266
300
|
export interface FemPlaneStrainBiotConsolidationResult {
|
|
267
301
|
schemaVersion: 'fem-plane-strain-biot-consolidation-result.v1';
|
|
268
302
|
method: 'quad4-plane-strain-biot-u-p-backward-euler-evidence';
|
|
@@ -295,6 +329,7 @@ export interface FemPlaneStrainBiotConsolidationResult {
|
|
|
295
329
|
maxFreePorePressureResidualM3PerS: number;
|
|
296
330
|
freePorePressureResidualL1M3PerS: number;
|
|
297
331
|
pressureAudit: FemPlaneStrainBiotPressureAudit;
|
|
332
|
+
pressureDiagnostics: FemPlaneStrainBiotPressureDiagnostics;
|
|
298
333
|
massBalanceErrorRatio: number;
|
|
299
334
|
minPorePressureKpa: number;
|
|
300
335
|
maxPorePressureKpa: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plane-strain-assembly.d.ts","sourceRoot":"","sources":["../../src/fem/plane-strain-assembly.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plane-strain-assembly.d.ts","sourceRoot":"","sources":["../../src/fem/plane-strain-assembly.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ const GAUSS_POINTS = [
|
|
|
6
6
|
[-1 / Math.sqrt(3), 1 / Math.sqrt(3), 1],
|
|
7
7
|
];
|
|
8
8
|
const MAX_DENSE_DOF_COUNT = 800;
|
|
9
|
+
const MAX_BIOT_TIME_STEP_GROWTH_RATIO = 8;
|
|
9
10
|
function assertFinite(value, label) {
|
|
10
11
|
if (!Number.isFinite(value))
|
|
11
12
|
throw new Error(`${label} must be finite.`);
|
|
@@ -62,6 +63,26 @@ function validateConvergencePolicy(policy) {
|
|
|
62
63
|
throw new Error('policy.minAcceptedSteps must be less than or equal to policy.maxIterations.');
|
|
63
64
|
}
|
|
64
65
|
}
|
|
66
|
+
function validateBiotTransientStepPolicy(timeStepsSeconds, policy) {
|
|
67
|
+
if (timeStepsSeconds.length < policy.minAcceptedSteps) {
|
|
68
|
+
throw new Error(`timeStepsSeconds must include at least ${policy.minAcceptedSteps} accepted transient steps for the Biot consolidation preview.`);
|
|
69
|
+
}
|
|
70
|
+
let previousTimeSeconds = 0;
|
|
71
|
+
let previousDeltaTimeSeconds;
|
|
72
|
+
for (const [index, timeSeconds] of timeStepsSeconds.entries()) {
|
|
73
|
+
assertFinitePositive(timeSeconds, `timeStepsSeconds.${index}`);
|
|
74
|
+
if (timeSeconds <= previousTimeSeconds) {
|
|
75
|
+
throw new Error(`timeStepsSeconds.${index} must be strictly increasing.`);
|
|
76
|
+
}
|
|
77
|
+
const deltaTimeSeconds = timeSeconds - previousTimeSeconds;
|
|
78
|
+
if (previousDeltaTimeSeconds != null &&
|
|
79
|
+
deltaTimeSeconds / previousDeltaTimeSeconds > MAX_BIOT_TIME_STEP_GROWTH_RATIO) {
|
|
80
|
+
throw new Error(`timeStepsSeconds.${index} step growth ratio must not exceed ${MAX_BIOT_TIME_STEP_GROWTH_RATIO} for the Biot consolidation preview.`);
|
|
81
|
+
}
|
|
82
|
+
previousTimeSeconds = timeSeconds;
|
|
83
|
+
previousDeltaTimeSeconds = deltaTimeSeconds;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
65
86
|
function round(value, digits = 10) {
|
|
66
87
|
const factor = 10 ** digits;
|
|
67
88
|
return Math.round(value * factor) / factor;
|
|
@@ -654,6 +675,7 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
654
675
|
assertUniqueIds(model.elements, 'element');
|
|
655
676
|
const policy = model.policy ?? DEFAULT_FEM_CONVERGENCE_POLICY;
|
|
656
677
|
validateConvergencePolicy(policy);
|
|
678
|
+
validateBiotTransientStepPolicy(model.timeStepsSeconds, policy);
|
|
657
679
|
const nodeIndexById = new Map(model.nodes.map((node, index) => [node.id, index]));
|
|
658
680
|
const materialById = new Map(model.materials.map((material) => [material.id, material]));
|
|
659
681
|
const displacementDofCount = model.nodes.length * 2;
|
|
@@ -661,14 +683,6 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
661
683
|
if (displacementDofCount + porePressureDofCount > MAX_DENSE_DOF_COUNT) {
|
|
662
684
|
throw new Error(`Plane-strain Biot consolidation dense assembly is capped at ${MAX_DENSE_DOF_COUNT} coupled DOFs for benchmark-scale evidence runs.`);
|
|
663
685
|
}
|
|
664
|
-
let previousTimeSeconds = 0;
|
|
665
|
-
for (const [index, timeSeconds] of model.timeStepsSeconds.entries()) {
|
|
666
|
-
assertFinitePositive(timeSeconds, `timeStepsSeconds.${index}`);
|
|
667
|
-
if (timeSeconds <= previousTimeSeconds) {
|
|
668
|
-
throw new Error(`timeStepsSeconds.${index} must be strictly increasing.`);
|
|
669
|
-
}
|
|
670
|
-
previousTimeSeconds = timeSeconds;
|
|
671
|
-
}
|
|
672
686
|
for (const node of model.nodes) {
|
|
673
687
|
assertFinite(node.xM, `node ${node.id} xM`);
|
|
674
688
|
assertFinite(node.yM, `node ${node.id} yM`);
|
|
@@ -703,6 +717,9 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
703
717
|
throw new Error(`Unknown Biot nodal flux node: ${flux.nodeId}.`);
|
|
704
718
|
const flowM3PerS = flux.flowM3PerS ?? 0;
|
|
705
719
|
assertFinite(flowM3PerS, `nodal flux ${flux.nodeId}.flowM3PerS`);
|
|
720
|
+
if (flowM3PerS < 0) {
|
|
721
|
+
throw new Error(`nodal flux ${flux.nodeId}.flowM3PerS must be non-negative; extraction-driven suction is unsupported by this saturated excess-pressure Biot evidence kernel.`);
|
|
722
|
+
}
|
|
706
723
|
fluxes[nodeIndex] += flowM3PerS;
|
|
707
724
|
}
|
|
708
725
|
const elementGaussCache = [];
|
|
@@ -828,6 +845,11 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
828
845
|
displacement[index] = value;
|
|
829
846
|
for (const [index, value] of prescribedPressures)
|
|
830
847
|
porePressure[index] = value;
|
|
848
|
+
const pressureUpperBoundKpa = Math.max(initialPorePressureKpa, ...Array.from(prescribedPressures.values()));
|
|
849
|
+
const averagePressure = (dofs) => dofs.length > 0
|
|
850
|
+
? dofs.reduce((sum, index) => sum + porePressure[index], 0) / dofs.length
|
|
851
|
+
: 0;
|
|
852
|
+
const initialAverageFreePorePressureKpa = averagePressure(freePressureDofs);
|
|
831
853
|
let previousDisplacement = [...displacement];
|
|
832
854
|
let previousPorePressure = [...porePressure];
|
|
833
855
|
let lastMechanicalResidual = new Array(displacementDofCount).fill(0);
|
|
@@ -846,6 +868,14 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
846
868
|
couplingRateSumM3PerS: 0,
|
|
847
869
|
darcyFlowRateSumM3PerS: 0,
|
|
848
870
|
};
|
|
871
|
+
let lastPressureDiagnostics = {
|
|
872
|
+
averagePorePressureKpa: round(porePressure.reduce((sum, value) => sum + value, 0) / porePressure.length, 8),
|
|
873
|
+
averageFreePorePressureKpa: round(initialAverageFreePorePressureKpa, 8),
|
|
874
|
+
porePressureDissipationRatio: 0,
|
|
875
|
+
maxPorePressureChangeKpa: 0,
|
|
876
|
+
maxPorePressureChangeRateKpaPerS: 0,
|
|
877
|
+
pressureOvershootKpa: 0,
|
|
878
|
+
};
|
|
849
879
|
let lastMinPorePressureKpa = Math.min(...porePressure);
|
|
850
880
|
let lastMaxPorePressureKpa = Math.max(...porePressure);
|
|
851
881
|
const timeSteps = [];
|
|
@@ -966,6 +996,23 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
966
996
|
const massBalanceErrorRatio = freePressureResidualSum / pressureScale;
|
|
967
997
|
const minPorePressureKpa = Math.min(...porePressure);
|
|
968
998
|
const maxPorePressureKpa = Math.max(...porePressure);
|
|
999
|
+
const pressureOvershootKpa = Math.max(0, maxPorePressureKpa - pressureUpperBoundKpa);
|
|
1000
|
+
if (pressureOvershootKpa > 1e-6) {
|
|
1001
|
+
throw new Error(`Plane-strain Biot step ${stepIndex + 1} pore pressure exceeded the initial/prescribed pressure envelope by ${pressureOvershootKpa} kPa.`);
|
|
1002
|
+
}
|
|
1003
|
+
const averagePorePressureKpa = porePressure.reduce((sum, value) => sum + value, 0) / porePressure.length;
|
|
1004
|
+
const averageFreePorePressureKpa = averagePressure(freePressureDofs);
|
|
1005
|
+
const dissipationReferenceKpa = Math.max(initialAverageFreePorePressureKpa, 1e-12);
|
|
1006
|
+
const porePressureDissipationRatio = Math.min(1, Math.max(0, (initialAverageFreePorePressureKpa - averageFreePorePressureKpa) / dissipationReferenceKpa));
|
|
1007
|
+
const maxPorePressureChangeKpa = Math.max(...porePressure.map((value, index) => Math.abs(value - previousPorePressure[index])));
|
|
1008
|
+
const pressureDiagnostics = {
|
|
1009
|
+
averagePorePressureKpa: round(averagePorePressureKpa, 8),
|
|
1010
|
+
averageFreePorePressureKpa: round(averageFreePorePressureKpa, 8),
|
|
1011
|
+
porePressureDissipationRatio: round(porePressureDissipationRatio, 12),
|
|
1012
|
+
maxPorePressureChangeKpa: round(maxPorePressureChangeKpa, 8),
|
|
1013
|
+
maxPorePressureChangeRateKpaPerS: Number((maxPorePressureChangeKpa / deltaTimeSeconds).toExponential(12)),
|
|
1014
|
+
pressureOvershootKpa: round(pressureOvershootKpa, 8),
|
|
1015
|
+
};
|
|
969
1016
|
const maxVerticalSettlementM = Math.max(0, -Math.min(...model.nodes.map((_, index) => displacement[dofIndex(index, 'uy')])));
|
|
970
1017
|
const converged = residualNormRatio <= policy.forceBalanceTolerance &&
|
|
971
1018
|
massBalanceErrorRatio <= policy.porePressureMassBalanceTolerance;
|
|
@@ -979,6 +1026,7 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
979
1026
|
freePorePressureResidualL1M3PerS: Number(freePressureResidualSum.toExponential(12)),
|
|
980
1027
|
massBalanceErrorRatio: round(massBalanceErrorRatio, 12),
|
|
981
1028
|
pressureAudit,
|
|
1029
|
+
pressureDiagnostics,
|
|
982
1030
|
minPorePressureKpa: round(minPorePressureKpa, 8),
|
|
983
1031
|
maxPorePressureKpa: round(maxPorePressureKpa, 8),
|
|
984
1032
|
maxVerticalSettlementM: round(maxVerticalSettlementM, 12),
|
|
@@ -994,6 +1042,7 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
994
1042
|
lastMaxFreePorePressureResidualM3PerS = maxFreePorePressureResidualM3PerS;
|
|
995
1043
|
lastFreePorePressureResidualL1M3PerS = freePressureResidualSum;
|
|
996
1044
|
lastPressureAudit = pressureAudit;
|
|
1045
|
+
lastPressureDiagnostics = pressureDiagnostics;
|
|
997
1046
|
lastMinPorePressureKpa = minPorePressureKpa;
|
|
998
1047
|
lastMaxPorePressureKpa = maxPorePressureKpa;
|
|
999
1048
|
}
|
|
@@ -1063,6 +1112,8 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
1063
1112
|
totalStressRelation: 'sigma_total_xx_yy = sigma_effective_xx_yy - alpha_B * p; shear unchanged',
|
|
1064
1113
|
darcyFluxRelation: 'q = -k/gamma_water * grad(p)',
|
|
1065
1114
|
storageConvention: 'specificStorage1PerM is head-based; pressure storage uses Ss / gamma_water',
|
|
1115
|
+
transientStepPolicy: 'fixed backward-Euler grid requires minAcceptedSteps and bounded step-growth ratio',
|
|
1116
|
+
maxTimeStepGrowthRatio: MAX_BIOT_TIME_STEP_GROWTH_RATIO,
|
|
1066
1117
|
gammaWaterKpaPerM: round(gammaWaterKpaPerM, 8),
|
|
1067
1118
|
},
|
|
1068
1119
|
nodes: model.nodes.map((node, index) => ({
|
|
@@ -1089,6 +1140,7 @@ export function runPlaneStrainBiotConsolidation(model) {
|
|
|
1089
1140
|
maxFreePorePressureResidualM3PerS: Number(lastMaxFreePorePressureResidualM3PerS.toExponential(12)),
|
|
1090
1141
|
freePorePressureResidualL1M3PerS: Number(lastFreePorePressureResidualL1M3PerS.toExponential(12)),
|
|
1091
1142
|
pressureAudit: lastPressureAudit,
|
|
1143
|
+
pressureDiagnostics: lastPressureDiagnostics,
|
|
1092
1144
|
massBalanceErrorRatio: round(lastMassBalanceErrorRatio, 12),
|
|
1093
1145
|
minPorePressureKpa: round(lastMinPorePressureKpa, 8),
|
|
1094
1146
|
maxPorePressureKpa: round(lastMaxPorePressureKpa, 8),
|
|
@@ -1528,6 +1580,31 @@ function normalizeLoadStepFractions(loadStepFractions) {
|
|
|
1528
1580
|
}
|
|
1529
1581
|
return fractions;
|
|
1530
1582
|
}
|
|
1583
|
+
function isDruckerPragerStepConverged(evaluation, policy) {
|
|
1584
|
+
return evaluation.residualNormRatio <= policy.forceBalanceTolerance &&
|
|
1585
|
+
evaluation.maxYieldResidualRatio <= policy.residualTolerance;
|
|
1586
|
+
}
|
|
1587
|
+
function druckerPragerResidualHistoryEntry(iteration, evaluation, policy) {
|
|
1588
|
+
return {
|
|
1589
|
+
iteration,
|
|
1590
|
+
maxFreeResidualKn: round(evaluation.maxFreeResidualKn, 12),
|
|
1591
|
+
residualNormRatio: round(evaluation.residualNormRatio, 12),
|
|
1592
|
+
forceBalanceTolerance: policy.forceBalanceTolerance,
|
|
1593
|
+
reactionBalanceRatio: round(evaluation.reactionBalanceRatio, 12),
|
|
1594
|
+
maxYieldResidualRatio: round(evaluation.maxYieldResidualRatio, 12),
|
|
1595
|
+
yieldResidualTolerance: policy.residualTolerance,
|
|
1596
|
+
converged: isDruckerPragerStepConverged(evaluation, policy),
|
|
1597
|
+
};
|
|
1598
|
+
}
|
|
1599
|
+
function druckerPragerTerminationReason(evaluation, policy, converged, iterations) {
|
|
1600
|
+
if (converged)
|
|
1601
|
+
return 'converged';
|
|
1602
|
+
if (iterations >= policy.maxIterations)
|
|
1603
|
+
return 'max_iterations';
|
|
1604
|
+
if (evaluation.residualNormRatio > policy.forceBalanceTolerance)
|
|
1605
|
+
return 'force_residual_exceeded';
|
|
1606
|
+
return 'yield_residual_exceeded';
|
|
1607
|
+
}
|
|
1531
1608
|
export function runPlaneStrainDruckerPragerLoadSteps(model, options = {}) {
|
|
1532
1609
|
const system = assemblePlaneStrainSystem(model);
|
|
1533
1610
|
const loadStepFractions = normalizeLoadStepFractions(options.loadStepFractions);
|
|
@@ -1540,8 +1617,10 @@ export function runPlaneStrainDruckerPragerLoadSteps(model, options = {}) {
|
|
|
1540
1617
|
displacement[index] = value * loadFactor;
|
|
1541
1618
|
let evaluation = evaluatePlaneStrainDruckerPragerState({ system, displacement, loadFactor });
|
|
1542
1619
|
let iterations = 0;
|
|
1543
|
-
let converged = evaluation
|
|
1544
|
-
|
|
1620
|
+
let converged = isDruckerPragerStepConverged(evaluation, system.policy);
|
|
1621
|
+
const residualHistory = [
|
|
1622
|
+
druckerPragerResidualHistoryEntry(iterations, evaluation, system.policy),
|
|
1623
|
+
];
|
|
1545
1624
|
while (!converged && iterations < system.policy.maxIterations) {
|
|
1546
1625
|
iterations += 1;
|
|
1547
1626
|
if (system.freeDofs.length === 0)
|
|
@@ -1554,10 +1633,11 @@ export function runPlaneStrainDruckerPragerLoadSteps(model, options = {}) {
|
|
|
1554
1633
|
for (const [index, value] of system.prescribed)
|
|
1555
1634
|
displacement[index] = value * loadFactor;
|
|
1556
1635
|
evaluation = evaluatePlaneStrainDruckerPragerState({ system, displacement, loadFactor });
|
|
1557
|
-
converged = evaluation
|
|
1558
|
-
|
|
1636
|
+
converged = isDruckerPragerStepConverged(evaluation, system.policy);
|
|
1637
|
+
residualHistory.push(druckerPragerResidualHistoryEntry(iterations, evaluation, system.policy));
|
|
1559
1638
|
}
|
|
1560
1639
|
finalEvaluation = evaluation;
|
|
1640
|
+
const terminationReason = druckerPragerTerminationReason(evaluation, system.policy, converged, iterations);
|
|
1561
1641
|
loadSteps.push({
|
|
1562
1642
|
step: stepIndex + 1,
|
|
1563
1643
|
loadFactor: round(loadFactor, 8),
|
|
@@ -1569,11 +1649,15 @@ export function runPlaneStrainDruckerPragerLoadSteps(model, options = {}) {
|
|
|
1569
1649
|
maxEquivalentPlasticStrain: round(evaluation.maxEquivalentPlasticStrain, 12),
|
|
1570
1650
|
plasticGaussPointCount: evaluation.plasticGaussPointCount,
|
|
1571
1651
|
converged,
|
|
1652
|
+
terminationReason,
|
|
1653
|
+
residualHistory,
|
|
1572
1654
|
});
|
|
1573
1655
|
}
|
|
1574
1656
|
if (!finalEvaluation) {
|
|
1575
1657
|
throw new Error('Plane-strain nonlinear load-step solver requires at least one load step.');
|
|
1576
1658
|
}
|
|
1659
|
+
const failedStep = loadSteps.find((step) => !step.converged);
|
|
1660
|
+
const status = failedStep ? 'nonconverged' : 'converged';
|
|
1577
1661
|
return {
|
|
1578
1662
|
schemaVersion: 'fem-plane-strain-drucker-prager-result.v1',
|
|
1579
1663
|
method: 'quad4-plane-strain-drucker-prager-modified-newton',
|
|
@@ -1595,10 +1679,22 @@ export function runPlaneStrainDruckerPragerLoadSteps(model, options = {}) {
|
|
|
1595
1679
|
maxYieldResidualRatio: round(finalEvaluation.maxYieldResidualRatio, 12),
|
|
1596
1680
|
maxEquivalentPlasticStrain: round(finalEvaluation.maxEquivalentPlasticStrain, 12),
|
|
1597
1681
|
plasticGaussPointCount: finalEvaluation.plasticGaussPointCount,
|
|
1598
|
-
converged:
|
|
1682
|
+
converged: status === 'converged',
|
|
1683
|
+
status,
|
|
1684
|
+
...(failedStep ? {
|
|
1685
|
+
failure: {
|
|
1686
|
+
step: failedStep.step,
|
|
1687
|
+
loadFactor: failedStep.loadFactor,
|
|
1688
|
+
terminationReason: failedStep.terminationReason,
|
|
1689
|
+
residualNormRatio: failedStep.residualNormRatio,
|
|
1690
|
+
maxYieldResidualRatio: failedStep.maxYieldResidualRatio,
|
|
1691
|
+
message: `Plane-strain Drucker-Prager load step ${failedStep.step} did not satisfy the configured convergence policy.`,
|
|
1692
|
+
},
|
|
1693
|
+
} : {}),
|
|
1599
1694
|
policy: system.policy,
|
|
1600
1695
|
limitations: [
|
|
1601
1696
|
'Benchmark-scale modified-Newton plane-strain plasticity evidence kernel only.',
|
|
1697
|
+
...(failedStep ? ['Nonconverged load-step result is reported fail-closed and must not be treated as an accepted engineering solve.'] : []),
|
|
1602
1698
|
'Uses elastic global tangent with Gauss-point Drucker-Prager stress projection; no production consistent tangent, sparse solver, hardening calibration, staged activation, pore-pressure DOF, or route-backed result manifest is provided.',
|
|
1603
1699
|
'Use for deterministic evidence and regression tests only until independent published/commercial benchmark comparison and licensed production approval gates are complete.',
|
|
1604
1700
|
],
|