///|
/// Deterministic benchmark workload for membrane design sweeps.
/// The checksum is printed so a benchmark run cannot be optimized away.
fn main {
let membrane = @membrane.Membrane::new(
name="benchmark",
thickness=0.0001,
area=50.0,
)
let cases : Array[(Double, Double, Double, Double)] = [
(125.0, 5000.0, 0.0, 0.90),
(250.0, 7500.0, 0.1, 0.91),
(375.0, 10000.0, 0.2, 0.92),
(500.0, 12500.0, 0.3, 0.93),
(625.0, 15000.0, 0.4, 0.94),
(750.0, 17500.0, 0.5, 0.95),
(875.0, 20000.0, 0.6, 0.96),
(1000.0, 22500.0, 0.7, 0.97),
(1125.0, 25000.0, 0.8, 0.98),
(1250.0, 27500.0, 0.9, 0.99),
]
let mut checksum = 0.0
let mut accepted = 0
for iteration in 0..<24000 {
let case = cases[iteration % cases.length()]
let point = @process.OperatingPoint::new(
feed_flow=case.0,
feed_conc=case.1,
recovery_rate=case.2,
rejection_rate=case.3,
)
let report = @process.quality_report(point, membrane, pressure_bar=55.0)
checksum += @process.design_score(report, 1.0, 0.08)
if report.feasible {
accepted += 1
}
}
println("cases=10")
println("iterations=24000")
println("accepted=\{accepted}")
println("checksum=\{checksum}")
}