@geotechcli/core 0.4.110 → 0.4.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/agents/brain.d.ts.map +1 -1
  2. package/dist/agents/brain.js +31 -2
  3. package/dist/agents/brain.js.map +1 -1
  4. package/dist/agents/fem-tools.js +5 -0
  5. package/dist/agents/fem-tools.js.map +1 -1
  6. package/dist/agents/safety.d.ts +1 -0
  7. package/dist/agents/safety.d.ts.map +1 -1
  8. package/dist/agents/safety.js +62 -0
  9. package/dist/agents/safety.js.map +1 -1
  10. package/dist/fem/engineering-evidence.d.ts +21 -2
  11. package/dist/fem/engineering-evidence.d.ts.map +1 -1
  12. package/dist/fem/engineering-evidence.js +257 -6
  13. package/dist/fem/engineering-evidence.js.map +1 -1
  14. package/dist/fem/index.d.ts +3 -2
  15. package/dist/fem/index.d.ts.map +1 -1
  16. package/dist/fem/index.js +1 -0
  17. package/dist/fem/index.js.map +1 -1
  18. package/dist/fem/nonlinear-plane-strain-solver.d.ts +10 -0
  19. package/dist/fem/nonlinear-plane-strain-solver.d.ts.map +1 -0
  20. package/dist/fem/nonlinear-plane-strain-solver.js +358 -0
  21. package/dist/fem/nonlinear-plane-strain-solver.js.map +1 -0
  22. package/dist/fem/plane-strain-assembly.d.ts +37 -0
  23. package/dist/fem/plane-strain-assembly.d.ts.map +1 -1
  24. package/dist/fem/plane-strain-assembly.js +209 -43
  25. package/dist/fem/plane-strain-assembly.js.map +1 -1
  26. package/dist/fem/production-readiness.js +2 -2
  27. package/dist/fem/production-readiness.js.map +1 -1
  28. package/dist/fem/types.d.ts +52 -3
  29. package/dist/fem/types.d.ts.map +1 -1
  30. package/dist/fem/validation.d.ts.map +1 -1
  31. package/dist/fem/validation.js +281 -10
  32. package/dist/fem/validation.js.map +1 -1
  33. package/dist/ingest/document-evidence-packet.d.ts +6 -6
  34. package/dist/ingest/geotech-document.d.ts +2 -1
  35. package/dist/ingest/geotech-document.d.ts.map +1 -1
  36. package/dist/ingest/geotech-document.js +2 -1
  37. package/dist/ingest/geotech-document.js.map +1 -1
  38. package/dist/ingest/geotech-extract.d.ts +2 -1
  39. package/dist/ingest/geotech-extract.d.ts.map +1 -1
  40. package/dist/ingest/geotech-extract.js +2 -1
  41. package/dist/ingest/geotech-extract.js.map +1 -1
  42. package/dist/ingest/job-worker.d.ts.map +1 -1
  43. package/dist/ingest/job-worker.js +48 -6
  44. package/dist/ingest/job-worker.js.map +1 -1
  45. package/dist/meta/metadata.json +1 -1
  46. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import type { FemConvergencePolicy } from './engineering-evidence.js';
2
2
  export type FemObjective = 'foundation_settlement' | 'excavation_deformation' | 'tunnel_volume_loss_settlement' | 'staged_settlement_consolidation' | 'seepage_groundwater_coupling';
3
- export type FemAnalysisType = 'static_3d_small_strain' | 'static_3d_staged_elastic' | 'empirical_3d_settlement_surface' | 'time_dependent_1d_consolidation' | 'time_dependent_2d_biot_consolidation';
3
+ export type FemAnalysisType = 'static_3d_small_strain' | 'static_3d_staged_elastic' | 'static_2d_plane_strain_drucker_prager' | 'empirical_3d_settlement_surface' | 'time_dependent_1d_consolidation' | 'time_dependent_2d_biot_consolidation';
4
4
  export type FemAssumptionConfidence = 'measured' | 'inferred' | 'review';
5
5
  export type FemFindingSeverity = 'info' | 'review' | 'blocker';
6
6
  export interface FemUnits {
@@ -247,6 +247,17 @@ export interface FemResultEnvelope {
247
247
  maxSolverResidualRatio?: number;
248
248
  maxYieldResidualRatio?: number;
249
249
  nonlinearPlasticStrain?: number;
250
+ planeStrainDofCount?: number;
251
+ planeStrainFreeDofCount?: number;
252
+ planeStrainConstrainedDofCount?: number;
253
+ plasticGaussPointCount?: number;
254
+ maxEquivalentPlasticStrain?: number;
255
+ maxEquivalentPlasticStrainIncrement?: number;
256
+ adaptiveAttemptCount?: number;
257
+ adaptiveAcceptedStepCount?: number;
258
+ adaptiveRejectedAttemptCount?: number;
259
+ adaptiveCutbackCount?: number;
260
+ adaptiveMaxCutbackDepth?: number;
250
261
  timeStepCount?: number;
251
262
  minPorePressureKpa?: number;
252
263
  maxPorePressureKpa?: number;
@@ -295,7 +306,7 @@ export interface FemResultBiotTransientAcceptance {
295
306
  blockerCodes: string[];
296
307
  }
297
308
  export type FemSolverConvergenceStatus = 'converged' | 'nonconverged';
298
- export type FemSolverTerminationReason = 'converged' | 'max_iterations' | 'force_residual_exceeded' | 'yield_residual_exceeded' | 'material_nonconvergence' | 'consolidation_nonconvergence';
309
+ export type FemSolverTerminationReason = 'converged' | 'max_iterations' | 'linear_solver_nonconverged' | 'force_residual_exceeded' | 'yield_residual_exceeded' | 'material_nonconvergence' | 'consolidation_nonconvergence';
299
310
  export interface FemSolverResidualHistoryEntry {
300
311
  iteration: number;
301
312
  residualRatio: number;
@@ -303,6 +314,11 @@ export interface FemSolverResidualHistoryEntry {
303
314
  yieldResidualRatio?: number;
304
315
  residualTolerance?: number;
305
316
  maxFreeResidualKn?: number;
317
+ reactionBalanceRatio?: number;
318
+ maxYieldResidualRatio?: number;
319
+ yieldResidualTolerance?: number;
320
+ maxEquivalentPlasticStrain?: number;
321
+ maxEquivalentPlasticStrainIncrement?: number;
306
322
  axialStrain?: number;
307
323
  verticalStressKpa?: number;
308
324
  converged: boolean;
@@ -312,6 +328,9 @@ export interface FemSolverLoadStepConvergence {
312
328
  stageId?: string;
313
329
  stageLabel?: string;
314
330
  loadFactor?: number;
331
+ requestedLoadFactor?: number;
332
+ cutbackDepth?: number;
333
+ adaptiveCutback?: boolean;
315
334
  cumulativeLoadKpa?: number;
316
335
  iterations: number;
317
336
  residualRatio: number;
@@ -337,16 +356,45 @@ export interface FemSolverConvergenceReport {
337
356
  loadSteps: FemSolverLoadStepConvergence[];
338
357
  failure?: FemSolverConvergenceFailure;
339
358
  }
359
+ export interface FemResultDruckerPragerAdaptiveLoadStepAttemptAudit {
360
+ attempt: number;
361
+ startLoadFactor: number;
362
+ targetLoadFactor: number;
363
+ requestedLoadFactor: number;
364
+ cutbackDepth: number;
365
+ accepted: boolean;
366
+ rollbackApplied: boolean;
367
+ terminationReason: FemSolverTerminationReason;
368
+ committedStateSignatureBefore: string;
369
+ committedStateSignatureAfter: string;
370
+ }
371
+ export interface FemResultDruckerPragerAdaptiveLoadSteppingAudit {
372
+ schemaVersion: 'fem-plane-strain-dp-adaptive-load-stepping.v1';
373
+ enabled: boolean;
374
+ strategy: 'explicit-only' | 'cutback-bisection';
375
+ requestedStepCount: number;
376
+ attemptedStepCount: number;
377
+ acceptedStepCount: number;
378
+ cutbackCount: number;
379
+ maxCutbackDepth: number;
380
+ minLoadFactorIncrement: number;
381
+ requestedLoadFactors: number[];
382
+ acceptedLoadFactors: number[];
383
+ attempts: FemResultDruckerPragerAdaptiveLoadStepAttemptAudit[];
384
+ blockerCodes: string[];
385
+ }
386
+ export type FemResultBackendId = 'builtin-elastic3d-demo' | 'builtin-staged-excavation-demo' | 'builtin-tunnel-volume-loss-demo' | 'builtin-staged-consolidation-1d' | 'builtin-nonlinear-column-v0' | 'builtin-biot-up-plane-strain-v0' | 'builtin-plane-strain-dp-adaptive-v0';
340
387
  export interface FemResultManifest {
341
388
  schemaVersion: 'fem-result-manifest.v0';
342
389
  caseId: string;
343
390
  title: string;
344
391
  generatedAt: string;
345
392
  backend: {
346
- id: 'builtin-elastic3d-demo' | 'builtin-staged-excavation-demo' | 'builtin-tunnel-volume-loss-demo' | 'builtin-staged-consolidation-1d' | 'builtin-nonlinear-column-v0' | 'builtin-biot-up-plane-strain-v0';
393
+ id: FemResultBackendId;
347
394
  label: string;
348
395
  deterministic: true;
349
396
  version: string;
397
+ productionReady?: false;
350
398
  };
351
399
  analysisCase: FemAnalysisCase;
352
400
  validation: FemValidationSummary;
@@ -362,6 +410,7 @@ export interface FemResultManifest {
362
410
  envelope: FemResultEnvelope;
363
411
  pressureAudit?: FemResultPressureAudit;
364
412
  biotTransientAcceptance?: FemResultBiotTransientAcceptance;
413
+ adaptiveLoadStepping?: FemResultDruckerPragerAdaptiveLoadSteppingAudit;
365
414
  solverConvergence?: FemSolverConvergenceReport;
366
415
  visualization: FemVisualizationMesh;
367
416
  resultFields?: FemResultField[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fem/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,MAAM,YAAY,GACpB,uBAAuB,GACvB,wBAAwB,GACxB,+BAA+B,GAC/B,iCAAiC,GACjC,8BAA8B,CAAC;AAEnC,MAAM,MAAM,eAAe,GACvB,wBAAwB,GACxB,0BAA0B,GAC1B,iCAAiC,GACjC,iCAAiC,GACjC,sCAAsC,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,uBAAuB,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,GAAG,cAAc,CAAC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC,CAAC,EAAE,MAAM,CAAC;IAC7C,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,uBAAuB,CAAC;IACnG,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,0BAA0B,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,sBAAsB,EAAE,uBAAuB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,sBAAsB,GAAG,gBAAgB,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,GAAG,cAAc,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,cAAc,GAAG,cAAc,GAAG,WAAW,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,sBAAsB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,EAAE,eAAe,CAAC;IAC9B,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE;QACR,MAAM,EAAE,YAAY,CAAC;QACrB,IAAI,CAAC,EAAE,eAAe,CAAC;QACvB,UAAU,CAAC,EAAE,qBAAqB,CAAC;QACnC,MAAM,CAAC,EAAE,iBAAiB,CAAC;QAC3B,aAAa,CAAC,EAAE,wBAAwB,CAAC;QACzC,IAAI,CAAC,EAAE,0BAA0B,CAAC;KACnC,CAAC;IACF,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;IAC3C,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,wBAAwB,CAAC;IACtC,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,GAAG,eAAe,GAAG,UAAU,CAAC;IACzD,QAAQ,EAAE,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,eAAe,GAAG,yBAAyB,GAAG,gBAAgB,CAAC;IAChI,SAAS,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IACd,MAAM,EAAE,oBAAoB,GAAG,qBAAqB,GAAG,4BAA4B,GAAG,UAAU,CAAC;CAClG;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,sCAAsC,CAAC,EAAE,MAAM,CAAC;IAChD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,gCAAgC,EAAE,MAAM,CAAC;IACzC,sCAAsC,EAAE,MAAM,CAAC;IAC/C,uCAAuC,EAAE,MAAM,CAAC;IAChD,yBAAyB,EAAE,MAAM,CAAC;IAClC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,+CAA+C,CAAC;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,oBAAoB,EAAE,qBAAqB,GAAG,gCAAgC,CAAC;IAC/E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,uCAAuC,EAAE,OAAO,CAAC;IACjD,+CAA+C,EAAE,OAAO,CAAC;IACzD,4BAA4B,EAAE,OAAO,CAAC;IACtC,iCAAiC,EAAE,MAAM,CAAC;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,0BAA0B,GAAG,WAAW,GAAG,cAAc,CAAC;AAEtE,MAAM,MAAM,0BAA0B,GAClC,WAAW,GACX,gBAAgB,GAChB,yBAAyB,GACzB,yBAAyB,GACzB,yBAAyB,GACzB,8BAA8B,CAAC;AAEnC,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,0BAA0B,CAAC;IAC9C,eAAe,EAAE,6BAA6B,EAAE,CAAC;CAClD;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,0BAA0B,CAAC;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,kCAAkC,CAAC;IAClD,MAAM,EAAE,0BAA0B,CAAC;IACnC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,4BAA4B,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,2BAA2B,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,wBAAwB,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,EAAE,EAAE,wBAAwB,GAAG,gCAAgC,GAAG,iCAAiC,GAAG,iCAAiC,GAAG,6BAA6B,GAAG,iCAAiC,CAAC;QAC5M,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,IAAI,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,EAAE,eAAe,CAAC;IAC9B,UAAU,EAAE,oBAAoB,CAAC;IACjC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAAC;QAC3C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,uBAAuB,CAAC,EAAE,gCAAgC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IAC/C,aAAa,EAAE,oBAAoB,CAAC;IACpC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
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;AAknBpB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,oBAAoB,CA0jBvF;AA+oBD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CAuK3F"}
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;AAooBpB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,oBAAoB,CAslBvF;AA63BD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CA8K3F"}
@@ -21,6 +21,8 @@ const FEM_WEBGL_UINT16_INDEX_LIMIT = 65_535;
21
21
  const FEM_MAX_PREVIEW_MESH_NODES = FEM_WEBGL_UINT16_INDEX_LIMIT + 1;
22
22
  const FEM_MIN_BIOT_TRANSIENT_STEPS = 3;
23
23
  const FEM_MAX_BIOT_TIME_STEP_GROWTH_RATIO = 8;
24
+ const FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID = 'builtin-plane-strain-dp-adaptive-v0';
25
+ const FEM_PLANE_STRAIN_DP_ANALYSIS_TYPE = 'static_2d_plane_strain_drucker_prager';
24
26
  function expectedMeshCounts(mesh) {
25
27
  if (mesh.elementType === 'quad4_plane_strain') {
26
28
  return {
@@ -223,6 +225,22 @@ function validateOptionalResultMetadata(findings, manifest, nodeCount, outlineNo
223
225
  ['max_mobilized_strength_ratio', manifest.envelope.maxMobilizedStrengthRatio],
224
226
  ['drainage_path', manifest.envelope.drainagePathM],
225
227
  ['consolidation_duration', manifest.envelope.consolidationDurationYears],
228
+ ['solver_load_steps', manifest.envelope.solverLoadSteps],
229
+ ['solver_iterations', manifest.envelope.solverIterations],
230
+ ['max_solver_residual_ratio', manifest.envelope.maxSolverResidualRatio],
231
+ ['max_yield_residual_ratio', manifest.envelope.maxYieldResidualRatio],
232
+ ['nonlinear_plastic_strain', manifest.envelope.nonlinearPlasticStrain],
233
+ ['plane_strain_dof_count', manifest.envelope.planeStrainDofCount],
234
+ ['plane_strain_free_dof_count', manifest.envelope.planeStrainFreeDofCount],
235
+ ['plane_strain_constrained_dof_count', manifest.envelope.planeStrainConstrainedDofCount],
236
+ ['plastic_gauss_point_count', manifest.envelope.plasticGaussPointCount],
237
+ ['max_equivalent_plastic_strain', manifest.envelope.maxEquivalentPlasticStrain],
238
+ ['max_equivalent_plastic_strain_increment', manifest.envelope.maxEquivalentPlasticStrainIncrement],
239
+ ['adaptive_attempt_count', manifest.envelope.adaptiveAttemptCount],
240
+ ['adaptive_accepted_step_count', manifest.envelope.adaptiveAcceptedStepCount],
241
+ ['adaptive_rejected_attempt_count', manifest.envelope.adaptiveRejectedAttemptCount],
242
+ ['adaptive_cutback_count', manifest.envelope.adaptiveCutbackCount],
243
+ ['adaptive_max_cutback_depth', manifest.envelope.adaptiveMaxCutbackDepth],
226
244
  ['time_step_count', manifest.envelope.timeStepCount],
227
245
  ['min_pore_pressure', manifest.envelope.minPorePressureKpa],
228
246
  ['max_pore_pressure', manifest.envelope.maxPorePressureKpa],
@@ -562,6 +580,7 @@ export function validateFemAnalysisCase(caseFile) {
562
580
  ]);
563
581
  }
564
582
  const { domain, raft, excavation, tunnel, consolidation, biot } = caseFile.geometry;
583
+ const isPlaneStrainDruckerPragerAnalysis = caseFile.analysisType === FEM_PLANE_STRAIN_DP_ANALYSIS_TYPE;
565
584
  if (caseFile.schemaVersion !== 'fem-analysis-case.v0') {
566
585
  findings.push(finding('blocker', 'schema.unsupported', 'Only fem-analysis-case.v0 is supported.'));
567
586
  }
@@ -586,7 +605,9 @@ export function validateFemAnalysisCase(caseFile) {
586
605
  if (caseFile.objective === 'foundation_settlement' && caseFile.analysisType !== 'static_3d_small_strain') {
587
606
  findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
588
607
  }
589
- if (caseFile.objective === 'excavation_deformation' && caseFile.analysisType !== 'static_3d_staged_elastic') {
608
+ if (caseFile.objective === 'excavation_deformation' &&
609
+ caseFile.analysisType !== 'static_3d_staged_elastic' &&
610
+ !isPlaneStrainDruckerPragerAnalysis) {
590
611
  findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
591
612
  }
592
613
  if (caseFile.objective === 'tunnel_volume_loss_settlement' && caseFile.analysisType !== 'empirical_3d_settlement_surface') {
@@ -696,7 +717,9 @@ export function validateFemAnalysisCase(caseFile) {
696
717
  if (previousDepth !== excavation.finalDepthM) {
697
718
  findings.push(finding('review', 'stages.final-depth-review', 'Last excavation stage does not exactly match the final depth; staging requires review.'));
698
719
  }
699
- findings.push(finding('review', 'excavation.design-excluded', 'Excavation preview excludes retaining wall design, basal heave, seepage, consolidation, and nonlinear soil response.'));
720
+ findings.push(isPlaneStrainDruckerPragerAnalysis
721
+ ? finding('review', 'excavation.plane-strain-dp-preview', 'Excavation preview uses experimental plane-strain Drucker-Prager plasticity and still excludes retaining wall design, basal heave, seepage, consolidation, and production design acceptance.')
722
+ : finding('review', 'excavation.design-excluded', 'Excavation preview excludes retaining wall design, basal heave, seepage, consolidation, and nonlinear soil response.'));
700
723
  }
701
724
  }
702
725
  if (caseFile.objective === 'tunnel_volume_loss_settlement') {
@@ -886,6 +909,16 @@ export function validateFemAnalysisCase(caseFile) {
886
909
  pushFiniteNumberFinding(findings, material.hydraulicConductivityMPerS, `${prefix}.hydraulic-conductivity`, 'Hydraulic conductivity', { positive: true });
887
910
  }
888
911
  }
912
+ if (isPlaneStrainDruckerPragerAnalysis) {
913
+ if (material.model !== 'mohr_coulomb') {
914
+ findings.push(finding('blocker', `${prefix}.plane-strain-dp-model-required`, 'Plane-strain Drucker-Prager previews require mohr_coulomb material strength parameters for Drucker-Prager mapping.'));
915
+ }
916
+ const frictionAngleDeg = material.frictionAngleDeg;
917
+ if (!isFiniteNumber(frictionAngleDeg) || frictionAngleDeg <= 0 || frictionAngleDeg >= 50) {
918
+ findings.push(finding('blocker', `${prefix}.plane-strain-dp-friction-angle-invalid`, 'Plane-strain Drucker-Prager previews require a finite Mohr-Coulomb friction angle between 0 and 50 degrees.'));
919
+ }
920
+ pushFiniteNumberFinding(findings, material.cohesionKpa, `${prefix}.plane-strain-dp-cohesion`, 'Plane-strain Drucker-Prager cohesion', { nonNegative: true });
921
+ }
889
922
  if (caseFile.objective === 'seepage_groundwater_coupling') {
890
923
  if (material.model !== 'linear_elastic') {
891
924
  findings.push(finding('blocker', `${prefix}.biot-model-required`, 'Biot u-p preview requires a linear_elastic material with hydraulic coupling parameters.'));
@@ -973,10 +1006,13 @@ export function validateFemAnalysisCase(caseFile) {
973
1006
  if (caseFile.mesh.elementType !== 'hex8' && caseFile.mesh.elementType !== 'quad4_plane_strain') {
974
1007
  findings.push(finding('blocker', 'mesh.element-type-invalid', `Unsupported mesh element type: ${String(caseFile.mesh.elementType)}.`));
975
1008
  }
976
- if (caseFile.objective === 'seepage_groundwater_coupling' && caseFile.mesh.elementType !== 'quad4_plane_strain') {
977
- findings.push(finding('blocker', 'mesh.element-type-biot-required', 'Biot u-p seepage previews require quad4_plane_strain mesh elements.'));
1009
+ const requiresQuad4PlaneStrainMesh = caseFile.objective === 'seepage_groundwater_coupling' || isPlaneStrainDruckerPragerAnalysis;
1010
+ if (requiresQuad4PlaneStrainMesh && caseFile.mesh.elementType !== 'quad4_plane_strain') {
1011
+ findings.push(finding('blocker', isPlaneStrainDruckerPragerAnalysis ? 'mesh.element-type-plane-strain-dp-required' : 'mesh.element-type-biot-required', isPlaneStrainDruckerPragerAnalysis
1012
+ ? 'Plane-strain Drucker-Prager previews require quad4_plane_strain mesh elements.'
1013
+ : 'Biot u-p seepage previews require quad4_plane_strain mesh elements.'));
978
1014
  }
979
- if (caseFile.objective !== 'seepage_groundwater_coupling' && caseFile.mesh.elementType !== 'hex8') {
1015
+ if (!requiresQuad4PlaneStrainMesh && caseFile.mesh.elementType !== 'hex8') {
980
1016
  findings.push(finding('blocker', 'mesh.element-type-hex8-required', 'Non-Biot FEM preview cases require hex8 mesh elements.'));
981
1017
  }
982
1018
  if (!Number.isInteger(divisionsX) ||
@@ -1141,7 +1177,7 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1141
1177
  const fallback = { forceBalanceTolerance: 1e-3, residualTolerance: 1e-6 };
1142
1178
  const report = manifest.solverConvergence;
1143
1179
  if (!isRecord(report)) {
1144
- findings.push(finding('blocker', 'result.solver-convergence.missing', 'Nonlinear column solver manifests must include explicit convergence policy and load-step residual history.'));
1180
+ findings.push(finding('blocker', 'result.solver-convergence.missing', 'Nonlinear solver manifests must include explicit convergence policy and load-step residual history.'));
1145
1181
  return fallback;
1146
1182
  }
1147
1183
  if (report.schemaVersion !== 'fem-solver-convergence-report.v1') {
@@ -1151,7 +1187,7 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1151
1187
  findings.push(finding('blocker', 'result.solver-convergence.status-invalid', 'Solver convergence status must be converged or nonconverged.'));
1152
1188
  }
1153
1189
  if (report.status === 'nonconverged') {
1154
- findings.push(finding('blocker', 'result.solver-convergence.nonconverged', 'Nonlinear column solver did not satisfy its configured convergence policy.'));
1190
+ findings.push(finding('blocker', 'result.solver-convergence.nonconverged', 'Nonlinear solver did not satisfy its configured convergence policy.'));
1155
1191
  }
1156
1192
  const policy = report.policy;
1157
1193
  let forceBalanceTolerance = fallback.forceBalanceTolerance;
@@ -1181,12 +1217,13 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1181
1217
  findings.push(finding('blocker', 'result.solver-convergence.load-steps.invalid', 'Solver convergence loadSteps must be an array.'));
1182
1218
  return { forceBalanceTolerance, residualTolerance };
1183
1219
  }
1184
- if (report.loadSteps.length !== expectedLoadSteps) {
1185
- findings.push(finding('blocker', 'result.solver-convergence.load-steps.count-mismatch', 'Solver convergence load steps must match consolidation stages.'));
1220
+ if (expectedLoadSteps != null && report.loadSteps.length !== expectedLoadSteps) {
1221
+ findings.push(finding('blocker', 'result.solver-convergence.load-steps.count-mismatch', 'Solver convergence load steps must match the expected accepted load-step count.'));
1186
1222
  }
1187
1223
  const validTerminationReasons = new Set([
1188
1224
  'converged',
1189
1225
  'max_iterations',
1226
+ 'linear_solver_nonconverged',
1190
1227
  'force_residual_exceeded',
1191
1228
  'yield_residual_exceeded',
1192
1229
  'material_nonconvergence',
@@ -1205,6 +1242,24 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1205
1242
  if (step.stageId != null && !isNonEmptyString(step.stageId)) {
1206
1243
  findings.push(finding('blocker', `${prefix}.stage-id.invalid`, 'Solver convergence stageId must be a non-empty string when present.'));
1207
1244
  }
1245
+ if (step.loadFactor != null) {
1246
+ const loadFactorOk = pushFiniteNumberFinding(findings, step.loadFactor, `${prefix}.load-factor`, 'Solver convergence load factor', { positive: true });
1247
+ if (loadFactorOk && step.loadFactor > 1 + 1e-9) {
1248
+ findings.push(finding('blocker', `${prefix}.load-factor.range-invalid`, 'Solver convergence load factor must not exceed 1.0.'));
1249
+ }
1250
+ }
1251
+ if (step.requestedLoadFactor != null) {
1252
+ const requestedOk = pushFiniteNumberFinding(findings, step.requestedLoadFactor, `${prefix}.requested-load-factor`, 'Solver convergence requested load factor', { positive: true });
1253
+ if (requestedOk && step.requestedLoadFactor > 1 + 1e-9) {
1254
+ findings.push(finding('blocker', `${prefix}.requested-load-factor.range-invalid`, 'Solver convergence requested load factor must not exceed 1.0.'));
1255
+ }
1256
+ }
1257
+ if (step.cutbackDepth != null && (!Number.isInteger(step.cutbackDepth) || step.cutbackDepth < 0)) {
1258
+ findings.push(finding('blocker', `${prefix}.cutback-depth.invalid`, 'Solver convergence cutback depth must be a non-negative integer when present.'));
1259
+ }
1260
+ if (step.adaptiveCutback != null && typeof step.adaptiveCutback !== 'boolean') {
1261
+ findings.push(finding('blocker', `${prefix}.adaptive-cutback.invalid`, 'Solver convergence adaptiveCutback must be boolean when present.'));
1262
+ }
1208
1263
  if (!Number.isInteger(step.iterations) || step.iterations < 0) {
1209
1264
  findings.push(finding('blocker', `${prefix}.iterations.invalid`, 'Solver convergence iterations must be a non-negative integer.'));
1210
1265
  }
@@ -1266,6 +1321,196 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1266
1321
  }
1267
1322
  return { forceBalanceTolerance, residualTolerance };
1268
1323
  }
1324
+ function validatePlaneStrainDpAdaptiveAcceptance(findings, manifest, solverTolerances) {
1325
+ const { envelope } = manifest;
1326
+ const adaptive = manifest.adaptiveLoadStepping;
1327
+ if (!isRecord(adaptive)) {
1328
+ findings.push(finding('blocker', 'result.dp-adaptive.missing', 'Plane-strain Drucker-Prager manifests must include adaptive load-stepping metadata.'));
1329
+ return;
1330
+ }
1331
+ if (adaptive.schemaVersion !== 'fem-plane-strain-dp-adaptive-load-stepping.v1') {
1332
+ findings.push(finding('blocker', 'result.dp-adaptive.schema.unsupported', 'Unsupported plane-strain Drucker-Prager adaptive load-stepping schema.'));
1333
+ }
1334
+ if (adaptive.enabled !== true) {
1335
+ findings.push(finding('blocker', 'result.dp-adaptive.enabled-required', 'Plane-strain Drucker-Prager adaptive load stepping must be enabled for this backend.'));
1336
+ }
1337
+ if (adaptive.strategy !== 'cutback-bisection') {
1338
+ findings.push(finding('blocker', 'result.dp-adaptive.strategy.invalid', 'Plane-strain Drucker-Prager adaptive load stepping must use cutback-bisection strategy.'));
1339
+ }
1340
+ const requestedStepCountOk = pushFiniteNumberFinding(findings, adaptive.requestedStepCount, 'result.dp-adaptive.requested-step-count', 'DP adaptive requested step count', { positive: true });
1341
+ const attemptedStepCountOk = pushFiniteNumberFinding(findings, adaptive.attemptedStepCount, 'result.dp-adaptive.attempted-step-count', 'DP adaptive attempted step count', { positive: true });
1342
+ const acceptedStepCountOk = pushFiniteNumberFinding(findings, adaptive.acceptedStepCount, 'result.dp-adaptive.accepted-step-count', 'DP adaptive accepted step count', { positive: true });
1343
+ const cutbackCountOk = pushFiniteNumberFinding(findings, adaptive.cutbackCount, 'result.dp-adaptive.cutback-count', 'DP adaptive cutback count', { nonNegative: true });
1344
+ const maxCutbackDepthOk = pushFiniteNumberFinding(findings, adaptive.maxCutbackDepth, 'result.dp-adaptive.max-cutback-depth', 'DP adaptive max cutback depth', { nonNegative: true });
1345
+ pushFiniteNumberFinding(findings, adaptive.minLoadFactorIncrement, 'result.dp-adaptive.min-load-factor-increment', 'DP adaptive minimum load-factor increment', { positive: true });
1346
+ for (const [ok, value, code, label] of [
1347
+ [requestedStepCountOk, adaptive.requestedStepCount, 'requested-step-count', 'requested step count'],
1348
+ [attemptedStepCountOk, adaptive.attemptedStepCount, 'attempted-step-count', 'attempted step count'],
1349
+ [acceptedStepCountOk, adaptive.acceptedStepCount, 'accepted-step-count', 'accepted step count'],
1350
+ [cutbackCountOk, adaptive.cutbackCount, 'cutback-count', 'cutback count'],
1351
+ [maxCutbackDepthOk, adaptive.maxCutbackDepth, 'max-cutback-depth', 'max cutback depth'],
1352
+ ]) {
1353
+ if (ok && !Number.isInteger(value)) {
1354
+ findings.push(finding('blocker', `result.dp-adaptive.${code}.integer`, `DP adaptive ${label} must be an integer.`));
1355
+ }
1356
+ }
1357
+ if (!Array.isArray(adaptive.requestedLoadFactors) || adaptive.requestedLoadFactors.length === 0) {
1358
+ findings.push(finding('blocker', 'result.dp-adaptive.requested-load-factors.invalid', 'DP adaptive requestedLoadFactors must be a non-empty array.'));
1359
+ }
1360
+ else {
1361
+ if (requestedStepCountOk && adaptive.requestedLoadFactors.length !== adaptive.requestedStepCount) {
1362
+ findings.push(finding('blocker', 'result.dp-adaptive.requested-load-factors.count-mismatch', 'DP adaptive requested load factors must match requestedStepCount.'));
1363
+ }
1364
+ for (const [index, loadFactor] of adaptive.requestedLoadFactors.entries()) {
1365
+ const ok = pushFiniteNumberFinding(findings, loadFactor, `result.dp-adaptive.requestedLoadFactors.${index}`, 'DP adaptive requested load factor', { positive: true });
1366
+ if (ok && loadFactor > 1 + 1e-9) {
1367
+ findings.push(finding('blocker', `result.dp-adaptive.requestedLoadFactors.${index}.range-invalid`, 'DP adaptive requested load factors must not exceed 1.0.'));
1368
+ }
1369
+ }
1370
+ }
1371
+ if (!Array.isArray(adaptive.acceptedLoadFactors) || adaptive.acceptedLoadFactors.length === 0) {
1372
+ findings.push(finding('blocker', 'result.dp-adaptive.accepted-load-factors.invalid', 'DP adaptive acceptedLoadFactors must be a non-empty array.'));
1373
+ }
1374
+ else {
1375
+ if (acceptedStepCountOk && adaptive.acceptedLoadFactors.length !== adaptive.acceptedStepCount) {
1376
+ findings.push(finding('blocker', 'result.dp-adaptive.accepted-load-factors.count-mismatch', 'DP adaptive accepted load factors must match acceptedStepCount.'));
1377
+ }
1378
+ let previous = 0;
1379
+ for (const [index, loadFactor] of adaptive.acceptedLoadFactors.entries()) {
1380
+ const ok = pushFiniteNumberFinding(findings, loadFactor, `result.dp-adaptive.acceptedLoadFactors.${index}`, 'DP adaptive accepted load factor', { positive: true });
1381
+ if (ok) {
1382
+ if (loadFactor <= previous + 1e-12) {
1383
+ findings.push(finding('blocker', `result.dp-adaptive.acceptedLoadFactors.${index}.not-increasing`, 'DP adaptive accepted load factors must be strictly increasing.'));
1384
+ }
1385
+ if (loadFactor > 1 + 1e-9) {
1386
+ findings.push(finding('blocker', `result.dp-adaptive.acceptedLoadFactors.${index}.range-invalid`, 'DP adaptive accepted load factors must not exceed 1.0.'));
1387
+ }
1388
+ previous = loadFactor;
1389
+ }
1390
+ }
1391
+ const finalLoadFactor = adaptive.acceptedLoadFactors.at(-1);
1392
+ if (isFiniteNumber(finalLoadFactor) && Math.abs(finalLoadFactor - 1) > 1e-9) {
1393
+ findings.push(finding('blocker', 'result.dp-adaptive.accepted-load-factors.final-load-mismatch', 'DP adaptive accepted load factors must reach full load factor 1.0.'));
1394
+ }
1395
+ }
1396
+ if (!Array.isArray(adaptive.attempts) || adaptive.attempts.length === 0) {
1397
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.invalid', 'DP adaptive attempts must be a non-empty array.'));
1398
+ }
1399
+ else {
1400
+ if (attemptedStepCountOk && adaptive.attempts.length !== adaptive.attemptedStepCount) {
1401
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.count-mismatch', 'DP adaptive attempts must match attemptedStepCount.'));
1402
+ }
1403
+ const acceptedAttempts = adaptive.attempts.filter((attempt) => isRecord(attempt) && attempt.accepted === true);
1404
+ const rejectedAttempts = adaptive.attempts.filter((attempt) => isRecord(attempt) && attempt.accepted === false);
1405
+ if (acceptedStepCountOk && acceptedAttempts.length !== adaptive.acceptedStepCount) {
1406
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.accepted-count-mismatch', 'DP adaptive accepted attempt count must match acceptedStepCount.'));
1407
+ }
1408
+ if (isFiniteNumber(envelope.adaptiveRejectedAttemptCount) && rejectedAttempts.length !== envelope.adaptiveRejectedAttemptCount) {
1409
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.rejected-count-mismatch', 'DP adaptive rejected attempt count must match the envelope.'));
1410
+ }
1411
+ for (const [index, attempt] of adaptive.attempts.entries()) {
1412
+ const prefix = `result.dp-adaptive.attempts.${index}`;
1413
+ if (!isRecord(attempt)) {
1414
+ findings.push(finding('blocker', `${prefix}.shape-invalid`, 'DP adaptive attempt must be an object.'));
1415
+ continue;
1416
+ }
1417
+ if (!Number.isInteger(attempt.attempt) || attempt.attempt !== index + 1) {
1418
+ findings.push(finding('blocker', `${prefix}.attempt.sequence-invalid`, 'DP adaptive attempts must be sequentially numbered.'));
1419
+ }
1420
+ pushFiniteNumberFinding(findings, attempt.startLoadFactor, `${prefix}.start-load-factor`, 'DP adaptive attempt start load factor', { nonNegative: true });
1421
+ pushFiniteNumberFinding(findings, attempt.targetLoadFactor, `${prefix}.target-load-factor`, 'DP adaptive attempt target load factor', { positive: true });
1422
+ pushFiniteNumberFinding(findings, attempt.requestedLoadFactor, `${prefix}.requested-load-factor`, 'DP adaptive attempt requested load factor', { positive: true });
1423
+ if (!Number.isInteger(attempt.cutbackDepth) || attempt.cutbackDepth < 0) {
1424
+ findings.push(finding('blocker', `${prefix}.cutback-depth.invalid`, 'DP adaptive attempt cutbackDepth must be a non-negative integer.'));
1425
+ }
1426
+ if (typeof attempt.accepted !== 'boolean') {
1427
+ findings.push(finding('blocker', `${prefix}.accepted.invalid`, 'DP adaptive attempt accepted must be boolean.'));
1428
+ }
1429
+ if (typeof attempt.rollbackApplied !== 'boolean') {
1430
+ findings.push(finding('blocker', `${prefix}.rollback-applied.invalid`, 'DP adaptive attempt rollbackApplied must be boolean.'));
1431
+ }
1432
+ if (!isNonEmptyString(attempt.committedStateSignatureBefore) || !isNonEmptyString(attempt.committedStateSignatureAfter)) {
1433
+ findings.push(finding('blocker', `${prefix}.state-signature.missing`, 'DP adaptive attempts must include committed state signatures before and after.'));
1434
+ }
1435
+ if (attempt.accepted === false) {
1436
+ if (attempt.rollbackApplied !== true) {
1437
+ findings.push(finding('blocker', `${prefix}.rollback-required`, 'Rejected DP adaptive attempts must apply rollback.'));
1438
+ }
1439
+ if (isNonEmptyString(attempt.committedStateSignatureBefore) &&
1440
+ isNonEmptyString(attempt.committedStateSignatureAfter) &&
1441
+ attempt.committedStateSignatureAfter !== attempt.committedStateSignatureBefore) {
1442
+ findings.push(finding('blocker', `${prefix}.rollback-state-mutated`, 'Rejected DP adaptive attempts must preserve the committed state signature.'));
1443
+ }
1444
+ }
1445
+ if (attempt.accepted === true && attempt.terminationReason !== 'converged') {
1446
+ findings.push(finding('blocker', `${prefix}.accepted-not-converged`, 'Accepted DP adaptive attempts must terminate with converged.'));
1447
+ }
1448
+ }
1449
+ }
1450
+ if (!Array.isArray(adaptive.blockerCodes)) {
1451
+ findings.push(finding('blocker', 'result.dp-adaptive.blocker-codes.invalid', 'DP adaptive blockerCodes must be an array.'));
1452
+ }
1453
+ else if (adaptive.blockerCodes.length > 0) {
1454
+ findings.push(finding('blocker', 'result.dp-adaptive.blocker-codes-not-empty', 'Accepted DP adaptive metadata must not include blocker codes.'));
1455
+ }
1456
+ const solverLoadStepsOk = pushFiniteNumberFinding(findings, envelope.solverLoadSteps, 'result.envelope.dp.solver-load-steps', 'DP envelope solver load steps', { positive: true });
1457
+ const solverIterationsOk = pushFiniteNumberFinding(findings, envelope.solverIterations, 'result.envelope.dp.solver-iterations', 'DP envelope solver iterations', { nonNegative: true });
1458
+ const solverResidualOk = pushFiniteNumberFinding(findings, envelope.maxSolverResidualRatio, 'result.envelope.dp.max-solver-residual-ratio', 'DP envelope max solver residual ratio', { nonNegative: true });
1459
+ const yieldResidualOk = pushFiniteNumberFinding(findings, envelope.maxYieldResidualRatio, 'result.envelope.dp.max-yield-residual-ratio', 'DP envelope max yield residual ratio', { nonNegative: true });
1460
+ pushFiniteNumberFinding(findings, envelope.nonlinearPlasticStrain, 'result.envelope.dp.nonlinear-plastic-strain', 'DP envelope nonlinear plastic strain', { nonNegative: true });
1461
+ const dofCountOk = pushFiniteNumberFinding(findings, envelope.planeStrainDofCount, 'result.envelope.dp.dof-count', 'DP envelope DOF count', { positive: true });
1462
+ const freeDofCountOk = pushFiniteNumberFinding(findings, envelope.planeStrainFreeDofCount, 'result.envelope.dp.free-dof-count', 'DP envelope free DOF count', { positive: true });
1463
+ const constrainedDofCountOk = pushFiniteNumberFinding(findings, envelope.planeStrainConstrainedDofCount, 'result.envelope.dp.constrained-dof-count', 'DP envelope constrained DOF count', { positive: true });
1464
+ const plasticGaussPointCountOk = pushFiniteNumberFinding(findings, envelope.plasticGaussPointCount, 'result.envelope.dp.plastic-gauss-point-count', 'DP envelope plastic Gauss-point count', { nonNegative: true });
1465
+ pushFiniteNumberFinding(findings, envelope.maxEquivalentPlasticStrain, 'result.envelope.dp.max-equivalent-plastic-strain', 'DP envelope max equivalent plastic strain', { nonNegative: true });
1466
+ pushFiniteNumberFinding(findings, envelope.maxEquivalentPlasticStrainIncrement, 'result.envelope.dp.max-equivalent-plastic-strain-increment', 'DP envelope max equivalent plastic strain increment', { nonNegative: true });
1467
+ const adaptiveAttemptCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveAttemptCount, 'result.envelope.dp.adaptive-attempt-count', 'DP envelope adaptive attempt count', { positive: true });
1468
+ const adaptiveAcceptedStepCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveAcceptedStepCount, 'result.envelope.dp.adaptive-accepted-step-count', 'DP envelope adaptive accepted step count', { positive: true });
1469
+ const adaptiveRejectedAttemptCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveRejectedAttemptCount, 'result.envelope.dp.adaptive-rejected-attempt-count', 'DP envelope adaptive rejected attempt count', { nonNegative: true });
1470
+ const adaptiveCutbackCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveCutbackCount, 'result.envelope.dp.adaptive-cutback-count', 'DP envelope adaptive cutback count', { nonNegative: true });
1471
+ const adaptiveMaxCutbackDepthOk = pushFiniteNumberFinding(findings, envelope.adaptiveMaxCutbackDepth, 'result.envelope.dp.adaptive-max-cutback-depth', 'DP envelope adaptive max cutback depth', { nonNegative: true });
1472
+ for (const [ok, value, code, label] of [
1473
+ [solverLoadStepsOk, envelope.solverLoadSteps, 'solver-load-steps', 'solver load steps'],
1474
+ [solverIterationsOk, envelope.solverIterations, 'solver-iterations', 'solver iterations'],
1475
+ [dofCountOk, envelope.planeStrainDofCount, 'dof-count', 'DOF count'],
1476
+ [freeDofCountOk, envelope.planeStrainFreeDofCount, 'free-dof-count', 'free DOF count'],
1477
+ [constrainedDofCountOk, envelope.planeStrainConstrainedDofCount, 'constrained-dof-count', 'constrained DOF count'],
1478
+ [plasticGaussPointCountOk, envelope.plasticGaussPointCount, 'plastic-gauss-point-count', 'plastic Gauss-point count'],
1479
+ [adaptiveAttemptCountOk, envelope.adaptiveAttemptCount, 'adaptive-attempt-count', 'adaptive attempt count'],
1480
+ [adaptiveAcceptedStepCountOk, envelope.adaptiveAcceptedStepCount, 'adaptive-accepted-step-count', 'adaptive accepted step count'],
1481
+ [adaptiveRejectedAttemptCountOk, envelope.adaptiveRejectedAttemptCount, 'adaptive-rejected-attempt-count', 'adaptive rejected attempt count'],
1482
+ [adaptiveCutbackCountOk, envelope.adaptiveCutbackCount, 'adaptive-cutback-count', 'adaptive cutback count'],
1483
+ [adaptiveMaxCutbackDepthOk, envelope.adaptiveMaxCutbackDepth, 'adaptive-max-cutback-depth', 'adaptive max cutback depth'],
1484
+ ]) {
1485
+ if (ok && !Number.isInteger(value)) {
1486
+ findings.push(finding('blocker', `result.envelope.dp.${code}.integer`, `DP envelope ${label} must be an integer.`));
1487
+ }
1488
+ }
1489
+ if (solverLoadStepsOk && acceptedStepCountOk && envelope.solverLoadSteps !== adaptive.acceptedStepCount) {
1490
+ findings.push(finding('blocker', 'result.envelope.dp.solver-load-steps-adaptive-mismatch', 'DP envelope solver load steps must match adaptive acceptedStepCount.'));
1491
+ }
1492
+ if (adaptiveAttemptCountOk && attemptedStepCountOk && envelope.adaptiveAttemptCount !== adaptive.attemptedStepCount) {
1493
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-attempt-count-mismatch', 'DP envelope adaptive attempt count must match adaptive metadata.'));
1494
+ }
1495
+ if (adaptiveAcceptedStepCountOk && acceptedStepCountOk && envelope.adaptiveAcceptedStepCount !== adaptive.acceptedStepCount) {
1496
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-accepted-step-count-mismatch', 'DP envelope adaptive accepted step count must match adaptive metadata.'));
1497
+ }
1498
+ if (adaptiveCutbackCountOk && cutbackCountOk && envelope.adaptiveCutbackCount !== adaptive.cutbackCount) {
1499
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-cutback-count-mismatch', 'DP envelope adaptive cutback count must match adaptive metadata.'));
1500
+ }
1501
+ if (adaptiveMaxCutbackDepthOk && maxCutbackDepthOk && envelope.adaptiveMaxCutbackDepth !== adaptive.maxCutbackDepth) {
1502
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-max-cutback-depth-mismatch', 'DP envelope adaptive max cutback depth must match adaptive metadata.'));
1503
+ }
1504
+ if (dofCountOk && freeDofCountOk && constrainedDofCountOk && envelope.planeStrainFreeDofCount + envelope.planeStrainConstrainedDofCount !== envelope.planeStrainDofCount) {
1505
+ findings.push(finding('blocker', 'result.envelope.dp.dof-count-mismatch', 'DP free and constrained DOF counts must sum to the total DOF count.'));
1506
+ }
1507
+ if (solverResidualOk && envelope.maxSolverResidualRatio > solverTolerances.forceBalanceTolerance) {
1508
+ findings.push(finding('blocker', 'result.envelope.dp.solver-residual-too-large', 'DP solver residual exceeds the force-balance tolerance.'));
1509
+ }
1510
+ if (yieldResidualOk && envelope.maxYieldResidualRatio > solverTolerances.residualTolerance) {
1511
+ findings.push(finding('blocker', 'result.envelope.dp.yield-residual-too-large', 'DP yield residual exceeds the material return-map tolerance.'));
1512
+ }
1513
+ }
1269
1514
  function validateResultEnvelopeSemantics(findings, manifest) {
1270
1515
  const { envelope, analysisCase } = manifest;
1271
1516
  const maxSettlementOk = pushFiniteNumberFinding(findings, envelope.maxSettlementMm, 'result.envelope.max-settlement', 'Envelope max settlement', { nonNegative: true });
@@ -1278,7 +1523,7 @@ function validateResultEnvelopeSemantics(findings, manifest) {
1278
1523
  }
1279
1524
  const expectedBackendByObjective = new Map([
1280
1525
  ['foundation_settlement', ['builtin-elastic3d-demo']],
1281
- ['excavation_deformation', ['builtin-staged-excavation-demo']],
1526
+ ['excavation_deformation', ['builtin-staged-excavation-demo', FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID]],
1282
1527
  ['tunnel_volume_loss_settlement', ['builtin-tunnel-volume-loss-demo']],
1283
1528
  ['staged_settlement_consolidation', ['builtin-staged-consolidation-1d', 'builtin-nonlinear-column-v0']],
1284
1529
  ['seepage_groundwater_coupling', ['builtin-biot-up-plane-strain-v0']],
@@ -1295,6 +1540,18 @@ function validateResultEnvelopeSemantics(findings, manifest) {
1295
1540
  findings.push(finding('blocker', 'result.biot-transient-acceptance.unexpected', 'Biot transient acceptance metadata is only valid for Biot u-p seepage result manifests.'));
1296
1541
  }
1297
1542
  }
1543
+ const isPlaneStrainDpAdaptiveManifest = manifest.backend.id === FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID;
1544
+ if (!isPlaneStrainDpAdaptiveManifest && manifest.adaptiveLoadStepping != null) {
1545
+ findings.push(finding('blocker', 'result.dp-adaptive.unexpected', 'Drucker-Prager adaptive metadata is only valid for plane-strain DP adaptive result manifests.'));
1546
+ }
1547
+ if (isPlaneStrainDpAdaptiveManifest) {
1548
+ if (analysisCase.analysisType !== FEM_PLANE_STRAIN_DP_ANALYSIS_TYPE) {
1549
+ findings.push(finding('blocker', 'result.dp-adaptive.analysis-type-mismatch', 'Plane-strain DP adaptive manifests require static_2d_plane_strain_drucker_prager analysis cases.'));
1550
+ }
1551
+ if (analysisCase.mesh.elementType !== 'quad4_plane_strain') {
1552
+ findings.push(finding('blocker', 'result.dp-adaptive.mesh-type-mismatch', 'Plane-strain DP adaptive manifests require quad4_plane_strain mesh cases.'));
1553
+ }
1554
+ }
1298
1555
  if (analysisCase.objective === 'foundation_settlement') {
1299
1556
  const raft = analysisCase.geometry.raft;
1300
1557
  if (!raft)
@@ -1344,6 +1601,13 @@ function validateResultEnvelopeSemantics(findings, manifest) {
1344
1601
  if (maxSettlementOk && maxSurfaceOk) {
1345
1602
  pushApproximateMatchFinding(findings, envelope.maxSettlementMm, maxSurfaceSettlementMm, 'result.envelope.excavation-max-settlement-mismatch', 'Excavation max settlement', 0.001);
1346
1603
  }
1604
+ if (isPlaneStrainDpAdaptiveManifest) {
1605
+ const expectedDpLoadSteps = Number.isInteger(envelope.solverLoadSteps) && envelope.solverLoadSteps > 0
1606
+ ? envelope.solverLoadSteps
1607
+ : undefined;
1608
+ const solverTolerances = validateNonlinearSolverConvergenceReport(findings, manifest, expectedDpLoadSteps);
1609
+ validatePlaneStrainDpAdaptiveAcceptance(findings, manifest, solverTolerances);
1610
+ }
1347
1611
  return;
1348
1612
  }
1349
1613
  if (analysisCase.objective === 'tunnel_volume_loss_settlement') {
@@ -1607,6 +1871,7 @@ export function validateFemResultManifest(manifest) {
1607
1871
  'builtin-staged-consolidation-1d',
1608
1872
  'builtin-nonlinear-column-v0',
1609
1873
  'builtin-biot-up-plane-strain-v0',
1874
+ FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID,
1610
1875
  ]);
1611
1876
  if (!validBackendIds.has(manifest.backend.id)) {
1612
1877
  findings.push(finding('blocker', 'result.backend.id-invalid', `Unsupported FEM result backend: ${String(manifest.backend.id)}.`));
@@ -1620,6 +1885,12 @@ export function validateFemResultManifest(manifest) {
1620
1885
  if (!isNonEmptyString(manifest.backend.version)) {
1621
1886
  findings.push(finding('blocker', 'result.backend.version.missing', 'Result backend version must be a non-empty string.'));
1622
1887
  }
1888
+ if (manifest.productionReady === true) {
1889
+ findings.push(finding('blocker', 'result.production-ready.overclaim', 'FEM result manifests must not claim productionReady true in strong-beta preview mode.'));
1890
+ }
1891
+ if (manifest.backend.productionReady === true) {
1892
+ findings.push(finding('blocker', 'result.backend.production-ready.overclaim', 'FEM result backends must not claim productionReady true in strong-beta preview mode.'));
1893
+ }
1623
1894
  for (const [key, value] of Object.entries(manifest.envelope)) {
1624
1895
  if (!Number.isFinite(value)) {
1625
1896
  findings.push(finding('blocker', `result.envelope.${key}.non-finite`, `Envelope value ${key} must be finite.`));