DmitrMakeev commited on
Commit
8172b25
·
verified ·
1 Parent(s): e21b28e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -58
app.py CHANGED
@@ -702,7 +702,7 @@ BASE_PROFILE = {
702
  'N (NH4+)': 0
703
  }
704
 
705
- # Полная база всех возможных удобрений (7 удобрений)
706
  ALL_FERTILIZERS = {
707
  "Кальциевая селитра": {
708
  "N (NO3-)": 0.118, "Ca": 0.169
@@ -728,28 +728,16 @@ ALL_FERTILIZERS = {
728
  }
729
 
730
  class NutrientCalculator:
731
- def __init__(self, volume_liters=1.0, use_k2so4=True, use_kno3=True):
732
  self.volume = volume_liters
733
  self.results = {}
734
  self.final_profile = BASE_PROFILE.copy()
735
  self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
736
  self.initial_n_profile = {}
737
-
738
- # Формируем активные удобрения
739
- self.fertilizers_db = {
740
- "Кальциевая селитра": ALL_FERTILIZERS["Кальциевая селитра"],
741
- "Аммоний азотнокислый": ALL_FERTILIZERS["Аммоний азотнокислый"],
742
- "Сульфат магния": ALL_FERTILIZERS["Сульфат магния"],
743
- "Калий фосфорнокислый": ALL_FERTILIZERS["Калий фосфорнокислый"]
744
- }
745
-
746
- if use_k2so4:
747
- self.fertilizers_db["Калий сернокислый"] = ALL_FERTILIZERS["Калий сернокислый"]
748
- if use_kno3:
749
- self.fertilizers_db["Калий азотнокислый"] = ALL_FERTILIZERS["Калий азотнокислый"]
750
 
751
  def calculate(self, total_n, no3_ratio, nh4_ratio):
752
- # Рассчитываем баланс азота
753
  total_parts = no3_ratio + nh4_ratio
754
  no3 = total_n * (no3_ratio / total_parts)
755
  nh4 = total_n * (nh4_ratio / total_parts)
@@ -759,16 +747,17 @@ class NutrientCalculator:
759
  'N (NH4+)': round(nh4, 1)
760
  }
761
 
762
- # Добавляем азот в профиль
763
  self.final_profile['N (NO3-)'] = no3
764
  self.final_profile['N (NH4+)'] = nh4
765
 
766
- # Последовательность внесения удобрений
767
  self._apply_magnesium_sulfate()
768
  self._apply_calcium_nitrate()
769
  self._apply_potassium_phosphate()
770
  self._apply_ammonium_nitrate()
771
- self._apply_potassium_fertilizers()
 
772
 
773
  # Корректируем отрицательные значения
774
  self._adjust_negative_values()
@@ -783,7 +772,6 @@ class NutrientCalculator:
783
  self.results[fert_name].update(additions)
784
 
785
  def _adjust_negative_values(self):
786
- # Корректируем отрицательные значения до 0
787
  for element in self.final_profile:
788
  if self.final_profile[element] < 0:
789
  self.final_profile[element] = 0
@@ -827,39 +815,6 @@ class NutrientCalculator:
827
  self._apply_fertilizer("Калий фосфорнокислый", grams, {'внесет K': round(added_k, 1)})
828
  self.final_profile['P'] = 0
829
 
830
- def _apply_potassium_fertilizers(self):
831
- k_need = self.final_profile['K']
832
- if k_need <= 0:
833
- return
834
-
835
- # Сначала используем калий сернокислый (если доступен)
836
- if "Калий сернокислый" in self.fertilizers_db:
837
- s_deficit = self.final_profile['S']
838
- k2so4_grams = (k_need * self.volume) / (self.fertilizers_db["Калий сернокислый"]["K"] * 1000)
839
- added_s = k2so4_grams * self.fertilizers_db["Калий сернокислый"]["S"] * 1000 / self.volume
840
-
841
- if s_deficit > 0 and added_s <= s_deficit:
842
- self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
843
- 'внесет K': round(k_need, 2),
844
- 'внесет S': round(added_s, 2)
845
- })
846
- self.final_profile['K'] = 0
847
- self.final_profile['S'] -= added_s
848
- return
849
-
850
- # Если остался калий, используем калий азотнокислый
851
- if k_need > 0 and "Калий азотнокислый" in self.fertilizers_db:
852
- kno3_grams = (k_need * self.volume) / (self.fertilizers_db["Калий азотнокислый"]["K"] * 1000)
853
- added_n = kno3_grams * self.fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
854
-
855
- self._apply_fertilizer(
856
- "Калий азотнокислый",
857
- kno3_grams,
858
- {'внесет NO3': round(added_n, 2)}
859
- )
860
- self.final_profile['K'] = 0
861
- self.final_profile['N (NO3-)'] -= added_n
862
-
863
  def _apply_ammonium_nitrate(self):
864
  nh4_need = self.final_profile['N (NH4+)']
865
  if nh4_need <= 0:
@@ -873,6 +828,44 @@ class NutrientCalculator:
873
  self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
874
  self.final_profile['N (NH4+)'] = 0
875
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
876
  def calculate_ec(self):
877
  return round(self.total_ppm / 700, 2)
878
 
@@ -915,11 +908,9 @@ class NutrientCalculator:
915
 
916
  # Пример использования
917
  if __name__ == "__main__":
918
- # Вариант с калием азотнокислым
919
- calc_with_kno3 = NutrientCalculator(volume_liters=10, use_k2so4=False, use_kno3=True)
920
- calc_with_kno3.calculate(TOTAL_NITROGEN, NO3_RATIO, NH4_RATIO)
921
- calc_with_kno3.print_report()
922
-
923
 
924
 
925
 
 
702
  'N (NH4+)': 0
703
  }
704
 
705
+ # Полная база всех удобрений (7 удобрений)
706
  ALL_FERTILIZERS = {
707
  "Кальциевая селитра": {
708
  "N (NO3-)": 0.118, "Ca": 0.169
 
728
  }
729
 
730
  class NutrientCalculator:
731
+ def __init__(self, volume_liters=1.0):
732
  self.volume = volume_liters
733
  self.results = {}
734
  self.final_profile = BASE_PROFILE.copy()
735
  self.total_ppm = sum(BASE_PROFILE.values()) + TOTAL_NITROGEN
736
  self.initial_n_profile = {}
737
+ self.fertilizers_db = ALL_FERTILIZERS
 
 
 
 
 
 
 
 
 
 
 
 
738
 
739
  def calculate(self, total_n, no3_ratio, nh4_ratio):
740
+ # 1. Сначала рассчитываем баланс азота
741
  total_parts = no3_ratio + nh4_ratio
742
  no3 = total_n * (no3_ratio / total_parts)
743
  nh4 = total_n * (nh4_ratio / total_parts)
 
747
  'N (NH4+)': round(nh4, 1)
748
  }
749
 
750
+ # Записываем азот в профиль
751
  self.final_profile['N (NO3-)'] = no3
752
  self.final_profile['N (NH4+)'] = nh4
753
 
754
+ # 2. Вносим удобрения в правильном порядке
755
  self._apply_magnesium_sulfate()
756
  self._apply_calcium_nitrate()
757
  self._apply_potassium_phosphate()
758
  self._apply_ammonium_nitrate()
759
+ self._apply_potassium_sulfate()
760
+ self._apply_potassium_nitrate()
761
 
762
  # Корректируем отрицательные значения
763
  self._adjust_negative_values()
 
772
  self.results[fert_name].update(additions)
773
 
774
  def _adjust_negative_values(self):
 
775
  for element in self.final_profile:
776
  if self.final_profile[element] < 0:
777
  self.final_profile[element] = 0
 
815
  self._apply_fertilizer("Калий фосфорнокислый", grams, {'внесет K': round(added_k, 1)})
816
  self.final_profile['P'] = 0
817
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
818
  def _apply_ammonium_nitrate(self):
819
  nh4_need = self.final_profile['N (NH4+)']
820
  if nh4_need <= 0:
 
828
  self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
829
  self.final_profile['N (NH4+)'] = 0
830
 
831
+ def _apply_potassium_sulfate(self):
832
+ k_need = self.final_profile['K']
833
+ s_need = self.final_profile['S']
834
+
835
+ if k_need <= 0 or s_need <= 0:
836
+ return
837
+
838
+ k_content = self.fertilizers_db["Калий сернокислый"]["K"]
839
+ s_content = self.fertilizers_db["Калий сернокислый"]["S"]
840
+
841
+ # Рассчитываем сколько можем внести по калию и сере
842
+ grams_by_k = (k_need * self.volume) / (k_content * 1000)
843
+ grams_by_s = (s_need * self.volume) / (s_content * 1000)
844
+ grams = min(grams_by_k, grams_by_s)
845
+
846
+ added_k = grams * k_content * 1000 / self.volume
847
+ added_s = grams * s_content * 1000 / self.volume
848
+
849
+ self.final_profile['K'] -= added_k
850
+ self.final_profile['S'] -= added_s
851
+ self._apply_fertilizer("Калий сернокислый", grams, {
852
+ 'внесет K': round(added_k, 2),
853
+ 'внесет S': round(added_s, 2)
854
+ })
855
+
856
+ def _apply_potassium_nitrate(self):
857
+ k_need = self.final_profile['K']
858
+ if k_need <= 0:
859
+ return
860
+
861
+ k_content = self.fertilizers_db["Калий азотнокислый"]["K"]
862
+ grams = (k_need * self.volume) / (k_content * 1000)
863
+ added_n = grams * self.fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
864
+
865
+ self.final_profile['K'] = 0
866
+ self.final_profile['N (NO3-)'] -= added_n
867
+ self._apply_fertilizer("Калий азотнокислый", grams, {'внесет NO3': round(added_n, 2)})
868
+
869
  def calculate_ec(self):
870
  return round(self.total_ppm / 700, 2)
871
 
 
908
 
909
  # Пример использования
910
  if __name__ == "__main__":
911
+ calculator = NutrientCalculator(volume_liters=10)
912
+ calculator.calculate(TOTAL_NITROGEN, NO3_RATIO, NH4_RATIO)
913
+ calculator.print_report()
 
 
914
 
915
 
916