--- a/src/EditRecipeTab7.cpp Fri Apr 15 20:20:22 2022 +0200 +++ b/src/EditRecipeTab7.cpp Sat Apr 16 13:05:47 2022 +0200 @@ -113,7 +113,7 @@ } else { error_count++; if (error_count < 5) - qDebug() << "ProtonDeficit" << pHZ << "invalid grist, return" << Result; + qDebug() << " ProtonDeficit" << pHZ << "invalid grist, return" << Result; } return Result; } @@ -136,7 +136,7 @@ pd = ProtonDeficit(pH); } pH = round(pH * 1000000) / 1000000.0; - qDebug() << "MashpH() n:" << n << "pH:" << pH; + qDebug() << " MashpH() n:" << n << "pH:" << pH; return pH; } @@ -153,12 +153,12 @@ double sulfate = 0; double ph = 0; double TpH = 0; - double frac; + double frac, RA; double protonDeficit = 0; double Acid = 0, Acidmg = 0; int AT; - qDebug() << "calcWater"; + qDebug() << "calcWater()"; /* * If there is a dilute water source, mix the waters. @@ -212,7 +212,7 @@ double wg_bicarbonate = bicarbonate; double mash_ph = MashpH(); - qDebug() << "Distilled water mash pH:" << mash_ph; + qDebug() << " Distilled water mash pH:" << mash_ph; /* Calculate Salt additions */ if (liters > 0) { @@ -246,43 +246,77 @@ */ TpH = recipe->mash_ph; protonDeficit = ProtonDeficit(TpH); - qDebug() << "calc_acid tgt:" << TpH << "protonDeficit:" << protonDeficit; + qDebug() << " calc_acid tgt:" << TpH << "protonDeficit:" << protonDeficit; if (protonDeficit > 0) { - qDebug() << "pkn:" << AT << my_acids[AT].pK1 << my_acids[AT].pK2 << my_acids[AT].pK3; frac = Utils::CalcFrac(TpH, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); Acid = protonDeficit / frac; - qDebug() << "1" << frac << Acid << protonDeficit; Acid *= my_acids[AT].MolWt; // mg. Acidmg = Acid; Acid = Acid / my_acids[AT].AcidSG; Acid = round((Acid / (recipe->wa_acid_perc / 100.0)) * 100.0) / 100.0; - qDebug() << "Mash auto Acid final ml:" << Acid; + qDebug() << " Mash auto Acid final ml:" << Acid; - for (int i = 0; i < recipe->miscs.size(); i++) { - qDebug() << i << recipe->miscs.at(i).m_name << my_acids[AT].name_en; - if (recipe->miscs.at(i).m_name == my_acids[AT].name_en || recipe->miscs.at(i).m_name == my_acids[AT].name_nl) { - qDebug() << "found at" << i << recipe->miscs.at(i).m_amount << Acid / 1000.0; - recipe->miscs[i].m_amount = Acid / 1000.0; - QTableWidgetItem *item = new QTableWidgetItem(QString("%1 ml").arg(Acid, 3, 'f', 2, '0')); - item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); - ui->miscsTable->setItem(i, 4, item); - this->ignoreChanges = true; - ui->mw_acidvolEdit->setValue(Acid); - this->ignoreChanges = false; - break; - } - } + QString w = my_acids[AT].name_en + ' ' + my_acids[AT].name_nl; + brewing_salt_sub(w, Acid); + this->ignoreChanges = true; + ui->mw_acidvolEdit->setValue(Acid); + this->ignoreChanges = false; + bicarbonate = bicarbonate - protonDeficit * frac / liters; total_alkalinity = bicarbonate * 50 / 61; } ph = TpH; ui->wb_phEdit->setValue(ph); - - //recipe->est_mash_ph = ph + recipe->mash_ph = ph; } else { // Manual /* * Manual adjust acid, calculate resulting pH. */ + double pHa = ph; // Mixed water pH. + // Then calculate the new pH with added acids and malts + qDebug() << " Mash pH:" << pHa; + Acid = my_acids[AT].AcidSG * (recipe->wa_acid_perc / 100.0); // ml + Acid *= ui->mw_acidvolEdit->value(); + Acid /= my_acids[AT].MolWt; // mg; + Acidmg = Acid; + + //find the pH where the protondeficit = protondeficit by the acid + frac = Utils::CalcFrac(pHa, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); + protonDeficit = Acid * frac; + //qDebug() << " protonDeficit Acid:" << protonDeficit << "frac:" << frac << "pH:" << pHa; + + double deltapH = 0.001; + double deltapd = 0.1; + double pd = round(ProtonDeficit(pHa) * 1000000.0) / 1000000.0; + int n = 0; + while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 4000)) { + n++; + if (pd < (protonDeficit - deltapd)) + pHa -= deltapH; + else if (pd > (protonDeficit + deltapd)) + pHa += deltapH; + frac = Utils::CalcFrac(pHa, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); + protonDeficit = Acid * frac; + pd = ProtonDeficit(pHa); + } + //qDebug() << " n:" << n << "pd:" << pd << "protonDeficit:" << protonDeficit << "frac:" << frac << "pHa:" << pHa; + + bicarbonate = wg_bicarbonate - protonDeficit * frac / liters; + total_alkalinity = bicarbonate * 50 / 61; + ph = pHa; + ui->wb_phEdit->setValue(ph); + ui->mw_phEdit->setValue(ph); + recipe->mash_ph = ph; + } + + if ((AT == 3) && (liters > 0)) { // Sulfuctic / Zwavelzuur + RA = ui->bs_caso4Edit->value() * MMSO4 / MMCaSO4 + ui->bs_mgso4Edit->value() * MMSO4 / MMMgSO4 + Acidmg / 1000 * MMSO4 / (MMSO4 + 2); + RA = 1000 * RA / liters; + sulfate = wg_sulfate + RA; // Not add to sulfate?? + } else if ((AT == 1) && (liters > 0)) { // Hydrochloric, Zoutzuur + RA = ui->bs_cacl2Edit->value() * MMCl / MMCaCl2 + ui->bs_naclEdit->value() * MMCl / MMNaCl + Acidmg / 1000 * MMCl / (MMCl + 1); + RA = 1000 * RA / liters; + chloride = wg_chloride + RA; } ui->wb_caEdit->setValue(calcium); @@ -330,51 +364,66 @@ } -void EditRecipe::on_w2_vol_changed(double val) +void EditRecipe::on_mw_ph_changed(double val) { + if (! recipe->calc_acid) + return; + + qDebug() << "on_mw_ph_changed" << val; + recipe->mash_ph = val; + is_changed(); + calcWater(); } -void EditRecipe::on_cacl2_changed(double val) -{ - set_brewing_salt("CaCl2", val); -} - - -void EditRecipe::on_caso4_changed(double val) +void EditRecipe::on_mw_acid_changed(double val) { - set_brewing_salt("CaSO4", val); -} - + if (recipe->calc_acid) + return; -void EditRecipe::on_mgso4_changed(double val) -{ - set_brewing_salt("MgSO4", val); + qDebug() << "on_mw_acid_changed" << val; + QString w = my_acids[recipe->wa_acid_name].name_en + ' ' + my_acids[recipe->wa_acid_name].name_nl; + set_brewing_salt(w, val); } -void EditRecipe::on_nacl_changed(double val) +void EditRecipe::on_mw_type_changed(int val) { - set_brewing_salt("NaCl", val); -} + if (val == recipe->wa_acid_name) + return; + qDebug() << "on_mw_type_changed" << val << "old" << recipe->wa_acid_name; + /* + * First remove current acid. + */ + QString w = my_acids[recipe->wa_acid_name].name_en + ' ' + my_acids[recipe->wa_acid_name].name_nl; + brewing_salt_sub(w, 0); -void EditRecipe::on_mgcl2_changed(double val) -{ - set_brewing_salt("MgCl2", val); + recipe->wa_acid_name = val; + w = my_acids[recipe->wa_acid_name].name_en + ' ' + my_acids[recipe->wa_acid_name].name_nl; + + recipe->wa_acid_perc = my_acids.at(val).AcidPrc; +// ui->mw_acidPick->setCurrentIndex(val); + ui->mw_acidpercEdit->setValue(my_acids.at(val).AcidPrc); + brewing_salt_sub(w, ui->mw_acidvolEdit->value()); // For now, set old amount. + + is_changed(); + calcWater(); } -void EditRecipe::on_nahco3_changed(double val) +void EditRecipe::on_w2_vol_changed(double val) { - set_brewing_salt("NaHCO3", val); + qDebug() << "on_w2_vol_changed" << val; } -void EditRecipe::on_caco3_changed(double val) -{ - set_brewing_salt("CaCO3", val); -} +void EditRecipe::on_cacl2_changed(double val) { set_brewing_salt("CaCl2", val); } +void EditRecipe::on_caso4_changed(double val) { set_brewing_salt("CaSO4", val); } +void EditRecipe::on_mgso4_changed(double val) { set_brewing_salt("MgSO4", val); } +void EditRecipe::on_nacl_changed(double val) { set_brewing_salt("NaCl", val); } +void EditRecipe::on_mgcl2_changed(double val) { set_brewing_salt("MgCl2", val); } +void EditRecipe::on_nahco3_changed(double val) { set_brewing_salt("NaHCO3", val); } +void EditRecipe::on_caco3_changed(double val) { set_brewing_salt("CaCO3", val); } -