#!/usr/bin/env python3
"""Andrade Safe: educational centrifugal pump and system curves.
Q in m3/h; H in metres; water rho1000/g9.81; eta is pump efficiency.
NPSHa held constant, NPSHr synthetic. No approval or electrical power estimate.
"""
import math,csv
from dataclasses import dataclass,asdict,replace
@dataclass(frozen=True)
class In:
    H0:float=45
    a:float=.05
    Hs0:float=8
    k:float=.02
    eta:float=.65
    NPSHa:float=3.2
    b0:float=1.6
    c:float=.0025
def solve(p:In):
    if not all(isinstance(v,(int,float)) and math.isfinite(v)for v in asdict(p).values()):raise ValueError('Finite numeric inputs required')
    if not(p.H0>0 and p.a>0 and p.Hs0>=0 and p.k>=0 and 0<p.eta<=1 and p.NPSHa>=0 and p.b0>=0 and p.c>=0):raise ValueError('Invalid domain')
    if p.H0<=p.Hs0:return {'kind':'noflow'}
    Q=math.sqrt((p.H0-p.Hs0)/(p.a+p.k));H=p.H0-p.a*Q*Q;Ph=1000*9.81*(Q/3600)*H/1000;Pe=Ph/p.eta;Nr=p.b0+p.c*Q*Q
    return dict(kind='ok',Q=Q,H=H,Ph=Ph,Pe=Pe,NPSHr=Nr,margin=p.NPSHa-Nr)
if __name__=='__main__':
    print('Default:',solve(In()))
    print('Higher system loss:',solve(In(k=.03)))
    print('No positive flow:',solve(In(H0=20,Hs0=25)))
