Brix.frink

View or download Brix.frink in plain text format


// Conversion from specific gravity to/from Brix and other scales.
//  This uses the equation developed by J. Hackbarth (2011), which is based on
// the AOAC Brix tables (Horwitz and Latimer, 2005), to convert from Brix to
// specific gravity.
//
//  The Brix scale is virtually identical to the Balling and Plato scales.
//
// See:
//  http://web2.airmail.net/sgross/fermcalc/fermcalc_conversions.html
//
// TODO:  Correct for hydrometer temperature.  See:
//   http://web2.airmail.net/sgross/fermcalc/fermcalc_alcohol.html

class Brix
{
   class var coeffs = [1, +0.3875135555, +0.09702881653, +0.3883357480,
             -1.782845295, +5.591472292, -11.00667976, +13.62230734,
             -10.33082001, +4.387787019, -0.7995558730]

   // Convert a Brix value, expressed as a dimensionless number, to a
   // specific gravity (which is a dimensionless number comparing the density
   // of the liquid to that of water.)
   class BrixToSG[brix is dimensionless] :=
   {
      sg = 1
      bp = brix/100
      for k=1 to 10
         sg = sg + coeffs@k bp^k

      return sg
   }

   // Convert a specific gravity, expressed as a dimensionless number, to a
   // Brix value (returned as a dimensionless number.)
   // This inverts the BrixToSG calculation using the secant method.
   // (Note that this could now just call secant.frink's method
   // inverseSecant.)
   class SGToBrix[sg is dimensionless] :=
   {
      // Estimation function taken from
      // http://en.wikipedia.org/wiki/Brix#Tables
      brix1 = 261.3 (1 - 1/sg)     
      brix2 = 261.3 (1 - 1/(sg+0.00001))
      sg1 = BrixToSG[brix1]
      sg2 = BrixToSG[brix2]
      while (true)
      {
         invSlope = (brix2-brix1)/(sg2 - sg1)
         bnew = brix1 + (sg - sg1) invSlope
         sgnew = BrixToSG[bnew]

         if abs[sgnew - sg] < 1e-8
            return bnew

         sg2 = sg1
         sg1 = sgnew
         brix2 = brix1
         brix1 = bnew
      }
   }
}


View or download Brix.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 17645 days, 8 hours, 38 minutes ago.