@geotechcli/core 0.4.122 → 0.4.124

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.
@@ -159,6 +159,21 @@ const DEFAULT_EXTERNAL_BENCHMARK_REFERENCES = [
159
159
  retrievedAt: '2026-06-04',
160
160
  },
161
161
  },
162
+ {
163
+ id: 'opengeosys-liquid-flow-vogel-massmann-benchmarks',
164
+ sourceType: 'open-source-solver',
165
+ label: 'OpenGeoSys Liquid Flow Vogel/Massmann verification benchmark reference',
166
+ citation: 'OpenGeoSys Documentation, Liquid Flow verification examples by Vogel and Maßmann, including the h1_1Dsteady saturated groundwater-flow benchmark against analytical solutions.',
167
+ referenceSolver: {
168
+ name: 'OpenGeoSys',
169
+ version: '6.5.7 documentation',
170
+ vendor: 'OpenGeoSys project',
171
+ analysisProcedure: 'LIQUID_FLOW saturated single-phase Darcy flow verification',
172
+ elementType: 'Liquid Flow finite elements',
173
+ url: 'https://www.opengeosys.org/6.5.7/docs/benchmarks/liquid-flow/liquid_flow-bgr/',
174
+ retrievedAt: '2026-06-04',
175
+ },
176
+ },
162
177
  ];
163
178
  function degToRad(degrees) {
164
179
  return (degrees * Math.PI) / 180;
@@ -712,7 +727,9 @@ function buildDefaultExternalBenchmarkComparisonResults(input) {
712
727
  .find((requirement) => requirement.id === 'consolidation-settlement-time-curve');
713
728
  const biotRequirement = DEFAULT_EXTERNAL_BENCHMARK_REQUIRED_QUANTITIES
714
729
  .find((requirement) => requirement.id === 'biot-pore-pressure-dissipation');
715
- if (!consolidationRequirement || !biotRequirement) {
730
+ const seepageRequirement = DEFAULT_EXTERNAL_BENCHMARK_REQUIRED_QUANTITIES
731
+ .find((requirement) => requirement.id === 'seepage-head-flux-gradient');
732
+ if (!consolidationRequirement || !biotRequirement || !seepageRequirement) {
716
733
  throw new Error('Default FEM external benchmark quantity requirements are missing.');
717
734
  }
718
735
  const consolidationPoints = input.consolidation.steps.map((step) => ({
@@ -868,6 +885,60 @@ function buildDefaultExternalBenchmarkComparisonResults(input) {
868
885
  quantity: biotRequirement.quantity,
869
886
  }) &&
870
887
  seriesSummarySatisfiesRequirementTolerance(ogsSeries, biotRequirement);
888
+ const seepageDeltaHeadM = input.openGeoSysLiquidFlowUpstreamHeadM - input.openGeoSysLiquidFlowDownstreamHeadM;
889
+ const seepagePoints = input.openGeoSysLiquidFlowSeepage.nodes
890
+ .map((node) => ({
891
+ x: node.xM,
892
+ actual: node.headM,
893
+ expected: input.openGeoSysLiquidFlowUpstreamHeadM -
894
+ seepageDeltaHeadM * (node.xM / input.openGeoSysLiquidFlowDomainLengthM),
895
+ }))
896
+ .sort((left, right) => left.x - right.x || left.actual - right.actual);
897
+ const seepageSeries = buildFemExternalBenchmarkSeriesSummary({
898
+ xQuantity: 'horizontal coordinate',
899
+ xUnit: 'm',
900
+ yQuantity: 'hydraulic head',
901
+ yUnit: 'm',
902
+ points: seepagePoints,
903
+ notes: [
904
+ 'Quad4 plane-strain steady Darcy seepage head profile compared with the OpenGeoSys Liquid Flow h1_1Dsteady analytical verification class.',
905
+ 'Boundary flux, hydraulic gradient, and head profile are checked together; commercial solver comparison remains missing.',
906
+ ],
907
+ });
908
+ const seepageActual = input.openGeoSysLiquidFlowSeepage.totalPositiveBoundaryFluxM3PerS;
909
+ const seepageExpected = input.openGeoSysLiquidFlowExpectedBoundaryFluxM3PerS;
910
+ const seepageEvidencePayload = {
911
+ schemaVersion: 'fem-external-benchmark-evidence.v1',
912
+ caseId: 'opengeosys-liquid-flow-h1-1dsteady-head-flux-gradient',
913
+ sourceId: 'opengeosys-liquid-flow-vogel-massmann-benchmarks',
914
+ method: input.openGeoSysLiquidFlowSeepage.method,
915
+ headDofCount: input.openGeoSysLiquidFlowSeepage.headDofCount,
916
+ freeHeadDofCount: input.openGeoSysLiquidFlowSeepage.freeHeadDofCount,
917
+ constrainedHeadDofCount: input.openGeoSysLiquidFlowSeepage.constrainedHeadDofCount,
918
+ massBalanceErrorRatio: input.openGeoSysLiquidFlowSeepage.massBalanceErrorRatio,
919
+ upstreamHeadM: input.openGeoSysLiquidFlowUpstreamHeadM,
920
+ downstreamHeadM: input.openGeoSysLiquidFlowDownstreamHeadM,
921
+ expectedBoundaryFluxM3PerS: seepageExpected,
922
+ seriesHashSha256: seepageSeries.seriesHashSha256,
923
+ };
924
+ const seepageResultPayload = {
925
+ actual: seepageActual,
926
+ expected: seepageExpected,
927
+ massBalanceErrorRatio: input.openGeoSysLiquidFlowSeepage.massBalanceErrorRatio,
928
+ maxAbsoluteError: seepageSeries.maxAbsoluteError,
929
+ maxRelativeError: seepageSeries.maxRelativeError,
930
+ resultSeriesHashSha256: seepageSeries.seriesHashSha256,
931
+ };
932
+ const seepageAccepted = input.openGeoSysLiquidFlowSeepage.converged &&
933
+ externalBenchmarkFinalAccepted({
934
+ actual: seepageActual,
935
+ expected: seepageExpected,
936
+ tolerance: seepageRequirement.tolerance,
937
+ toleranceType: seepageRequirement.toleranceType,
938
+ unit: seepageRequirement.unit,
939
+ quantity: seepageRequirement.quantity,
940
+ }) &&
941
+ seriesSummarySatisfiesRequirementTolerance(seepageSeries, seepageRequirement);
871
942
  return [
872
943
  {
873
944
  id: 'published-terzaghi-1d-consolidation-tv-0-197',
@@ -966,6 +1037,45 @@ function buildDefaultExternalBenchmarkComparisonResults(input) {
966
1037
  'This adds open-source cross-solver evidence but does not satisfy the required commercial-solver production benchmark gate.',
967
1038
  ],
968
1039
  },
1040
+ {
1041
+ id: 'opengeosys-liquid-flow-h1-1dsteady-head-flux-gradient',
1042
+ quantityRequirementId: seepageRequirement.id,
1043
+ referenceId: 'opengeosys-liquid-flow-vogel-massmann-benchmarks',
1044
+ caseId: 'opengeosys-liquid-flow-h1-1dsteady-head-flux-gradient',
1045
+ comparisonKind: 'series-summary',
1046
+ metricName: 'steadyDarcyHeadFluxGradient',
1047
+ quantity: seepageRequirement.quantity,
1048
+ unit: seepageRequirement.unit,
1049
+ actual: round(seepageActual, 12),
1050
+ expected: round(seepageExpected, 12),
1051
+ tolerance: seepageRequirement.tolerance,
1052
+ toleranceType: seepageRequirement.toleranceType,
1053
+ accepted: seepageAccepted,
1054
+ candidateSolver: {
1055
+ name: 'geotechCLI FEM evidence suite',
1056
+ version: 'strong-beta',
1057
+ solverType: 'geotechcli-kernel',
1058
+ analysisProcedure: 'Quad4 plane-strain steady Darcy seepage head solve',
1059
+ elementType: 'Quad4 plane-strain hydraulic-head evidence mesh',
1060
+ runId: 'opengeosys-liquid-flow-h1-1dsteady-head-flux-gradient',
1061
+ },
1062
+ referenceSolver: {
1063
+ name: 'OpenGeoSys',
1064
+ version: '6.5.7 documentation',
1065
+ vendor: 'OpenGeoSys project',
1066
+ solverType: 'open-source-solver',
1067
+ analysisProcedure: 'LIQUID_FLOW h1_1Dsteady analytical verification benchmark',
1068
+ elementType: 'Liquid Flow finite elements',
1069
+ runId: 'LiquidFlow/Vogel-Massmann/h1_1Dsteady',
1070
+ },
1071
+ evidenceHashSha256: hashFemBenchmarkPayload(seepageEvidencePayload),
1072
+ resultHashSha256: hashFemBenchmarkPayload(seepageResultPayload),
1073
+ seriesSummary: seepageSeries,
1074
+ notes: [
1075
+ 'Generated open-source solver comparison record against the OpenGeoSys Liquid Flow saturated Darcy verification class.',
1076
+ 'This partially covers seepage head/flux/gradient evidence but does not satisfy the required published-source or commercial-solver production benchmark gates.',
1077
+ ],
1078
+ },
969
1079
  ];
970
1080
  }
971
1081
  export function evaluateFemTolerance(quantity, actual, expected, absoluteTolerance, options = {}) {
@@ -2032,8 +2142,8 @@ export function runFemEngineeringEvidenceSuite(policy = DEFAULT_FEM_CONVERGENCE_
2032
2142
  const seepage2dMesh = buildPlaneStrainRectangularMesh({
2033
2143
  widthM: 20,
2034
2144
  heightM: 5,
2035
- divisionsX: 2,
2036
- divisionsY: 1,
2145
+ divisionsX: 8,
2146
+ divisionsY: 2,
2037
2147
  materialId: 'soil',
2038
2148
  });
2039
2149
  const seepage2d = runPlaneStrainSteadySeepage({
@@ -2532,6 +2642,11 @@ export function runFemEngineeringEvidenceSuite(policy = DEFAULT_FEM_CONVERGENCE_
2532
2642
  openGeoSysConsolidation,
2533
2643
  openGeoSysConsolidationDimensionlessTime,
2534
2644
  openGeoSysConsolidationLoadKpa,
2645
+ openGeoSysLiquidFlowSeepage: seepage2d,
2646
+ openGeoSysLiquidFlowDomainLengthM: 20,
2647
+ openGeoSysLiquidFlowUpstreamHeadM: 10,
2648
+ openGeoSysLiquidFlowDownstreamHeadM: 6,
2649
+ openGeoSysLiquidFlowExpectedBoundaryFluxM3PerS: seepage2dExpectedFlow,
2535
2650
  }),
2536
2651
  });
2537
2652
  return {