Data Supplement to: Reconstruction-Free EIT for Injection-Pattern Classification and Superficial Gas Velocity Regression as Proxies for Local Gas Holdup in Bubble Columns
收藏资源简介:
This archive contains raw Electrical Impedance Tomography (EIT) measurement frames recorded on a laboratory bubble column reactor, alongside the corresponding gas-injection configuration and flow-rate ground truth. The data was collected to study whether raw EIT measurement frames—without reconstructing a conductivity image—can be used to: Classify which gas injector ports ("sparger" configuration) are active. Regress the total gas flow rate. (Note: Both metrics serve as proxies for local gas holdup in bubbly two-phase flow. The archive is self-contained and does not require the accompanying code repository to be understood or reused, though model code and training pipelines are available separately.) Experimental Setup Reactor: Cylindrical bubble column with an inner diameter ($D$) of $104\text{ mm}$ and a cross-sectional area ($A_c$) of $8494.87\text{ mm}^2$. Sensor: 8-ring EIT sensor containing 32 electrodes per ring ($256$ electrodes total) mounted along the column height. Rings are numbered from 1 (nearest the gas injector/sparger, bottom) to 8 (farthest, top). Excitation: 4 frequencies—1 kHz, 10 kHz, 100 kHz, and 1 MHz. Each measurement frame records the complex (real + imaginary) boundary voltage response across all four frequencies. Sparger Configurations: 17 distinct injection-port patterns using between 1 and 3 simultaneously active ports out of 6 possible base positions (numbered 1–6). Naming convention: S_<active ports> (e.g., S_1 for port 1 only, S_2_3 for ports 2 and 3, S_2_3_5 for ports 2, 3, and 5, and S_all for all ports active). Flow Rates (Coarse Dataset): 12 gas flow rates ranging from $1.0$ to $6.5\text{ L/min}$ in $0.5\text{ L/min}$ steps, corresponding to superficial gas velocities $U_g = Q_g / A_c \approx 1.96\text{--}12.75\text{ mm/s}$ (within the homogeneous bubbly-flow regime). Flow Rates (Fine-Scale Dataset): A finer calibration subset restricted to sparger configurations S_3 and S_all, sampled at $0.167\text{ L/min}$ spacing over the same overall range. Operating Points: Each contiguous acquisition at a fixed (sparger, flow-rate) operating point forms an operating-point segment within a chronological bubble column run sequence. Directory Contents Plaintext raw_data.zip ├── coarse_raw/ # Main dataset: 12 flow rates × 17 sparger configs (~5.1 GB) │ ├── full_train_Xraw.npy (14284, 65536) float32 │ ├── full_train_Y_S.npy (14284,) string — sparger label │ ├── full_train_Y_F.npy (14284,) float32 — flow rate [L/min] │ ├── val_Xraw.npy (3061, 65536) float32 │ ├── val_Y_S.npy (3061,) string │ ├── val_Y_F.npy (3061,) float32 │ ├── test_Xraw.npy (3249, 65536) float32 │ ├── test_Y_S.npy (3249,) string │ ├── test_Y_F.npy (3249,) float32 │ ├── train_op_boundaries.npy (204, 2) int64 — [start,end) row ranges │ └── train_op_sparger.npy (204,) string — sparger label per op │ └── fine_raw/ # Fine-scale calibration subset (~607 MB) ├── full_train_Xraw.npy (1682, 65536) float32 ├── full_train_Y_S.npy / full_train_Y_F.npy ├── val_Xraw.npy / val_Y_S.npy / val_Y_F.npy (361 samples) ├── test_Xraw.npy / test_Y_S.npy / test_Y_F.npy (384 samples) └── train_op_boundaries.npy (24, 2) int64 Note on Partitions: Both coarse_raw/ and fine_raw/ are pre-split into full_train, val, and test partitions. Splits are chronological (the test set represents the most recently recorded portion of each acquisition campaign) unless re-partitioned manually using the operating-point boundaries. Feature Layout (*_Xraw.npy) Each row represents a single EIT measurement frame flattened into a 65536-dimensional float32 vector: $$\mathbf{65536} = 4 \text{ frequencies} \times 2 \text{ parts (real, imag)} \times 8 \text{ rings} \times (32 \times 32 \text{ boundary-voltage matrix})$$ Vector Block Structure Plaintext [ f0_real | f0_imag | f1_real | f1_imag | f2_real | f2_imag | f3_real | f3_imag ] ←16384→ ←16384→ ←16384→ ←16384→ ←16384→ ←16384→ ←16384→ ←16384→ Within each frequency block, real and imaginary parts are ordered ring-by-ring: $\text{f\{i\}}\_\text{real} = [\text{ring1\_real (1024)} \mid \text{ring2\_real (1024)} \mid \dots \mid \text{ring8\_real (1024)}]$ ($8192$ values) $\text{f\{i\}}\_\text{imag} = [\text{ring1\_imag (1024)} \mid \text{ring2\_imag (1024)} \mid \dots \mid \text{ring8\_imag (1024)}]$ ($8192$ values) Each ring's 1024 values correspond to a flattened $32 \times 32$ boundary-measurement matrix ($32$ excitation patterns $\times$ $32$ electrode voltage readings) at that specific frequency. Frequency Index Mapping: $\text{f0} = 1\text{ kHz}$, $\text{f1} = 10\text{ kHz}$, $\text{f2} = 100\text{ kHz}$, $\text{f3} = 1\text{ MHz}$. Preprocessing: None applied; these are raw sensor readings acquired directly from the Sciospec EIT system. Labels & Metadata *_Y_S.npy: Sparger (injection-pattern) label as a string. Contains 17 possible values for coarse_raw (S_1, S_1_2, S_1_2_3, S_2, S_2_3, S_2_3_4, S_2_3_5, S_2_3_6, S_2_4, S_2_5, S_2_6, S_3, S_3_4_5, S_4, S_5, S_6, S_all), and is restricted to {S_3, S_all} for fine_raw. *_Y_F.npy: Total gas flow rate in $\text{L/min}$ (float32). train_op_boundaries.npy: Index pairs [start, end) into the matching full_train_Xraw.npy file, indicating the row limits for each contiguous operating-point acquisition. train_op_sparger.npy: Sparger label corresponding to each entry in train_op_boundaries.npy. Quickstart Loading Example Python import numpy as np # Load training data and labels X = np.load("coarse_raw/full_train_Xraw.npy") # (14284, 65536) float32 Y_S = np.load("coarse_raw/full_train_Y_S.npy", allow_pickle=True).astype(str) Y_F = np.load("coarse_raw/full_train_Y_F.npy").astype(np.float32) # Note: The data layout defaults to all-rings and all-frequencies. # To isolate specific rings or frequencies, slice the 65536-dim vector # according to the block layout described above.



