/** This is a class that contains various calculations about ethanol (that is, the usual drinking alcohol.) Most functions are class-level functions meaning that you can call them without an instance of the class. Density calculations are deived from LeastSquaresFitAlc.frink */ class Ethanol { /** Given an ethanol-water mix with the given density (probably measured as g/cm^3 and must have those dimensions,) returns the percentage of alcohol as a dimensionless number between 0 and 1. If the density is out of the physical ranges of ethanol-water mixes (e.g. from 1 g/cm^3 at 0% alcohol to 0.7939 g/cm^3 at 100% alcohol,) the behavior is currently undefined. */ class densityToPercent[density is mass_density] := { x = density / (g/cm^3) if x < 0.9244 p = 2541.808938140371 x^3 + -7511.267369943389 x^2 + 6924.229816881236 x + -1934.810793622680 else if x < 0.97608 p = -71159.75090820634 x^3 + 197494.3009780669 x^2 + -183203.0689308734 x + 56856.10214464291 else p = 15582.22157329863 x^3 + -37521.67546881218 x^2 + 27672.18981374326 x + -5732.705459313710 return p percent } /** Given an ethanol-water mix with the given percentage of ethanol (measured as a dimensionless number between 0 and 1, that is, 80 proof is 40% alcohol and the input should be 0.4), returns the density of the mix (you can treat it as g/cm^3 ) If the percentage is not between 0 and 1, the behavior is currently undefined. You can call this like: Ethanol.percentToDensity[40 percent] -> "g/cm^3" which returns "0.95182" */ class percentToDensity[percentAlcohol is dimensionless] := { if (percentAlcohol < 0) or (percentAlcohol > 1) println["Ethanol.percentToDensity: was passed a value not between 0% and 100%. Value was " + percentAlcohol] x = percentAlcohol * 100 if x < 32 d = -5.049258448369746e-7 x^3 + 0.00002974600301202464 x^2 + -0.001592547961868473 x + 1.0000628175763 else if x < 85 d = 8.942640260440939e-8 x^3 + -0.00003044191130699079 x^2 + 0.0004539612214965898 x + 0.9766798856308560 else d = -0.000003136268563653715 x^3 + 0.0008056820001188939 x^2 + -0.07208147436198514 x + 3.081536420026518 return d (g/cm^3) } }