# HG changeset patch # User Michiel Broek # Date 1546035522 -3600 # Node ID 041af8a82d778f801987f2d3cb89537fdd843faf # Parent ef298b5aa994acb353f50066a2c6ad2ca26fb4a2 Some pH calculations cane use twice as much loops, probably because we have better float precision then the original pascal code. More variables to prevent html reads. Use predicted mash pH (the grist in demi water) to calculate the pH shift from the tapwater to the target pH. It's better but not right yet. Or it is right and brouwhulp is far off. diff -r ef298b5aa994 -r 041af8a82d77 www/js/rec_edit.js --- a/www/js/rec_edit.js Thu Dec 27 22:30:26 2018 +0100 +++ b/www/js/rec_edit.js Fri Dec 28 23:18:42 2018 +0100 @@ -252,9 +252,7 @@ var row = rows[i]; if (row.m_name == name) { var id = $("#miscGrid").jqxGrid('getrowid', i); -// console.log("name found, erase "+ id); var commit = $("#miscGrid").jqxGrid('deleterow', id); -// console.log("result: "+commit); } } } else { @@ -268,7 +266,7 @@ break; } } - console.log("set something, found: "+found); +// console.log("set something, found: "+found); if (! found) { // console.log("need to add this misc"); var miscs = new $.jqx.dataAdapter(miscInvSource, { @@ -287,7 +285,6 @@ row["m_weight"] = amount; row["m_amount_is_weight"] = record.amount_is_weight; var commit = $("#miscGrid").jqxGrid('addrow', null, row); -// console.log("result: "+commit); } } } @@ -390,7 +387,7 @@ var deltapH = 0.001; var deltapd = 0.1; var pd = ProtonDeficit(pH); - while (((pd < -deltapd) || (pd > deltapd)) && (n < 1000)) { + while (((pd < -deltapd) || (pd > deltapd)) && (n < 2000)) { n++; if (pd < -deltapd) pH -= deltapH; @@ -399,6 +396,7 @@ pd = ProtonDeficit(pH); } console.log("MashpH() n: "+n+" pH: "+pH); + return pH; } function GetAcidSpecs(AT) { @@ -489,16 +487,25 @@ ph = dataRecord.w1_ph; } $('#wg_amount').val(liters); + var wg_calcium = calcium; $('#wg_calcium').val(Math.round(calcium * 10) / 10); + var wg_magnesium = magnesium; $('#wg_magnesium').val(Math.round(magnesium * 10) / 10); + var wg_sodium = sodium; $('#wg_sodium').val(Math.round(sodium * 10) / 10); + var wg_total_alkalinity = total_alkalinity; $('#wg_total_alkalinity').val(Math.round(total_alkalinity * 10) / 10); + var wg_chloride = chloride; $('#wg_chloride').val(Math.round(chloride * 10) / 10); + var wg_sulfate = sulfate; $('#wg_sulfate').val(Math.round(sulfate * 10) / 10); // Note: brouwhulp has the malts included here in the result. + var wg_ph = ph; $('#wg_ph').val(Math.round(ph * 10) / 10); - $('#wb_ph').val(Math.round(ph * 10) / 10); +// $('#wb_ph').val(Math.round(ph * 10) / 10); + $('#wb_ph').val(Math.round(MashpH() * 10) / 10); bicarbonate = total_alkalinity * 1.22; + var wg_bicarbonate = bicarbonate; // Noot: de volgende berekeningen geven bijna gelijke resultaten in Brun'water. // Calculate Ca @@ -525,6 +532,15 @@ chloride += 1000 * RA / liters; // Einde noot. + if ($("#wa_acid_name").val() == "") { + $("#wa_acid_name").val('Melkzuur'); + last_acid = 'Melkzuur'; + } + if ($("#wa_base_name").val() == "") { + $("#wa_base_name").val('NaHCO3'); + last_base = 'NaHCO3'; + } + var AT = $("#wa_acid_name").val(); var BT = $("#wa_base_name").val(); @@ -544,15 +560,11 @@ if (protonDeficit > 0) { // Add acid $("#wa_base").val(0); setWaterAgent(last_base, 0); - if ($("#wa_acid_name").val() == "") { - $("#wa_acid_name").val('Melkzuur'); - last_acid = 'Melkzuur'; - } frac = CalcFrac(TpH, pK1, pK2, pK3); Acid = protonDeficit / frac; - console.log("Required moles: "+Acid); + // console.log("Required moles: "+Acid); Acid *= MolWt; // mg - // Acidmg = Acid; + Acidmg = Acid; // console.log("Required mg: "+Acidmg); Acid = Acid / AcidSG; // ml @@ -568,10 +580,6 @@ } else if (protonDeficit < 0) { //Add base $("#wa_acid").val(0); setWaterAgent(last_acid, 0); - if ($("#wa_base_name").val() == "") { - $("#wa_base_name").val('NaHCO3'); - last_base = 'NaHCO3'; - } r1d = Math.pow(10, (TpH - 6.38)); r2d = Math.pow(10, (TpH - 10.38)); f1d = 1 / (1 + r1d + r1d * r2d); @@ -587,11 +595,11 @@ RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMNa / MMNaHCO3; RA = 1000 * RA / liters; - sodium = parseFloat($('#wg_sodium').jqxNumberInput('decimal')) + RA; + sodium = wg_sodium + RA; // HCO3 RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3; RA = 1000 * RA / liters; - bicarbonate = (parseFloat($('#wg_total_alkalinity').jqxNumberInput('decimal')) * 1.22) + RA; + bicarbonate = wg_bicarbonate + RA; total_alkalinity = bicarbonate * 50 / 61; } break; @@ -603,11 +611,11 @@ RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + parseFloat($("#wa_base").jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; RA = 1000 * RA / liters; - sodium = parseFloat($('#wg_sodium').jqxNumberInput('decimal')) + RA; + sodium = wg_sodium + RA; // HCO3 RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3; RA = 1000 * RA / liters; - bicarbonate = (parseFloat($('#wg_total_alkalinity').jqxNumberInput('decimal')) * 1.22) + RA; + bicarbonate = wg_bicarbonate + RA; total_alkalinity = bicarbonate * 50 / 61; } break; @@ -621,14 +629,14 @@ //Bicarbonate RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3; RA = 1000 * RA / liters; - bicarbonate = (parseFloat($('#wg_total_alkalinity').jqxNumberInput('decimal')) * 1.22) + RA; + bicarbonate = wg_bicarbonate + RA; total_alkalinity = bicarbonate * 50 / 61; //Ca precipitates out as Ca10(PO4)6(OH)2 RA = parseFloat($("#wa_cacl2").jqxNumberInput('decimal')) * MMCa / MMCaCl2 + parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaCO3; RA = 1000 * RA / liters; - calcium = parseFloat($('#wg_calcium').jqxNumberInput('decimal')) + RA; + calcium = wg_calcium + RA; } break; case 'Ca(OH)2': base = -protonDeficit / 19.3; // g @@ -637,14 +645,14 @@ if (liters > 0) { // Bicarbonate RA = -protonDeficit / liters; - total_alkalinity = parseFloat($('#wg_total_alkalinity').jqxNumberInput('decimal')) + RA; + total_alkalinity = wg_total_alkalinity + RA; bicarbonate = total_alkalinity * 61 / 50; // Calcium RA = parseFloat($("#wa_cacl2").jqxNumberInput('decimal')) * MMCa / MMCaCl2 + parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaOH2; RA = 1000 * RA / liters; - calcium = parseFloat($('#wg_calcium').jqxNumberInput('decimal')) + RA; + calcium = wg_calcium + RA; } break; } @@ -659,8 +667,8 @@ } TpH = parseFloat(dataRecord.mash_ph); - pHa = parseFloat($('#wg_ph').jqxNumberInput('decimal')); - //pHa = parseFloat(dataRecord.mash_ph); + // pHa = MashpH(); + pHa = parseFloat($("#wb_ph").jqxNumberInput('decimal')); // Then calculate the new pH with added acids if (parseFloat($("#wa_acid").jqxNumberInput('decimal')) > 0) { console.log("TpH: "+TpH+" water: "+pHa); @@ -670,18 +678,19 @@ Acid = Acid / AcidPrc * (parseFloat($("#wa_acid_perc").jqxNumberInput('decimal')) / 100); // ml Acid = Acid * AcidSG; // ml Acid = Acid / MolWt; // mg + Acidmg = Acid; //find the pH where the protondeficit = protondeficit by the acid frac = CalcFrac(pHa, pK1, pK2, pK3); protonDeficit = Acid * frac; - deltapH = 0.01; + deltapH = 0.001; deltapd = 0.1; pd = ProtonDeficit(TpH); n = 0; console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa); - while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 1000)) { + while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 2000)) { n++; if (pd < (protonDeficit-deltapd)) pHa = pHa - deltapH; @@ -693,117 +702,30 @@ // console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa); } console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa); - + RA = wg_bicarbonate - protonDeficit * frac / liters; + bicarbonate = RA; + total_alkalinity = RA * 50 / 61; + ph = pHa; + $('#wb_ph').val(Math.round(ph * 10) / 10); } - } -/* - TpH = parseFloat(dataRecord.mash_ph); - if (TpH < 5.0 || TpH > 6.0) { - TpH = 5.4; - dataRecord.mash_ph = 5.4; - $("#mash_ph").val(5.4); - } - var acid_amount = parseFloat($("#wa_acid").jqxNumberInput('decimal')); - var acid_perc = parseFloat($("#wa_acid_perc").jqxNumberInput('decimal')); - - switch ($("#wa_acid_name").val()) { - case 'Melkzuur': pK1 = 3.08; - pK2 = 20; - pK3 = 20; - MolWt = 90.08; - AcidSG = 1214; //@88% - AcidPrc = 0.88; - frac = CalcFrac(TpH, pK1, pK2, pK3); - acid += acid_amount * acid_perc / 100 * AcidSG / MolWt * frac / liters; //mEq/l - break; - - case 'Zoutzuur': pK1 = -10; - pK2 = 20; - pK3 = 20; - MolWt = 36.46; - AcidSG = 1142; //@28% - AcidPrc = 0.28; - frac = CalcFrac(TpH, pK1, pK2, pK3); - Acidmg = acid_amount * acid_perc / 100 * AcidSG / liters; - acid += Acidmg / MolWt * frac; //mEq/l - chloride += Acidmg / 1000 * MMCl / (MMCl + 1); - break; - - case 'Fosforzuur': pK1 = 2.12; - pK2 = 7.20; - pK3 = 12.44; - MolWt = 98.00; - AcidSG = 1170; //@25% - AcidPrc = 0.25; - frac = CalcFrac(TpH, pK1, pK2, pK3); - Acidmg = acid_amount * acid_perc / 100 * AcidSG / liters; - acid += Acidmg / MolWt * frac; //mEq/l - break; - - case 'Zwavelzuur': pK1 = -10; - pK2 = 1.92; - pK3 = 20; - MolWt = 98.07; - AcidSG = 1700; //@93% - AcidPrc = 0.93; - frac = CalcFrac(TpH, pK1, pK2, pK3); - Acidmg = acid_amount * acid_perc / 100 * AcidSG / liters; - acid += Acidmg / MolWt * frac; //mEq/l - sulfate += Acidmg / 1000 * MMSO4 / (MMSO4 + 2); - break; } - if (dataRecord.calc_acid) { - } else if (liters > 0) { // not calc_acid - // First add base salts - if (parseFloat($("#wa_base").jqxNumberInput('decimal')) > 0) { - - } - - pHa = parseFloat($("#wb_ph").jqxNumberInput('decimal')); - console.log("Adjusted water mash pH: "+pHa); - // Then calculate the new pH with added acids - if (parseFloat($("#wa_acid").jqxNumberInput('decimal')) > 0) { - acid = parseFloat($("#wa_acid").jqxNumberInput('decimal')); - if (parseFloat($("#wa_acid_perc").jqxNumberInput('decimal')) == 0) - $("#wa_acid_perc").val(AcidPrc); - console.log("screen value: "+acid); - acid = acid / AcidPrc * (parseFloat($("#wa_acid_perc").jqxNumberInput('decimal')) / 100); // ml - console.log("acid ml: "+acid); - acid = acid * AcidSG // ml - console.log("acid ml: "+acid); - acid = acid / MolWt; // mg - console.log("acid mg: "+acid); - var Acidmg = acid; - - frac = CalcFrac(pHa, pK1, pK2, pK3); - protonDeficit = acid * frac; + if ((AT == 'Zwavelzuur') && (liters > 0)) { + RA = parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 + + parseFloat($("#wa_mgso4").jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 + + Acidmg / 1000 * MMSO4 / (MMSO4 + 2); + RA = 1000 * RA / liters; + sulfate = wg_sulfate + RA; // Not add to sulfate?? + } else if ((AT == 'Zoutzuur') && (liters > 0)) { + RA = parseFloat($("#wa_cacl2").jqxNumberInput('decimal')) * MMCl / MMCaCl2 + + parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMCl / MMNaCl + + Acidmg / 1000 * MMCl / (MMCL + 1); + RA = 1000 * RA / liters; + chloride = wg_chloride + RA; + } - deltapH = 0.001; - deltapd = 0.1; - pd = ProtonDeficit(pHa); - n = 0; - console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa); - - while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 1000)) { - n++; - if (pd < (protonDeficit-deltapd)) - pHa = pHa - deltapH; - else if (pd > (protonDeficit+deltapd)) - pHa = pHa + deltapH; - frac = CalcFrac(pHa, pK1, pK2, pK3); - protonDeficit = acid * frac; - pd = ProtonDeficit(pHa); - console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa); - } - console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa); - } - } - total_alkalinity -= 50 / 61 * protonDeficit * frac / liters; - MashpH(); -*/ $('#tgt_bu').val(Math.round(GetBUGU() * 100) / 100); - $('#tgt_cl_so4').val(Math.round(GetOptClSO4ratio() * 10) / 10); + $('#tgt_cl_so4').val(Math.round(GetOptClSO4ratio() * 10) / 10); // Show real value too $('#wb_calcium').val(Math.round(calcium * 10) / 10); $('#wb_magnesium').val(Math.round(magnesium * 10) / 10);