742 $('#w1_chloride').val(dataRecord.w1_chloride); |
738 $('#w1_chloride').val(dataRecord.w1_chloride); |
743 $('#w1_sodium').val(dataRecord.w1_sodium); |
739 $('#w1_sodium').val(dataRecord.w1_sodium); |
744 $('#w1_magnesium').val(dataRecord.w1_magnesium); |
740 $('#w1_magnesium').val(dataRecord.w1_magnesium); |
745 $('#w1_total_alkalinity').val(dataRecord.w1_total_alkalinity); |
741 $('#w1_total_alkalinity').val(dataRecord.w1_total_alkalinity); |
746 $('#w1_ph').val(dataRecord.w1_ph); |
742 $('#w1_ph').val(dataRecord.w1_ph); |
|
743 $('#w1_bicarbonate').val(Bicarbonate(dataRecord.w1_total_alkalinity, dataRecord.w1_ph)); |
747 $('#w1_cost').val(dataRecord.w1_cost); |
744 $('#w1_cost').val(dataRecord.w1_cost); |
748 $('#w2_name').val(dataRecord.w2_name); |
745 $('#w2_name').val(dataRecord.w2_name); |
749 $('#w2_amount').val(dataRecord.w2_amount); |
746 $('#w2_amount').val(dataRecord.w2_amount); |
750 $('#w2_calcium').val(dataRecord.w2_calcium); |
747 $('#w2_calcium').val(dataRecord.w2_calcium); |
751 $('#w2_sulfate').val(dataRecord.w2_sulfate); |
748 $('#w2_sulfate').val(dataRecord.w2_sulfate); |
752 $('#w2_chloride').val(dataRecord.w2_chloride); |
749 $('#w2_chloride').val(dataRecord.w2_chloride); |
753 $('#w2_sodium').val(dataRecord.w2_sodium); |
750 $('#w2_sodium').val(dataRecord.w2_sodium); |
754 $('#w2_magnesium').val(dataRecord.w2_magnesium); |
751 $('#w2_magnesium').val(dataRecord.w2_magnesium); |
755 $('#w2_total_alkalinity').val(dataRecord.w2_total_alkalinity); |
752 $('#w2_total_alkalinity').val(dataRecord.w2_total_alkalinity); |
756 $('#w2_ph').val(dataRecord.w2_ph); |
753 $('#w2_ph').val(dataRecord.w2_ph); |
|
754 $('#w2_bicarbonate').val(Bicarbonate(dataRecord.w2_total_alkalinity, dataRecord.w2_ph)); |
757 $('#w2_cost').val(dataRecord.w2_cost); |
755 $('#w2_cost').val(dataRecord.w2_cost); |
758 $('#wg_amount').val(dataRecord.wg_amount); |
756 $('#wg_amount').val(dataRecord.wg_amount); |
759 $('#wg_calcium').val(dataRecord.wg_calcium); |
757 $('#wg_calcium').val(dataRecord.wg_calcium); |
760 $('#wg_sulfate').val(dataRecord.wg_sulfate); |
758 $('#wg_sulfate').val(dataRecord.wg_sulfate); |
761 $('#wg_chloride').val(dataRecord.wg_chloride); |
759 $('#wg_chloride').val(dataRecord.wg_chloride); |
1372 |
1365 |
1373 if (dataRecord.w1_name == '') { |
1366 if (dataRecord.w1_name == '') { |
1374 return; |
1367 return; |
1375 } |
1368 } |
1376 |
1369 |
|
1370 $('#w1_hardness').val(Hardness(dataRecord.w1_calcium, dataRecord.w1_magnesium)); |
|
1371 $('#w1_ra').val(ResidualAlkalinity(dataRecord.w1_total_alkalinity, dataRecord.w1_calcium, dataRecord.w1_magnesium)); |
|
1372 |
1377 // If there is a dillute water source, mix the waters. |
1373 // If there is a dillute water source, mix the waters. |
1378 if (dataRecord.w2_name != '') { |
1374 if (dataRecord.w2_name != '') { |
1379 liters = dataRecord.w1_amount + dataRecord.w2_amount; |
1375 liters = dataRecord.w1_amount + dataRecord.w2_amount; |
1380 calcium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_calcium, dataRecord.w2_calcium); |
1376 calcium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_calcium, dataRecord.w2_calcium); |
1381 magnesium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_magnesium, dataRecord.w2_magnesium); |
1377 magnesium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_magnesium, dataRecord.w2_magnesium); |
1382 sodium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sodium, dataRecord.w2_sodium); |
1378 sodium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sodium, dataRecord.w2_sodium); |
1383 chloride = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_chloride, dataRecord.w2_chloride); |
1379 chloride = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_chloride, dataRecord.w2_chloride); |
1384 sulfate = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sulfate, dataRecord.w2_sulfate); |
1380 sulfate = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sulfate, dataRecord.w2_sulfate); |
1385 total_alkalinity = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_total_alkalinity, dataRecord.w2_total_alkalinity); |
1381 total_alkalinity = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_total_alkalinity, dataRecord.w2_total_alkalinity); |
1386 ph = -Math.log10(((Math.pow(10, -dataRecord.w1_ph) * dataRecord.w1_amount) + (Math.pow(10, -dataRecord.w2_ph) * dataRecord.w2_amount)) / liters); |
1382 ph = -Math.log10(((Math.pow(10, -dataRecord.w1_ph) * dataRecord.w1_amount) + (Math.pow(10, -dataRecord.w2_ph) * dataRecord.w2_amount)) / liters); |
|
1383 $('#w2_hardness').val(Hardness(dataRecord.w2_calcium, dataRecord.w2_magnesium)); |
|
1384 $('#w2_ra').val(ResidualAlkalinity(dataRecord.w2_total_alkalinity, dataRecord.w2_calcium, dataRecord.w2_magnesium)); |
1387 } else { |
1385 } else { |
1388 liters = dataRecord.w1_amount; |
1386 liters = dataRecord.w1_amount; |
1389 calcium = dataRecord.w1_calcium; |
1387 calcium = dataRecord.w1_calcium; |
1390 magnesium = dataRecord.w1_magnesium; |
1388 magnesium = dataRecord.w1_magnesium; |
1391 sodium = dataRecord.w1_sodium; |
1389 sodium = dataRecord.w1_sodium; |
1392 chloride = dataRecord.w1_chloride; |
1390 chloride = dataRecord.w1_chloride; |
1393 sulfate = dataRecord.w1_sulfate; |
1391 sulfate = dataRecord.w1_sulfate; |
1394 total_alkalinity = dataRecord.w1_total_alkalinity; |
1392 total_alkalinity = dataRecord.w1_total_alkalinity; |
1395 ph = dataRecord.w1_ph; |
1393 ph = dataRecord.w1_ph; |
1396 } |
1394 } |
1397 var bicarbonate = total_alkalinity * 1.22; |
1395 var bicarbonate = Bicarbonate(total_alkalinity, ph); |
1398 |
1396 |
1399 /* Save mixed water ions for later */ |
1397 /* Save mixed water ions for later */ |
1400 var wg_calcium = calcium; |
1398 var wg_calcium = calcium; |
1401 var wg_sodium = sodium; |
1399 var wg_sodium = sodium; |
1402 var wg_total_alkalinity = total_alkalinity; |
1400 var wg_total_alkalinity = total_alkalinity; |
1403 var wg_chloride = chloride; |
1401 var wg_chloride = chloride; |
1404 var wg_sulfate = sulfate; |
1402 var wg_sulfate = sulfate; |
1405 var wg_bicarbonate = bicarbonate; |
1403 var wg_bicarbonate = bicarbonate; |
|
1404 |
|
1405 dataRecord.wg_amount = liters; |
|
1406 dataRecord.wg_ph = ph; |
1406 |
1407 |
1407 $('#wg_amount').val(liters); |
1408 $('#wg_amount').val(liters); |
1408 $('#wg_calcium').val(Round(calcium, 1)); |
1409 $('#wg_calcium').val(Round(calcium, 1)); |
1409 $('#wg_magnesium').val(Round(magnesium, 1)); |
1410 $('#wg_magnesium').val(Round(magnesium, 1)); |
1410 $('#wg_sodium').val(Round(sodium, 1)); |
1411 $('#wg_sodium').val(Round(sodium, 1)); |
1411 $('#wg_bicarbonate').val(Round(bicarbonate, 1)); |
1412 $('#wg_bicarbonate').val(Round(bicarbonate, 1)); |
1412 $('#wg_total_alkalinity').val(Round(total_alkalinity, 1)); |
1413 $('#wg_total_alkalinity').val(Round(total_alkalinity, 1)); |
1413 $('#wg_chloride').val(Round(chloride, 1)); |
1414 $('#wg_chloride').val(Round(chloride, 1)); |
1414 $('#wg_sulfate').val(Round(sulfate, 1)); |
1415 $('#wg_sulfate').val(Round(sulfate, 1)); |
1415 $('#wg_ph').val(Round(ph, 2)); |
1416 $('#wg_ph').val(Round(ph, 2)); |
|
1417 $('#wg_hardness').val(Round(Hardness(calcium, magnesium), 1)); |
|
1418 $('#wg_ra').val(Round(ResidualAlkalinity(total_alkalinity, calcium, magnesium), 1)); |
1416 |
1419 |
1417 var mash_ph = Round(MashpH(), 3); |
1420 var mash_ph = Round(MashpH(), 3); |
1418 console.log('Distilled water mash pH: ' + mash_ph); |
1421 console.log('Distilled water mash pH: ' + mash_ph); |
1419 |
1422 |
1420 /* Calculate Salt additions */ |
1423 /* Calculate Salt additions */ |
1463 if (protonDeficit > 0) { // Add acid |
1466 if (protonDeficit > 0) { // Add acid |
1464 frac = CalcFrac(TpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
1467 frac = CalcFrac(TpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
1465 Acid = protonDeficit / frac; |
1468 Acid = protonDeficit / frac; |
1466 Acid *= AcidTypeData[AT].MolWt; // mg |
1469 Acid *= AcidTypeData[AT].MolWt; // mg |
1467 Acidmg = Acid; |
1470 Acidmg = Acid; |
1468 Acid = Acid / AcidTypeData[AT].AcidSG; // ml |
1471 var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (parseFloat(dataRecord.wa_acid_perc) / 100)) + 1000, 2); |
1469 Acid = Round(Acid / (parseFloat(dataRecord.wa_acid_perc) / 100), 2); // ml |
1472 Acid /= RealSG; |
|
1473 Acid /= AcidTypeData[AT].AcidPrc / 100; |
|
1474 Acid = Round(Acid, 2); |
1470 console.log('Mash auto Acid final ml: ' + Acid); |
1475 console.log('Mash auto Acid final ml: ' + Acid); |
1471 $('#wa_acid').val(Acid); |
1476 $('#wa_acid').val(Acid); |
1472 setWaterAgent(AcidTypeData[AT].nl, Acid); |
1477 setWaterAgent(AcidTypeData[AT].nl, Acid); |
1473 |
1478 |
1474 bicarbonate = bicarbonate - protonDeficit * frac / liters; |
1479 bicarbonate = bicarbonate - protonDeficit * frac / liters; |
1475 total_alkalinity = bicarbonate * 50 / 61; |
1480 total_alkalinity = bicarbonate * 50 / 61; |
1476 } |
1481 } |
1477 ph = TpH; |
1482 ph = TpH; |
|
1483 dataRecord.wb_ph = ph; |
1478 $('#wb_ph').val(Round(ph, 2)); |
1484 $('#wb_ph').val(Round(ph, 2)); |
1479 $('#est_mash_ph').val(Round(ph, 2)); |
1485 $('#est_mash_ph').val(Round(ph, 2)); |
1480 } else { // Manual |
1486 } else { // Manual |
1481 /* Manual calculate pH */ |
1487 /* Manual calculate pH */ |
1482 $('.c_mashph').hide(); |
1488 $('.c_mashph').hide(); |
1641 |
1648 |
1642 |
1649 |
1643 function calcSparge() { |
1650 function calcSparge() { |
1644 |
1651 |
1645 /* Based on the work of ajDeLange. */ |
1652 /* Based on the work of ajDeLange. */ |
|
1653 var ws_calcium, ws_magnesium, ws_total_alkalinity, ws_sodium, ws_chloride; |
|
1654 var ws_sulfate, ws_ph, ws_hardness, ws_ra; |
1646 var TargetpH = dataRecord.sparge_ph; |
1655 var TargetpH = dataRecord.sparge_ph; |
1647 var Source_pH = dataRecord.w1_ph; |
1656 var Source_pH = 7.0; |
1648 var Source_alkalinity = dataRecord.w1_total_alkalinity; |
1657 |
1649 // Select watersource or fallback to the first source. |
1658 // Select watersource or fallback to the first source. |
1650 if (dataRecord.sparge_source == 1) { // Source 2 |
1659 if ((dataRecord.sparge_source == 1) && (dataRecord.w2_ph > 0.0)) { // Source 2 |
1651 if (dataRecord.w2_ph > 0.0) { |
1660 ws_calcium = dataRecord.w2_calcium; |
|
1661 ws_magnesium = dataRecord.w2_magnesium; |
|
1662 ws_total_alkalinity = dataRecord.w2_total_alkalinity; |
|
1663 ws_sodium = dataRecord.w2_sodium; |
|
1664 ws_chloride = dataRecord.w2_chloride; |
|
1665 ws_sulfate = dataRecord.w2_sulfate; |
1652 Source_pH = dataRecord.w2_ph; |
1666 Source_pH = dataRecord.w2_ph; |
1653 Source_alkalinity = dataRecord.w2_total_alkalinity; |
1667 $('#w2_button').jqxRadioButton({ checked: true }); |
1654 } else { |
1668 } else if ((dataRecord.sparge_source == 2) && (dataRecord.w2_ph > 0.0)) { // Mixed |
1655 dataRecord.sparge_source = 0; // Source 1 |
1669 ws_calcium = dataRecord.wg_calcium; |
1656 $('#sparge_source').val(0); |
1670 ws_magnesium = dataRecord.wg_magnesium; |
1657 } |
1671 ws_total_alkalinity = dataRecord.wg_total_alkalinity; |
1658 } else if (dataRecord.sparge_source == 2) { // Mixed |
1672 ws_sodium = dataRecord.wg_sodium; |
1659 if (dataRecord.w2_ph > 0.0) { |
1673 ws_chloride = dataRecord.wg_chloride; |
1660 Source_pH = parseFloat($('#wg_ph').jqxNumberInput('decimal')); |
1674 ws_sulfate = dataRecord.wg_sulfate; |
1661 Source_alkalinity = parseFloat($('#wg_total_alkalinity').jqxNumberInput('decimal')); |
1675 Source_pH = dataRecord.wg_ph; |
1662 } else { |
1676 $('#wg_button').jqxRadioButton({ checked: true }); |
1663 dataRecord.sparge_source = 0; |
1677 } else { |
1664 $('#sparge_source').val(0); |
1678 ws_calcium = dataRecord.w1_calcium; |
1665 } |
1679 ws_magnesium = dataRecord.w1_magnesium; |
1666 } |
1680 ws_total_alkalinity = dataRecord.w1_total_alkalinity; |
1667 |
1681 ws_sodium = dataRecord.w1_sodium; |
1668 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH |
1682 ws_chloride = dataRecord.w1_chloride; |
1669 var r1 = Math.pow(10, Source_pH - 6.35); |
1683 ws_sulfate = dataRecord.w1_sulfate; |
1670 var r2 = Math.pow(10, Source_pH - 10.33); |
1684 Source_pH = dataRecord.w1_ph; |
1671 var d = 1 + r1 + r1 * r2; |
1685 $('#w1_button').jqxRadioButton({ checked: true }); |
1672 var f1 = 1 / d; |
1686 } |
1673 var f3 = r1 * r2 / d; |
1687 |
1674 |
1688 if (dataRecord.sparge_volume > 0) { |
1675 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) |
1689 ws_calcium += (parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 + |
1676 var r143 = Math.pow(10, 4.3 - 6.35); |
1690 parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000) / dataRecord.sparge_volume; |
1677 var r243 = Math.pow(10, 4.3 - 10.33); |
1691 ws_magnesium += (parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4 * 1000 + |
1678 var d43 = 1 + r143 + r143 * r243; |
1692 parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMMg / MMMgCl2 * 1000) / dataRecord.sparge_volume; |
1679 var f143 = 1 / d43; |
1693 ws_sodium += (parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000) / dataRecord.sparge_volume; |
1680 var f343 = r143 * r243 / d43; |
1694 ws_sulfate += (parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 * 1000 + |
1681 |
1695 parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 * 1000) / dataRecord.sparge_volume; |
1682 //Step 4. Solve |
1696 ws_chloride += (2 * parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCl / MMCaCl2 * 1000 + |
1683 //var Ct = (alkalinity - 1000 * (Math.pow(10, -4.3) - Math.pow(10, -Source_pH))) / ((f143 - f1) + (f3 - f343)); |
1697 parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl * 1000 + |
1684 var Ct = Source_alkalinity / 50 / ((f143 - f1) + (f3 - f343)); |
1698 parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMCl / MMMgCl2 * 1000) / dataRecord.sparge_volume; |
1685 |
1699 } |
1686 //Step 5. Compute mole fractions at desired pH |
1700 |
1687 var r1g = Math.pow(10, TargetpH - 6.35); |
1701 /* Show the spargewate with salt additions */ |
1688 var r2g = Math.pow(10, TargetpH - 10.33); |
1702 $('#sw_calcium').val(Round(ws_calcium, 1)); |
1689 var dg = 1 + r1g + r1g * r2g; |
1703 $('#sw_magnesium').val(Round(ws_magnesium, 1)); |
1690 var f1g = 1 / dg; |
1704 $('#sw_sodium').val(Round(ws_sodium, 1)); |
1691 var f3g = r1g * r2g / dg; |
1705 $('#sw_sulfate').val(Round(ws_sulfate, 1)); |
1692 |
1706 $('#sw_chloride').val(Round(ws_chloride, 1)); |
1693 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) |
1707 $('#sw_bicarbonate').val(Round(Bicarbonate(ws_total_alkalinity, Source_pH), 1)); |
1694 var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l |
1708 $('#sw_total_alkalinity').val(Round(ws_total_alkalinity, 1)); |
1695 Acid += 0.01; // Add acid that would be required for distilled water. |
1709 $('#sw_ph').val(dataRecord.sparge_ph); |
1696 |
1710 $('#sw_hardness').val(Hardness(ws_calcium, ws_magnesium)); |
1697 //Step 8. Get the acid data. |
1711 $('#sw_ra').val(ResidualAlkalinity(ws_total_alkalinity, ws_calcium, ws_magnesium)); |
|
1712 |
1698 AT = dataRecord.sparge_acid_type; |
1713 AT = dataRecord.sparge_acid_type; |
1699 if (AT < 0 || AT >= AcidTypeData.length) { |
1714 if (AT < 0 || AT >= AcidTypeData.length) { |
1700 AT = 0; |
1715 AT = 0; |
1701 dataRecord.sparge_acid_type = 0; |
1716 dataRecord.sparge_acid_type = 0; |
1702 $('#sparge_acid_type').val(AcidTypeData[0].nl); |
1717 $('#sparge_acid_type').val(AcidTypeData[0].nl); |
1703 dataRecord.sparge_acid_perc = AcidTypeData[0].AcidPrc; |
1718 dataRecord.sparge_acid_perc = AcidTypeData[0].AcidPrc; |
1704 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); |
1719 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); |
1705 } |
1720 } |
1706 var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
1721 |
1707 |
1722 /* |
1708 //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. |
1723 * Auto calculate the required acid |
1709 Acid /= fract; |
1724 */ |
1710 |
1725 if (dataRecord.calc_acid) { |
1711 //Step 10. Multiply by molecular weight of the acid |
1726 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH |
1712 Acid *= AcidTypeData[AT].MolWt; //mg |
1727 var r1 = Math.pow(10, Source_pH - 6.35); |
1713 |
1728 var r2 = Math.pow(10, Source_pH - 10.33); |
1714 //Step 11. Divide by Specific Gravity and Percentage to get the final ml. |
1729 var d = 1 + r1 + r1 * r2; |
1715 Acid = Acid / AcidTypeData[AT].AcidSG / (dataRecord.sparge_acid_perc / 100); //ml |
1730 var f1 = 1 / d; |
1716 Acid *= dataRecord.sparge_volume; //ml acid total |
1731 var f3 = r1 * r2 / d; |
1717 Acid = Round(Acid, 2); |
1732 |
1718 dataRecord.sparge_acid_amount = Acid / 1000; |
1733 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) |
1719 $('#sparge_acid_amount').val(Acid); |
1734 var r143 = Math.pow(10, 4.3 - 6.35); |
|
1735 var r243 = Math.pow(10, 4.3 - 10.33); |
|
1736 var d43 = 1 + r143 + r143 * r243; |
|
1737 var f143 = 1 / d43; |
|
1738 var f343 = r143 * r243 / d43; |
|
1739 |
|
1740 //Step 4. Solve |
|
1741 var Ct = ws_total_alkalinity / 50 / ((f143 - f1) + (f3 - f343)); |
|
1742 |
|
1743 //Step 5. Compute mole fractions at desired pH |
|
1744 var r1g = Math.pow(10, TargetpH - 6.35); |
|
1745 var r2g = Math.pow(10, TargetpH - 10.33); |
|
1746 var dg = 1 + r1g + r1g * r2g; |
|
1747 var f1g = 1 / dg; |
|
1748 var f3g = r1g * r2g / dg; |
|
1749 |
|
1750 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) |
|
1751 var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l |
|
1752 Acid += 0.01; // Add acid that would be required for distilled water. |
|
1753 |
|
1754 //Step 8. Get the acid data. |
|
1755 var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); |
|
1756 |
|
1757 //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. |
|
1758 Acid /= fract; |
|
1759 |
|
1760 //Step 10. Multiply by molecular weight of the acid |
|
1761 Acid *= AcidTypeData[AT].MolWt; //mg |
|
1762 |
|
1763 //Step 11. Divide by Specific Gravity and Percentage to get the final ml. |
|
1764 var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (dataRecord.sparge_acid_perc / 100)) + 1000, 2); |
|
1765 Acid = Acid / RealSG; //ml |
|
1766 Acid *= dataRecord.sparge_volume; //ml acid total at 100% |
|
1767 Acid /= AcidTypeData[AT].AcidPrc / 100; //ml acid at supplied strength |
|
1768 Acid = Round(Acid, 2); |
|
1769 dataRecord.sparge_acid_amount = Acid / 1000; |
|
1770 $('#sparge_acid_amount').val(Acid); |
|
1771 } |
|
1772 |
|
1773 // Finally calculate the estimate preboil pH |
|
1774 var ph = -Math.log10(((Math.pow(10, -dataRecord.wb_ph) * dataRecord.wg_amount) + (Math.pow(10, -dataRecord.sparge_ph) * dataRecord.sparge_volume)) / |
|
1775 (dataRecord.wg_amount + dataRecord.sparge_volume)); |
|
1776 $('#preboil_ph').val(ph); |
1720 } |
1777 } |
1721 |
1778 |
1722 function calcInit() { |
1779 function calcInit() { |
1723 console.log('calc.init()'); |
1780 console.log('calc.init()'); |
1724 |
1781 |
1958 $('#mash_name').jqxInput({ theme: theme, width: 320, height: 23 }); |
2015 $('#mash_name').jqxInput({ theme: theme, width: 320, height: 23 }); |
1959 |
2016 |
1960 // Tab 7, Water |
2017 // Tab 7, Water |
1961 $('#tgt_bu').jqxNumberInput(Show2wat); |
2018 $('#tgt_bu').jqxNumberInput(Show2wat); |
1962 $('#tgt_so4_cl,#got_so4_cl').jqxNumberInput(Show1wat); |
2019 $('#tgt_so4_cl,#got_so4_cl').jqxNumberInput(Show1wat); |
|
2020 $('#preboil_ph').jqxNumberInput(Show2wat); |
1963 |
2021 |
1964 // Water source 1 |
2022 // Water source 1 |
1965 $('#w1_name').jqxDropDownList({ |
2023 $('#w1_name').jqxInput({ theme: theme, width: 200, height: 23 }); |
1966 placeHolder: 'Kies hoofd water:', |
2024 $('#w1_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true }); |
1967 theme: theme, |
|
1968 source: waterlist, |
|
1969 displayMember: 'name', |
|
1970 width: 200, |
|
1971 height: 27, |
|
1972 dropDownWidth: 400, |
|
1973 dropDownHeight: 400 |
|
1974 }); |
|
1975 $('#w1_name').on('select', function(event) { |
|
1976 if (event.args) { |
|
1977 var datarecord, index = event.args.index; |
|
1978 datarecord = waterlist.records[index]; |
|
1979 dataRecord.w1_name = datarecord.name; |
|
1980 $('#w1_calcium').val(datarecord.calcium); |
|
1981 dataRecord.w1_calcium = datarecord.calcium; |
|
1982 $('#w1_sulfate').val(datarecord.sulfate); |
|
1983 dataRecord.w1_sulfate = datarecord.sulfate; |
|
1984 $('#w1_chloride').val(datarecord.chloride); |
|
1985 dataRecord.w1_chloride = datarecord.chloride; |
|
1986 $('#w1_sodium').val(datarecord.sodium); |
|
1987 dataRecord.w1_sodium = datarecord.sodium; |
|
1988 $('#w1_magnesium').val(datarecord.magnesium); |
|
1989 dataRecord.w1_magnesium = datarecord.magnesium; |
|
1990 $('#w1_total_alkalinity').val(datarecord.total_alkalinity); |
|
1991 $('#w1_bicarbonate').val(datarecord.total_alkalinity * 1.22); |
|
1992 dataRecord.w1_total_alkalinity = datarecord.total_alkalinity; |
|
1993 $('#w1_ph').val(datarecord.ph); |
|
1994 dataRecord.w1_ph = datarecord.ph; |
|
1995 $('#w1_cost').val(datarecord.cost); |
|
1996 dataRecord.w1_cost = datarecord.cost; |
|
1997 calcWater(); |
|
1998 } |
|
1999 }); |
|
2000 $('#w1_amount').jqxNumberInput(Show1wat); |
2025 $('#w1_amount').jqxNumberInput(Show1wat); |
2001 $('#w1_calcium').jqxNumberInput(Show1wat); |
2026 $('#w1_calcium').jqxNumberInput(Show1wat); |
2002 $('#w1_magnesium').jqxNumberInput(Show1wat); |
2027 $('#w1_magnesium').jqxNumberInput(Show1wat); |
2003 $('#w1_sodium').jqxNumberInput(Show1wat); |
2028 $('#w1_sodium').jqxNumberInput(Show1wat); |
2004 $('#w1_bicarbonate').jqxNumberInput(Show1wat); |
2029 $('#w1_bicarbonate').jqxNumberInput(Show1wat); |
2005 $('#w1_total_alkalinity').jqxNumberInput(Show1wat); |
2030 $('#w1_total_alkalinity').jqxNumberInput(Show1wat); |
2006 $('#w1_chloride').jqxNumberInput(Show1wat); |
2031 $('#w1_chloride').jqxNumberInput(Show1wat); |
2007 $('#w1_sulfate').jqxNumberInput(Show1wat); |
2032 $('#w1_sulfate').jqxNumberInput(Show1wat); |
2008 $('#w1_ph').jqxNumberInput(Show2wat); |
2033 $('#w1_ph').jqxNumberInput(Show2wat); |
|
2034 $('#w1_hardness').jqxNumberInput(Show1wat); |
|
2035 $('#w1_ra').jqxNumberInput(Show1wat); |
2009 // Water source 2 |
2036 // Water source 2 |
2010 $('#w2_name').jqxDropDownList({ |
2037 $('#w2_name').jqxInput({ theme: theme, width: 200, height: 23 }); |
2011 placeHolder: 'Kies meng water:', |
2038 $('#w2_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true }); |
2012 theme: theme, |
|
2013 source: waterlist, |
|
2014 displayMember: 'name', |
|
2015 width: 200, |
|
2016 height: 27, |
|
2017 dropDownWidth: 400, |
|
2018 dropDownHeight: 400 |
|
2019 }); |
|
2020 $('#w2_name').on('select', function(event) { |
|
2021 if (event.args) { |
|
2022 var datarecord, index = event.args.index; |
|
2023 datarecord = waterlist.records[index]; |
|
2024 dataRecord.w2_name = datarecord.name; |
|
2025 $('#w2_calcium').val(datarecord.calcium); |
|
2026 dataRecord.w2_calcium = datarecord.calcium; |
|
2027 $('#w2_sulfate').val(datarecord.sulfate); |
|
2028 dataRecord.w2_sulfate = datarecord.sulfate; |
|
2029 $('#w2_chloride').val(datarecord.chloride); |
|
2030 dataRecord.w2_chloride = datarecord.chloride; |
|
2031 $('#w2_sodium').val(datarecord.sodium); |
|
2032 dataRecord.w2_sodium = datarecord.sodium; |
|
2033 $('#w2_magnesium').val(datarecord.magnesium); |
|
2034 dataRecord.w2_magnesium = datarecord.magnesium; |
|
2035 $('#w2_total_alkalinity').val(datarecord.total_alkalinity); |
|
2036 $('#w2_bicarbonate').val(datarecord.total_alkalinity * 1.22); |
|
2037 dataRecord.w2_total_alkalinity = datarecord.total_alkalinity; |
|
2038 $('#w2_ph').val(datarecord.ph); |
|
2039 dataRecord.w2_ph = datarecord.ph; |
|
2040 $('#w2_cost').val(datarecord.cost); |
|
2041 dataRecord.w2_cost = datarecord.cost; |
|
2042 calcWater(); |
|
2043 } |
|
2044 }); |
|
2045 $('#w2_amount').jqxNumberInput(Show1wat); |
2039 $('#w2_amount').jqxNumberInput(Show1wat); |
2046 $('#w2_calcium').jqxNumberInput(Show1wat); |
2040 $('#w2_calcium').jqxNumberInput(Show1wat); |
2047 $('#w2_magnesium').jqxNumberInput(Show1wat); |
2041 $('#w2_magnesium').jqxNumberInput(Show1wat); |
2048 $('#w2_sodium').jqxNumberInput(Show1wat); |
2042 $('#w2_sodium').jqxNumberInput(Show1wat); |
2049 $('#w2_bicarbonate').jqxNumberInput(Show1wat); |
2043 $('#w2_bicarbonate').jqxNumberInput(Show1wat); |
2050 $('#w2_total_alkalinity').jqxNumberInput(Show1wat); |
2044 $('#w2_total_alkalinity').jqxNumberInput(Show1wat); |
2051 $('#w2_chloride').jqxNumberInput(Show1wat); |
2045 $('#w2_chloride').jqxNumberInput(Show1wat); |
2052 $('#w2_sulfate').jqxNumberInput(Show1wat); |
2046 $('#w2_sulfate').jqxNumberInput(Show1wat); |
2053 $('#w2_ph').jqxNumberInput(Show2wat); |
2047 $('#w2_ph').jqxNumberInput(Show2wat); |
|
2048 $('#w2_hardness').jqxNumberInput(Show1wat); |
|
2049 $('#w2_ra').jqxNumberInput(Show1wat); |
2054 // Water mixed |
2050 // Water mixed |
|
2051 $('#wg_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true }); |
2055 $('#wg_amount').jqxNumberInput(Show1wat); |
2052 $('#wg_amount').jqxNumberInput(Show1wat); |
2056 $('#wg_calcium').jqxNumberInput(Show1wat); |
2053 $('#wg_calcium').jqxNumberInput(Show1wat); |
2057 $('#wg_magnesium').jqxNumberInput(Show1wat); |
2054 $('#wg_magnesium').jqxNumberInput(Show1wat); |
2058 $('#wg_sodium').jqxNumberInput(Show1wat); |
2055 $('#wg_sodium').jqxNumberInput(Show1wat); |
2059 $('#wg_bicarbonate').jqxNumberInput(Show1wat); |
2056 $('#wg_bicarbonate').jqxNumberInput(Show1wat); |
2060 $('#wg_total_alkalinity').jqxNumberInput(Show1wat); |
2057 $('#wg_total_alkalinity').jqxNumberInput(Show1wat); |
2061 $('#wg_chloride').jqxNumberInput(Show1wat); |
2058 $('#wg_chloride').jqxNumberInput(Show1wat); |
2062 $('#wg_sulfate').jqxNumberInput(Show1wat); |
2059 $('#wg_sulfate').jqxNumberInput(Show1wat); |
2063 $('#wg_ph').jqxNumberInput(Show2wat); |
2060 $('#wg_ph').jqxNumberInput(Show2wat); |
|
2061 $('#wg_hardness').jqxNumberInput(Show1wat); |
|
2062 $('#wg_ra').jqxNumberInput(Show1wat); |
2064 // Water treated |
2063 // Water treated |
2065 $('#wb_calcium').jqxTooltip({ content: 'De ideale hoeveelheid Calcium is tussen 40 en 150.'}); |
2064 $('#wb_calcium').jqxTooltip({ content: 'De ideale hoeveelheid Calcium is tussen 40 en 150.'}); |
2066 $('#wb_calcium').jqxNumberInput(Show1wat); |
2065 $('#wb_calcium').jqxNumberInput(Show1wat); |
2067 $('#wb_magnesium').jqxTooltip({ content: 'De ideale hoeveelheid Magnesium is tussen 5 en 40.'}); |
2066 $('#wb_magnesium').jqxTooltip({ content: 'De ideale hoeveelheid Magnesium is tussen 5 en 40.'}); |
2068 $('#wb_magnesium').jqxNumberInput(Show1wat); |
2067 $('#wb_magnesium').jqxNumberInput(Show1wat); |
2074 $('#wb_sulfate').jqxNumberInput(Show1wat); |
2073 $('#wb_sulfate').jqxNumberInput(Show1wat); |
2075 $('#wb_bicarbonate').jqxTooltip({ content: '0 tot 50 lichte bieren, 50 tot 150 amber bieren, 150 tot 250 donkere bieren.'}); |
2074 $('#wb_bicarbonate').jqxTooltip({ content: '0 tot 50 lichte bieren, 50 tot 150 amber bieren, 150 tot 250 donkere bieren.'}); |
2076 $('#wb_bicarbonate').jqxNumberInput(Show1wat); |
2075 $('#wb_bicarbonate').jqxNumberInput(Show1wat); |
2077 $('#wb_total_alkalinity').jqxNumberInput(Show1wat); |
2076 $('#wb_total_alkalinity').jqxNumberInput(Show1wat); |
2078 $('#wb_ph').jqxNumberInput(Show2wat); |
2077 $('#wb_ph').jqxNumberInput(Show2wat); |
2079 // Water target profile |
2078 $('#wb_hardness').jqxNumberInput(Show1wat); |
2080 $('#pr_name').jqxDropDownList({ |
2079 $('#wb_ra').jqxNumberInput(Show1wat); |
2081 placeHolder: 'Kies doel profiel:', |
2080 // Sparge water |
2082 theme: theme, |
2081 $('#sw_amount').jqxNumberInput(Show1wat); |
2083 source: waterprofiles, |
2082 $('#sw_calcium').jqxNumberInput(Show1wat); |
2084 displayMember: 'name', |
2083 $('#sw_magnesium').jqxNumberInput(Show1wat); |
2085 width: 200, |
2084 $('#sw_sodium').jqxNumberInput(Show1wat); |
2086 height: 27, |
2085 $('#sw_bicarbonate').jqxNumberInput(Show1wat); |
2087 dropDownWidth: 400, |
2086 $('#sw_total_alkalinity').jqxNumberInput(Show1wat); |
2088 dropDownHeight: 300 |
2087 $('#sw_chloride').jqxNumberInput(Show1wat); |
2089 }); |
2088 $('#sw_sulfate').jqxNumberInput(Show1wat); |
2090 $('#pr_name').on('select', function(event) { |
2089 $('#sw_ph').jqxNumberInput(Show2wat); |
2091 if (event.args) { |
2090 $('#sw_hardness').jqxNumberInput(Show1wat); |
2092 var datarecord, index = event.args.index; |
2091 $('#sw_ra').jqxNumberInput(Show1wat); |
2093 datarecord = waterprofiles.records[index]; |
|
2094 $('#pr_calcium').val(datarecord.calcium); |
|
2095 $('#pr_sulfate').val(datarecord.sulfate); |
|
2096 $('#pr_chloride').val(datarecord.chloride); |
|
2097 $('#pr_sodium').val(datarecord.sodium); |
|
2098 $('#pr_magnesium').val(datarecord.magnesium); |
|
2099 $('#pr_total_alkalinity').val(datarecord.total_alkalinity); |
|
2100 $('#pr_bicarbonate').val(datarecord.total_alkalinity * 1.22); |
|
2101 calcWater(); |
|
2102 } |
|
2103 }); |
|
2104 $('#pr_calcium').jqxNumberInput(Show1wat); |
|
2105 $('#pr_magnesium').jqxNumberInput(Show1wat); |
|
2106 $('#pr_sodium').jqxNumberInput(Show1wat); |
|
2107 $('#pr_bicarbonate').jqxNumberInput(Show1wat); |
|
2108 $('#pr_total_alkalinity').jqxNumberInput(Show1wat); |
|
2109 $('#pr_chloride').jqxNumberInput(Show1wat); |
|
2110 $('#pr_sulfate').jqxNumberInput(Show1wat); |
|
2111 |
2092 |
2112 // Water agents |
2093 // Water agents |
2113 $('#wa_cacl2').jqxTooltip({ content: 'Voor het maken van een ander waterprofiel. Voegt calcium en chloride toe. Voor het verbeteren van zoetere bieren.'}); |
2094 $('#wa_cacl2').jqxTooltip({ content: 'Voor het maken van een ander waterprofiel. Voegt calcium en chloride toe. Voor het verbeteren van zoetere bieren.'}); |
2114 $('#wa_cacl2').jqxNumberInput(Show1wat); |
2095 $('#wa_cacl2').jqxNumberInput(Show2wat); |
2115 $('#ss_cacl2').jqxNumberInput(Show1wat); |
2096 $('#ss_cacl2').jqxNumberInput(Show2wat); |
2116 |
2097 |
2117 $('#wa_caso4').jqxTooltip({ |
2098 $('#wa_caso4').jqxTooltip({ |
2118 content: 'Gips. Voor het maken van een ander waterprofiel. Voegt calcium en sulfaat toe. Voor het verbeteren van bittere bieren.' |
2099 content: 'Gips. Voor het maken van een ander waterprofiel. Voegt calcium en sulfaat toe. Voor het verbeteren van bittere bieren.' |
2119 }); |
2100 }); |
2120 $('#wa_caso4').jqxNumberInput(Show1wat); |
2101 $('#wa_caso4').jqxNumberInput(Show2wat); |
2121 $('#ss_caso4').jqxNumberInput(Show1wat); |
2102 $('#ss_caso4').jqxNumberInput(Show2wat); |
2122 |
2103 |
2123 $('#wa_mgso4').jqxTooltip({ content: 'Epsom zout. Voor het maken van een ander waterprofiel. Voegt magnesium en sulfaat toe. Gebruik spaarzaam!'}); |
2104 $('#wa_mgso4').jqxTooltip({ content: 'Epsom zout. Voor het maken van een ander waterprofiel. Voegt magnesium en sulfaat toe. Gebruik spaarzaam!'}); |
2124 $('#wa_mgso4').jqxNumberInput(Show1wat); |
2105 $('#wa_mgso4').jqxNumberInput(Show2wat); |
2125 $('#ss_mgso4').jqxNumberInput(Show1wat); |
2106 $('#ss_mgso4').jqxNumberInput(Show2wat); |
2126 |
2107 |
2127 $('#wa_nacl').jqxTooltip({ |
2108 $('#wa_nacl').jqxTooltip({ |
2128 content: 'Keukenzout. Voor het maken van een ander waterprofiel. Voegt natrium en chloride toe. ' + |
2109 content: 'Keukenzout. Voor het maken van een ander waterprofiel. Voegt natrium en chloride toe. ' + |
2129 'Voor het accentueren van zoetheid. Bij hoge dosering wordt het bier ziltig.' |
2110 'Voor het accentueren van zoetheid. Bij hoge dosering wordt het bier ziltig.' |
2130 }); |
2111 }); |
2131 $('#wa_nacl').jqxNumberInput(Show1wat); |
2112 $('#wa_nacl').jqxNumberInput(Show2wat); |
2132 $('#ss_nacl').jqxNumberInput(Show1wat); |
2113 $('#ss_nacl').jqxNumberInput(Show2wat); |
2133 |
2114 |
2134 $('#wa_mgcl2').jqxTooltip({ content: 'Magnesiumchloride'}); |
2115 $('#wa_mgcl2').jqxTooltip({ content: 'Magnesiumchloride'}); |
2135 $('#wa_mgcl2').jqxNumberInput(Show1wat); |
2116 $('#wa_mgcl2').jqxNumberInput(Show2wat); |
2136 $('#ss_mgcl2').jqxNumberInput(Show1wat); |
2117 $('#ss_mgcl2').jqxNumberInput(Show2wat); |
2137 |
2118 |
2138 $('#wa_nahco3').jqxTooltip({ content: 'Baksoda'}); |
2119 $('#wa_nahco3').jqxTooltip({ content: 'Baksoda'}); |
2139 $('#wa_caco3').jqxTooltip({ content: 'Kalk'}); |
2120 $('#wa_caco3').jqxTooltip({ content: 'Kalk'}); |
2140 $('#wa_nahco3,#wa_caco3').jqxNumberInput(Show1wat); |
2121 $('#wa_nahco3,#wa_caco3').jqxNumberInput(Show2wat); |
2141 |
2122 |
2142 $('#mash_ph').jqxTooltip({ content: 'Maisch pH tussen 5.2 en 5.6. Gebruik 5.2 voor lichte en 5.5 voor donkere bieren.'}); |
2123 $('#mash_ph').jqxTooltip({ content: 'Maisch pH tussen 5.2 en 5.6. Gebruik 5.2 voor lichte en 5.5 voor donkere bieren.'}); |
2143 $('#mash_ph').jqxNumberInput(Show2dec); |
2124 $('#mash_ph').jqxNumberInput(Show2dec); |
2144 |
2125 |
2145 $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23, disabled: true }); |
2126 $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23, disabled: true }); |