///|
/// 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}")
}