diff --git a/gradation.py b/gradation.py new file mode 100644 index 0000000..6b90c1e --- /dev/null +++ b/gradation.py @@ -0,0 +1,60 @@ + +from __future__ import annotations +from typing import Union +import math + + +class Gradation: + grams_per_liter: int + + def __init__(self, grams_per_liter: Union[float, int]): + self.grams_per_liter = int(grams_per_liter) + + def get_nm(self) -> float: + return self.grams_per_liter / 10 + + def get_kmw(self) -> float: + return 0.732 * self.get_nm() + 3.2 + + def get_oe(self) -> float: + return self.get_kmw() * (4.54 + 0.022 * self.get_kmw()) + + def get_be(self) -> float: + return self.get_kmw() / 1.53 + + def get_bx(self) -> float: + return self.get_be() / 0.55 + + @staticmethod + def from_nm(nm: float) -> Gradation: + return Gradation(nm * 10) + + @staticmethod + def from_kmw(kmw: float) -> Gradation: + return Gradation.from_nm((kmw - 3.2) / 0.732) + + @staticmethod + def from_oe(oe: float) -> Gradation: + return Gradation.from_kmw((-4.54 + math.sqrt(4.54 * 4.54 - 4 * 0.022 * -oe)) / (2 * 0.022)) + + +def test(): + g1 = Gradation.from_kmw(15) + assert round(g1.get_kmw(), 1) == 15 + assert round(g1.get_oe(), 0) == 73 + + +def print_all(): + for i in range(14 * 2, 22 * 2): + kmw = i / 2 + g = Gradation.from_kmw(kmw) + print(f"{kmw} -> {g.get_kmw():.1f} °KMW, {g.get_oe():3.0f} °Oe, {g.get_nm():.1f} °NM, {g.grams_per_liter}") + print("================================") + for oe in range(65, 110): + g = Gradation.from_oe(oe) + print(f"{oe:3} -> {g.get_kmw():.1f} °KMW, {g.get_oe():3.0f} °Oe, {g.get_nm():.1f} °NM, {g.grams_per_liter}") + + +if __name__ == '__main__': + print_all() + test()