Skip to content
Drybench Bioreactor product page

Docs and methods

Drybench Bioreactor.

How the bioreactor simulator sets up and solves a run, where its presets' values come from, how the rescue works, what you can take away, how the engine is checked against SciPy, and what leaves your browser (nothing).

Updated 6 October 2026 · v0.4.0

Methods

What the app shows, how it works and how it was built, in the words of its own write-up, followed by the parameter defaults and the data sources with their licences.

What it does

Pick a preset (E. coli fed-batch, S. cerevisiae glucose-limited fed-batch, Pichia AOX1 on methanol, a chemostat, or a custom run that starts from E. coli's values) and the app simulates biomass, substrate, product, volume, the feed and dissolved oxygen against time, with the oxygen uptake and transfer rates, CO₂ evolution, the respiratory quotient and the exhaust gas. It says when dissolved oxygen would run out in the simulated vessel and, within the agitation, gas-flow and oxygen-enrichment limits you enter, what would rescue it: raise the agitation, then the gas flow, then the inlet's oxygen, and last cap the feed, each step the smallest on its grid that holds the setpoint to the end of the run. The rescue ignores cooling capacity, and says so wherever it is shown.

Bring your own vessel with a measured kLa, or your kLa readings at several agitation rates; or compute kLa from Van 't Riet's correlation with its range stated. Every preset value shows where it comes from and its reported range, and a value with no measured source is labelled illustrative. The pump sheet gives the rate to set for each interval of the feed, ready to print. A run is a link: the preset by id and version, and only the parameters you changed, so a teaching link gives the same run next year. Lecturer mode hides the results until a prediction is entered.

How it works

The model is the uptake-first unstructured one: Monod substrate limitation (Haldane and Andrews' substrate inhibition for methanol), Pirt's maintenance, Luedeking and Piret's product terms drawing on the same substrate budget as growth, the oxygen term multiplied with the substrate term (a model choice), and the balances with volume change for batch, fed-batch and chemostat runs. Oxygen and CO₂ come from carbon and degree-of-reduction balances with ammonium as the nitrogen source. Dissolved oxygen follows its own balance, dC/dt = kLa(C* − C) − OUR + (Fin/V)(Cfeed − C), with C* from the exhaust gas, starting at saturation with the inlet gas; the solubility is Benson and Krause's as the USGS documents it.

The equations are stiff (the substrate's time constant can be under a second while growth runs over hours), so they are solved by the modified Rosenbrock formula of Shampine and Reichelt 1997 with an analytic Jacobian, error control and located events, in a Web Worker, never on the page's own thread. Every switch (the feed starting, the cap, the substrate running out, dissolved oxygen crossing the setpoint) is located by the solver on its continuous extension, so a short excursion cannot fall between output points. Flags mark where a run leaves the biology the model covers, or where an input or correlation is outside its fitted range, as numbered notes on the chart, the table, the tiles and every export.

How it is checked

The engine is compared with an independent solver run offline: SciPy's Radau method at a relative tolerance of 1e-9, through pipeline/bioreactor-simulator/reference.py, on 33 scenarios across batch, fed-batch (exponential and constant feeds, a cap, a stop), chemostat steady states, steps and washout, oxygen-limited runs at kLa 50, 200 and 1,000 per hour, a kLa step from 20 to 40 per hour, planted short excursions, and each preset's published run. Closed forms check the chemostat's steady state and a batch run; the carbon and electron balances close at the end of every run. The right-hand sides agree with the oracle's to within 1e-12 relative. Each preset version keeps golden runs, so a model change that moves a published run beyond the stated tolerance fails the build.

The state variables are checked against an independent solver; the derived oxygen and CO₂ rates are compared with published measurements (listed on the verification page); there is no other comparison with process data. The wording stays draft until an independent reviewer with bioprocess experience signs the equations, the presets and the fixtures (Q-19).

Equations

Growth (Monod, or Haldane and Andrews with Ki)
f(S) = S/(Ks + S + S²/Ki); f(C) = C/(Ko + C), multiplied (a model choice)
Uptake and maintenance (Pirt)
qS = (μmax/Y + ms)·f(S)·f(C); μ = (μmax + Y·ms)·f(S)·f(C) − Y·ms where positive
Product (Luedeking and Piret)
qP = α·μ + β, from the same budget as growth: μ + qP = Y·max(0, qS − ms)
Balances with volume change
dX/dt = μX − (F/V)X; dS/dt = −qS·X + (F/V)(Sf − S); dP/dt = qP·X − (F/V)P; dV/dt = F (a chemostat draws off F = D·V)
Dissolved oxygen
dC/dt = kLa(C* − C) − OUR + (Fin/V)(Cfeed − C), C* from the exhaust gas; OUR from the degree-of-reduction balance, CER from the carbon balance, RQ = CER/OUR
kLa
kLa = a·(Pg/V)^b·vs^c (Van 't Riet), Pg from Hughmark's ratio; or your value, scaled by the same exponents; or your readings, log-log

Choices stated

Ks acts on uptake
Literature growth-fitted Ks is used as an uptake parameter: an explicit modelling choice, not an equivalent growth-Monod parameter. In the product-free, fully oxygenated Monod limit, growth half-saturation is Ks × (1 + 2Yms/μmax), with factors 1.092 for E. coli and 1.025 for yeast. Methanol inhibition and product allocation require the full model; no universal scalar conversion or preset refit is claimed.
Growth stops below maintenance
Growth is (μmax + Y·ms)·f(S)·f(C) − Y·ms where positive: Pirt's form while cells grow. Below uptake equal to maintenance nothing grows and nothing decays; death and endogenous decay are not modelled. The switches between growing, product only and maintenance only are located by the solver as events.
The product
Off by default (α and β zero). When on, it draws on the same substrate budget as growth and uses biomass-equivalent carbon fraction, degree of reduction and substrate yield. Chemically different products can distort OUR, CER and RQ; these outputs are approximate when product is enabled. Every product output reads "with your α and β; not a titre forecast".
Oxygen and CO₂
From the carbon and degree-of-reduction balances with ammonium as the nitrogen source, converting dry weight to C-mol through the measured carbon fraction. CER is the CO₂ produced; dissolved CO₂ and bicarbonate are not modelled.
C* and the exhaust gas
Air saturation by Benson and Krause as the USGS documents them, for 0 to 40 °C and 0.5 to 1.1 atm; a pressure from 1.1 to 3 atm runs and is flagged extrapolated, outside 0.5 to 3 atm or 0 to 40 °C a run is refused. C* in the vessel follows the exhaust gas's oxygen fraction, from the gas balance on the inlet at the vessel's temperature and pressure, the gas phase taken at steady state.
kLa
By its source: your value, at the setup's agitation, gas flow and starting volume, scaled to other settings by Van 't Riet's exponents with Hughmark's gassed-power ratio, so the power number cancels; your readings at several rpm, interpolated log-log and extended beyond them with a flag; or Van 't Riet's correlation with Hughmark's gassed power, a Rushton turbine's power number of 5 and two impellers summed (empirical correlation; Np = 5 and additive impeller power are nominal geometry assumptions). kLa is taken at the volume where the aeration is set and held.
Gas-flow basis
Choose actual reactor conditions or specified reference temperature and absolute pressure. Qactual = Qreference × Preference/P × Tkelvin/Treference. This preserves molar supply and supplies actual velocity to power and kLa calculations. Vvm is normalised by current liquid volume, so molar flow rises during feeding; kLa remains held between aeration changes. The ideal dry-gas convention excludes line humidification, head and salinity effects.
The feed
Constant, or exponential at a set growth rate from a rate designed to hold it (paying for maintenance, the product and the residual substrate), held at the pump's limit once reached, stopping at its set time or when the vessel reaches its working volume. The pump sheet gives each interval's rate as the law's average over it, so the volumes add up.
The rescue
When dissolved oxygen first falls below the setpoint (excursions under 3 minutes not counted), the cascade raises the agitation, then the gas flow, then the inlet's oxygen fraction, each the smallest step on its grid (10 rpm, 0.05 vvm, 1 percentage point) that holds the setpoint to the end of the run, found by bisection, within the limits you enter; at a limit the next lever takes over, and last, in a fed-batch run, the feed's growth rate is capped (steps of 0.005 per hour). It ignores cooling capacity, vessel pressure and gas-safety limits.
The solver
Shampine and Reichelt's modified Rosenbrock (W-) formula with its continuous extension, an analytic Jacobian checked against finite differences, a relative tolerance of 1e-7 with an absolute tolerance per state, and every switch, trigger and time event located on the continuous extension. A run that reaches 40,000 steps stops with the time it reached; a run is never clamped silently.
Flags
A run carries numbered notes where it leaves the biology the model covers: S. cerevisiae's uptake at 95 percent or more of its respiratory maximum, E. coli's glucose uptake at or above 0.8 g per g dry weight per hour (Vemuri et al. 2006, MG1655), and oxygen demand beyond what the vessel can transfer; and where an input or correlation is outside its fitted range. Each flag's code and rule version travel in every export.

Data sources, licences and versions

Sources and licences

  • Monod 1949; Andrews 1968 (growth and substrate inhibition)Method (cited)

    μ = μmax·S/(Ks + S), and S/(Ks + S + S²/Ki) for methanol; here acting on uptake, so the factor (μmax + 2Y·ms)/μmax is stated beside each preset.

    Monod J. The growth of bacterial cultures. Annu Rev Microbiol 1949;3:371-394. Andrews JF. A mathematical model for the continuous culture of microorganisms utilizing inhibitory substrates. Biotechnol Bioeng 1968;10:707-723, doi:10.1002/bit.260100602 (read 5 October 2026).

  • Pirt 1965; Luedeking and Piret 1959 (maintenance and product)Method (cited)

    qS = μ/Y + ms while cells grow; qP = α·μ + β, drawing on the same substrate budget as growth.

    Pirt SJ. Proc R Soc B 1965;163:224-231. Luedeking R, Piret EL. J Biochem Microbiol Technol Eng 1959;1:393-412 (read 5 October 2026).

  • Shampine and Reichelt 1997 (the solver)Method (cited)

    The modified Rosenbrock (W-) formula of §3.1 with its continuous extension, implemented from the paper only; no MATLAB or Octave code read.

    Shampine LF, Reichelt MW. The MATLAB ODE Suite. SIAM J Sci Comput 1997;18(1):1-22 (read 6 October 2026).

  • Benson and Krause, as documented by the USGS (oxygen's solubility)Method (cited); a US government work in the public domain

    Air saturation at 0 to 40 °C and 0.5 to 1.1 atm, with the water-vapour and non-ideal terms; checked against the USGS DOTABLES program's own output.

    USGS Office of Water Quality Technical Memorandum 2011.03, attachment eqs. 7 and 9 to 11 (read 6 October 2026).

  • Van 't Riet 1979; Hughmark 1980; Yawalkar et al. 2002 (kLa and gassed power)Method (cited)

    kLa = a·(Pg/V)^b·vs^c with the coalescing constants as Yawalkar et al. quote them (Table 2), and Hughmark's gassed power with its range (Table 3); non-coalescing 0.002(Pg/V)^0.7·vs^0.2 and the approximate experimental ranges are cited to Van 't Riet 1979, not yet read against a clean copy, and marked Unverified. Np=5 is nominal for standard baffled turbulent Rushton geometry, with additive multi-impeller power requiring calibration.

    Van 't Riet K. Ind Eng Chem Process Des Dev 1979;18:357-364, doi:10.1021/i260071a001. Yawalkar AA, Heesink ABM, Versteeg GF, Pangarkar VG. Gas-liquid mass transfer coefficient in stirred tank reactors. Can J Chem Eng 2002;80:840-848, doi:10.1002/cjce.5450800507 (read 6 October 2026). Kaiser SC, Werner S, Jossen V, Kraume M, Eibl D. Eng Life Sci 2017;17(5):500-511, doi:10.1002/elsc.201600096 (PMC5434943; read in full 24 October 2026): §3.3.1 and Table 3 compile Rushton Np of 3.6 to 5.9 for fully turbulent turbines in four-baffled flat-bottomed vessels, and §3.3.1 with Fig. 6 measures 4.17 ± 0.14 at Re above 10⁴ (three baffles, torospherical base); Np=5 stays a nominal default.

  • The presets' values (cited papers)Values (cited from the papers)

    Growth, uptake, yield, maintenance, oxygen affinity, composition and the onsets the flags use, each with its paper, table, DOI and reported range on its preset's page and in Setup; values with no measured source are labelled illustrative, and values from memory unverified.

    Eighteen papers, each read on 6 October 2026 (full text or abstract, as each value's source says).

  • The oracle fixtures and the golden runsMIT (generated; no third-party data)

    The scenarios, closed forms, transfer and scale-up cases and right-hand sides the engine is checked against, and each preset version's golden runs.

    pipeline/bioreactor-simulator/reference.py and write-golden.mts (the suite's authors, 6 October 2026).

Times on screen are local time with the UTC offset; times in exports are UTC. Dates with no time are shown at the precision the source gave them.

Exports

The Export menu offers the time series of the runs on screen as CSV (every computed point, the units in the headers, the flags in force at each time, the data's origin and the product's basis, with the provenance file and a README whose first lines are the flag notes), the pump sheet as CSV in mL/h and mL, the chart as SVG or PNG with the flag notes in the caption strip, the printed bench sheet on A4 (the setup, the vessel's limits, the rescue, the chart, the pump sheet, the method block and the verification log) and the method paragraph as text. Copy link carries the preset by id and version and the parameters you changed, never results; a run you keep is stored in this browser.

Release gate: before the app leaves the preview, its exports and printed reports will carry the data versions, parameters, limits and a timestamp needed to reproduce a result, as the regulatory position says. This section will describe each format as it ships.

Verification

Each module below is a set of automated tests in the app's source code, with the expected results written into the tests. They check the app's logic against recorded inputs and stored reference records; none of them calls a live service.

src/lib/hosts/fixtures.test.ts
Every one of the 33 scenarios in pipeline/bioreactor-simulator/fixtures/scenarios.json against the engine: each point within the larger of 1e-5 of its value, a time shift of max(1e-4 h, 1e-5 of the elapsed time) times its slope, and its floor; inside the window after a change of aeration or feed, the series computed from dissolved oxygen on value alone; events within 1e-3 h; the growth switches, triggers and events; the carbon and electron balances within 0.5 percent; the closed forms, the oxygen solubility against the USGS DOTABLES program's own output, the exhaust-gas balance, the kLa correlation and the scale-up rules; the files' hashes against manifest.json. The oracle is SciPy 1.17.0's Radau, run offline by reference.py at a relative tolerance of 1e-9.
src/lib/hosts/model.test.ts and src/lib/fit/ode.test.ts
The right-hand sides against the oracle's at 13 states within 1e-12 relative; the Jacobian against central differences; one step and the linear solve against NumPy and LAPACK; fixed-step RK4's failure at kLa 1,000 per hour kept as a regression test; step-count ceilings per scenario.
src/lib/hosts/golden.test.ts
The 12 golden runs (each preset's default run and one with three changes, the E. coli rescue and the yeast page's chemostat link), written once per published preset version, within each point within the larger of the golden tolerance (1e-4 of the value; DO 0.01 percent of air saturation; OUR, OTR and CER 0.01 mmol/L/h; RQ 0.001), a time shift of max(1e-3 h, 1e-4 of the elapsed time) times its slope, and its floor: a change that moves a published run fails until the golden runs are re-recorded under a new preset version (a changed value) or a new model version (a changed equation), the earlier ones kept as superseded.
src/lib/hosts/presets.test.ts
Every preset value has its source with the table or page and a reported range, or is labelled; illustrative values pass the tenfold test (headline outputs unchanged at the precision shown); the matched yield and maintenance pairs; each preset's default run.
src/lib/hosts/setup.test.ts and rescue.test.ts
The link grammar's round trip and refusals; kLa by each source, exact at the setup's own settings; the rescue never exceeds a limit and takes the smallest holding step on each grid.

Draft until the independent bioprocess reviewer signs the equations, the presets and the fixtures (Q-19).

Release gate: before the app leaves the preview, each release will publish a verification dataset with expected outputs on this page, so you can run your own checks.

Published verification sets

MethodsOracleFixturesToleranceDateFile
unstructured-growth-model, modified-rosenbrock, dissolved-oxygen-balanceSciPy33each point within the larger of 1e-5 of its value, a time shift of max(1e-4 h, 1e-5 of the elapsed time) times its slope, and its floor; events within 1e-3 h; the carbon and electron balances within 0.5 percent2026-10-07scenarios.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
unstructured-growth-modelSciPy4the chemostat's steady states and washout, and a batch run's implicit closed form, within 1e-3 relative2026-10-07analytic.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
dissolved-oxygen-balance, van-t-riet-klaSciPy22air saturation to the USGS DOTABLES output's rounding; the exhaust gas and kLa within 1e-9 relative2026-10-07transfer.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
scale-up-rulesSciPy3constant power per volume and tip speed within 1e-9 relative; constant-kLa speed within 1e-6 relative2026-10-07scaleup.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
measured-comparison-time-alignmentPython fractions8elapsed hours exact where the reduced fraction's denominator is a power of two and within 1e-15 h otherwise; row identity and order, raw responses, roles, exclusions and qualification codes exact. The file's 12 refusal entries name a code and its fault but carry no inputs2026-10-19measured-comparison-0.3.0.jsonRecorded for version 0.3.0; the test suite checks the current engine against it.
measured-comparison-time-alignmentPython fractions3each case carries its inputs; the failing reference rule and its code, the dropped reference and its claimed hashes exact; elapsed hours as in 0.3.02026-10-20measured-comparison-0.4.0.json
measured-comparison-time-alignmentPython fractions25Measured-run comparison completion set: 25 cases with complete inputs, every refusal code and the simulation-reference alignment (Python fractions and hashlib, 3.12.14); refusal codes, hashes and qualification codes exact, elapsed hours as in 0.3.02026-10-24measured-comparison-0.5.0.jsonRecorded for version 0.5.0; the test suite checks the current engine against it.
kla-value-scaledNumPy18kLa from your value or readings: 18 settings against NumPy float64 (value and readings; agitation, gas flow, volume, reference-basis flow, Hughmark's cap) within 1e-12 relative; the non-coalescing exponents checked as arithmetic only2026-10-24kla-scaling-0.6.0.jsonRecorded for version 0.6.0; the test suite checks the current engine against it.
feed-lawPython decimal16Feed laws and pump sheet: 12 feeds and 4 design rates against Python decimal at 40 digits (constant, exponential, pump limit, the rescue's cap, the Vmax and end-time stops, every pump-sheet row and total) within 1e-12 relative2026-10-24feed-0.7.0.jsonRecorded for version 0.7.0; the test suite checks the current engine against it.
feed-handoffPython fractions86Feed hand-off: 14 schedules over the published pump sheets, 15 programmes (stop, total fed, refused incomplete programmes) and 57 substrate matches on the shipped table bioreactor-substrate-identity@1 (its keys recomputed by RDKit from a PubChem snapshot) against Python fractions (exact), within 1e-12 relative; keys, stops and refusal codes exact2026-10-24feed-handoff-0.12.0.jsonRecorded for version 0.12.0; the test suite checks the current engine against it.

Oracles and build-time tools

Software the app's numbers were checked against, or its data built with. None of it ships with the app or is a dependency of it.

  • SciPy 1.17.0 (BSD-3-Clause; Oracle; 2026-10-07). solve_ivp's Radau method at a relative tolerance of 1e-9 on the same equations, which wrote the scenario, closed-form, transfer and scale-up fixtures
  • NumPy 2.3.5 (BSD-3-Clause; Oracle; 2026-10-07). the one-step and linear-solve checks against LAPACK, and the oracle's arithmetic
  • Python 3.12.14 (PSF-2.0; Build-time tool; 2026-10-07). running pipeline/bioreactor-simulator/reference.py offline; never shipped
  • Python fractions 3.9.6 (PSF-2.0; Oracle; 2026-10-19). exact rational elapsed hours for the measured-run comparison's time alignment (pipeline/bioreactor-simulator/reference-measured-comparison.py)
  • Python fractions 3.13.16 (PSF-2.0; Oracle; 2026-10-20). the measured-run comparison with a failed simulation reference: exact elapsed hours, the reference rules restated and the snapshot SHA-256 recomputed by hashlib (pipeline/bioreactor-simulator/reference-measured-comparison-2.py)
  • Python decimal 3.12.14 (PSF-2.0; Oracle; 2026-10-24). the feed laws and the pump sheet at 40 digits: constant, exponential and capped feeds, the Vmax and end-time stops, every pump-sheet row and total, and the design rates (pipeline/bioreactor-simulator/reference-feed.py)
  • Python fractions 3.12.14 (PSF-2.0; Oracle; 2026-10-24). the measured-run comparison's completion set: every refusal code and the simulation-reference alignment with complete inputs, exact elapsed hours and the hashes recomputed by hashlib (pipeline/bioreactor-simulator/reference-measured-comparison-3.py); and the feed hand-off, exactly: the schedule's units, mass flow and substrate mass over the feed's published pump sheets, the programme a feed recipe carries with its stop, total fed and refused incomplete programmes, and the exact-identity substrate match by InChIKey on the shipped table, with exact conversions to g/L and every refusal (pipeline/bioreactor-simulator/reference-feed-handoff.py)

Draft until the independent bioprocess reviewer signs the equations, the presets and the fixtures (Q-19).

scenarios.json

SciPy 1.17.0 Radau, 2026-10-07; sha256 614bce70c89ce2cb…; the engine is held to: each point within the larger of 1e-5 of its value, a time shift of max(1e-4 h, 1e-5 of the elapsed time) times its slope, and its floor; inside the window after a change of aeration or feed, the series computed from dissolved oxygen on value alone; events within 1e-3 h.

ScenarioModeHorizon (h)kLa (per hour)Oxygen runs out (h)What it checks
batch-monodbatch122500–Batch Monod growth on glucose at 37 °C, oxygen not limiting; an overflow onset of 0.8 g/g/h watched
batch-monod-small-ksbatch122500–Batch growth with a glucose Ks of 33 µg/L (stiff near depletion)
batch-productbatch401500–Batch growth at 30 °C with a growth-associated and a basal product drawing on the substrate budget
batch-haldanebatch481500–Batch growth on methanol at 25 °C above the inhibition optimum (Haldane), a basal product
batch-starvationbatch162500–Batch growth into starvation, where uptake falls below maintenance
fed-batch-exponentialfed-batch24300023.49A batch phase, then an exponential feed at μset 0.15 per hour; an overflow onset of 0.8 g/g/h watched
fed-batch-exponential-small-ksfed-batch243000–The exponential feed with a glucose Ks of 33 µg/L: substrate near Ks in the fed phase (stiff)
fed-batch-exponential-cappedfed-batch241500–An exponential glucose feed from the start at μset 0.2 per hour, held at the pump's limit, with a product
fed-batch-exponential-methanolfed-batch362500–A methanol feed at μset 0.04 per hour from 25 g/L biomass at 25 °C
fed-batch-constantfed-batch303000–A batch phase, then a constant glucose feed: growth slows as the culture grows
fed-batch-constant-overfeedfed-batch402500–A constant methanol feed faster than the culture takes it up: methanol accumulates and inhibits growth
fed-batch-constant-stopfed-batch243000–A constant glucose feed that stops at a set time, then the culture uses up what is left
fed-batch-rescuedfed-batch2460010.63An exponential feed designed from the state at its start, at the pump's limit, then capped at 14 h to μ 0.1 per hour with a rate designed from the state there; the gas enriched and the flow raised at 12 h, the headspace pressure raised at 16 h, and the feed stopped when the volume reaches 7.5 L
chemostat-steadychemostat602500–A chemostat at D 0.3 per hour from inoculation to steady state
chemostat-stepchemostat802500–A chemostat stepped from D 0.2 to 0.45 per hour at 40 h
chemostat-washoutchemostat302500–A chemostat above the washout dilution rate
oxygen-limited-kla-50-dynamicfed-batch24502.40An exponential feed at μset 0.25 per hour with kLa 50 per hour; dissolved oxygen dynamic
oxygen-limited-kla-50-qssfed-batch24502.40An exponential feed at μset 0.25 per hour with kLa 50 per hour; dissolved oxygen quasi-steady
oxygen-limited-kla-200-dynamicfed-batch242004.64An exponential feed at μset 0.25 per hour with kLa 200 per hour; dissolved oxygen dynamic
oxygen-limited-kla-200-qssfed-batch242004.64An exponential feed at μset 0.25 per hour with kLa 200 per hour; dissolved oxygen quasi-steady
oxygen-limited-kla-1000-dynamicfed-batch24100013.08An exponential feed at μset 0.25 per hour with kLa 1000 per hour; dissolved oxygen dynamic
oxygen-limited-kla-1000-qssfed-batch24100013.08An exponential feed at μset 0.25 per hour with kLa 1000 per hour; dissolved oxygen quasi-steady
oxygen-step-kla-20-40-dynamicbatch16200.87Batch growth limited by oxygen at kLa 20 per hour, the agitation raised to kLa 40 at 5 h (the longest transient drawn); dissolved oxygen dynamic
oxygen-step-kla-20-40-qssbatch16200.87Batch growth limited by oxygen at kLa 20 per hour, the agitation raised to kLa 40 at 5 h (the longest transient drawn); dissolved oxygen quasi-steady
planted-excursion-06batch820005.50Batch growth with ample oxygen, kLa dropped from 2,000 to 5 per hour for 0.06 h at 5.5 h: the oxygen trigger is on for exactly 0.06 h, so the excursion rule keeps it
planted-excursion-04batch82000–Batch growth with ample oxygen, kLa dropped from 2,000 to 5 per hour for 0.04 h at 5.5 h: the oxygen trigger is on for exactly 0.04 h, so the excursion rule drops it
preset-e-coli-fed-batch@1fed-batch2440012.32The E. coli preset's default run, without rescue
preset-e-coli-fed-batch@1-rescuedfed-batch24400–The E. coli preset's run with the rescue's steps as the engine chose them
preset-s-cerevisiae-fed-batch@1fed-batch24400–The S. cerevisiae preset's default run
preset-s-cerevisiae-fed-batch@1-chemostatchemostat24200–The S. cerevisiae page's chemostat link: D 0.10 per hour, kLa 200 per hour, Sf 10 g/L, from its steady state
preset-pichia-aox1@1fed-batch24700–The Pichia preset's default run
preset-chemostat@1chemostat24400–The chemostat preset's default run
preset-custom@1fed-batch2440012.32The custom preset's default run

Maintenance at both ends of its range (pichia-aox1@1)

The data do not resolve maintenance, so the run is shown at both ends of its range, with everything else as the preset sets it.

Maintenance (g/g/h)Biomass at the end (g/L)Lowest DO (% air saturation)Peak OUR (mmol/L/h)DO below the setpoint
024.642.878.3never
0.02124.425.5101.6from 22.3 h

Security overview

Scientific computation runs in your browser, and individual apps need no account. Optional Bench accounts and backups use the site server and configured providers. The privacy statement, the hosts it contacts and the headers its workspace is served with are generated from its registry entry, the same record that sets the browser's policy.

What leaves your browser

What leaves your device. Requests for Drybench Bioreactor's own files (pages, scripts, data files and images) go to the host that serves it. That host keeps standard web-server logs (IP address, user agent, requested address, time). Anything in the address bar before the # (a search, a SMILES, an accession or a step) is sent to this site's host when a page loads or a link is opened; anything after the # is not sent. No external scientific host is contacted for these operations. The app carries no analytics and no error reporting, and loads no font or script from any other origin. Optional Bench sign-in and billing contact the site server and its configured account providers; choosing an account backup uploads the selected Study.

What stays on your device. The runs you set up, your vessel's limits and kLa readings, and the runs you keep, your preferences, and anything you have not chosen to export, share or back up to your account. They live in this browser's storage on this device.

Where you choose to send data. A link you copy carries what you were looking at (the preset and every parameter you changed); anyone who receives it can read it, and mail and chat tools may fetch the link to show a preview. A file you export or share goes wherever you send it.

Hosts the app contacts

The app contacts no host but its own.

Headers the workspace is served with

These are the exact header values, generated from the app's registry entry.

Content-Security-Policy
default-src 'self'; script-src 'self' 'unsafe-inline'; worker-src 'self' blob:; connect-src 'self' blob:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'
Referrer-Policy
no-referrer
Permissions-Policy
camera=(), microphone=(), geolocation=(), payment=(), usb=()
X-Content-Type-Options
nosniff
Cross-Origin-Opener-Policy
same-origin

Limits

  1. 1. Teaching and estimation model, not a validated process model.
  2. 2. The rescue cascade stays within the agitation, gas-flow and oxygen-enrichment limits you enter, and ignores cooling capacity, vessel pressure and gas-safety limits. Oxygen enrichment near flammable solvents or vapours is a fire and explosion hazard. Do not run a vessel from these outputs without your own engineering review.
  3. 3. Presets combine literature values and operating choices from multiple conditions; they are teaching scenarios, not validated strain/process parameter sets. Quantitative process use requires measured parameters and specialist validation.
  4. 4. Literature growth-fitted Ks is not interchangeable with the uptake Ks used here. Without product/inhibition and with excess oxygen, growth half-saturation is Ks × (1 + 2Yms/μmax). Presets are not silently transformed without refitting.
  5. 5. Nominal Rushton Np=5 assumes standard baffled turbulent geometry (Re above 10⁴, Kaiser et al. 2017); the app does not compute Reynolds number or broth rheology. Vessel geometry, multiple impellers and real-broth transfer need measurement.
  6. 6. An unstructured uptake/Monod model with mixed literature parameters has not been quantitatively validated for a given strain or process. Reported parameter ranges do not establish predictive uncertainty for these composite presets.
  7. 7. The Crabtree effect is not modelled; the S. cerevisiae preset stays glucose-limited, and a run that leaves glucose limitation or runs short of oxygen is flagged.
  8. 8. The acetate onset is MG1655's; other strains differ.
  9. 9. CHO and other sparged mammalian cultures are not modelled for oxygen limitation.
  10. 10. The DO setpoint is a process margin, not a kinetic threshold.
  11. 11. The gas phase is taken at steady state (no hold-up). Feed oxygen enters dC/dt through (Fin/V)(Cfeed−C); zero feed DO is the default. The chart shows oxygen in the liquid; a DO probe's reading lags it by the probe's response time, which is not modelled.
  12. 12. Excursions past a limit that last less than about 3 minutes are not flagged: the model leaves out the gas phase's hold-up and the DO probe's response, which act over about a minute.
  13. 13. Gas flow has an explicit actual or reference basis, including reference temperature and absolute pressure. The same ideal dry-inlet-gas conversion supplies molar flow, superficial velocity and gassed power. Gas-flow humidification and hydrostatic expansion are not modelled; freshwater solubility includes its water-vapour correction, but broth salinity and composition require measurement. Vvm is per current liquid volume; flow rises during feeding while kLa is held between aeration changes.
  14. 14. Van 't Riet's empirical correlation supplies no validated prediction interval for your vessel or broth. Yawalkar et al. 2002 report substantial deviations for some conditions; use measured kLa when available.
  15. 15. Real broths fall anywhere between the coalescing form used by default and the non-coalescing form; enter a measured kLa if you have one.
  16. 16. The presets' 10 L vessel sits at the lower edge of the tank sizes Hughmark's correlation was fitted on (0.21 to 3.33 m).
  17. 17. kLa is taken at the volume where the aeration is set, at the start or at a rescue step, and held as the volume grows.
  18. 18. The product is biomass-equivalent for substrate yield, carbon fraction and degree of reduction. Product-enabled OUR, CER and RQ are approximate for chemically different products.
  19. 19. When uptake falls below maintenance, nothing grows and nothing decays: death and endogenous decay are not modelled.
  20. 20. The CO₂ evolution rate is the CO₂ produced: dissolved CO₂ and bicarbonate are not modelled.
  21. 21. No heat transfer, pH control, parameter fitting or Monte Carlo.
  22. 22. Scale-up assumes geometrically similar vessels with the same impellers, Np and gas flow per volume; constant P/V holds ungassed power, so gassed P/V differs between scales. It ignores cooling, mixing time and shear. Every kLa is the correlation's, flagged outside its fitted range, with no prediction interval.
  23. 23. The yield check refuses only what the carbon and electron balances forbid; a feasible yield is not thereby a likely one.
  24. 24. The model's feed law; pump calibration, line dead volume and feed density at temperature are yours to check.
  25. 25. A complex medium is context; the model simulates one declared substrate; delivery is not verified.
  26. 26. Matched by exact compound identity against a short ruled list; names are not read; glucose monohydrate is converted to anhydrous glucose by formula mass, assuming the exact monohydrate.
  27. 27. An apparent ln(response) slope over your window; not the model's μmax; no OD-to-biomass conversion; no interval.
  28. 28. Elapsed time from a declared event is not physiological equivalence; responses are not converted or overlaid on one axis; a simulation reference is context only.
  29. 29. Estimates one parameter, conditional on every other value as entered; a wrong fixed value biases it without warning.
  30. 30. Needs measured biomass as mass concentration and measured substrate; optical density alone is refused.
  31. 31. No confidence interval; a profile is a numerical diagnostic.
  32. 32. Values marked “Unverified” have not yet been checked against their sources; each is checked, or removed, before this app leaves preview.
  33. 33. A link carries the preset and every parameter you changed, never results; a run you keep stays in this browser. No account needed.
  34. 34. No offline use: the pages are served by the site, and nothing is installed.

Where it runs and what it sends

  1. Pick a presetOpen E. coli fed-batch, S. cerevisiae glucose-limited fed-batch, Pichia on methanol, a chemostat or a custom start; Setup shows every value with where it comes from and its range.
  2. Change what you want to tryMove kLa or agitation and gas flow, the inlet's oxygen, the feed and the horizon beside the chart; the run follows as you drag, and the link records only what you changed.
  3. Read where oxygen runs outThe tiles, the chart with its numbered notes and the data table say when dissolved oxygen falls below the setpoint and runs out, and Rescue lists the steps that would hold it within your vessel's limits.
  4. Take it to the benchPrint the bench sheet with the pump table, export the time series as CSV with its provenance, or share the run as a link. Simulation runs locally; no account needed. Optional Study backups upload only when you choose them.

Built for the keyboard and for screen readers

Everywhere in the app

Show every keyboard shortcut
?
Go to the search field
/
Open the command palette
ControlK
Open Settings
Control,
Close the innermost panel, menu or dialog
Escape

In this app

Go to Run
1
Go to Setup
2
Go to Rescue
3
Go to Compare
4
Go to Pump sheet
5

Single-key shortcuts work outside text fields and can be turned off in Settings.

Commitments

  • Controls work from the keyboard, with focus always visible.
  • One polite live region announces what changes, for screen readers.
  • Reduced motion is honoured, from your system setting or the app's own switch.
  • Works at 375 px wide.

Questions buyers ask

What does the model leave out?

It is the textbook's unstructured model: Monod growth with Pirt's maintenance, Luedeking and Piret's product terms and the balances with volume change, with dissolved oxygen by its own balance. It leaves out heat transfer, pH, dissolved CO₂, death and decay, overflow metabolism such as E. coli's acetate and the Crabtree effect in yeast, the gas phase's hold-up and the DO probe's lag. Where a run reaches one of those, a numbered note says so on the chart, the table and every export.

Where do the preset values come from?

Each value shows its paper, the table or page it is on and its reported range, and was read on 6 October 2026. A kinetic value no read source gives is labelled illustrative, and only where changing it tenfold either way leaves the headline outputs unchanged at the precision shown; values from memory are marked unverified until checked against their sources. A preset version, once published, never changes: a changed value is a new preset version and a changed equation a new model version, and every run, export and recorded result names both. A shared link names the preset version only, so a link made before a model change opens on the current model.

How is kLa worked out?

Three ways: a measured kLa you enter, scaled to other agitation and gas flows by Van 't Riet's exponents; your kLa readings at several rpm, interpolated between them; or Van 't Riet's correlation with Hughmark's gassed power, its range stated and anything outside it marked extrapolated. The empirical correlation supplies no validated prediction interval for your broth or vessel; enter a measured kLa if you have one.

How is the engine checked?

Against SciPy 1.17.0's Radau method at a relative tolerance of 1e-9, run offline on the same equations, on 33 scenarios across batch, fed-batch and chemostat runs, oxygen-limited runs at kLa 50, 200 and 1,000 per hour and each preset's published run, with closed forms, the oxygen solubility against the USGS's own program, and mass balances closing within 0.5 percent. The fixtures and their hashes are on the verification page. The wording stays draft until an independent reviewer with bioprocess experience signs the equations, the presets and the fixtures.

Can I run my vessel from the rescue?

No. The rescue stays within the limits you enter and ignores cooling capacity, vessel pressure and gas-safety limits, and oxygen enrichment near flammable solvents or vapours is a fire and explosion hazard. It is a teaching and estimation model, not a validated process model: do not run a vessel from its outputs without your own engineering review.

Is anything sent to a server?

No. The app contacts no host besides its own. A shared link carries the preset by id and version and the parameters you changed, never results, and a run you keep is stored in this browser. No account needed.

Next step

Want this tuned to your process?

Email m.beale@icloud.com with what you need, or use the contact page.