src/Utils.h

Sat, 19 Aug 2023 16:58:03 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 19 Aug 2023 16:58:03 +0200
changeset 498
c6f957fa7442
parent 453
fc0c10d79539
permissions
-rw-r--r--

In fermentation plot draw the SG line with temperature compensation.

#ifndef _UTILS_H
#define	_UTILS_H

#include <QString>
#include <QColor>

// #define Ka1 0.0000004445
// #define Ka2 0.0000000000468


/**
 * @namespace Utils
 *
 * @brief Global math functions.
 */
namespace Utils {

    double lintner_to_kolbach(double lintner);
    double kolbach_to_lintner(double kolbach);
    double ebc_to_srm(double ebc);
    double srm_to_ebc(double srm);
    double get_kt(int ebc);
    double plato_to_sg(double plato);
    double sg_to_plato(double sg);
    double brix_to_sg(double brix);
    double sg_to_brix(double sg);
    double brix_to_fg(double o_plato, double refracto);
    double calc_svg(double og, double fg);
    double estimate_sg(double sugars, double batch_size);

    /**
     * @brief Return log with custom base.
     * @param y The input value.
     * @param b The base to use.
     * @return The log result.
     */
    double logbase(double y, int b);

    /**
     * @brief Predict FG using recipe data.
     * @param psugar Percentage sugar in the wort.
     * @param pcara Percentage cara/crystal malts in the wort.
     * @param wgratio The water/grain ratio of the mash.
     * @param mashtime The total mash time in minutes.
     * @param mashtemp The average mash temperature.
     * @param svg The SVG percentage of the primary yeast.
     * @param og The Original Gravity of the wort.
     * @param sta1 The STA1 gen present in the yeast flag.
     * @return The predicted Final Gravity.
     */
    double estimate_fg(double psugar, double pcara, double wgratio, double mashtime, double mashtemp, double svg, double og, bool sta1);
    double kw_to_srm(int colormethod, double c);
    double kw_to_ebc(int colormethod, double c);
    double kw_to_newebc(int colormethod, double c);
    double abvol(double og, double fg);

    /**
     * @brief Calculate standar air pressure at the brewery.
     *        Assume 20°C and use the global setup height.
     * @return Pressure in hPa.
     */
    double brewery_hPa();

    /**
     * @brief Return boil temperature in °C at the brewery height.
     * @return Temperature in °C
     */
    double boilPoint();

    /**
     * @brief Calculate IBU reduction at given temperature.
     * @param Tc temperature in °C.
     * @return The reduction factor.
     */
    double IBU_reduction(double Tc);

    /**
     * @brief Calculate IBU's of a hop at 100°C using the Tinseth formula.
     *        Use a time window, for example T1 = 60, T2 = 70 gives the ibus increment for
     *        a hop that is already 60 minutes in the wort for the next 10 minutes time.
     *        This is useful for calculating flamout, chilling and hopstands.
     * @param Form HOP_FORMS_PELLET HOP_FORMS_PLUG HOP_FORMS_LEAF HOP_FORMS_LEAF_WET HOP_FORMS_CRYO HOP_FORMS_EXTRACT
     * @param SG the density
     * @param Volume in liters
     * @param Amount in kilograms
     * @param T1 in minutes start of time window
     * @param T2 in minutes end of time window
     * @param Alpha in procent
     * @param Utilisation Hop extract utilisation
     * @param BU_factor Bitterness Unit multiply factor
     * @return The calculated IBU's
     */
    double TinsethIBU(int Form, double SG, double Volume, double Amount, double T1, double T2, double Alpha, double Utilisation, double BU_factor);

    /**
     * @brief Calculate IBU's of a hop during the whole production process.
     * @param Use HOP_USEAT_MASH HOP_USEAT_FWH HOP_USEAT_BOIL HOP_USEAT_AROMA HOP_USEAT_WHIRLPOOL HOP_USEAT_DRY_HOP HOP_USEAT_BOTTLING
     * @param Form HOP_FORMS_PELLET HOP_FORMS_PLUG HOP_FORMS_LEAF HOP_FORMS_LEAF_WET HOP_FORMS_CRYO HOP_FORMS_EXTRACT
     * @param preSG the density pre boil.
     * @param postSG the density after the boil.
     * @param Volume in liters after boil.
     * @param Amount in kilograms
     * @param Boiltime in minutes
     * @param Alpha in procent
     * @param Method, 0 = Tinseth, 1 = Tinseth++ (+flamout, +whirlpool etc).
     * @param Whirlpool9 time in whirlpool above 80°C or zero.
     * @param Whirlpool7 time in whirlpool between 72°C and 77°C.
     * @param Whirlpool6 time in whirlpool between 60°C amd 66°C.
     * @param Fulltime, full boiltime, even for aroma hops.
     * @param Cooltype 0 = N/A, 1 = Emersion chiller, 2 = Counterflow, 3 = Au bain marie, 4 = natural
     * @param CoolTo79 Chiller time to 79 degrees for immersion chillers.
     * @param CoolLPM Chiller transfer liters/minute for counterflow chillers.
     * @param Utilisation Hop extract utilisation
     * @param BU_factor Bitterness Unit multiply factor
     * @return The calculated IBU's
     */
    double toIBU(int Use, int Form, double preSG, double postSG, double Volume, double Amount, double Boiltime, double Alpha,
                 int Method, double Whirlpool9, double Whirlpool7, double Whirlpool6, double Fulltime,
		 int Cooltype, double CoolTo79, double CoolLPM, double Utilisation, double BU_factor);

    /**
     * @brief Estimate hop flavour contribution.
     * @param bt Boil time in minutes.
     * @param vol Volume of the wort.
     * @param use Hop use moment.
     * @param amount The amount in kg.
     * @param form The hop form.
     * @return A number indicating a contribution factor.
     */
    double hopFlavourContribution(double bt, double vol, int use, double amount, int form);

    /**
     * @brief Estimate hop aroma contribution.
     * @param bt Boil time in minutes.
     * @param vol Volume of the wort.
     * @param use Hop use moment.
     * @param amount The amount in kg.
     * @param form The hop form.
     * @return A number indicating a contribution factor.
     */
    double hopAromaContribution(double bt, double vol, int use, double amount, int form);
    QString hours_to_string(int hours);
    double kettle_cm(double volume, double kettle_volume, double kettle_height);
    double kettle_vol(double cm, double kettle_volume, double kettle_height);

    /**
     * @brief Map SRM color to RGB and return as QColor.
     * @param srm The srm value.
     * @return QColor
     */
    QColor srm_to_color(int srm);

    /**
     * @brief Map EBC color to RGB and return as QColor.
     * @param ebc The ebc value.
     * @return QColor
     */
    QColor ebc_to_color(int ebc);

    /**
     * @brief Map SRM color to a QString for stylesheets.
     * @param srm The srm value.
     * @return A QString with stylesheet colors.
     */
    QString srm_to_style(int ebc);

    /**
     * @brief Map EBC color to a QString for stylesheets.
     * @param ebc The ebc value.
     * @return A QString with stylesheet colors.
     */
    QString ebc_to_style(int srm);

    /**
     * @brief Mix water volumes and ingredients.
     *
     */
    double mix(double v1, double v2, double c1, double c2);

    /**
     * @brief Calculate water hardness
     */
    double Hardness(double calcium, double magnesium);

    /**
     * @brief Calculate HCO3 (bicarbonate) from the total_alkalinity and ph.
     * @param total_alkalinity as ppm
     * @param ph the pH
     * @return The bicarbonate as HCO3.
     */
    double Bicarbonate(double total_alkalinity, double ph);

    /**
     * @brief Return Residual Alkalinity as CaCO3
     * @param bicarbonate as ppm
     * @param carbonate CO3 as ppm
     * @param calcium as ppm
     * @param magnesium as ppm
     * @return Residual Alkalinity
     */
    double RA_CaCO3(double bicarbonate, double carbonate, double calcium, double magnesium);

    /**
     * @brief Return Residual Alkalinity as CaCO3, Paul Kolbach.
     * @param total_alkalinity as ppm
     * @param calcium as ppm
     * @param magnesium as ppm
     * @return Residual Alkalinity
     */
    double ResidualAlkalinity(double total_alkalinity, double calcium, double magnesium);

    double PartCO3(double pH);

    double PartHCO3(double pH);

    double Charge(double pH);

    double CalcFrac(double TpH, double pK1, double pK2, double pK3);

    /**
     * @brief Calculate residual volumes CO2 in the fermenter.
     * @param T The highest fermentation temperature in celsius.
     * @return The volumes CO2.
     */
    double ResCO2(double T);

    /**
     * @brief Calculate the grams/liter sugar.
     * @param CO2 The desired volumes CO2.
     * @param T The highest fermentation temperature in celsius.
     * @param SFactor The sugar factor, 1.0 for table sugar.
     * @return The grams/liter of the chosen priming sugar.
     */
    double CarbCO2toS(double CO2, double T, double SFactor);

    /**
     * @brief Calculate pressure in Bar after refermentation.
     * @param gl Sugar in gram/liter
     * @param T Temperature in celsius
     * @return Pressure in Bar.
     */
    double GetPressureBar(double gl, double T);

    /**
     * @brief Calculate Hydrometer (and iSpindel) Correction.
     * @param mg Measured SG
     * @param tr Temperature at reading in C
     * @param tc Calibration temperature in C
     * @return Corrected SG.
     */
    double HydroCorrection(double mg, double tr, double tc);
}

#endif

mercurial