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.

Fri, 28 Dec 2018 23:18:42 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Fri, 28 Dec 2018 23:18:42 +0100
changeset 155
041af8a82d77
parent 154
ef298b5aa994
child 156
35860890224c

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.

www/js/rec_edit.js file | annotate | diff | comparison | revisions
--- 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);

mercurial