src/EditRecipeTab7.cpp

changeset 136
17030224d919
parent 135
e68b27ad8a40
child 137
ffe8b2e9517b
--- 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);  }
 
 
-

mercurial