Digital Twin of the Thermal-Conductivity Apparatus

Physics, architecture, a one-week build plan, lessons from past digital twins, and sources.
Project: Digital Twin research group under Prof. Rachit Khare, IIT Delhi Abu Dhabi. Document version 2 (revised 11 October 2026). Supersedes the 16-week student-rig plan in version 1.

Editing is off. Changes made in the browser are not saved until you download a copy.

1. Summary

What to build this week: a calibrated physics model of the commercial thermal-conductivity apparatus, connected live to the apparatus's data, estimating thermal conductivity k, interface (contact) resistance and heat-loss coefficient online, with a dashboard and a "virtual experiment" mode. That is a digital shadow with an honest predictive model. Closing the loop (the twin choosing the next set-point or stopping a run) is a day-5 stretch goal if the instrument accepts commands; otherwise it becomes the first task of week 2.

Why the timeline changed: version 1 assumed the team would build a hobby rig from scratch. The apparatus is real lab equipment, so the mechanical build disappears and the critical path becomes (a) getting data out of the instrument and (b) understanding its physics well enough to calibrate a model. Both fit in a week for six people, provided the instrument's data is reachable (see Section 4.2 on what to check on day 1).

What "truly replicates real life" means operationally: the model's predictions at sensors it was not fitted to fall inside the model's own stated uncertainty, on runs it has never seen, for the operating range you declare. Nothing more, nothing less. Industrial twins that work (Rolls-Royce engines, Aarhus incubator, Willcox's UAV) all share three traits: a fit-for-purpose model, few physically meaningful tunable parameters, and continual verification, validation and uncertainty quantification (VVUQ). Copy that discipline.

Three capabilities the twin must offer, and how each is implemented:

CapabilityImplementationSection
Replicate (mirror the live experiment, with uncertainty)1D finite-difference heat model + Kalman filter for state + periodic least-squares refit of k, Rc, h; validation against held-out runs3, 5
Run new experiments virtually ("what if we used sample X at 80 °C?")Same model run forward from the current calibrated state with user-chosen inputs; material library; uncertainty bands from parameter posteriors5.5
Optimise (which run next, which set-points, how long to wait)Bayesian experimental design / Bayesian optimisation over the model; time-to-steady-state forecast; stop-early rule when k uncertainty falls below a target5.6

The honest caveat on one week: steady-state thermal runs take 30 minutes to 2 hours each. You can build and wire the whole twin in a week, but a proper validation (≥3 materials × ≥2 thicknesses) is roughly 15 hours of instrument time and will run in the background into week 2. Plan for that from day 1 by queuing instrument time.

2. Context and assumptions

2.1 Team

MembersNatural homeBut everyone also
2 computer-science engineersData pipeline, twin runtime, database, dashboard, repository hygieneRuns at least one full experiment on the instrument
1 energy engineerHeat-transfer physics, loss analysis, instrument physics, model-form decisionsWrites code in the physics module and reviews pull requests
3 chemical engineersExperiment design and SOPs, calibration and validation, uncertainty budgets; later: reaction kinetics and reactor modelsEach owns one Python module end to end this week

Everyone is willing to work across the pipeline, so pair people across disciplines on each module (a CS engineer with a chemical engineer on the estimator, the energy engineer with a CS engineer on the model). The point of this first week is to make the whole team fluent in every layer before the reactor work, where the chemical engineers' knowledge becomes the critical path.

2.2 Facilities and inputs

2.3 Scope of this week versus later

This week (thermal-conductivity twin)Weeks 2–4Later (reactor twin with catalysis database)
Instrument interface; 1D physics model; live estimation of k, Rc, h; dashboard; virtual-experiment mode; PostgreSQL store; first validation runsClosed-loop control (if the instrument allows); Bayesian calibration on the workstation; experiment-design optimiser; 2D model check; lab-mode report generator; second instrument if availableNon-isothermal packed-bed reactor model reusing the heat model; kinetic parameters with priors from the catalysis database; hybrid physics + ML residual models; autonomous experiment loop

3. The physics, in terms a CS engineer can act on

3.1 Fourier's law and the resistance analogy

Fourier's law: heat flux q″ = −k dT/dx, with k in W/(m·K). Treat temperature difference as voltage, heat rate Q (W) as current, and thermal resistance R = L/(kA) (K/W) as electrical resistance. At steady state the stack is a series circuit:

Q = ΔT_total / ( R_c,hot + L/(k·A) + R_c,cold )

If Q is known and the drop across the sample ΔTs is measured, then k = Q·L/(A·ΔTs). Most commercial instruments do exactly this, either measuring Q directly (heater power, with guards to stop losses) or comparatively, by placing reference bars of known kref in series with the sample so that the same Q flows through both: ks = kref(ΔTref/Lref)(Ls/ΔTs). With a reference bar above and below the sample, the mismatch between the two flux estimates is a live measure of heat loss — use it as a health signal.

3.2 The transient model (what the twin actually integrates)

ρc ∂T/∂t = ∂/∂x ( k ∂T/∂x ) − (hP/A)(T − T_ambient)

3.3 Identifiability — decide this before fitting anything

At steady state with one sample thickness, k and Rc are confounded: you only observe their series sum. Three ways to separate them: sensors on or inside the sample faces; testing 2–4 thicknesses and regressing total resistance against L (slope 1/(kA), intercept = contact term; this is the ASTM D5470 logic); or transient data. Likewise hloss and the true delivered power are confounded unless reference bars (or a guard) are present. Before writing the estimator, compute Beck-style scaled sensitivity coefficients θ ∂T/∂θ for each sensor the instrument exposes; if two parameters have proportional curves, they are not separately identifiable with that sensor set and you must change the experiment (power steps, multiple thicknesses) rather than the code.

3.4 Which standard method the instrument follows

Method (standard)PrincipleTypical rangeWhat it means for the twin
Guarded hot plate (ASTM C177, ISO 8302)Absolute steady state; guard heater eliminates lateral lossInsulatorsLosses small; model the guard as a Dirichlet boundary
Heat flow meter (ASTM C518, ISO 8301)Calibrated heat-flux transducer replaces power measurementInsulation boardsTwin gets Q directly; estimate the transducer's calibration drift
Guarded comparative cut-bar (ASTM E1225)Sample in series with reference bars, plus guard0.2–200 W/(m·K), 90–1300 KClosest to a source/sample/sink stack; two flux estimates available
Meter-bar, thin materials (ASTM D5470)Hot/cold meter bars; multi-thickness regression separates contact resistanceThermal interface materialsClosest for thin samples; Rc becomes a first-class parameter
Transient plane source (ISO 22007-2)Sensor is both heater and thermometer; fit the transientWideInstrument already does an inverse fit; twin adds UQ and drift tracking
Laser flash (ASTM E1461)Pulse one face; α ≈ 0.1388 L²/t½DiffusivityTwin estimates α; k needs ρc from elsewhere

ASTM E1225 defines a homogeneous specimen as one whose apparent conductivity does not vary with thickness or cross-section by more than ±5 %. That is a ready-made validation test. Your twin will be "E1225-inspired", not compliant; say so in reports.

3.5 Numerical approaches

ApproachUsePython
Analytical (series resistances; Fourier-series slab transient)Day-1 test oracle for the solverNumPy
Lumped RC network (3–10 nodes)First twin model; runs in microseconds inside a filterscipy.integrate.solve_ivp
1D finite difference, method of lines: dT/dt = A(θ)T + B(θ)uMain model this week (contact nodes, fin-loss term)SciPy sparse; solve_ivp(method="BDF"); Crank–Nicolson via solve_banded
Explicit FTCSTeaching only; stable only if αΔt/Δx² ≤ ½NumPy
Finite volumeLayered materials, flux-conservativeFiPy
2D axisymmetric FEMWeek 2: quantify how much the 1D assumption costs; size insulationscikit-fem (light); FEniCSx (Docker)
Reduced-order model (POD/DMD)Only if FEM must run in real timeNumPy SVD, PyDMD
Surrogates (GP / NN / PINN)Only after the physics model exists; GP surrogate speeds MCMC on the workstationscikit-learn, GPyTorch, PyTorch, DeepXDE

4. Working with real lab equipment

4.1 Why this changes the plan

A commercial instrument gives you traceable geometry, a built-in heater controller, calibrated sensors and (usually) its own steady-state readout. It takes away freedom: you may not be able to add sensors where identifiability wants them, change the excitation profile, or command the heater from your code. The twin's job therefore shifts from "measure k" (the instrument already does that) to: estimate k earlier and with uncertainty, track drift of contact resistance and losses across runs, detect faults, simulate experiments that have not been run, and propose the next run.

4.2 Day-1 checklist once the model number is known

QuestionWhy it mattersFallback if the answer is "no"
Does it stream data (RS-232/USB serial, Modbus, Ethernet, OPC UA) or only log to its own PC software?Determines the ingest module: pyserial, pymodbus, opcua, or a file watcher on the vendor's CSV exportFile watcher on exported CSV; worst case, periodic screenshot OCR is not acceptable — ask the vendor for a logging option
Which channels are exposed? (individual thermocouple/RTD readings, heater power, guard temperature, coolant temperature, or only the computed k)Decides the observation model and identifiabilityAdd your own sensors on accessible surfaces (Section 4.3)
Can set-points be written remotely?Needed for the virtual→physical loop (true twin)Human-in-the-loop: the twin recommends, an operator applies; log the recommendation and the action
What are the internal geometry and materials (bar lengths, sensor positions, reference-bar k)?Fixed model inputs; the manual or vendor drawings usually give themTreat unknown geometry as parameters with tight priors; calibrate with a certified reference sample
What reference samples and calibration certificates come with it?Your ground truth for validationBuy or borrow references (Pyroceram 9606, stainless 304, PMMA, borosilicate)
Sampling rate and timestamp source?Filter design; clock alignmentTimestamp on arrival at the ingest PC; keep sequence numbers
Safety interlocks and maximum temperatures?Your software must never be the only protectionNever bypass; put software limits below hardware limits
Licence terms of the vendor software and data format?Some vendors lock exportsDocument the limitation; request an SDK

4.3 Adding sensors to a commercial instrument (only if needed)

If the instrument exposes too few channels for identifiability, add external sensors at accessible points (outer insulation surface, coolant inlet/outlet, ambient, and if the vendor allows, sample faces). Use NTC thermistors with an ADS1115, or PT100/PT1000 with MAX31865, on an ESP32 or Raspberry Pi, emitting JSON at 1 Hz. Inter-calibrate all added sensors against the instrument's own sensors by soaking them together at three temperatures; only relative offsets matter for ΔT. Print mounts in PETG/ASA/PC, not PLA, near warm surfaces. Keep added wiring away from the heater and outside the guard; otherwise you perturb the measurement you are twinning.

4.4 Lab mode and research mode

AspectLab mode (teaching)Research mode
WhoStudents following a worksheetThe team, and later other groups
DashboardGuided steps, live measured vs theoretical profile, "you are at 63 % of steady state", one-page auto-report with k ± UFull parameter traces, residuals, posterior plots, raw data access, experiment-design suggestions
EstimationFixed, pre-calibrated Rc and h; estimates k onlyFull θ estimation; drift tracking across runs
ControlNone (or vendor software only)Recommendations, closed loop where permitted
DataWritten to the same database, tagged mode=lab, course=...Tagged mode=research, with run metadata and git commit

Lab-mode runs are not throwaway: hundreds of student runs on reference samples are exactly the dataset you need to learn instrument drift, operator effects and sensor ageing, and to validate the model across time.

5. Twin architecture

5.1 Layers

LayerThis week's implementation
Physical assetThe commercial apparatus, plus any added sensors
Sensing / acquisitionInstrument stream or CSV export; optional ESP32 sensors; 1 Hz
Data pipelineIngest → pydantic validation → MQTT topic → PostgreSQL (+TimescaleDB) and Parquet archive
Virtual model1D finite difference; parameters θ = [k, Rc,hot, Rc,cold, hloss, ρc]; material library
SynchronisationKalman filter on temperature field at 1 Hz; windowed least-squares refit of θ every few minutes; UKF/Bayesian in week 2
Analytics / servicesTime-to-steady-state forecast; early k with uncertainty; residual-based fault flag; virtual experiments; next-run recommendation
VisualisationStreamlit (lab and research pages)
Feedback (virtual→physical)Recommendation shown to operator; direct set-point write if the instrument allows

5.2 Where this sits in the reference architectures

Grieves (2002/2014)
Physical product, virtual product, and the data connections between them. Your "connections" are the MQTT bus and the database.
NASA, Glaessgen & Stargel (2012)
A probabilistic, as-built simulation using the best physical models and sensor updates to mirror its twin. The twin is of this instrument with its contact resistances, not a generic one.
Kritzinger et al. (2018)
Digital model (manual data flow) → digital shadow (automatic physical→digital) → digital twin (automatic both ways). Target: shadow by day 4; twin by day 5 or week 2 depending on instrument control. Report your level honestly.
Tao et al. five dimensions
Physical entity, virtual entity, services, data, connections. Name your services explicitly in the code (services/early_k.py, services/forecast.py, services/anomaly.py, services/virtual_experiment.py, services/next_run.py).
ISO 23247 (2021)
The instrument is an "observable manufacturing element"; ingest is the device-communication entity; model + estimator form the digital-twin entity; the dashboard is the user entity. Use its vocabulary in the architecture diagram.
NASEM (2023)
A twin is dynamically updated, predictive, informs decisions, and the virtual–physical interaction is bidirectional. The model must be fit for purpose; VVUQ is continual. This report's capability table (Section 1) is written to that definition.
Digital Twin Consortium Capabilities Periodic Table
A checklist, not an architecture. Tick: data acquisition and integrity, streaming, real-time monitoring, prediction, simulation, alerts, orchestration (later).

5.3 Synchronisation (the inverse problem)

  1. Steady-state algebra: detect steady state (|dT/dt| < 0.01 K/min on all channels for 10 min, via rolling regression slope), then apply the instrument's own formula. This reproduces the vendor readout and is your sanity check.
  2. Batch nonlinear least squares with scipy.optimize.least_squares (residuals Tmeas − Tmodel(θ); loss="soft_l1", bounds, x_scale). Covariance ≈ s²(JᵀJ)⁻¹ gives error bars from day one.
  3. Recursive estimation: linear Kalman filter on the temperature field (the method-of-lines model is linear in T, so the KF is exact) with θ fixed between refits; normalised innovations are the fault detector (the Aarhus tutorial uses this to detect a lid opening). Week 2: unscented KF on the augmented state [T, k, Rc, h] with random-walk parameters, via FilterPy.
  4. Bayesian calibration (workstation): emcee or PyMC with physical priors (e.g. PMMA k ∈ [0.15, 0.25]; log-normal Rc), ArviZ diagnostics; add a Kennedy–O'Hagan Gaussian-process discrepancy term if residuals show structure. This is the Kapteyn–Willcox view in miniature: each asset keeps a unique digital state on a shared model, updated by Bayesian inference.
  5. Sensitivity and UQ: SALib (Sobol/Morris) to rank which uncertain inputs dominate k; Monte Carlo propagation of sensor accuracy.

5.4 Validation criteria (write these down before running)

5.5 Virtual experiments

Expose a function simulate_run(material, thickness, T_hot, T_cold, duration, theta_samples) that integrates the model forward from either the current filtered state or a cold start, for each of N posterior samples of θ, and returns median and 5–95 % bands for every virtual sensor, time-to-steady-state and the expected ΔT across the sample. Two uses: (a) teaching — students predict before they measure; (b) research — screening whether a proposed sample/temperature combination will give a resolvable ΔT at all (Section 3 example: an aluminium disc 5 mm thick gives ΔT ≈ 0.02 K, which no instrument resolves well). Keep virtual runs in the same database with origin=simulated so they are never confused with measurements.

5.6 Optimisation

6. The one-week plan

Assumes instrument data is reachable by day 2 and the team can commit roughly 25–30 hours each this week. Instrument time is the scarce resource: book it in blocks from day 1 and run reference samples continuously in the background.

6.1 Day by day

DayGoalDeliverablesPairs (suggested)
1 (Mon)Scope and plumbingInstrument checklist (4.2) completed; repo with CI; interfaces.py; PostgreSQL schema; analytical oracle; sensitivity study of exposed channels; instrument time bookedCS1 + ChemE1: repo, DB. CS2 + Energy: instrument interface spike. ChemE2 + ChemE3: manual, geometry, reference samples, SOP draft
2 (Tue)Data in, model runningLive or file-watch ingest writing to DB; replay tool; fd1d.py passing verification tests; first reference run recordedCS2 + ChemE2: ingest. Energy + CS1: model. ChemE1 + ChemE3: first run, calibration log
3 (Wed)EstimationSteady-state detector; least-squares fit on day-2 run with covariance; KF running on replay; residual plotsEnergy + ChemE1: least squares. CS1 + ChemE3: KF. CS2 + ChemE2: dashboard skeleton, second run
4 (Thu)Digital shadowEnd-to-end live: instrument → DB → KF → dashboard with 2σ bands; virtual-experiment page; lab-mode pageAll, integration day; one person on documentation
5 (Fri)Decisions and reviewStop-early recommendation live; next-run suggester; if instrument allows, set-point write-back (twin); V&V summary from the runs so far; retrospective; week-2 planAll; 30-minute demo to Prof. Khare
Weekend / backgroundValidation and Bayesian calibrationRemaining reference runs queued; MCMC on the workstation; posterior plotsRota for instrument babysitting

6.2 Hard gates

6.3 Repository layout

thermal-twin/
├── pyproject.toml            # pinned dependencies; package "thermotwin"
├── configs/                  # instrument_<model>.yaml, materials.yaml, estimator.yaml, modes/lab.yaml, modes/research.yaml
├── firmware/esp32/           # only if extra sensors are added
├── hardware/                 # fixtures, sensor mounts (STEP + source), photos
├── db/                       # schema.sql, migrations/ (alembic), seeds/
├── src/thermotwin/
│   ├── interfaces.py         # Asset / Model / Estimator / Store / KnowledgeBase protocols
│   ├── physics/              # analytical.py, lumped.py, fd1d.py, fem2d.py, materials.py
│   ├── estimation/           # steady.py, least_squares.py, kalman.py, bayes.py, sensitivity.py
│   ├── io/                   # instrument_<model>.py, csv_watcher.py, serial_reader.py, mqtt_bridge.py, schema.py, storage_pg.py, replay.py
│   ├── services/             # early_k.py, forecast.py, anomaly.py, virtual_experiment.py, next_run.py, report.py
│   └── twin/                 # state.py, runner.py, decisions.py, safety.py
├── dashboard/                # app.py, pages/lab.py, pages/research.py
├── notebooks/                # exploration only; never imported
├── data/                     # raw/ (immutable), processed/; DVC or git-lfs
├── tests/                    # unit, property (hypothesis), replay regression, @pytest.mark.instrument
├── docs/                     # MkDocs: architecture, derivations, SOPs, data dictionary, assumptions log
└── .github/workflows/ci.yml  # ruff, mypy, pytest

interfaces.py is the investment that pays off in the reactor phase: FD1DConductionModel and a future PackedBedReactorModel both expose step(state, u, theta, dt), observe(state), params() and param_priors(), so every estimator, service and dashboard page is reused unchanged.

6.4 Exactly what Python is used for, per module

ModuleLibrariesWhat it does
physics/analytical.pyNumPysteady_profile(layers, T_hot, T_cold); slab_transient(x, t, alpha, L, T0, T1, n_terms); test oracle
physics/fd1d.pySciPy sparse, solve_ivp, solve_bandedBuilds A(θ), B(θ) on a mesh with interface nodes; Dirichlet/Neumann/Robin classes; explicit, backward-Euler, Crank–Nicolson, BDF steppers
physics/materials.pyYAML, pandasMaterial library (k, ρ, c, temperature dependence, source and uncertainty)
estimation/steady.pypandas, statsmodelsRolling-slope steady-state detector; comparative/absolute k; multi-thickness OLS for Rc
estimation/least_squares.pySciPy least_squares, NumPyWindowed fit, Jacobian covariance, scaled sensitivity plots
estimation/kalman.pyFilterPy (pin version) or a 60-line NumPy KFDiscretised F, B; Q, R from calibration noise; innovations; UKF later
estimation/bayes.pyemcee or PyMC, ArviZPosterior over θ; runs on the workstation; writes posterior samples to DB
estimation/sensitivity.pySALibSobol/Morris indices; identifiability report
io/instrument_*.pypyserial / pymodbus / opcua / watchdogInstrument-specific reader emitting a common Sample record
io/schema.pypydanticValidates units, ranges, monotonic timestamps; rejects and logs bad packets
io/mqtt_bridge.pypaho-mqtt, MosquittoTopics rig/<id>/telemetry and rig/<id>/cmd (the virtual→physical channel)
io/storage_pg.pySQLAlchemy 2, psycopg 3, TimescaleDBWrites samples, runs, estimates, posteriors; Parquet export per run
io/replay.pypandas, asyncioRe-streams stored runs at ×1–×100 for development and regression tests
services/*.pyNumPy, model and estimator APIsEarly-k, forecast, anomaly, virtual experiment, next-run (D-optimal), report (Jinja2 → HTML/PDF)
twin/runner.pyasyncioEvent loop: ingest → KF predict/update → periodic θ refit → services → decisions → persist
twin/safety.py—Software limits below hardware limits; never the only protection
dashboard/app.pyStreamlit, PlotlyLab page and research page; buttons publish MQTT commands or recommendations

6.5 Database schema (PostgreSQL, same server as the catalysis data if permitted)

instruments(id, model, serial_no, geometry_json, calibration_cert, installed_on)
runs(id, instrument_id, mode, operator, sample_id, thickness_m, clamp_force_n, started_at, ended_at,
     config_hash, git_commit, origin)                 -- origin: measured | simulated | replay
samples(id, material, supplier, lot, nominal_k, notes)
telemetry(time, run_id, channel, value, unit)         -- hypertable (TimescaleDB) or partitioned by run
estimates(time, run_id, estimator, param, mean, sd)   -- k, R_c_hot, R_c_cold, h_loss, rho_c
posteriors(run_id, method, param, sample_idx, value)  -- MCMC draws
events(time, run_id, kind, payload_json)              -- steady_state, anomaly, recommendation, command
materials(name, k, rho, c, T_ref, k_dTdx, source)     -- material library (also loaded into configs)

Keep telemetry long-format (one row per channel per timestamp) so new instruments add channels without schema changes. Never store derived quantities in the telemetry table; they go in estimates with the estimator version.

6.6 Working practices

6.7 Pitfalls

PitfallSymptomMitigation
Contact resistance dominatesk varies with thickness or re-clampingFollow the vendor's grease/pressure SOP exactly; multi-thickness regression; explicit Rc parameter tracked across runs
Lateral lossesUpper and lower flux estimates disagree; curved bar profilesMean stack temperature near ambient; fin-loss term; guard set correctly; 2D check in week 2
Sensor offsetsNon-zero ΔT with heater offZero-power check at the start of every run; inter-calibrate any added sensors
Thermocouple cold-junction errorOffsets that track room temperatureLog ambient; include an offset parameter per channel in research mode
Timestamp drift between instrument and PCFilter diverges or lagsOne time authority; sequence numbers; replay tests
Poor identifiabilityLarge, correlated parameter uncertaintiesSensitivity study before fitting; change the experiment, not the code
Over-trusting the vendor's kTwin "validated" against the instrument's own outputValidate against certified reference materials, not the readout
Over-engineeringKubernetes, cloud, no physicsFreeze the stack on day 1; the day-4 gate
SafetyOver-temperature; sample off-gassingHardware limits untouched; software limits lower; supervised runs; polymer samples below their service temperature

7. PostgreSQL and the catalysis database

7.1 Questions to ask whoever provides it

7.2 How the twin will use it

Through a read-only KnowledgeBase adapter (io/catalysis_db.py) that converts records into ParameterPrior objects with value, uncertainty, units, provenance (table, record id, DOI) and validity range. The reactor model's param_priors() returns these; the same estimators that today update k from live data will then update kinetic parameters, with the database as prior and the experiment as evidence. Build the adapter against a tiny mock table this week (two rows is enough) so the interface exists before the real data arrives.

7.3 Modelling path toward the reactor twin

  1. Isothermal CSTR with power-law kinetics (an ODE as simple as lumped.py).
  2. Non-isothermal packed bed: species balances plus an energy balance that is the heat equation of Section 3 with a reaction source term; reuses fd1d.py directly.
  3. Microkinetics (Cantera surface kinetics) seeded from database energies.
  4. Hybrid physics + ML residual models trained across the database on the workstation.
  5. Autonomous experiment loop: the next-run service becomes Bayesian experimental design over kinetic parameters.

8. Toolkit decisions

ToolDecisionReason
Plain Python (NumPy, SciPy, pandas, FilterPy, PyMC/emcee, SALib)AdoptTransparent, free, teaches the whole team every layer
Mosquitto (MQTT)AdoptDecouples ingest, twin and dashboard; trivial to add a second instrument
PostgreSQL + TimescaleDBAdoptMatches the provided database; SQL joins between twin data and catalysis data later
StreamlitAdoptFastest route to lab and research pages; Grafana optional for time-series panels
Grafana on PostgreSQLOptionalNo-code monitoring panels for the lab bench
FMI/FMU (FMPy, pythonfmu), OpenModelicaLearn lightly; export the model as an FMU in week 2–3Co-simulation standard; useful when the reactor model meets other tools
scikit-fem / FEniCSxWeek 22D check of the 1D assumption
COMSOL / AnsysOnly if licensed, as an independent referenceNot a twin runtime
PyTorch, GPyTorch, BoTorch, DeepXDEWorkstation, from week 2Surrogates, Bayesian optimisation, PINN side-study
Eclipse Ditto, ThingsBoard, Node-REDSkip for nowOrchestration is not the bottleneck; Aarhus found their simple twin fitted only 5 of 14 surveyed DT frameworks
Azure Digital Twins (DTDL), AWS IoT TwinMaker, NVIDIA OmniverseSkip implementation; read DTDL for schema ideasCost, lock-in, GPU-heavy visuals
Asset Administration Shell (Eclipse BaSyx)Optional later exerciseDescribing the instrument as an AAS is good documentation practice

Standards to cite: ASTM E1225, D5470, C177/ISO 8302, C518/ISO 8301, E1461, ISO 22007-2; GUM (JCGM 100:2008) for uncertainty; ISO 23247-1…4:2021; ISO/IEC 30173:2023; ISO/IEC 30141; FMI; AAS (IEC 63278); OPC UA; MQTT (OASIS). Check IEEE 2888 working-group status before citing it.

9. Lessons from past digital twins

CaseWhat they didWhat workedDocumented difficultiesApply here
NASA, Apollo and Glaessgen & Stargel (2012)Physical ground twins in Apollo; 2012 paper defined the DT as a probabilistic, as-built simulationClear vision"Ultra-high fidelity" exceeded available computingKeep probabilistic and as-built; drop ultra-fidelity
Kapteyn, Pretorius & Willcox (2021), UAVDynamic Bayesian network over component-based reduced-order models; experimental calibrationPrincipled updating with end-to-end UQNeeds ROM libraries and expertisePosterior over θ + KF is the miniature version
Niederer et al. (2021)Cardiac and aerospace exemplarsClear challenge listTwins are bespoke and hard to scaleReuse-oriented interfaces
Aarhus incubator (2021–2025)Insulated box with heat bed; RC models; message bus; KF anomaly detection; open sourceA 4-parameter model captured heat-bed thermal inertia better than a 2-parameter oneOnly 5/14 frameworks could host it; maintenanceClosest template: clone the repository, copy the RC + KF + messaging pattern
ETH Zurich machine-tool thermal twin (Lang et al., 2024)Thermomechanical model + KF state observerFew sensors plus estimation beat a 284-sensor interpolation; thermal-error RMSE roughly halvedModel reduction; long-term driftEstimation beats adding sensors
Power-electronics thermal twins (Kuprat et al., 2024)PSO identification + dual EKF onlineParameter drift reveals thermal-path ageingCoexisting ageing mechanisms confound parametersTrack Rc across runs as an instrument-health signal
Inverse heat-transfer twins (ANN + Kalman smoother; EnKF in casting)Surrogates inside filtersNear-real-time inversionSurrogate training; sensor placementSurrogates only when physics is too slow
GE Predix / Digital Wind FarmIIoT platform with asset twinsCondition monitoringCompany-sourced value claims; platform was costly and some divisions struggled with itStart from a decision, not a platform
Rolls-Royce engine health monitoringEngine data to a ground twin that can refocus monitoringTime-on-wing, predictive maintenanceVendor-reported outcomes; heavy integration investmentLet the twin change what is measured next
Catalytic and process reactors (fixed-bed digital design; pilot SMR + WGS twin; plasma-reactor twin)Calibrate a few meaningful PDE coefficients; "experiment digital twin" of lab kinetics scaled to plantReformer RMSE ~12 °C; H₂ yield within ~2 %Scarce modelling skills; maintenance; vendor-heavy sourcesCalibrate a few physical parameters, not large black-box models
Pharmaceutical continuous manufacturingMechanistic, hybrid and data-driven twinsHybrid strategiesReal-time applications rare; integrated twins immature; regulationA closed loop is an achievement; plan for it explicitly
Self-driving labs (Burger et al., 2020)Mobile robot ran 688 experiments in 8 days via batched Bayesian optimisationClosed-loop, model-guided experimentationRobust automation; human oversightYour next-run service is a micro self-driving lab
Buildings, batteries, additive manufacturing (thermal)RC-network and equivalent-circuit twins with KFLow-order RC + KF is the workhorseSparse sensors; drift; AM models too slowThe RC + KF core is industry-standard

On industrial numbers: figures such as GE's "1.2 million digital twins" or Rolls-Royce's "400 unplanned maintenance events prevented annually" come from the companies or their vendors. Cite them as claims. The National Academies (2023) note that enthusiasm for digital twins currently outweighs evidence of their success.

Prioritised lessons: (1) start from the decision the twin informs; (2) few, physical, continuously updated parameters; (3) estimation beats adding sensors; (4) VVUQ and data quality are continual, not a phase; (5) design for reuse; (6) plan a real, small virtual→physical loop so the project does not stall at the shadow stage.

10. Sources

10.1 Referenced in this report

Digital-twin foundations and reviews

Thermal and laboratory twins; estimation

Industry and process

Self-driving labs and catalysis data

Standards and measurement

10.2 Recommended further reading

Heat transfer

Numerical methods

Inverse problems, estimation and UQ

Reaction engineering (for the next phase)

Library documentation

Courses

11. Caveats

12. Change log

DateWhoChange
2026-10-11Initial draft (v1)16-week plan for a self-built student rig; full physics, lessons and reading list.
2026-10-11Revision (v2)Rewritten for a six-person CS/Energy/ChemE team, a commercial instrument, a one-week build, PostgreSQL storage, a training workstation, lab and research modes, and explicit replicate / virtual-experiment / optimise capabilities. Converted to editable HTML.