src/Utils.h

Thu, 18 Aug 2022 20:34:15 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 18 Aug 2022 20:34:15 +0200
changeset 401
583148eb6e01
parent 373
b02aca4e926c
child 440
349c0c5bd512
permissions
-rw-r--r--

Init est_carb field for new products.

#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);
    double estimate_fg(double psugar, double pcara, double wgratio, double mashtime, double mashtemp, double svg, double og);
    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 Coolparm1 to define later
     * @param Coolparm2 to define later
     * @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 Coolparm1, double Coolparm2, 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);
}

#endif

mercurial