\n",
" \n",
" | 0 | \n",
- " All 36 principal curve attempts recorded | \n",
+ " All 110 supported Dholabhai points retained | \n",
" True | \n",
"
\n",
" \n",
" | 1 | \n",
- " 20, 50 and 100 bara controls accepted for every recipe | \n",
+ " All Dholabhai states numerically accepted and vapor-comparable | \n",
" True | \n",
"
\n",
" \n",
" | 2 | \n",
- " Accepted principal boundaries increase with pressure | \n",
+ " Dholabhai errors finite for every comparable point | \n",
" True | \n",
"
\n",
" \n",
" | 3 | \n",
- " Rejected points excluded from principal temperature table | \n",
+ " All 36 principal curve attempts recorded | \n",
" True | \n",
"
\n",
" \n",
" | 4 | \n",
- " NaCl concentration depresses each curve | \n",
+ " 20, 50 and 100 bara controls accepted for every recipe | \n",
" True | \n",
"
\n",
" \n",
" | 5 | \n",
- " MEG depresses both pressure cases | \n",
+ " Accepted principal boundaries increase with pressure | \n",
" True | \n",
"
\n",
" \n",
" | 6 | \n",
- " Water activities finite and in (0,1] | \n",
+ " Rejected points excluded from principal temperature table | \n",
" True | \n",
"
\n",
" \n",
" | 7 | \n",
- " Component inventory error below 1e-8 | \n",
+ " NaCl concentration depresses each curve | \n",
" True | \n",
"
\n",
" \n",
" | 8 | \n",
- " Aqueous charge error below 1e-8 | \n",
+ " MEG depresses both pressure cases | \n",
" True | \n",
"
\n",
" \n",
" | 9 | \n",
- " Ions confined to aqueous phase | \n",
+ " Water activities finite and in (0,1] | \n",
" True | \n",
"
\n",
" \n",
" | 10 | \n",
- " Reactive carbon error below 1e-6 mol | \n",
+ " Component inventory error below 1e-8 | \n",
" True | \n",
"
\n",
" \n",
" | 11 | \n",
- " Starting-temperature spread below 0.002 K | \n",
+ " Aqueous charge error below 1e-8 | \n",
" True | \n",
"
\n",
" \n",
" | 12 | \n",
- " All ten published points calculated | \n",
+ " Ions confined to aqueous phase | \n",
" True | \n",
"
\n",
" \n",
" | 13 | \n",
- " No pressure-level leakage in fitting | \n",
+ " Reactive carbon error below 1e-6 mol | \n",
" True | \n",
"
\n",
" \n",
" | 14 | \n",
- " High-pressure control now conserved and saturated | \n",
+ " Starting-temperature spread below 0.002 K | \n",
" True | \n",
"
\n",
" \n",
" | 15 | \n",
- " NaCl-CaCl2 control now conserves original feed | \n",
+ " All ten published points calculated | \n",
" True | \n",
"
\n",
" \n",
" | 16 | \n",
- " Reported KCl case converged and saturated | \n",
+ " No pressure-level leakage in fitting | \n",
" True | \n",
"
\n",
" \n",
" | 17 | \n",
- " KCl saturated inventory spread below 0.005 K | \n",
+ " High-pressure control now conserved and saturated | \n",
" True | \n",
"
\n",
" \n",
" | 18 | \n",
+ " NaCl-CaCl2 control now conserves original feed | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " Reported KCl case converged and saturated | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " KCl saturated inventory spread below 0.005 K | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
" Accepted non-reactive original feed conserved | \n",
" True | \n",
"
\n",
@@ -4130,26 +6750,29 @@
""
],
"text/plain": [
- " Check Passed\n",
- "0 All 36 principal curve attempts recorded True\n",
- "1 20, 50 and 100 bara controls accepted for every recipe True\n",
- "2 Accepted principal boundaries increase with pressure True\n",
- "3 Rejected points excluded from principal temperature table True\n",
- "4 NaCl concentration depresses each curve True\n",
- "5 MEG depresses both pressure cases True\n",
- "6 Water activities finite and in (0,1] True\n",
- "7 Component inventory error below 1e-8 True\n",
- "8 Aqueous charge error below 1e-8 True\n",
- "9 Ions confined to aqueous phase True\n",
- "10 Reactive carbon error below 1e-6 mol True\n",
- "11 Starting-temperature spread below 0.002 K True\n",
- "12 All ten published points calculated True\n",
- "13 No pressure-level leakage in fitting True\n",
- "14 High-pressure control now conserved and saturated True\n",
- "15 NaCl-CaCl2 control now conserves original feed True\n",
- "16 Reported KCl case converged and saturated True\n",
- "17 KCl saturated inventory spread below 0.005 K True\n",
- "18 Accepted non-reactive original feed conserved True"
+ " Check Passed\n",
+ "0 All 110 supported Dholabhai points retained True\n",
+ "1 All Dholabhai states numerically accepted and vapor-comparable True\n",
+ "2 Dholabhai errors finite for every comparable point True\n",
+ "3 All 36 principal curve attempts recorded True\n",
+ "4 20, 50 and 100 bara controls accepted for every recipe True\n",
+ "5 Accepted principal boundaries increase with pressure True\n",
+ "6 Rejected points excluded from principal temperature table True\n",
+ "7 NaCl concentration depresses each curve True\n",
+ "8 MEG depresses both pressure cases True\n",
+ "9 Water activities finite and in (0,1] True\n",
+ "10 Component inventory error below 1e-8 True\n",
+ "11 Aqueous charge error below 1e-8 True\n",
+ "12 Ions confined to aqueous phase True\n",
+ "13 Reactive carbon error below 1e-6 mol True\n",
+ "14 Starting-temperature spread below 0.002 K True\n",
+ "15 All ten published points calculated True\n",
+ "16 No pressure-level leakage in fitting True\n",
+ "17 High-pressure control now conserved and saturated True\n",
+ "18 NaCl-CaCl2 control now conserves original feed True\n",
+ "19 Reported KCl case converged and saturated True\n",
+ "20 KCl saturated inventory spread below 0.005 K True\n",
+ "21 Accepted non-reactive original feed conserved True"
]
},
"metadata": {},
@@ -4172,6 +6795,13 @@
" - seed_table[\"Calculated boundary [°C]\"].min())\n",
"accepted_runs = pd.DataFrame([row for row in all_runs if row[\"accepted\"]])\n",
"checks = {\n",
+ " \"All 110 supported Dholabhai points retained\": len(dholabhai) == 110,\n",
+ " \"All Dholabhai states numerically accepted and vapor-comparable\": bool(\n",
+ " dholabhai[\"comparable\"].all()\n",
+ " ),\n",
+ " \"Dholabhai errors finite for every comparable point\": bool(\n",
+ " np.isfinite(dholabhai.loc[dholabhai[\"comparable\"], \"error_K\"]).all()\n",
+ " ),\n",
" \"All 36 principal curve attempts recorded\": len(curves) == 36,\n",
" \"20, 50 and 100 bara controls accepted for every recipe\": bool(\n",
" curves.loc[curves[\"pressure_bara\"].isin([20.0, 50.0, 100.0]), \"accepted\"].all()\n",
@@ -4273,7 +6903,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 24,
"id": "28529e1b",
"metadata": {},
"outputs": [
@@ -4283,7 +6913,8 @@
"text": [
"At 50 bara: fresh water 9.954 °C; 5 wt% NaCl 7.341 °C.\n",
"Independent NaCl benchmark MAE: 0.143 K across ten points.\n",
- "Mud correction: SYNTHETIC demonstration; replace with laboratory evidence.\n"
+ "Mud correction: SYNTHETIC demonstration; replace with laboratory evidence.\n",
+ "Dholabhai K10 at 11.3 bara: model minus experiment +1.583 K.\n"
]
},
{
@@ -4349,86 +6980,111 @@
" \n",
" \n",
" | 7 | \n",
- " all_calculation_diagnostics.csv | \n",
- " 22751 | \n",
+ " 08_dholabhai_pressure_temperature.png | \n",
+ " 332029 | \n",
"
\n",
" \n",
" | 8 | \n",
- " brine_curves.csv | \n",
- " 10811 | \n",
+ " 09_dholabhai_residuals.png | \n",
+ " 90993 | \n",
"
\n",
" \n",
" | 9 | \n",
+ " all_calculation_diagnostics.csv | \n",
+ " 54685 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " brine_curves.csv | \n",
+ " 10807 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
" calcium_component_balance_control.csv | \n",
" 351 | \n",
"
\n",
" \n",
- " | 10 | \n",
+ " 12 | \n",
" correlation_coefficients.csv | \n",
" 179 | \n",
"
\n",
" \n",
- " | 11 | \n",
+ " 13 | \n",
" correlation_data_and_predictions.csv | \n",
" 8439 | \n",
"
\n",
" \n",
- " | 12 | \n",
+ " 14 | \n",
+ " dholabhai_1993_comparison.csv | \n",
+ " 22352 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " dholabhai_1993_family_metrics.csv | \n",
+ " 617 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " dholabhai_1993_recipe_metrics.csv | \n",
+ " 3034 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
" finite_inventory_screen.csv | \n",
" 192 | \n",
"
\n",
" \n",
- " | 13 | \n",
+ " 18 | \n",
" guest_composition_screen.csv | \n",
" 439 | \n",
"
\n",
" \n",
- " | 14 | \n",
+ " 19 | \n",
" illustrative_temperature_margin.csv | \n",
" 689 | \n",
"
\n",
" \n",
- " | 15 | \n",
+ " 20 | \n",
" kcl_pressure_inventory_regression.csv | \n",
- " 1336 | \n",
+ " 1337 | \n",
"
\n",
" \n",
- " | 16 | \n",
+ " 21 | \n",
" laboratory_input_template.csv | \n",
" 163 | \n",
"
\n",
" \n",
- " | 17 | \n",
+ " 22 | \n",
" meg_screen.csv | \n",
" 583 | \n",
"
\n",
" \n",
- " | 18 | \n",
+ " 23 | \n",
" provenance.json | \n",
- " 1083 | \n",
+ " 3150 | \n",
"
\n",
" \n",
- " | 19 | \n",
+ " 24 | \n",
" published_nacl_benchmark.csv | \n",
" 889 | \n",
"
\n",
" \n",
- " | 20 | \n",
+ " 25 | \n",
" reactive_species.csv | \n",
" 213 | \n",
"
\n",
" \n",
- " | 21 | \n",
+ " 26 | \n",
" synthetic_lab_data.csv | \n",
" 5413 | \n",
"
\n",
" \n",
- " | 22 | \n",
+ " 27 | \n",
" validation_checks.csv | \n",
- " 912 | \n",
+ " 1085 | \n",
"
\n",
" \n",
- " | 23 | \n",
+ " 28 | \n",
" water_activity.csv | \n",
" 345 | \n",
"
\n",
@@ -4445,23 +7101,28 @@
"4 05_published_benchmark.png 124353\n",
"5 06_synthetic_fit_validation.png 91254\n",
"6 07_temperature_margin.png 100277\n",
- "7 all_calculation_diagnostics.csv 22751\n",
- "8 brine_curves.csv 10811\n",
- "9 calcium_component_balance_control.csv 351\n",
- "10 correlation_coefficients.csv 179\n",
- "11 correlation_data_and_predictions.csv 8439\n",
- "12 finite_inventory_screen.csv 192\n",
- "13 guest_composition_screen.csv 439\n",
- "14 illustrative_temperature_margin.csv 689\n",
- "15 kcl_pressure_inventory_regression.csv 1336\n",
- "16 laboratory_input_template.csv 163\n",
- "17 meg_screen.csv 583\n",
- "18 provenance.json 1083\n",
- "19 published_nacl_benchmark.csv 889\n",
- "20 reactive_species.csv 213\n",
- "21 synthetic_lab_data.csv 5413\n",
- "22 validation_checks.csv 912\n",
- "23 water_activity.csv 345"
+ "7 08_dholabhai_pressure_temperature.png 332029\n",
+ "8 09_dholabhai_residuals.png 90993\n",
+ "9 all_calculation_diagnostics.csv 54685\n",
+ "10 brine_curves.csv 10807\n",
+ "11 calcium_component_balance_control.csv 351\n",
+ "12 correlation_coefficients.csv 179\n",
+ "13 correlation_data_and_predictions.csv 8439\n",
+ "14 dholabhai_1993_comparison.csv 22352\n",
+ "15 dholabhai_1993_family_metrics.csv 617\n",
+ "16 dholabhai_1993_recipe_metrics.csv 3034\n",
+ "17 finite_inventory_screen.csv 192\n",
+ "18 guest_composition_screen.csv 439\n",
+ "19 illustrative_temperature_margin.csv 689\n",
+ "20 kcl_pressure_inventory_regression.csv 1337\n",
+ "21 laboratory_input_template.csv 163\n",
+ "22 meg_screen.csv 583\n",
+ "23 provenance.json 3150\n",
+ "24 published_nacl_benchmark.csv 889\n",
+ "25 reactive_species.csv 213\n",
+ "26 synthetic_lab_data.csv 5413\n",
+ "27 validation_checks.csv 1085\n",
+ "28 water_activity.csv 345"
]
},
"metadata": {},
@@ -4470,6 +7131,9 @@
],
"source": [
"export_tables = {\n",
+ " \"dholabhai_1993_comparison.csv\": dholabhai,\n",
+ " \"dholabhai_1993_family_metrics.csv\": dholabhai_metrics,\n",
+ " \"dholabhai_1993_recipe_metrics.csv\": dholabhai_recipe_metrics,\n",
" \"brine_curves.csv\": curves,\n",
" \"kcl_pressure_inventory_regression.csv\": kcl_table,\n",
" \"water_activity.csv\": activity_table,\n",
@@ -4495,6 +7159,15 @@
" \"doi\": \"10.2516/stet/2023005\", \"table\": 4, \"license\": \"CC BY 4.0\",\n",
" \"points\": len(published), \"MAE_K\": benchmark_mae_K, \"RMSE_K\": benchmark_rmse_K,\n",
" },\n",
+ " \"dholabhai_benchmark\": {\n",
+ " \"doi\": \"10.1021/je00012a045\", \"tables\": [\"I\", \"III\", \"IV\"],\n",
+ " \"source\": \"User-supplied paper; manually transcribed numerical endpoints\",\n",
+ " \"points\": len(dholabhai), \"compared\": int(dholabhai[\"comparable\"].sum()),\n",
+ " \"excluded\": \"Five synthetic seawater points: recipe outside the three-salt builder\",\n",
+ " \"family_metrics\": dholabhai_metrics.to_dict(orient=\"records\"),\n",
+ " \"parameters_fitted\": False,\n",
+ " \"accuracy_follow_up\": \"https://github.com/equinor/neqsim/issues/4234\",\n",
+ " },\n",
" \"synthetic_correlation\": bool(using_synthetic_data),\n",
" \"numerical_checks_passed\": len(checks),\n",
" \"known_phase_state_issue\": \"https://github.com/equinor/neqsim/issues/3584\",\n",
@@ -4508,7 +7181,8 @@
"print(f\"At 50 bara: fresh water {curve_cache[('Fresh water', 50.0)]:.3f} °C; \"\n",
" f\"5 wt% NaCl {curve_cache[('NaCl 5%', 50.0)]:.3f} °C.\")\n",
"print(f\"Independent NaCl benchmark MAE: {benchmark_mae_K:.3f} K across ten points.\")\n",
- "print(\"Mud correction: SYNTHETIC demonstration; replace with laboratory evidence.\")"
+ "print(\"Mud correction: SYNTHETIC demonstration; replace with laboratory evidence.\")\n",
+ "print(f\"Dholabhai K10 at 11.3 bara: model minus experiment {k10_low['error_K']:+.3f} K.\")"
]
},
{
@@ -4528,6 +7202,12 @@
"\n",
"**Primary experimental literature**\n",
"\n",
+ "- Dholabhai, P. D., Kalogerakis, N. and Bishnoi, P. R. (1993).\n",
+ " *Equilibrium Conditions for Carbon Dioxide Hydrate Formation in Aqueous Electrolyte Solutions*.\n",
+ " J. Chem. Eng. Data 38, 650–654. [doi:10.1021/je00012a045](https://doi.org/10.1021/je00012a045).\n",
+ " Section 9 uses Table I recipes and all non-seawater endpoints in Tables III–IV.\n",
+ " The supplied ACS paper is the transcription source; original figures/PDF are not redistributed.\n",
+ "\n",
"- Burgass, R., Chapoy, A., Askvik, K. M., Neeraas, B. O. and Li, X. (2023).\n",
" *CO₂ hydrate formation in NaCl systems and undersaturated aqueous solutions*.\n",
" Science and Technology for Energy Transition 78, 8.\n",
@@ -4544,6 +7224,10 @@
"\n",
"**Tracked improvements**\n",
"\n",
+ "- [#4234: KCl and mixed-brine hydrate accuracy against Dholabhai (1993)](https://github.com/equinor/neqsim/issues/4234):\n",
+ " concentration-dependent KCl discrepancy despite convergence and conserved phase inventories;\n",
+ " water-activity, solubility and ion-specific parameter investigation under #3144.\n",
+ "\n",
"- [#3584: CO₂–brine hydrate phase-state selection](https://github.com/equinor/neqsim/issues/3584):\n",
" high-salinity/high-pressure and finite-CO₂ inventory qualification; structured residual/phase diagnostics.\n",
"- [#3585: NaCl–CaCl₂ component-inventory imbalance](https://github.com/equinor/neqsim/issues/3585):\n",
@@ -4564,7 +7248,8 @@
"criteria have been invented. The disclosed synthetic correlation is an executable statistical example.\n",
"\n",
"The KCl regression adds numerical evidence for the reported low-pressure case.\n",
- "It adds no KCl experimental data or fitted parameters. The repaired September defects\n",
+ "The separate Dholabhai comparison adds KCl and mixed-salt experimental evidence,\n",
+ "with visible model discrepancies and no fitted parameters. The repaired September defects\n",
"remain linked as implementation history; their original rejected results are replaced\n",
"by fresh execution of the same inputs.\n"
]
From f77a6285ef557b3d67d947183eba3ee63d83f0fe Mon Sep 17 00:00:00 2001
From: Even Solbraa <41290109+EvenSol@users.noreply.github.com>
Date: Mon, 5 Oct 2026 23:23:29 +0200
Subject: [PATCH 2/3] Catalog the Dholabhai hydrate validation example
---
notebooks/examples_of_NeqSim_in_Colab.ipynb | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/notebooks/examples_of_NeqSim_in_Colab.ipynb b/notebooks/examples_of_NeqSim_in_Colab.ipynb
index 4b761f08..4f0fb703 100644
--- a/notebooks/examples_of_NeqSim_in_Colab.ipynb
+++ b/notebooks/examples_of_NeqSim_in_Colab.ipynb
@@ -398,7 +398,7 @@
"\n",
"* [Methanol, MEG and AA-LDHI hydrate management choices](flowassurance/hydrate_mitigation_chemical_choice_4016.ipynb): source-pinned three-phase CPA hydrate curves, flowline margins, synthetic-water scale pH screens and the separate AA-LDHI qualification boundary.\n",
"* **Advanced** - [Hot-oil commissioning of subsea jumpers with NeqSim and machine learning](flowassurance/hot_oil_commissioning_neqsim_ml.ipynb): follow hot oil displacing cold diesel; calculate properties, wax, wall heat storage, risk and pressure; check conservation and discretization; compare RF/MLP surrogates and explicit restart scenarios.\n",
- "* [CO₂ hydrate calculations with NeqSim: brines, inhibitors and drilling-fluid examples](flowassurance/co2_hydrate_brines_and_drilling_fluids.ipynb): updated CO₂/brine solver with a 10 wt% KCl regression at 11.3 bara, pressure/inventory phase checks and hydt unit comparison; hands-on setup, single-point calculations, parameter sweeps and result interpretation; executed brine/MEG/CO₂–CH₄ examples, published-data comparison, practice tasks and a clearly synthetic laboratory-correlation workflow.\n",
+ "* [CO₂ hydrate calculations with NeqSim: brines, inhibitors and drilling-fluid examples](flowassurance/co2_hydrate_brines_and_drilling_fluids.ipynb): updated CO₂/brine solver with a 10 wt% KCl regression at 11.3 bara, pressure/inventory phase checks and hydt unit comparison; hands-on setup, single-point calculations, parameter sweeps and result interpretation; executed brine/MEG/CO₂–CH₄ examples, Burgass NaCl plus 110 Dholabhai (1993) pure-water/single/mixed-salt endpoints, family error metrics and experimental discussion, practice tasks and a clearly synthetic laboratory-correlation workflow.\n",
"* [Thermodynamics of natural gas hydrates — CPA equilibrium, MEG and salt inhibition, and arrival-process screening](thermodynamics/thermodynamics_of_natural_gas_hydrates.ipynb)\n",
"* [Wax appearance, model tuning, and flowline operability with NeqSim](thermodynamics/thermodynamicsOfWax.ipynb): characterize a reservoir fluid, calculate and tune wax precipitation, map WAT and wax fraction, and screen cooling and insulation scenarios along a segmented flowline.\n",
"* [Mineral-scale thermodynamics and flowline control with NeqSim](thermodynamics/ThermodynamicsOfMineralScale.ipynb): calculate Electrolyte-CPA aqueous speciation and saturation indices, screen water chemistry and incompatible-brine mixing, profile flowline risk, assess inhibitor dose, and couple multiphase hydraulics to deposition.\n",
@@ -623,4 +623,3 @@
"nbformat": 4,
"nbformat_minor": 0
}
-
From 61a7ac0f01a5880c97946e15e44fcacbd9d78aa1 Mon Sep 17 00:00:00 2001
From: Even Solbraa <41290109+EvenSol@users.noreply.github.com>
Date: Mon, 5 Oct 2026 23:23:31 +0200
Subject: [PATCH 3/3] Record Dholabhai hydrate comparison validation and
accuracy limits
---
.../co2_hydrate_drilling_fluids_20260908.json | 417 +++++++++++++++++-
1 file changed, 395 insertions(+), 22 deletions(-)
diff --git a/notebooks/maintenance_ledger/co2_hydrate_drilling_fluids_20260908.json b/notebooks/maintenance_ledger/co2_hydrate_drilling_fluids_20260908.json
index 2a1c095f..3e2d8d27 100644
--- a/notebooks/maintenance_ledger/co2_hydrate_drilling_fluids_20260908.json
+++ b/notebooks/maintenance_ledger/co2_hydrate_drilling_fluids_20260908.json
@@ -1,12 +1,12 @@
{
"schema_version": 1,
"shard": "co2-hydrate-drilling-fluids-20260908",
- "updated_at": "2026-10-05T15:03:41.708994+00:00",
+ "updated_at": "2026-10-05T21:20:53.534087+00:00",
"notebooks": [
{
"path": "notebooks/flowassurance/co2_hydrate_brines_and_drilling_fluids.ipynb",
"verified_date": "2026-10-05",
- "verified_at_utc": "2026-10-05T15:03:41.708994+00:00",
+ "verified_at_utc": "2026-10-05T21:20:53.534087+00:00",
"neqsim_version": "3.20.0 Python bridge; source-built Java 3.23.0 runtime",
"neqsim_java_commit": "f59810115c07d9a3ef479e55be45a5972963231d",
"neqsim_jar_sha256": "e26d9dd82e86d351fa58fe05e04801e2af6aebb17d19081c690736d924536f19",
@@ -21,15 +21,15 @@
"scipy": "1.17.0"
},
"execution_status": "passed",
- "execution_method": "All 21 code cells executed top to bottom in a fresh Python/IPython process and fresh JVM using scripts/execute_notebook_inprocess.py. Verified clean source-built JAR reused via NEQSIM_SOURCE_ROOT and NEQSIM_SOURCE_JAR; class origin and SHA-256 asserted. Every result-bearing output and all seven figures retained. Hosted Colab installation and remote source checkout were not exercised locally.",
- "execution_seconds": 198.1,
- "code_cells": 21,
- "substantive_code_cells": 21,
- "markdown_cells": 24,
- "git_blob_sha1": "63693bce99487ebb1aab3eb953f6a22a5d11b35f",
- "notebook_bytes": 898834,
+ "execution_method": "All 24 code cells executed in order in a fresh Python/IPython process and JVM. Immutable source checkout and previously source-built JAR were verified against the existing SHA-256 and source files; class origin asserted. Every result, nine plots, and 110 experimental endpoints retained. Hosted Colab install/build was not rerun locally.",
+ "execution_seconds": 253.4,
+ "code_cells": 24,
+ "substantive_code_cells": 24,
+ "markdown_cells": 26,
+ "git_blob_sha1": "5ff70f3731d2c6be04496f84b4a5e5ede4375245",
+ "notebook_bytes": 1435071,
"publication": {
- "branch": "codex/fix-kcl-hydrate-notebook-20261005",
+ "branch": "codex/hydrate-dholabhai-comparison-20261005",
"mode": "focused draft pull request",
"files": [
"notebooks/flowassurance/co2_hydrate_brines_and_drilling_fluids.ipynb",
@@ -47,7 +47,8 @@
"10 wt% KCl at 11.3 bara and 2.805906013 mol CO2/kg water",
"Pressure/inventory phase classification and saturated-inventory independence",
"hydt kelvin return, structure-I overload and fresh-fluid comparison",
- "Conservation against the original input inventory and structured solver diagnostics"
+ "Conservation against the original input inventory and structured solver diagnostics",
+ "Independent pure-water, single-salt and binary-brine hydrate comparison against 110 Dholabhai (1993) endpoints with numerical diagnostics and family/recipe residuals"
],
"independent_validation": {
"doi": "10.2516/stet/2023005",
@@ -60,12 +61,12 @@
"interpretation": "Limited NaCl benchmark; no KCl calibration or commercial-mud qualification."
},
"engineering_validation": {
- "named_assertions_passed": 19,
+ "named_assertions_passed": 22,
"assertions_failed": 0,
"principal_curve_attempts": 36,
"principal_curve_accepted": 36,
- "all_hydrate_attempts": 85,
- "accepted_hydrate_attempts": 85,
+ "all_hydrate_attempts": 197,
+ "accepted_hydrate_attempts": 197,
"max_accepted_component_error": 5.379030554308883e-14,
"max_accepted_original_feed_error": 5.380506159803984e-14,
"max_accepted_charge_error": 5.096317915411774e-12,
@@ -86,12 +87,12 @@
}
},
"rendered_visual_validation": {
- "renderer": "nbconvert 7.17.1 HTML; MathJax 3.2.2 SVG; WeasyPrint 70 PDF and Poppler PNG",
- "display_equations_inspected": 7,
- "inline_equations_inspected": 19,
- "figures_inspected": 7,
+ "renderer": "nbconvert HTML, MathJax 3.2.2 SVG, WeasyPrint PDF and Poppler PNG",
+ "display_equations_inspected": 8,
+ "inline_equations_inspected": 24,
+ "figures_inspected": 9,
"result": "passed",
- "notes": "All Markdown and result cells inspected; equations, figures, units, legends and tables checked. Diagnostic column width and scientific number display avoid truncated check labels and residuals rounded to apparent zero."
+ "notes": "Every Markdown/result cell inspected; all equations, tables, plots and units checked. Catalog text fully rendered and inspected; scientific figures inspected individually."
},
"repository_validation": {
"checker_unit_tests": "6 passed",
@@ -101,7 +102,7 @@
"pre_commit": "No .pre-commit-config.yaml on the inspected Colab base; workflow runs notebook checker.",
"ci": "pending"
},
- "documentation_impact": "Updates source-pin/restart guidance, KCl pressure/inventory teaching, hydt kelvin and overload explanation, repaired historical defect examples, diagnostics and CSV export. Catalog entry and this ledger updated. No Java API, salt/hydrate parameters or library implementation changed.",
+ "documentation_impact": "Adds Dholabhai measured recipes, complete supported-point comparison, family/per-recipe metrics, two figures, matched K10 concentration/inventory controls, experimental uncertainty and model-discrepancy discussion, CSV exports and citation. Catalog and this ledger updated. No Java API or model parameters changed.",
"issue_handling": [
{
"url": "https://github.com/equinor/neqsim/issues/3584",
@@ -110,9 +111,13 @@
{
"url": "https://github.com/equinor/neqsim/issues/3585",
"handling": "Existing inventory repair used; NaCl-CaCl2 feed passes original-feed conservation."
+ },
+ {
+ "url": "https://github.com/equinor/neqsim/issues/4234",
+ "handling": "Dedicated empirical accuracy follow-up; no fitting in this comparison."
}
],
- "improvement_assessment": "Reported hang reproduced on the stale September pin and resolved by existing current source fixes. No distinct new NeqSim library defect reproduced; no duplicate issue filed.",
+ "improvement_assessment": "KCl model-accuracy limitation documented in equinor/neqsim#4234 under #3144; not a recurrence of the numerical hang. No model fitted to this paper.",
"previous_validation": {
"source_commit": "76f14ae079a7b1db1888203d20e11a6433774b4c",
"validation_date": "2026-09-08",
@@ -130,7 +135,375 @@
"principal_curve_attempts": 36,
"principal_curve_accepted": 35,
"note": "Historical evidence; superseded by clean execution of the updated source pin."
- }
+ },
+ "neqsim_java_master_inspected": "17c0beca5a5ca53401fa214c2a542892e5a6a467",
+ "master_comparison": "No thermo, hydrate flash, electrolyte or database changes from tested pin.",
+ "dholabhai_validation": {
+ "doi": "10.1021/je00012a045",
+ "tables": [
+ "I",
+ "III",
+ "IV"
+ ],
+ "source": "User-supplied paper; manually transcribed numerical endpoints",
+ "points": 110,
+ "compared": 110,
+ "excluded": "Five synthetic seawater points: recipe outside the three-salt builder",
+ "family_metrics": [
+ {
+ "Family": "Pure water",
+ "Measured": 4,
+ "Compared": 4,
+ "Bias [K]": 0.3639718239515872,
+ "MAE [K]": 0.3639718239515872,
+ "RMSE [K]": 0.3830125365504527,
+ "Max absolute error [K]": 0.5243938347231278
+ },
+ {
+ "Family": "NaCl",
+ "Measured": 25,
+ "Compared": 25,
+ "Bias [K]": 0.15801747910150651,
+ "MAE [K]": 0.2647777588608801,
+ "RMSE [K]": 0.32486187038181336,
+ "Max absolute error [K]": 0.7773410951842266
+ },
+ {
+ "Family": "KCl",
+ "Measured": 21,
+ "Compared": 21,
+ "Bias [K]": 1.7411253670351812,
+ "MAE [K]": 1.7411253670351812,
+ "RMSE [K]": 2.685081832407701,
+ "Max absolute error [K]": 6.729003869912958
+ },
+ {
+ "Family": "CaCl2",
+ "Measured": 21,
+ "Compared": 21,
+ "Bias [K]": 0.4448687376450569,
+ "MAE [K]": 0.47048312904848627,
+ "RMSE [K]": 0.7608002512078572,
+ "Max absolute error [K]": 2.145490223592219
+ },
+ {
+ "Family": "NaCl + KCl",
+ "Measured": 17,
+ "Compared": 17,
+ "Bias [K]": 0.05710972524584309,
+ "MAE [K]": 0.7451141124244901,
+ "RMSE [K]": 0.9997587971638354,
+ "Max absolute error [K]": 1.7640223174028051
+ },
+ {
+ "Family": "NaCl + CaCl2",
+ "Measured": 22,
+ "Compared": 22,
+ "Bias [K]": -0.01524452654061034,
+ "MAE [K]": 0.37705945714725947,
+ "RMSE [K]": 0.5105665176898994,
+ "Max absolute error [K]": 1.186529079953857
+ }
+ ],
+ "parameters_fitted": false,
+ "accuracy_follow_up": "https://github.com/equinor/neqsim/issues/4234",
+ "recipe_count": 28,
+ "excluded_seawater_points": 5,
+ "original_units": {
+ "temperature": "K",
+ "pressure": "MPa"
+ },
+ "pressure_basis": "absolute: corrected gauge reading plus atmosphere in the paper",
+ "salt_basis": "mass percent of water plus all dissolved salts, Table I actual values",
+ "paper_sha256": "229d7d6a011d2bc63dc2d56ec84af7ab1942511ceacd71f6206f7a62b8014765",
+ "access_conditions": "User-supplied ACS copyrighted paper; factual numerical transcription. No paper pages, figures or PDF redistributed.",
+ "recipe_metrics": [
+ {
+ "Solution": "water",
+ "Compared": 4,
+ "Bias [K]": 0.3639718239515872,
+ "MAE [K]": 0.3639718239515872,
+ "RMSE [K]": 0.3830125365504527,
+ "Min error [K]": 0.1967875349310475,
+ "Max error [K]": 0.5243938347231278
+ },
+ {
+ "Solution": "Na3-1",
+ "Compared": 4,
+ "Bias [K]": 0.3477767342162963,
+ "MAE [K]": 0.3477767342162963,
+ "RMSE [K]": 0.3891925871958145,
+ "Min error [K]": 0.1276623547657323,
+ "Max error [K]": 0.6060719764695364
+ },
+ {
+ "Solution": "Na3-2",
+ "Compared": 1,
+ "Bias [K]": 0.3618092085234252,
+ "MAE [K]": 0.3618092085234252,
+ "RMSE [K]": 0.3618092085234252,
+ "Min error [K]": 0.3618092085234252,
+ "Max error [K]": 0.3618092085234252
+ },
+ {
+ "Solution": "Na3-3",
+ "Compared": 1,
+ "Bias [K]": -0.044139815524943,
+ "MAE [K]": 0.044139815524943,
+ "RMSE [K]": 0.044139815524943,
+ "Min error [K]": -0.044139815524943,
+ "Max error [K]": -0.044139815524943
+ },
+ {
+ "Solution": "Na5-1",
+ "Compared": 4,
+ "Bias [K]": 0.4939312713169244,
+ "MAE [K]": 0.4939312713169244,
+ "RMSE [K]": 0.5263035496206743,
+ "Min error [K]": 0.3117722678024393,
+ "Max error [K]": 0.7773410951842266
+ },
+ {
+ "Solution": "Na5-2",
+ "Compared": 1,
+ "Bias [K]": -0.2233135520441465,
+ "MAE [K]": 0.2233135520441465,
+ "RMSE [K]": 0.2233135520441465,
+ "Min error [K]": -0.2233135520441465,
+ "Max error [K]": -0.2233135520441465
+ },
+ {
+ "Solution": "Na10-1",
+ "Compared": 2,
+ "Bias [K]": -0.0967227684019746,
+ "MAE [K]": 0.0967227684019746,
+ "RMSE [K]": 0.0968029155125083,
+ "Min error [K]": -0.1006611087097439,
+ "Max error [K]": -0.0927844280942054
+ },
+ {
+ "Solution": "Na10-2",
+ "Compared": 5,
+ "Bias [K]": 0.1505309560605951,
+ "MAE [K]": 0.236233116737128,
+ "RMSE [K]": 0.2962645837769826,
+ "Min error [K]": -0.1260039275048825,
+ "Max error [K]": 0.531083075277536
+ },
+ {
+ "Solution": "Na15",
+ "Compared": 4,
+ "Bias [K]": 0.0073302246820219,
+ "MAE [K]": 0.1950904463798792,
+ "RMSE [K]": 0.2209570313280566,
+ "Min error [K]": -0.2895708933221499,
+ "Max error [K]": 0.3075423986202281
+ },
+ {
+ "Solution": "Na20",
+ "Compared": 3,
+ "Bias [K]": -0.0330936759255564,
+ "MAE [K]": 0.1561254890958328,
+ "RMSE [K]": 0.1721427224915065,
+ "Min error [K]": -0.2272434745776195,
+ "Max error [K]": 0.1845477197554146
+ },
+ {
+ "Solution": "K3",
+ "Compared": 6,
+ "Bias [K]": 0.3400518262451442,
+ "MAE [K]": 0.3400518262451442,
+ "RMSE [K]": 0.3871564822812567,
+ "Min error [K]": 0.1077415950883278,
+ "Max error [K]": 0.6033697674800464
+ },
+ {
+ "Solution": "K5",
+ "Compared": 7,
+ "Bias [K]": 0.5214696766857401,
+ "MAE [K]": 0.5214696766857401,
+ "RMSE [K]": 0.5310665844154743,
+ "Min error [K]": 0.4244962785168127,
+ "Max error [K]": 0.6788289152129323
+ },
+ {
+ "Solution": "K10",
+ "Compared": 4,
+ "Bias [K]": 2.056410731209624,
+ "MAE [K]": 2.056410731209624,
+ "RMSE [K]": 2.083688640731458,
+ "Min error [K]": 1.5834853509147138,
+ "Max error [K]": 2.4720390600299997
+ },
+ {
+ "Solution": "K15",
+ "Compared": 4,
+ "Bias [K]": 5.661847772157316,
+ "MAE [K]": 5.661847772157316,
+ "RMSE [K]": 5.726306774548871,
+ "Min error [K]": 4.477513615322721,
+ "Max error [K]": 6.729003869912958
+ },
+ {
+ "Solution": "Ca3",
+ "Compared": 4,
+ "Bias [K]": 0.2138087640509809,
+ "MAE [K]": 0.218556645079758,
+ "RMSE [K]": 0.2822304836804269,
+ "Min error [K]": -0.0094957620575542,
+ "Max error [K]": 0.482801819277995
+ },
+ {
+ "Solution": "Ca5",
+ "Compared": 4,
+ "Bias [K]": 0.1312393476264759,
+ "MAE [K]": 0.1685436460759746,
+ "RMSE [K]": 0.2333741709171692,
+ "Min error [K]": -0.0746085968989973,
+ "Max error [K]": 0.435992477865966
+ },
+ {
+ "Solution": "Ca10",
+ "Compared": 5,
+ "Bias [K]": 0.0689090433379647,
+ "MAE [K]": 0.1428477436497473,
+ "RMSE [K]": 0.1889431294106265,
+ "Min error [K]": -0.0990009000423128,
+ "Max error [K]": 0.3727507573752859
+ },
+ {
+ "Solution": "Ca15",
+ "Compared": 4,
+ "Bias [K]": 0.2925894817580285,
+ "MAE [K]": 0.2925894817580285,
+ "RMSE [K]": 0.3055930777255068,
+ "Min error [K]": 0.1459495808307451,
+ "Max error [K]": 0.3678909782612436
+ },
+ {
+ "Solution": "Ca20",
+ "Compared": 4,
+ "Bias [K]": 1.6117869750286076,
+ "MAE [K]": 1.6117869750286076,
+ "RMSE [K]": 1.6633280810881284,
+ "Min error [K]": 1.018679175139198,
+ "Max error [K]": 2.145490223592219
+ },
+ {
+ "Solution": "Na3K3",
+ "Compared": 5,
+ "Bias [K]": 0.1341771918263134,
+ "MAE [K]": 0.1665289357648248,
+ "RMSE [K]": 0.2077153294797957,
+ "Min error [K]": -0.0772794177613036,
+ "Max error [K]": 0.3137855993855964
+ },
+ {
+ "Solution": "Na5K5",
+ "Compared": 4,
+ "Bias [K]": 0.0626582963828639,
+ "MAE [K]": 0.1172039927521382,
+ "RMSE [K]": 0.1190740219907959,
+ "Min error [K]": -0.1090913927385486,
+ "Max error [K]": 0.1523227454111406
+ },
+ {
+ "Solution": "Na7K10",
+ "Compared": 4,
+ "Bias [K]": 1.4268531807374956,
+ "MAE [K]": 1.4268531807374956,
+ "RMSE [K]": 1.475801649248203,
+ "Min error [K]": 0.821105651898165,
+ "Max error [K]": 1.7640223174028051
+ },
+ {
+ "Solution": "Na15K5",
+ "Compared": 4,
+ "Bias [K]": -1.414516634608418,
+ "MAE [K]": 1.414516634608418,
+ "RMSE [K]": 1.4148670679217996,
+ "Min error [K]": -1.4684805759328017,
+ "Max error [K]": -1.3915922237843006
+ },
+ {
+ "Solution": "Na3Ca3",
+ "Compared": 5,
+ "Bias [K]": 0.1375118701681231,
+ "MAE [K]": 0.1522163646830449,
+ "RMSE [K]": 0.2042579163404697,
+ "Min error [K]": -0.0367612362873046,
+ "Max error [K]": 0.3466357046389134
+ },
+ {
+ "Solution": "Na8Ca2",
+ "Compared": 4,
+ "Bias [K]": 0.0458206756673149,
+ "MAE [K]": 0.1267876040098343,
+ "RMSE [K]": 0.144952123722395,
+ "Min error [K]": -0.1619338566850388,
+ "Max error [K]": 0.2114326195965645
+ },
+ {
+ "Solution": "Na2Ca8",
+ "Compared": 4,
+ "Bias [K]": -0.0565060348203303,
+ "MAE [K]": 0.1118383603220252,
+ "RMSE [K]": 0.1190746244802942,
+ "Min error [K]": -0.1607910711805402,
+ "Max error [K]": 0.1106646510033897
+ },
+ {
+ "Solution": "Na5Ca15",
+ "Compared": 5,
+ "Bias [K]": 0.5599524878375064,
+ "MAE [K]": 0.5599524878375064,
+ "RMSE [K]": 0.5798214012575342,
+ "Min error [K]": 0.3682485387117822,
+ "Max error [K]": 0.8228473050418756
+ },
+ {
+ "Solution": "Na15Ca5",
+ "Compared": 4,
+ "Bias [K]": -0.9449899843273784,
+ "MAE [K]": 0.9449899843273784,
+ "RMSE [K]": 0.9623654985899016,
+ "Min error [K]": -1.186529079953857,
+ "Max error [K]": -0.7019803566178666
+ }
+ ],
+ "k10_at_11_3_bara": {
+ "solution": "K10",
+ "family": "KCl",
+ "table": "III",
+ "NaCl_wt_percent": 0.0,
+ "KCl_wt_percent": 10.02,
+ "CaCl2_wt_percent": 0.0,
+ "salt_total_wt_percent": 10.02,
+ "measured_K": 269.02,
+ "pressure_MPa": 1.13,
+ "pressure_bara": 11.3,
+ "measured_c": -4.129999999999996,
+ "predicted_c": -2.5465146490852817,
+ "raw_returned_c": -2.5465146490852817,
+ "comparable": true,
+ "material_phases": "GAS+AQUEOUS",
+ "numerically_accepted": true,
+ "saturated_boundary": true,
+ "hydrate_residual": -1.5598766722746404e-10,
+ "original_feed_error": 1.0373514122669443e-16,
+ "error_K": 1.5834853509147138
+ },
+ "interpretation": "Reliable numerical boundaries, with concentration-dependent KCl accuracy gap and opposing mixture biases. No fitting or empirical correction. Solid-phase stability and full mud qualification remain outside scope."
+ },
+ "validation_history": [
+ {
+ "verified_at_utc": "2026-10-05T15:03:41.708994+00:00",
+ "code_cells": 21,
+ "execution_seconds": 198.1,
+ "git_blob_sha1": "63693bce99487ebb1aab3eb953f6a22a5d11b35f",
+ "note": "October KCl hang repair validation, before Dholabhai comparison."
+ }
+ ]
}
]
}