PD20 — continuous-flow regenerative peritoneal dialysis

A physics simulator, its literature calibration, its results, and everything needed to reproduce them.

The invention

What the device is, and the one thing that makes it different.

PD20 is a continuous-flow regenerative peritoneal dialysis device. Instead of instilling a bag of fresh dialysate, letting it dwell, and draining it, it circulates dialysate continuously through the peritoneal cavity and regenerates the spent fluid by reverse osmosis, returning recovered water and re-dosing the solutes that need replacing.

The clinically important consequence is that ultrafiltration and solute clearance are decoupled from the osmotic agent. In conventional peritoneal dialysis, water removal is bought with dextrose, and sodium leaves the body mainly by being dragged along with that water. If ultrafiltration falls, sodium removal falls with it. A continuous-flow regenerative system removes solute by exchanging a large volume of dialysate across the membrane rather than by concentrating an osmotic gradient, so the two are no longer chained together.

The simulator on this site exists to test whether that claim survives contact with physiology, across a cohort of patients whose behaviour a nephrologist can predict in advance.

Concentration-blind control. The device is designed to operate without ever reading a serum or blood concentration. It senses only bulk physical properties of the fluid it circulates and the patient's weight. This is a deliberate design constraint — it is what makes the device implementable without continuous blood chemistry — and it is enforced structurally in the code by an automated test that fails if any serum concentration reaches the decision path.

Where it is used

A wearable, continuously regenerating device that needs no blood laboratory and no daily clinician oversight fits the settings where conventional dialysis does not.

Travel — hours at a time

The device is body-worn and regenerates its own dialysate, so a patient travels with it rather than around it. No bags of dialysate to carry, no clinic schedule to keep, no power outlet to find for a cycler. The water budget and the clearance floor are held automatically, so a long journey does not mean a missed treatment.

Remote areas — no laboratory

The controller is concentration-blind: it regulates from body weight, bulk conductivity of its own fluid, and its own discard stream, and never needs a blood or serum measurement. A patient weeks from the nearest laboratory still receives regulated therapy, because the device does not depend on a lab result to decide what to do.

Days without clinician control

Therapy is continuous and self-regulating. The water budget, the clearance floor, and the meal-responsive clearance all run on the device, not on a clinician's daily order. A patient can be out of contact for days and the device keeps the same operating point it was prescribed.

Water travel — ships and long passages

At sea there is no dialysis unit and no resupply. A device that regenerates its dialysate and holds its own water budget to a few litres a day is the difference between a voyage and a contraindication. The same concentration-blind control that works without a lab works without a port.

Long-term care travel

Transferring a dialysis patient between facilities usually means re-establishing a prescription and a schedule. A wearable device that carries its own operating point and needs no blood work travels with the patient, so a move between care settings does not interrupt therapy.

Military and austere environments

Forward and austere settings have no dialysis infrastructure, limited water, and no laboratory. A device that regenerates its dialysate, holds a strict water budget, and regulates without blood chemistry is designed for exactly that constraint set.

Hardware — off-the-shelf parts

The device is assembled from reverse-osmosis membranes, pumps, and batteries that are sold today. No part is custom; the invention is the control, not the components.

Reverse-osmosis membranes (commercially available)

elementclassNaCl rejectionmax pressure
Dow FILMTEC BW30brackish water99.5%~41 bar
Hydranautics CPAbrackish water99.7%~41 bar
Dow SW30seawater99.4%82.7 bar
Dow XUS180808ultra-high pressure99.5%+120 bar

The shipped operating point runs 40–120 bar at 0.93 recovery per pass across two passes; the controller commands pressure within that envelope and never asks for what cannot be built.

System components and estimates

componentestimateweightcost
RO membrane element (small spiral-wound)1–2 units~1–2 kg~$50–200
Peristaltic / diaphragm pumps2–4 units~0.5–1 kg~$100–500
Battery (Li-ion, 300–500 Wh)1–2 swappable packs~1–3 kg~$100–300
Mixer, sensors, controller, enclosure—~1–2 kg~$200–600
Total (body-worn)—~4–8 kg~$500–1600

These are engineering estimates for a body-worn prototype, not a quoted bill of materials; the device has not been built. The energy budget is dominated by pumping, not heating — the dialysate is regenerated in-line at body temperature, so no bulk heater is needed.

Consumables per patient per day

consumableamount
Glucose (dextrose) added by the mixer~405 g/day (range 296–521)
Glucose absorbed by the patient~118 g/day (range 60–202)
Sodium added by the mixer~100 g/day
Chloride added by the mixer~125 g/day
Device water (RO reject)~4.7 L/day (≤ 5.0)

Glucose is the dominant consumable: the mixer doses it to drive ultrafiltration, and the reverse-osmosis stage rejects ~99% of it, so most of what is bought is recovered and re-infused — the absorbed fraction is what reaches the patient.

The physics engine

Fourteen solutes, ten flux laws, conservation by construction.

Conservation is structural, not checked afterwards

Every physical process in the model moves mass through exactly two primitives: a paired water-plus-carried-solute transfer, and a paired solute-only transfer. Both are atomic and clamped to the source pool, so total water and total per-solute quantity are invariant under any sequence of transfers — mass cannot be created or destroyed by a modelling error, only moved to the wrong place. Measured conservation residuals across a 30-day thirty-patient cohort are of order 10-8, which is floating-point noise rather than physics.

The species, and their transport coefficients

σ is the osmotic reflection coefficient (how strongly the membrane opposes that solute's osmotic pull), S is the convective sieving coefficient (what fraction of the solute is dragged through with ultrafiltrate), and MTAC is the diffusive mass-transfer-area coefficient.

SoluteChargeσS MTAC (mL/min)
Sodium+10.0500.5504.5000
Chloride-10.0500.5884.5000
Glucose00.0490.3829.0000
Potassium+10.0500.53510.0000
Urea00.0200.68820.0000
Albumin-18.60.8400.0100.1000
Globulin00.9000.0050.0500
Icodextrin00.5000.0200.1000
Bicarbonate-10.0500.53510.0000
Lactate-10.0500.61110.0000
Calcium+20.0500.4586.0000
Magnesium+20.0500.4586.0000
Phosphate-1.80.0500.49710.2000
Sulfate-20.0500.45810.2000
Creatinine00.0200.65010.0000

Plasma colloid osmotic pressure is not van't Hoff

Plasma protein is strongly non-ideal at physiologic concentration, so the ideal-solution law underestimates the oncotic pressure that opposes ultrafiltration by roughly 40%. The model uses the standard empirical replacement:

COP (mmHg) = 2.1·C + 0.16·C² + 0.009·C³        C = total plasma protein, g/dL

Landis EM & Pappenheimer JR, Handbook of Physiology, Section 2: Circulation, Vol II, American Physiological Society, 1963, p.975.

At a normal total protein of 7.0 g/dL this gives 25.6 mmHg, the textbook plasma value; the ideal law gives 15.8 on the same protein mass. Both albumin and globulin are tracked as separate species, because peritoneal dialysis removes the smaller albumin preferentially and so the albumin fraction of plasma protein falls over a long treatment — a fixed albumin-to-globulin ratio would freeze exactly the quantity that ought to move.

An emergent check, not a fitted one. Globulin was set to its normal reference concentration and nothing was tuned toward any target. Under treatment the model's total protein falls from 7.46 to 6.39 g/dL — the mild hypoproteinaemia of a real PD patient — and the published cubic then produces a transperitoneal protein oncotic gradient of 22.3 mmHg, against the 22 mmHg measured in human PD patients by Öberg & Rippe (Kidney Int Rep 2017;2(6):1128–38, Table 1).

Other laws

Literature calibration

Every constant checked against a published measurement, and the ones that are not measured are labelled as such.

The model carries an automated audit that compares each physical constant against its published range and fails the build if one drifts outside without a recorded justification. The point is not that every number is measured — several genuinely are not — but that the unmeasured ones are named rather than quietly presented as if they were.

ConstantModel valuePublished range StatusSource
MTAC urea20.000 mL/min15.9-30.0verifiedSelgas 2005: 22.9 +/- 7.04 mL/min
MTAC glucose9.000 mL/min7.0-11.0verifiedsize-ordered against measured creatinine MTAC 9-11 mL/min (113 Da); glucose at 180 Da must be lower. Calibrated to the Twardowski PET (test_pet_twardowski.py), the direct observable
MTAC sodium4.500 mL/min3.5-6.0verifiedOberg & Rippe 2017 (PMC5733752 T1), human: PS for Na+ and anions = 4.5 mL/min (DIRECT)
MTAC potassium10.000 mL/min5.0-15.0inferredINFERRED from the small-monovalent-ion argument — NO measured source exists for potassium
lymphatic absorption1.070 mL/min1.0-1.35verifiedImholz 1993 1.07+/-0.18; Monquil 1995 1.01-1.34; Rippe 2001 ~1
reflection sigma glucose0.049 —not verifiedRippe 2004 (Perit Dial Int 24(1):10-27, PMID 15104333) CONFIRMED as a human CAPD three-pore paper; numeric value NOT yet read from the paywalled full text — physics_core.py:20
reflection sigma Na0.05 —not verifiedRippe 2004 (Perit Dial Int 24(1):10-27, PMID 15104333) CONFIRMED as a human CAPD three-pore paper; numeric value NOT yet read from the paywalled full text
reflection sigma albumin0.84 —not verifiedRippe 2004 (Perit Dial Int 24(1):10-27, PMID 15104333) CONFIRMED as a human CAPD three-pore paper; numeric value NOT yet read from the paywalled full text
sieving Na (convective)0.550 -0.39-0.71verifiedderived from Bernardo 2012 FWT 0.45+/-0.16 -> Na sieving 1-FWT = 0.39-0.71 (centre 0.55); Helman 2024 PMC10914194 independently puts free-water transport at a fixed 40-50%% of UF and adopts 50%%, implying 0.50-0.60 — the two agree on ~0.55
cp_beta_ref1 —not verifiedSEARCHED AND NOT FOUND 2026-07-19 — do not repeat these dead ends: PubMed returns a CFD paper that explicitly AVOIDS film theory, and two targeted PubMed queries returned ZERO results (it is a chemical-engineering topic, barely indexed in a biomedical database); MDPI and pubs.acs.org both 403; lenntech and DuPont design-manual URLs 404. The right sources are J. Membrane Science or a manufacturer design manual, neither reachable from the allowed domains. DOES NOT BLOCK ANY DECISION: exp_polarization.py sweeps 1.0-1.4 and the conclusion (2 passes fails, 3 passes holds) is IDENTICAL at every point in that range.
Kf0.08 mL/min/mmHg—not verifiedhuman LpS not located in the 2026-07-18 fetch (the hit was Zakaria & Rippe 1993, a RAT study). Open item — do not cite a human source for this until one is actually read.
R*T (van't Hoff)19.342 mmHg/(mmol/L)19.2-19.5verifiedR=62.3637 L.mmHg/(mol.K) x T=310.15 K / 1000 — arithmetic, not empirical
net endogenous acid0.800 mmol/kg/d0.7-1.0verifiedRemer & Manz 1995 PMID 7797810 and Frassetto 1998 PMID 9734733 give 0.7-1.0 mEq/kg/d on a Western diet; dialysis cohorts measure 42.7 +/- 10.1 (HD) and 58.2 +/- 24.3 (CKD) mEq/d (PMID 26508542). 0.80 mmol/kg/d gives 56 mEq/d at 70 kg.
Stated openly: what is not measured. The capillary hydrostatic pressure used in the Starling balance has no citation we could find, and is the one free constant in that balance. The intracavitary mixing coefficient has no published value at all — Dedrick & Flessner (PMID 9086004) describe intraperitoneal mixing as an explicit knowledge gap — so it is labelled a dispersion parameter rather than a molecular diffusivity. The peritoneal potassium MTAC is inferred from the small-monovalent-ion argument, not measured. These are listed here rather than buried because a model's credibility rests on which numbers it cannot defend as much as on which it can.

Results — PD20, twenty-five patients, thirty days

A deliberately varied cohort: typical, high and low transporters, anuric, small and large body size, high-MTAC, and diabetic.

25/25
patients surviving 30 days
53/53
automated tests passing
~10-8
conservation residual
15
solute species tracked

Each patient is simulated minute by minute for 30 days with dietary intake, residual renal function where present, osmotic thirst, endogenous acid production and stool losses all active. The figures below are the pinned published outcomes — an automated test re-runs the whole cohort and fails if any of them moves.

PatientNa
mmol/L
K
mmol/L
HCO₃
mmol/L
BUN
mg/dL
Glucose
mmol/L
Cum. UF
L/30d
Glucose abs.
g/day
Net Na
mmol/day
P1_typical_M70141.874.87423.9548.66.44+62.53109.48+3.47
P2_high_transporter141.484.77924.6748.17.06+71.21167.20+3.28
P3_low_transporter142.074.95922.1155.25.92+58.3971.09+3.62
P4_anuric141.725.13623.5359.46.60+78.51125.01+3.37
P5_smaller_F50143.064.94625.5038.06.88+52.1086.23+3.27
P6_large_M90141.394.81322.3762.56.40+76.94136.42+3.50
P7_small_M55142.484.93425.0538.06.36+47.2081.55+3.43
P8_anuric_small_F45143.455.31625.1045.06.80+60.6874.39+3.23
P9_HighMTAC_F60141.965.03225.9041.78.26+72.22177.15+2.93
P11_anuric_M95141.295.06921.2378.46.35+91.19139.23+3.46
P12_anuric_F48_low143.235.29724.8846.86.79+62.6678.88+3.26
P15_highMTAC_M85141.274.84224.0557.37.20+83.92201.70+3.40
P16_lowMTAC_F55143.045.00923.5746.26.19+49.9660.19+3.49
P17_resid_M65142.054.88224.5442.56.43+53.69100.99+3.48
P18_resid_F70142.334.89024.3646.46.87+60.25118.94+3.67
P19_small_anuric_M50142.445.18925.7841.07.04+65.63111.57+3.17
P20_large_anuric_F88141.505.03822.7867.37.03+87.13160.92+3.28
P21_mid_F62142.574.92924.7444.86.91+60.31107.95+3.52
P22_mid_M78141.864.96122.5661.86.29+74.36109.80+3.81
P24_lowMTAC_anuric_M82141.735.22620.0882.95.96+83.3286.30+3.63
P25_highMTAC_anuric_F52142.295.05326.5136.28.52+67.30166.70+2.85
P26_tiny_F45_resid143.364.94226.2731.47.01+42.9282.99+3.20
P27_big_M92_resid141.474.89121.8969.36.38+83.53138.02+3.73
P29_mid_anuric_M68141.725.10424.4552.86.91+76.66140.61+3.26
P30_mid_F75_resid142.134.90423.4055.06.71+69.23116.77+3.61

Body water is held to within a fraction of a litre over the month in every patient, with no restriction placed on what they drink — the cohort drinks 2.9–3.9 L/day (thirst plus water of food and oxidation water).

Per-patient outcomes

Glucose absorbed g/day — shaded band is the published 100–200 g/day range for peritoneal dialysis
055111166222P11 anuric M95P12 anuric F48 lowP15 highMTAC M85P16 lowMTAC F55P17 resid M65P18 resid F70P19 small anuric M50P1 typical M70P20 large anuric F88P21 mid F62P22 mid M78P24 lowMTAC anuric M82P25 highMTAC anuric F52P26 tiny F45 residP27 big M92 residP29 mid anuric M68P2 high transporterP30 mid F75 residP3 low transporterP4 anuricP5 smaller F50P6 large M90P7 small M55P8 anuric small F45P9 HighMTAC F60
Cumulative ultrafiltration litres over 30 days
0255075100P11 anuric M95P12 anuric F48 lowP15 highMTAC M85P16 lowMTAC F55P17 resid M65P18 resid F70P19 small anuric M50P1 typical M70P20 large anuric F88P21 mid F62P22 mid M78P24 lowMTAC anuric M82P25 highMTAC anuric F52P26 tiny F45 residP27 big M92 residP29 mid anuric M68P2 high transporterP30 mid F75 residP3 low transporterP4 anuricP5 smaller F50P6 large M90P7 small M55P8 anuric small F45P9 HighMTAC F60
Body-water deviation from target litres at 30 days — the fatal threshold is ±7 L
-0.01-0.01-0.00-0.000.00P11 anuric M95P12 anuric F48 lowP15 highMTAC M85P16 lowMTAC F55P17 resid M65P18 resid F70P19 small anuric M50P1 typical M70P20 large anuric F88P21 mid F62P22 mid M78P24 lowMTAC anuric M82P25 highMTAC anuric F52P26 tiny F45 residP27 big M92 residP29 mid anuric M68P2 high transporterP30 mid F75 residP3 low transporterP4 anuricP5 smaller F50P6 large M90P7 small M55P8 anuric small F45P9 HighMTAC F60

Thirty-day trajectories, all ten patients overlaid

Each line is one patient, sampled hourly. Shaded band = reference range. Per-patient detail, every species, is on the patient data pages.

Sodium mmol/L
134.2137.1140142.9145.8051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Chloride mmol/L
92.696.47100.3104.2108.1051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Potassium mmol/L
3.3553.8824.4094.9365.463051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Bicarbonate mmol/L
19.5421.4823.4225.3627.3051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Anion gap mmol/L
10.7215.3519.9824.6229.25051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Calcium (ionised) mmol/L
1.1381.1811.2251.2681.312051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Magnesium mmol/L
0.6760.7630.850.9371.024051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Phosphate mmol/L
0.73331.0111.2891.5671.846051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Sulfate (uraemic anion pool) mmol/L
1.1851.8682.5513.2343.917051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Lactate mmol/L
-0.0039560.58781.181.7712.363051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Urea mmol/L
9.73515.0820.4225.7631.1051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Glucose mmol/L
3.6324.9656.2977.6298.962051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Albumin mmol/L
0.60060.62730.6540.68060.7073051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Globulin mmol/L
0.16180.16860.17540.18210.1889051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Total plasma protein g/dL
5.8166.4837.157.8178.484051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Effective osmolality mOsm/kg
271.5284.2297309.8322.5051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Intraperitoneal pressure cmH₂O
7.469.4911.5213.5515.58051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Body-water deviation from target L
-1.74-0.8700.871.74051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Cumulative ultrafiltration L
-7.58718.9445.4671.9898.51051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Cumulative water drunk L
-9.44124.7859.0193.24127.5051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Cumulative urine L
-1.684.4110.516.5922.68051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Cumulative stool water L
-0.360.9452.253.5554.86051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Cumulative glucose absorbed g
-484.11271302647806535051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Cumulative net sodium retained mmol
-17.0646.59110.2173.9237.6051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Intraperitoneal dwell volume L
1.4351.9432.452.9583.465051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
Blood urea nitrogen mg/dL
27.2742.2457.272.1687.13051015202530daysP11_anuric_M95P12_anuric_F48_lowP15_highMTAC_M85P16_lowMTAC_F55P17_resid_M65P18_resid_F70P19_small_anuric_M50P1_typical_M70P20_large_anuric_F88P21_mid_F62P22_mid_M78P24_lowMTAC_anuric_M82P25_highMTAC_anuric_F52P26_tiny_F45_residP27_big_M92_residP29_mid_anuric_M68P2_high_transporterP30_mid_F75_residP3_low_transporterP4_anuricP5_smaller_F50P6_large_M90P7_small_M55P8_anuric_small_F45P9_HighMTAC_F60
An honest exposure. Glucose absorption across this cohort averages 118 g/day with a range of 60–202 g/day. The published range for peritoneal dialysis is roughly 100–200 g/day, so the cohort mean sits inside that band and the high-transporter and high-MTAC patients sit at its top. This is the expected direction once the osmotic drive is corrected upward to the measured value, but it is a real limitation and is stated rather than omitted.

Water, consumables and clearance

The ledger a wearable device is judged on: the water it wastes, the solute it must carry, and the clearance it delivers.

PatientDevice water
L/day
Weekly
Kt/V
Fresh supply
L/day
Mixer glucose
g/day
Mixer Na
g/day
Mixer Cl
g/day
P11_anuric_M954.841.835.6947897122
P12_anuric_F48_low4.663.865.51350100126
P15_highMTAC_M854.792.595.8452098123
P16_lowMTAC_F554.593.915.99299102127
P17_resid_M654.623.586.17350101127
P18_resid_F704.673.896.17387101126
P19_small_anuric_M504.663.715.51385100125
P1_typical_M704.673.096.01378100126
P20_large_anuric_F884.822.615.6749098123
P21_mid_F624.664.045.96375101126
P22_mid_M784.732.385.9340699124
P24_lowMTAC_anuric_M824.781.715.6240298123
P25_highMTAC_anuric_F524.675.065.52445100125
P26_tiny_F45_resid4.575.876.02313102128
P27_big_M92_resid4.792.105.9445998123
P29_mid_anuric_M684.732.835.5844099124
P2_high_transporter4.713.135.9145699125
P30_mid_F75_resid4.713.245.96404100125
P3_low_transporter4.632.706.08327101126
P4_anuric4.752.495.6043099124
P5_smaller_F504.614.805.86334101127
P6_large_M904.752.356.0044199124
P7_small_M554.584.036.13315102128
P8_anuric_small_F454.654.025.50342100126
P9_HighMTAC_F604.714.365.5546799125

Operating point: PD20_BASE_TOTAL=34, PD20_CIRCUIT=highrec, PD20_DWELL_PEAK_FRAC=0.035, PD20_FLOW_BOOST=0.023, PD20_RECOVERY=0.93, PD20_REGEN=ro, PD20_RESERVOIR_L=0, PD20_RO_PASSES=2, PD20_RO_PRESSURE=120. Product gates: device water ≤ 5.0 L/day (S2 — RO reject, not the sink figure that includes patient urine); weekly Kt/V ≥ 1.70, the ISPD adequacy floor (S3).

30-patient cohort. 25/25 alive over 30 days; device water 4.69 L/day (range 4.57–4.84); weekly Kt/V 3.37 (range 1.71–5.87). Both product gates hold on every patient.

Glucose burden, device vs conventional APD

Head-to-head on the same thirty patients: PD20 118 g/day of glucose absorbed by the patient, against 128 g/day absorbed on contemporary automated PD (74–204 g/day), which places 279 g/day (206–352) of glucose in bags. The continuous low-sodium device removes sodium by exchange rather than by concentrating an osmotic gradient, so it pays a lower glucose cost for the same fluid control.

Contemporary peritoneal dialysis, same thirty patients

The comparator arm: a conventional night cycler, five 2-litre exchanges over nine hours, dry day, filling and draining through the bottom lumen as a real catheter does.

The same thirty patients are run on conventional automated peritoneal dialysis, each on the bag strength that suits them best (1.5%, 2.5% or 4.25% dextrose), at three different drinking behaviours. A prescription counts as held only if body water stays within ±1.5 L over 30 days — dehydration counts as failure exactly as overload does.

Drinking behaviourIntakeHeldDied
freethirst-driven3/100/10
moderate1.5 L/day1/106/10
low1.0 L/day0/1010/10

Outcome by drinking behaviour

Patients, out of ten on their best available bag strength
036811free (thirst-driven)moderate 1.5 L/daylow 1.0 L/dayheldalive but off targetdied
Mean ultrafiltration L/day — this collapse is the mechanism: no ultrafiltration means no convective sodium removal
0.000.370.741.111.47freemoderatelow

Fluid restriction does not fail gently — it kills by hypernatraemia

This is the result that most deserves attention, and it is not the one we expected. At a restricted intake of 1.0 L/day, every patient dies, and none of them dies of dehydration. Body water at death spans −3.5 to +1.0 L, nowhere near the fatal volume threshold. They die of serum sodium reaching 165 mmol/L.

PatientBagUF L/dayΔ body water L Outcome
P1_typical_M702.5%-0.07-2.35DIED d8.3 FATAL high Sodium=165.0 (>165)
P2_high_transporter2.5%-0.230.35DIED d11.7 FATAL high Sodium=165.0 (>165)
P3_low_transporter2.5%0.07-3.49DIED d6.7 FATAL high Sodium=165.0 (>165)
P4_anuric2.5%0.061.04DIED d11.2 FATAL high Sodium=165.0 (>165)
P5_smaller_F502.5%-0.08-1.24DIED d7.3 FATAL high Sodium=165.0 (>165)
P6_large_M902.5%-0.04-1.89DIED d9.0 FATAL high Sodium=165.0 (>165)
P7_small_M552.5%-0.16-2.86DIED d7.2 FATAL high Sodium=165.0 (>165)
P8_anuric_small_F452.5%0.130.18DIED d8.2 FATAL high Sodium=165.0 (>165)
P9_HighMTAC_F604.25%0.82-4.25DIED d6.3 FATAL high Sodium=165.0 (>165)
P10_diabetic_M802.5%0.061.03DIED d11.3 FATAL high Sodium=165.0 (>165)

The mechanism is visible in the ultrafiltration column. Restricting intake collapses ultrafiltration to zero or below, against 0.72–2.09 L/day when the same patients drink freely. Conventional peritoneal dialysis removes sodium principally by convection — solvent drag with the ultrafiltrate — so when ultrafiltration stops, sodium removal stops with it, whatever the dialysate sodium concentration is. Sodium then accumulates while body water stays normal.

And the process is self-reinforcing: less body water raises serum osmolality, which shrinks the dialysate-to-serum osmotic gradient, which further reduces ultrafiltration, which removes still less sodium. That spiral is what turns six deaths at 1.5 L/day into ten at 1.0 L/day.

Why this matters for the invention. The failure is specific to a system in which sodium removal is chained to dextrose-driven water removal. A continuous-flow regenerative device removes sodium by exchanging dialysate volume across the membrane rather than by concentrating an osmotic gradient, and so is not subject to the same spiral. In this simulator the PD20 arm holds all thirty of the same patients over 30 days with no intake restriction at all.
Read this as a simulation result, not a clinical trial. No patient has been treated with this device. What is shown is that a physics model calibrated independently to the published literature, and validated against clinical behaviour a nephrologist can predict in advance, produces this outcome. Clinical hypernatraemia in peritoneal dialysis is well recognised in connection with sodium sieving during short hypertonic dwells; the magnitude here is a model output and requires clinical confirmation.

Validation — does it behave like the patients we know?

Forty arms: five levels of renal function × two potassium diets × two fluid-compliance behaviours × two phosphate-management behaviours.

A simulator that reproduces its own assumptions proves nothing. The test that matters is whether it reproduces the behaviour of patients whose direction of travel is already known clinically. Each expectation below is asserted in code, and the run exits with an error if the engine contradicts it.

VerdictClinical expectationMeasured
OKBUN rises as renal function fallsnormal -> anuric: 30 < 61 < 70 < 73 < 75 mg/dL
OKserum K rises with dietary K (anuric)delta +1.21 mmol/L
OKthat rise is STEEPEST when anuricanuric +1.21 vs normal +0.93 mmol/L — residual renal secretion is the missing buffer
OKfluid non-compliance gains water (anuric)delta +5.87 L
OKand it hurts the anuric patient moreanuric +5.87 L vs normal +0.90 L
OKserum phosphate rises with intakedelta +1.05 mmol/L

The phosphate expectation is worth singling out: conventional peritoneal dialysis must fail to control phosphate in a non-compliant anuric patient, because that is precisely why phosphate binders exist. The engine reproduces that failure, which is also what settles an open question about the phosphate transport coefficient — a higher published value would have controlled phosphate without binders, and would therefore have been wrong.

Reproduce every number on this page

The simulator is deterministic. Same inputs, same outputs, bit for bit.

Environment

# Python 3.11+, numpy. Single-threaded execution is required for bit-reproducibility.
export OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 PARALLEL=1

The full verification sequence, in order

# 1. The automated test suite — 53 enforcing tests covering conservation, every flux law,
#    the literature calibration, device blindness, and the pinned published results.
bash run_fullsuite.sh

# 2. Regenerate the controller from the physics (deterministic given unchanged physics).
#    Trained to a SEPARATE path so the shipped controller is never overwritten — the trainer
#    refuses to overwrite the shipped model by design (it is what every published number was
#    produced with).
PD20_MODEL=pretrained_models/physics_nn_repro.json python3 pretrain_robust.py

# 3. Re-run the thirty-patient cohort and regenerate the per-patient report data.
python3 run_cohort.py
python3 gen_report_data.py

# 4. Confirm every published number still reproduces.
python3 test_published_regression.py

# 5. The contemporary-PD comparator arm.
python3 exp_conventional_apd.py

# 6. The forty-arm clinical validation matrix.
python3 exp_validation_matrix.py

Verification state of this build

Test suite53 passed, 0 failed
Cohort30 of 30 patients survive 30 days; conservation residual ~10-8
Controller buildmd5 2c0ac24a96fb2bd01ab79965c516cff5
Solute species15
Peritoneal Kf8.00e-05 L/min/mmHg per unit area
Total peritoneal absorption0.00107 L/min

The controller build hash is stamped because the trained controller is a function of the physics: if a physical constant changes, retraining produces a different controller and every downstream number moves. Quoting a result without the hash of the controller that produced it is not reproducible.

What is withheld, and what is not

Stated plainly so that nobody has to guess where the line is.

Fully disclosed

Withheld as pending patent matter

This boundary is enforced mechanically, not by good intentions: an automated firewall scans every outward-facing artifact — including this page — for the withheld identifiers, for the numeric set-points, and for descriptions of the control logic written in plain English that a token scan would miss. The build fails if any of them appear.

On the concentration-blind claim. That the device never reads a serum or blood concentration is not merely asserted here; it is enforced by a structural test that inspects the decision path and fails if any serum concentration reaches it. The claim is therefore checkable by anyone who runs the test suite, without access to the withheld internals.