"""Bounded interpolation of saved historical graphical data; no project acceptance."""
from pathlib import Path
import json
P=Path(__file__).resolve().parent
S=json.loads((P/'c11-separation-curves.json').read_text())
def separation_LD(gas_density, maximum_drop_um, efficiency_percent, velocity_m_s, *, mode='duty'):
    if mode not in ['duty','comparison']:raise ValueError('mode must be duty or comparison')
    if mode=='duty' and efficiency_percent<=99:raise ValueError('Selected source procedure requires better than99%; lower curves are comparisons only')
    if mode=='duty' and velocity_m_s>2:raise ValueError('Above2m/s is plotted comparison only, outside stated separation duty limit')
    panels=[x for x in S['panels'] if x['gas_density_kg_m3']==gas_density and x['maximum_drop_um']==maximum_drop_um]
    if not panels:raise ValueError('Exact represented density/drop panel required; no off-density substitution')
    curves=[c for c in panels[0]['curves'] if c['efficiency_percent']==efficiency_percent]
    if not curves:raise ValueError('Exact represented efficiency curve required; no inter-family fit')
    pts=curves[0]['samples']
    for a,b in zip(pts,pts[1:]):
        if a['velocity_m_s']<=velocity_m_s<=b['velocity_m_s']:
            t=(velocity_m_s-a['velocity_m_s'])/(b['velocity_m_s']-a['velocity_m_s'])
            return a['L_over_D']+t*(b['L_over_D']-a['L_over_D'])
    raise ValueError('Outside saved curve span; no extrapolation')
def illustrative_length(gas_density,drop_um,efficiency,velocity,inside_diameter):
    if inside_diameter<=0:raise ValueError('Actual inside diameter must be positive')
    ld=separation_LD(gas_density,drop_um,efficiency,velocity)
    return {'L_over_D':ld,'length_m':ld*inside_diameter,'graphical_length_allowance_m':max(.5,.05*ld)*inside_diameter,'condition':'All model gates and geometry ratios must be adopted and matched independently; result is graphical model estimate, not actual efficiency certification'}
if __name__=='__main__':print(json.dumps(illustrative_length(60,1000,99.5,1.5,.9),indent=2))
