DmitrMakeev commited on
Commit
7c1d440
·
verified ·
1 Parent(s): 7fce857

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -30
app.py CHANGED
@@ -711,17 +711,31 @@ INPUT_DATA = {
711
 
712
 
713
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
714
  class NutrientCalculator:
715
- def __init__(self, fertilizer_constants, profile_settings, liters, rounding_precision, activation_cacl, enhancement_cacl):
716
  self.fertilizers = fertilizer_constants
717
  self.profile = profile_settings
718
  self.volume = liters
719
  self.rounding_precision = rounding_precision
720
 
721
- # Новые параметры
722
- self.activation_cacl = float(activation_cacl) # Активация CaCl
723
- self.enhancement_cacl = float(enhancement_cacl) # Усиление CaCl
724
-
725
  total_parts = self.profile["NO3_RAT"] + 1
726
  self.target = {
727
  'P': self.profile["P"],
@@ -737,14 +751,26 @@ class NutrientCalculator:
737
  self.results = {fert: {'граммы': 0.0} for fert in self.fertilizers}
738
 
739
  def calculate(self):
 
740
  self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target["N (NH4+)"])
 
 
741
  self._apply_fertilizer("Монофосфат калия", "P", self.target["P"])
 
 
742
  self._apply_fertilizer("Сульфат магния", "Mg", self.target["Mg"])
 
 
743
  self._balance_k_s()
 
 
744
  self._distribute_calcium()
 
 
745
  no3_needed = self.target["N (NO3-)"] - self.actual["N (NO3-)"]
746
  if no3_needed > 0:
747
  self._apply_fertilizer("Калий азотнокислый", "N (NO3-)", no3_needed)
 
748
  return self._verify_results()
749
 
750
  def _apply_fertilizer(self, name, element, target_ppm):
@@ -764,6 +790,8 @@ class NutrientCalculator:
764
  def _balance_k_s(self):
765
  k_needed = self.target["K"] - self.actual["K"]
766
  s_needed = self.target["S"] - self.actual["S"]
 
 
767
  if k_needed > 0 and s_needed > 0:
768
  k_fraction = self.fertilizers["Калий сернокислый"].get("K", 0)
769
  s_fraction = self.fertilizers["Калий сернокислый"].get("S", 0)
@@ -772,33 +800,18 @@ class NutrientCalculator:
772
  return
773
  k_from_k2so4 = min(k_needed, s_needed * k_fraction / s_fraction)
774
  self._apply_fertilizer("Калий сернокислый", "K", k_from_k2so4)
 
 
775
  remaining_k = self.target["K"] - self.actual["K"]
776
  if remaining_k > 0:
777
  self._apply_fertilizer("Калий азотнокислый", "K", remaining_k)
778
 
779
  def _distribute_calcium(self):
780
  ca_target = self.target["Ca"] # Общий кальций
781
- no3_ratio = self.profile["NO3_RAT"]
782
-
783
- # Проверка соотношения NO3/NH4
784
- if no3_ratio >= self.activation_cacl: # Заменили "5" на self.activation_cacl
785
- print(f"Соотношение NO3/NH4 >= {self.activation_cacl}. Кальций хлористый не добавляется.")
786
- remaining_ca = ca_target
787
- else:
788
- # Определяем, сколько кальция взять из хлористого кальция
789
- cacl_ratio = self.enhancement_cacl # Заменили "0.1" на self.enhancement_cacl
790
- cacl_target = ca_target * cacl_ratio
791
-
792
- # Вносим кальций из хлористого кальция
793
- if cacl_target > 0:
794
- self._apply_fertilizer("Кальций хлорид", "Ca", cacl_target)
795
 
796
- # Оставшийся кальций берем из кальциевой селитры
797
- remaining_ca = ca_target - cacl_target
798
-
799
- # Добавляем оставшийся кальций из кальциевой селитры
800
- if remaining_ca > 0:
801
- self._apply_fertilizer("Кальциевая селитра", "Ca", remaining_ca)
802
 
803
  def _verify_results(self):
804
  deficits = {}
@@ -845,17 +858,13 @@ fertilizer_constants = INPUT_DATA["fertilizerConstants"]
845
  profile_settings = INPUT_DATA["profileSettings"]
846
  liters = profile_settings["liters"]
847
  rounding_precision = 3
848
- activation_cacl = float(profile_settings.get("activation_cacl", 5))
849
- enhancement_cacl = float(profile_settings.get("enhancement_cacl", 0.1))
850
 
851
  # Создаем калькулятор
852
  calculator = NutrientCalculator(
853
  fertilizer_constants=fertilizer_constants,
854
  profile_settings=profile_settings,
855
  liters=liters,
856
- rounding_precision=rounding_precision,
857
- activation_cacl=activation_cacl,
858
- enhancement_cacl=enhancement_cacl
859
  )
860
 
861
  # Запуск расчета
 
711
 
712
 
713
 
714
+ from tabulate import tabulate
715
+
716
+ # Входные данные (пример)
717
+ INPUT_DATA = {
718
+ "fertilizerConstants": {
719
+ "Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca": 0.16972},
720
+ "Калий азотнокислый": {"N (NO3-)": 0.13854, "K": 0.36672},
721
+ "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
722
+ "Сульфат магния": {"Mg": 0.10220, "S": 0.13483},
723
+ "Монофосфат калия": {"P": 0.22761, "K": 0.28731},
724
+ "Калий сернокислый": {"K": 0.44874, "S": 0.18401}
725
+ },
726
+ "profileSettings": {
727
+ "P": 31, "K": 210, "Mg": 24, "Ca": 82, "S": 57.5,
728
+ "NO3_RAT": 8.25, "TOTAL_NITROG": 125, "liters": 100
729
+ }
730
+ }
731
+
732
  class NutrientCalculator:
733
+ def __init__(self, fertilizer_constants, profile_settings, liters, rounding_precision):
734
  self.fertilizers = fertilizer_constants
735
  self.profile = profile_settings
736
  self.volume = liters
737
  self.rounding_precision = rounding_precision
738
 
 
 
 
 
739
  total_parts = self.profile["NO3_RAT"] + 1
740
  self.target = {
741
  'P': self.profile["P"],
 
751
  self.results = {fert: {'граммы': 0.0} for fert in self.fertilizers}
752
 
753
  def calculate(self):
754
+ # Добавляем аммонийный азот
755
  self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target["N (NH4+)"])
756
+
757
+ # Добавляем фосфор
758
  self._apply_fertilizer("Монофосфат калия", "P", self.target["P"])
759
+
760
+ # Добавляем магний
761
  self._apply_fertilizer("Сульфат магния", "Mg", self.target["Mg"])
762
+
763
+ # Балансируем калий и серу
764
  self._balance_k_s()
765
+
766
+ # Распределяем кальций
767
  self._distribute_calcium()
768
+
769
+ # Балансируем нитратный азот
770
  no3_needed = self.target["N (NO3-)"] - self.actual["N (NO3-)"]
771
  if no3_needed > 0:
772
  self._apply_fertilizer("Калий азотнокислый", "N (NO3-)", no3_needed)
773
+
774
  return self._verify_results()
775
 
776
  def _apply_fertilizer(self, name, element, target_ppm):
 
790
  def _balance_k_s(self):
791
  k_needed = self.target["K"] - self.actual["K"]
792
  s_needed = self.target["S"] - self.actual["S"]
793
+
794
+ # Используем "Калий сернокислый" для баланса K и S
795
  if k_needed > 0 and s_needed > 0:
796
  k_fraction = self.fertilizers["Калий сернокислый"].get("K", 0)
797
  s_fraction = self.fertilizers["Калий сернокислый"].get("S", 0)
 
800
  return
801
  k_from_k2so4 = min(k_needed, s_needed * k_fraction / s_fraction)
802
  self._apply_fertilizer("Калий сернокислый", "K", k_from_k2so4)
803
+
804
+ # Оставшийся калий добавляем через "Калий азотнокислый"
805
  remaining_k = self.target["K"] - self.actual["K"]
806
  if remaining_k > 0:
807
  self._apply_fertilizer("Калий азотнокислый", "K", remaining_k)
808
 
809
  def _distribute_calcium(self):
810
  ca_target = self.target["Ca"] # Общий кальций
 
 
 
 
 
 
 
 
 
 
 
 
 
 
811
 
812
+ # Весь кальций добавляется через "Кальциевую селитру"
813
+ if ca_target > 0:
814
+ self._apply_fertilizer("Кальциевая селитра", "Ca", ca_target)
 
 
 
815
 
816
  def _verify_results(self):
817
  deficits = {}
 
858
  profile_settings = INPUT_DATA["profileSettings"]
859
  liters = profile_settings["liters"]
860
  rounding_precision = 3
 
 
861
 
862
  # Создаем калькулятор
863
  calculator = NutrientCalculator(
864
  fertilizer_constants=fertilizer_constants,
865
  profile_settings=profile_settings,
866
  liters=liters,
867
+ rounding_precision=rounding_precision
 
 
868
  )
869
 
870
  # Запуск расчета