1927 chloride = dataRecord.w1_chloride; |
1924 chloride = dataRecord.w1_chloride; |
1928 sulfate = dataRecord.w1_sulfate; |
1925 sulfate = dataRecord.w1_sulfate; |
1929 total_alkalinity = dataRecord.w1_total_alkalinity; |
1926 total_alkalinity = dataRecord.w1_total_alkalinity; |
1930 ph = dataRecord.w1_ph; |
1927 ph = dataRecord.w1_ph; |
1931 } |
1928 } |
|
1929 var bicarbonate = total_alkalinity * 1.22; |
|
1930 |
|
1931 /* Save mixed water ions for later */ |
|
1932 var wg_calcium = calcium; |
|
1933 var wg_sodium = sodium; |
|
1934 var wg_total_alkalinity = total_alkalinity; |
|
1935 var wg_chloride = chloride; |
|
1936 var wg_sulfate = sulfate; |
|
1937 var wg_bicarbonate = bicarbonate; |
|
1938 |
1932 $('#wg_amount').val(liters); |
1939 $('#wg_amount').val(liters); |
1933 wg_calcium = calcium; |
|
1934 $('#wg_calcium').val(Math.round(calcium * 10) / 10); |
1940 $('#wg_calcium').val(Math.round(calcium * 10) / 10); |
1935 //wg_magnesium = magnesium; |
|
1936 $('#wg_magnesium').val(Math.round(magnesium * 10) / 10); |
1941 $('#wg_magnesium').val(Math.round(magnesium * 10) / 10); |
1937 wg_sodium = sodium; |
|
1938 $('#wg_sodium').val(Math.round(sodium * 10) / 10); |
1942 $('#wg_sodium').val(Math.round(sodium * 10) / 10); |
1939 wg_total_alkalinity = total_alkalinity; |
|
1940 $('#wg_total_alkalinity').val(Math.round(total_alkalinity * 10) / 10); |
1943 $('#wg_total_alkalinity').val(Math.round(total_alkalinity * 10) / 10); |
1941 wg_chloride = chloride; |
|
1942 $('#wg_chloride').val(Math.round(chloride * 10) / 10); |
1944 $('#wg_chloride').val(Math.round(chloride * 10) / 10); |
1943 wg_sulfate = sulfate; |
|
1944 $('#wg_sulfate').val(Math.round(sulfate * 10) / 10); |
1945 $('#wg_sulfate').val(Math.round(sulfate * 10) / 10); |
1945 // Note: brouwhulp has the malts included here in the result. |
|
1946 //wg_ph = ph; |
|
1947 $('#wg_ph').val(Round(ph, 1)); |
1946 $('#wg_ph').val(Round(ph, 1)); |
1948 $('#wb_ph').val(Round(MashpH(), 1)); |
1947 |
1949 bicarbonate = total_alkalinity * 1.22; |
1948 var mash_ph = Round(MashpH(), 3); |
1950 wg_bicarbonate = bicarbonate; |
1949 console.log('Distilled water mash pH: ' + mash_ph); |
1951 |
1950 |
1952 // Noot: de volgende berekeningen geven bijna gelijke resultaten in Brun'water. |
1951 /* Calculate Salt additions */ |
1953 // Calculate Ca |
1952 if (liters > 0) { |
1954 RA = parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 + |
1953 calcium += (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 + |
1955 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4; |
1954 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000) / liters; |
1956 calcium += 1000 * RA / liters; |
1955 magnesium += (parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4 * 1000) / liters; |
1957 |
1956 sodium += (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 + |
1958 // Calculate Mg |
1957 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3 * 1000) / liters; |
1959 RA = parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4; |
1958 sulfate += (parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 * 1000 + |
1960 magnesium += 1000 * RA / liters; |
1959 parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 * 1000) / liters; |
1961 |
1960 chloride += (2 * parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCl / MMCaCl2 * 1000 + |
1962 // Calculate Na |
1961 parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl * 1000) / liters; |
1963 RA = parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl; |
1962 } |
1964 sodium += 1000 * RA / liters; |
1963 |
1965 |
1964 if (dataRecord.wa_acid_name < 0 || dataRecord,wa_acid_name >= AcidTypeData.length) { |
1966 // Calculate SO4 |
|
1967 RA = parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 + |
|
1968 parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4; |
|
1969 sulfate += 1000 * RA / liters; |
|
1970 |
|
1971 // Calculate Cl |
|
1972 RA = 2 * parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCl / MMCaCl2 + |
|
1973 parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl; |
|
1974 chloride += 1000 * RA / liters; |
|
1975 // Einde noot. |
|
1976 |
|
1977 if ($('#wa_acid_name').val() < 0 || $('#wa_acid_name').val() > 3) { |
|
1978 $('#wa_acid_name').val(0); |
1965 $('#wa_acid_name').val(0); |
1979 dataRecord.wa_acid_name = 0; |
1966 dataRecord.wa_acid_name = 0; |
|
1967 dataRecord.wa_acid_perc = AcidTypeData[0].AcidPrc; |
|
1968 $('#wa_acid_perc').val(AcidTypeData[0].AcidPrc); |
1980 } |
1969 } |
1981 if (last_acid == '') |
1970 if (last_acid == '') |
1982 last_acid = AcidTypeData[$('#wa_acid_name').val()].nl; |
1971 last_acid = AcidTypeData[dataRecord.wa_acid_name].nl; |
1983 |
1972 |
1984 if ($('#wa_base_name').val() < 0 || $('#wa_base_name').val() > 3) { |
1973 if (parseFloat(dataRecord.wa_acid_perc) == 0) { |
|
1974 dataRecord.wa_acid_perc = AcidTypeData[AT].AcidPrc; |
|
1975 $('#wa_acid_perc').val(AcidTypeData[AT].AcidPrc); |
|
1976 } |
|
1977 |
|
1978 if (dataRecord.wa_base_name < 0 || dataRecord.wa_base_name > 3) { |
1985 $('#wa_base_name').val(0); |
1979 $('#wa_base_name').val(0); |
1986 dataRecord.wa_base_name = 0; |
1980 dataRecord.wa_base_name = 0; |
1987 } |
1981 } |
1988 if (last_base == '') |
1982 if (last_base == '') |
1989 last_base = BaseTypeData[$('#wa_base_name').val()].nl; |
1983 last_base = BaseTypeData[dataRecord.wa_base_name].nl; |
1990 |
1984 |
1991 AT = dataRecord.wa_acid_name; |
1985 AT = dataRecord.wa_acid_name; |
1992 BT = dataRecord.wa_base_name; |
1986 BT = dataRecord.wa_base_name; |
1993 |
1987 |
1994 result = GetAcidSpecs(AT); |
1988 /* Note that the next calculations do not correct the pH change by the added salts. |
1995 pK1 = result.pK1; |
1989 This pH change is at most 0.1 pH and is a minor difference in Acid amount. */ |
1996 pK2 = result.pK2; |
|
1997 pK3 = result.pK3; |
|
1998 MolWt = result.MolWt; |
|
1999 AcidSG = result.AcidSG; |
|
2000 AcidPrc = result.AcidPrc; |
|
2001 |
1990 |
2002 if (dataRecord.calc_acid) { |
1991 if (dataRecord.calc_acid) { |
|
1992 $('.c_mashph').show(); |
|
1993 /* Auto calculate pH */ |
2003 TpH = parseFloat(dataRecord.mash_ph); |
1994 TpH = parseFloat(dataRecord.mash_ph); |
2004 protonDeficit = ProtonDeficit(TpH); |
1995 protonDeficit = ProtonDeficit(TpH); |
2005 console.log('calc_acid tgt: ' + TpH + ' protonDeficit: ' + protonDeficit); |
1996 console.log('calc_acid tgt: ' + TpH + ' protonDeficit: ' + protonDeficit); |
2006 if (protonDeficit > 0) { // Add acid |
1997 if (protonDeficit > 0) { // Add acid |
2007 $('#wa_base').val(0); |
1998 $('#wa_base').val(0); |
2008 setWaterAgent(last_base, 0); |
1999 setWaterAgent(last_base, 0); |
2009 frac = CalcFrac(TpH, pK1, pK2, pK3); |
2000 frac = CalcFrac(TpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
2010 Acid = protonDeficit / frac; |
2001 Acid = protonDeficit / frac; |
2011 Acid *= MolWt; // mg |
2002 Acid *= AcidTypeData[AT].MolWt; // mg |
2012 Acidmg = Acid; |
2003 Acidmg = Acid; |
2013 Acid = Acid / AcidSG; // ml |
2004 Acid = Acid / AcidTypeData[AT].AcidSG; // ml |
2014 |
2005 Acid = Round(Acid / (parseFloat(dataRecord.wa_acid_perc) / 100), 2); // ml |
2015 if (parseFloat($('#wa_acid_perc').jqxNumberInput('decimal')) == 0) |
2006 console.log('Mash auto Acid final ml: ' + Acid); |
2016 $('#wa_acid_perc').val(AcidPrc); |
2007 $('#wa_acid').val(Acid); |
2017 Acid = Acid * AcidPrc / (parseFloat($('#wa_acid_perc').jqxNumberInput('decimal')) / 100); // ml |
2008 setWaterAgent(AcidTypeData[AT].nl, Acid); |
2018 console.log('Final ml: ' + Acid); |
|
2019 $('#wa_acid').val(Math.round(Acid * 100) / 100); |
|
2020 setWaterAgent(AcidTypeData[AT].nl, Math.round(Acid * 100) / 100); |
|
2021 |
2009 |
2022 bicarbonate = bicarbonate - protonDeficit * frac / liters; |
2010 bicarbonate = bicarbonate - protonDeficit * frac / liters; |
2023 total_alkalinity = bicarbonate * 50 / 61; |
2011 total_alkalinity = bicarbonate * 50 / 61; |
2024 } else if (protonDeficit < 0) { //Add base |
2012 } else if (protonDeficit < 0) { //Add base |
2025 $('#wa_acid').val(0); |
2013 $('#wa_acid').val(0); |
2026 setWaterAgent(last_acid, 0); |
2014 setWaterAgent(last_acid, 0); |
2027 r1d = Math.pow(10, (TpH - 6.38)); |
2015 r1d = Math.pow(10, (TpH - 6.35)); |
2028 r2d = Math.pow(10, (TpH - 10.38)); |
2016 r2d = Math.pow(10, (TpH - 10.33)); |
2029 f1d = 1 / (1 + r1d + r1d * r2d); |
2017 f1d = 1 / (1 + r1d + r1d * r2d); |
2030 f2d = f1d * r1d; |
2018 f2d = f1d * r1d; |
2031 f3d = f2d * r2d; |
2019 f3d = f2d * r2d; |
2032 switch (BT) { |
2020 switch (BT) { |
2033 case 0: RA = -protonDeficit / (f1d - f3d); //Sodiumbicarbonate, mmol totaal |
2021 case 0: |
2034 RA = RA * MMNaHCO3 / 1000; //gram |
2022 RA = -protonDeficit / (f1d - f3d); //Sodiumbicarbonate, mmol totaal |
2035 $('#wa_base').val(Round(RA, 2)); |
2023 RA = RA * MMNaHCO3 / 1000; //gram |
2036 setWaterAgent('NaHCO3', Round(RA, 2)); |
2024 $('#wa_base').val(Round(RA, 2)); |
2037 if (liters > 0) { |
2025 setWaterAgent('NaHCO3', Round(RA, 2)); |
2038 // Na |
2026 if (liters > 0) { |
2039 RA = parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl + |
2027 // Na |
2040 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3; |
2028 RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 + |
2041 RA = 1000 * RA / liters; |
2029 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3 * 1000) / liters; |
2042 sodium = wg_sodium + RA; |
2030 sodium = wg_sodium + RA; |
2043 // HCO3 |
2031 // HCO3 |
2044 RA = parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3; |
2032 RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3 * 1000) / liters; |
2045 RA = 1000 * RA / liters; |
2033 bicarbonate = wg_bicarbonate + RA; |
2046 bicarbonate = wg_bicarbonate + RA; |
2034 total_alkalinity = bicarbonate * 50 / 61; |
2047 total_alkalinity = bicarbonate * 50 / 61; |
2035 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2048 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2036 } |
2049 } |
2037 break; |
2050 break; |
2038 case 1: |
2051 case 1: RA = -protonDeficit / (2 * f1d + f2d); // Sodiumcarbonate, mmol totaal |
2039 RA = -protonDeficit / (2 * f1d + f2d); // Sodiumcarbonate, mmol totaal |
2052 RA = RA * MMNa2CO3 / 1000; //gram |
2040 RA = RA * MMNa2CO3 / 1000; //gram |
2053 $('#wa_base').val(Round(RA, 2)); |
2041 $('#wa_base').val(Round(RA, 2)); |
2054 setWaterAgent('Na2CO3', Round(RA, 2)); |
2042 setWaterAgent('Na2CO3', Round(RA, 2)); |
2055 if (liters > 0) { |
2043 if (liters > 0) { |
2056 RA = parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl + |
2044 RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 + |
2057 parseFloat($('#wa_base').jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; |
2045 parseFloat($('#wa_base').jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3 * 1000) / liters; |
2058 RA = 1000 * RA / liters; |
2046 sodium = wg_sodium + RA; |
2059 sodium = wg_sodium + RA; |
2047 // HCO3 |
2060 // HCO3 |
2048 RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3 * 1000) / liters; |
2061 RA = parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3; |
2049 bicarbonate = wg_bicarbonate + RA; |
2062 RA = 1000 * RA / liters; |
2050 total_alkalinity = bicarbonate * 50 / 61; |
2063 bicarbonate = wg_bicarbonate + RA; |
2051 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2064 total_alkalinity = bicarbonate * 50 / 61; |
2052 } |
2065 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2053 break; |
2066 } |
2054 case 2: |
2067 break; |
2055 RA = -protonDeficit * (f1d - f3d); // Calciumcarbonate, mmol totaal |
2068 case 2: RA = -protonDeficit * (f1d - f3d); // Calciumcarbonate, mmol totaal |
2056 RA = RA * MMCaCO3 / 1000; //gram |
2069 RA = RA * MMCaCO3 / 1000; //gram |
2057 //but only 1/3 is effective, so add 3 times as much |
2070 //but only 1/3 is effective, so add 3 times as much |
2058 RA = 3 * RA; |
2071 RA = 3 * RA; |
2059 $('#wa_base').val(Round(RA, 2)); |
2072 $('#wa_base').val(Round(RA, 2)); |
2060 setWaterAgent('CaCO3', Round(RA, 2)); |
2073 setWaterAgent('CaCO3', Round(RA, 2)); |
2061 if (liters > 0) { |
2074 if (liters > 0) { |
2062 //Bicarbonate |
2075 //Bicarbonate |
2063 RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3 * 1000) / liters; |
2076 RA = parseFloat($('#wa_base').jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3; |
2064 bicarbonate = wg_bicarbonate + RA; |
2077 RA = 1000 * RA / liters; |
2065 total_alkalinity = bicarbonate * 50 / 61; |
2078 bicarbonate = wg_bicarbonate + RA; |
2066 //Ca precipitates out as Ca10(PO4)6(OH)2 |
2079 total_alkalinity = bicarbonate * 50 / 61; |
2067 RA = (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 + |
2080 //Ca precipitates out as Ca10(PO4)6(OH)2 |
2068 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000 + |
2081 RA = parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 + |
2069 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa / MMCaCO3 * 1000) / liters; |
2082 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 + |
2070 calcium = wg_calcium + RA; |
2083 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa / MMCaCO3; |
2071 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2084 RA = 1000 * RA / liters; |
2072 } |
2085 calcium = wg_calcium + RA; |
2073 break; |
2086 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2074 case 3: |
2087 } |
2075 RA = -protonDeficit / 19.3; // Calciumhydroxide |
2088 break; |
2076 $('#wa_base').val(Round(RA, 2)); |
2089 case 3: RA = -protonDeficit / 19.3; // Calciumhydroxide |
2077 setWaterAgent('Ca(OH)2', Round(RA, 2)); |
2090 $('#wa_base').val(Round(RA, 2)); |
2078 if (liters > 0) { |
2091 setWaterAgent('Ca(OH)2', Round(RA, 2)); |
2079 // Bicarbonate |
2092 if (liters > 0) { |
2080 RA = -protonDeficit / liters; |
2093 // Bicarbonate |
2081 total_alkalinity = wg_total_alkalinity + RA; |
2094 RA = -protonDeficit / liters; |
2082 bicarbonate = total_alkalinity * 61 / 50; |
2095 total_alkalinity = wg_total_alkalinity + RA; |
2083 // Calcium |
2096 bicarbonate = total_alkalinity * 61 / 50; |
2084 RA = (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 + |
2097 // Calcium |
2085 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000 + |
2098 RA = parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 + |
2086 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa / MMCaOH2 * 1000) / liters; |
2099 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 + |
2087 calcium = wg_calcium + RA; |
2100 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa / MMCaOH2; |
2088 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2101 RA = 1000 * RA / liters; |
2089 } |
2102 calcium = wg_calcium + RA; |
2090 break; |
2103 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
|
2104 } |
|
2105 break; |
|
2106 } |
2091 } |
2107 } |
2092 } |
2108 ph = TpH; |
2093 ph = TpH; |
2109 $('#wb_ph').val(Math.round(ph * 10) / 10); |
2094 $('#wb_ph').val(Round(ph, 2)); |
|
2095 $('#est_mash_ph').val(Round(ph, 2)); |
2110 } else { // Manual |
2096 } else { // Manual |
|
2097 /* Manual calculate pH */ |
|
2098 $('.c_mashph').hide(); |
2111 console.log('calc_acid no'); |
2099 console.log('calc_acid no'); |
2112 // First add base salts |
2100 if (parseFloat($('#wa_base').jqxNumberInput('decimal')) > 0 && liters > 0) { |
2113 if (parseFloat($('#wa_base').jqxNumberInput('decimal')) > 0) { |
2101 /* First add the base salts */ |
2114 if (liters > 0) { |
2102 switch (BT) { |
2115 switch (BT) { |
2103 case 0: // Sodiumbicarbonate, Na |
2116 case 0: // Sodiumbicarbonate, Na |
2104 RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 + |
2117 RA = parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl + |
2105 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3 * 1000) / liters; |
2118 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3; |
2106 sodium = wg_sodium + RA; |
2119 RA = 1000 * RA / liters; |
2107 // HCO3 |
2120 sodium = wg_sodium + RA; |
2108 RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3 * 1000) / liters; |
2121 // HCO3 |
2109 bicarbonate = wg_bicarbonate + RA; |
2122 RA = parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3; |
2110 total_alkalinity = bicarbonate * 50 / 61; |
2123 RA = 1000 * RA / liters; |
2111 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2124 bicarbonate = wg_bicarbonate + RA; |
2112 break; |
2125 total_alkalinity = bicarbonate * 50 / 61; |
2113 case 1: // Sodiumcarbonate |
2126 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2114 RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 + |
2127 break; |
2115 parseFloat($('#wa_base').jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3 * 1000) / liters; |
2128 case 1: // Sodiumcarbonate |
2116 sodium = wg_sodium + RA; |
2129 RA = parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl + |
2117 // HCO3 |
2130 parseFloat($('#wa_base').jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; |
2118 RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3 * 1000) / liters; |
2131 RA = 1000 * RA / liters; |
2119 bicarbonate = wg_bicarbonate + RA; |
2132 sodium = wg_sodium + RA; |
2120 total_alkalinity = bicarbonate * 50 / 61; |
2133 // HCO3 |
2121 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2134 RA = parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3; |
2122 break; |
2135 RA = 1000 * RA / liters; |
2123 case 2: // Calciumcarbonate: Bicarbonate |
2136 bicarbonate = wg_bicarbonate + RA; |
2124 RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) / 3 * MMHCO3 * 1000 / MMCaCO3) / liters; |
2137 total_alkalinity = bicarbonate * 50 / 61; |
2125 bicarbonate = wg_bicarbonate + RA; |
2138 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2126 total_alkalinity = bicarbonate * 50 / 61; |
2139 break; |
2127 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2140 case 2: // Calciumcarbonate: Bicarbonate |
2128 // Ca |
2141 RA = parseFloat($('#wa_base').jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3; |
2129 RA = (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa * 1000 / MMCaCl2 + |
2142 RA = 1000 * RA / liters; |
2130 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa * 1000 / MMCaSO4 + |
2143 bicarbonate = wg_bicarbonate + RA; |
2131 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa * 1000 / MMCaCO3) / liters; |
2144 total_alkalinity = bicarbonate * 50 / 61; |
2132 calcium = wg_calcium + RA; |
2145 RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); |
2133 break; |
2146 // Ca |
|
2147 RA = parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 + |
|
2148 parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 + |
|
2149 parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa / MMCaCO3; |
|
2150 RA = 1000 * RA / liters; |
|
2151 calcium = wg_calcium + RA; |
|
2152 break; |
|
2153 } |
|
2154 } |
2134 } |
2155 } |
2135 } |
2156 |
2136 |
2157 TpH = parseFloat(dataRecord.mash_ph); |
2137 pHa = Round(ph, 3); // Adjusted water pH |
2158 pHa = MashpH(); // This one is in demi water, should be in adjusted water??? |
2138 // Then calculate the new pH with added acids and malts |
2159 // Then calculate the new pH with added acids |
2139 console.log('Mash pH: ' + pHa); |
2160 if (parseFloat($('#wa_acid').jqxNumberInput('decimal')) > 0) { |
2140 Acid = AcidTypeData[AT].AcidSG * (parseFloat(dataRecord.wa_acid_perc) / 100); // ml |
2161 console.log('TpH: ' + TpH + ' water: ' + pHa); |
2141 Acid *= parseFloat($('#wa_acid').jqxNumberInput('decimal')); |
2162 Acid = parseFloat($('#wa_acid').jqxNumberInput('decimal')); |
2142 Acid /= AcidTypeData[AT].MolWt; // mg |
2163 if (parseFloat($('#wa_acid_perc').jqxNumberInput('decimal')) == 0) |
2143 Acidmg = Acid; |
2164 $('#wa_acid_perc').val(AcidPrc); |
2144 |
2165 Acid = Acid / AcidPrc * (parseFloat($('#wa_acid_perc').jqxNumberInput('decimal')) / 100); // ml |
2145 //find the pH where the protondeficit = protondeficit by the acid |
2166 Acid *= AcidSG; // ml |
2146 frac = CalcFrac(pHa, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
2167 Acid /= MolWt; // mg |
2147 protonDeficit = Round(Acid * frac, 3); |
2168 Acidmg = Acid; |
2148 //console.log('protonDeficit Acid: ' + protonDeficit + ' frac: ' + frac + ' pH: ' + pHa); |
2169 |
2149 |
2170 //find the pH where the protondeficit = protondeficit by the acid |
2150 deltapH = 0.001; |
2171 frac = CalcFrac(pHa, pK1, pK2, pK3); |
2151 deltapd = 0.1; |
2172 protonDeficit = Acid * frac; |
2152 pd = Round(ProtonDeficit(pHa), 6); |
2173 |
2153 n = 0; |
2174 deltapH = 0.001; |
2154 while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 4000)) { |
2175 deltapd = 0.1; |
|
2176 pd = ProtonDeficit(pHa); |
|
2177 n = 0; |
|
2178 while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 2000)) { |
|
2179 n++; |
2155 n++; |
2180 if (pd < (protonDeficit - deltapd)) |
2156 if (pd < (protonDeficit - deltapd)) |
2181 pHa -= deltapH; |
2157 pHa -= deltapH; |
2182 else if (pd > (protonDeficit + deltapd)) |
2158 else if (pd > (protonDeficit + deltapd)) |
2183 pHa += deltapH; |
2159 pHa += deltapH; |
2184 frac = CalcFrac(pHa, pK1, pK2, pK3); |
2160 frac = CalcFrac(pHa, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
2185 protonDeficit = Acid * frac; |
2161 protonDeficit = Acid * frac; |
2186 pd = ProtonDeficit(pHa); |
2162 pd = ProtonDeficit(pHa); |
2187 } |
|
2188 console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa); |
|
2189 RA = wg_bicarbonate - protonDeficit * frac / liters; |
|
2190 bicarbonate = RA; |
|
2191 total_alkalinity = RA * 50 / 61; |
|
2192 ph = pHa; |
|
2193 $('#wb_ph').val(Round(ph, 1)); |
|
2194 } |
2163 } |
|
2164 //console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa); |
|
2165 RA = wg_bicarbonate - protonDeficit * frac / liters; |
|
2166 bicarbonate = RA; |
|
2167 total_alkalinity = RA * 50 / 61; |
|
2168 ph = pHa; |
|
2169 $('#wb_ph').val(Round(ph, 2)); |
|
2170 $('#est_mash_ph').val(Round(ph, 2)); |
2195 } |
2171 } |
2196 |
2172 |
2197 if ((AT == 3) && (liters > 0)) { // Sulfuctic / Zwavelzuur |
2173 if ((AT == 3) && (liters > 0)) { // Sulfuctic / Zwavelzuur |
2198 RA = parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 + |
2174 RA = parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 + |
2199 parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 + |
2175 parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 + |
2331 $('#sparge_source').val(0); |
2304 $('#sparge_source').val(0); |
2332 } |
2305 } |
2333 } |
2306 } |
2334 |
2307 |
2335 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH |
2308 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH |
2336 r1 = Math.pow(10, Source_pH - 6.38); |
2309 var r1 = Math.pow(10, Source_pH - 6.35); |
2337 r2 = Math.pow(10, Source_pH - 10.373); |
2310 var r2 = Math.pow(10, Source_pH - 10.33); |
2338 d = 1 + r1 + r1 * r2; |
2311 var d = 1 + r1 + r1 * r2; |
2339 f1 = 1 / d; |
2312 var f1 = 1 / d; |
2340 f3 = r1 * r2 / d; |
2313 var f3 = r1 * r2 / d; |
2341 |
2314 |
2342 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) |
2315 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) |
2343 r143 = Math.pow(10, 4.3 - 6.38); |
2316 var r143 = Math.pow(10, 4.3 - 6.35); |
2344 r243 = Math.pow(10, 4.3 - 10.373); |
2317 var r243 = Math.pow(10, 4.3 - 10.33); |
2345 d43 = 1 + r143 + r143 * r243; |
2318 var d43 = 1 + r143 + r143 * r243; |
2346 f143 = 1 / d43; |
2319 var f143 = 1 / d43; |
2347 f343 = r143 * r243 / d43; |
2320 var f343 = r143 * r243 / d43; |
2348 |
2321 |
2349 //Step 3. Convert the sample alkalinity to milliequivalents/L |
|
2350 alkalinity = Source_alkalinity / 50; |
|
2351 //Step 4. Solve |
2322 //Step 4. Solve |
2352 Ct = (alkalinity - 1000 * (Math.pow(10, -4.3) - Math.pow(10, -Source_pH))) / ((f143 - f1) + (f3 - f343)); |
2323 //var Ct = (alkalinity - 1000 * (Math.pow(10, -4.3) - Math.pow(10, -Source_pH))) / ((f143 - f1) + (f3 - f343)); |
|
2324 var Ct = Source_alkalinity / 50 / ((f143 - f1) + (f3 - f343)); |
2353 |
2325 |
2354 //Step 5. Compute mole fractions at desired pH |
2326 //Step 5. Compute mole fractions at desired pH |
2355 r1g = Math.pow(10, TargetpH - 6.38); |
2327 var r1g = Math.pow(10, TargetpH - 6.35); |
2356 r2g = Math.pow(10, TargetpH - 10.373); |
2328 var r2g = Math.pow(10, TargetpH - 10.33); |
2357 dg = 1 + r1g + r1g * r2g; |
2329 var dg = 1 + r1g + r1g * r2g; |
2358 f1g = 1 / dg; |
2330 var f1g = 1 / dg; |
2359 f3g = r1g * r2g / dg; |
2331 var f3g = r1g * r2g / dg; |
2360 |
2332 |
2361 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) |
2333 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) |
2362 Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l |
2334 var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l |
2363 Acid += 0.01; // Add acid that would be required for distilled water. |
2335 Acid += 0.01; // Add acid that would be required for distilled water. |
2364 if (dataRecord.sparge_acid_type < 0 || dataRecord.sparge_acid_type > 3) { |
2336 |
|
2337 //Step 8. Get the acid data. |
|
2338 AT = dataRecord.sparge_acid_type; |
|
2339 if (AT < 0 || AT >= AcidTypeData.length) { |
|
2340 AT = 0; |
2365 dataRecord.sparge_acid_type = 0; |
2341 dataRecord.sparge_acid_type = 0; |
2366 $('#sparge_acid_type').val(0); |
2342 $('#sparge_acid_type').val(0); |
2367 } |
2343 dataRecord.sparge_acid_perc = AcidTypeData[0].AcidPrc; |
2368 |
2344 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); |
2369 //Step 8. Get the acid data. |
2345 } |
2370 AT = dataRecord.sparge_acid_type; |
2346 var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
2371 result = GetAcidSpecs(AT); |
|
2372 pK1 = result.pK1; |
|
2373 pK2 = result.pK2; |
|
2374 pK3 = result.pK3; |
|
2375 MolWt = result.MolWt; |
|
2376 AcidSG = result.AcidSG; |
|
2377 AcidPrc = result.AcidPrc; |
|
2378 fract = CalcFrac(TargetpH, pK1, pK2, pK3); |
|
2379 |
2347 |
2380 //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. |
2348 //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. |
2381 Acid /= fract; |
2349 Acid /= fract; |
2382 |
2350 |
2383 //Step 10. Multiply by molecular weight of the acid |
2351 //Step 10. Multiply by molecular weight of the acid |
2384 Acid *= MolWt; //mg |
2352 Acid *= AcidTypeData[AT].MolWt; //mg |
2385 |
2353 |
2386 Acid = Acid / AcidSG; //ml ; 88% lactic solution |
2354 //Step 11. Divide by Specific Gravity and Percentage to get the final ml. |
2387 f1 = dataRecord.sparge_acid_perc; |
2355 Acid = Acid / AcidTypeData[AT].AcidSG / (dataRecord.sparge_acid_perc / 100); //ml |
2388 if (f1 <= 0.1) |
2356 Acid *= dataRecord.sparge_volume; //ml acid total |
2389 f1 = AcidPrc; |
|
2390 Acid = Acid * AcidPrc / (f1 / 100); |
|
2391 |
|
2392 Acid *= dataRecord.sparge_volume; //ml lactic acid total |
|
2393 Acid = Round(Acid, 2); |
2357 Acid = Round(Acid, 2); |
2394 dataRecord.sparge_acid_amount = Acid / 1000; |
2358 dataRecord.sparge_acid_amount = Acid / 1000; |
2395 $('#sparge_acid_amount').val(Acid); |
2359 $('#sparge_acid_amount').val(Acid); |
2396 } |
2360 } |
2397 |
2361 |