DmitrMakeev commited on
Commit
cee8242
·
verified ·
1 Parent(s): 1f2fd8a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +152 -0
app.py CHANGED
@@ -752,6 +752,158 @@ class NutrientCalculator:
752
  self.fertilizers_db["Калий азотнокислый"] = ALL_FERTILIZERS["Калий азотнокислый"]
753
 
754
  # ... (остальные методы класса остаются без изменений)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
755
 
756
  def _apply_potassium_fertilizers(self):
757
  k_need = self.final_profile['K']
 
752
  self.fertilizers_db["Калий азотнокислый"] = ALL_FERTILIZERS["Калий азотнокислый"]
753
 
754
  # ... (остальные методы класса остаются без изменений)
755
+ def __init__(self, volume_liters=1.0):
756
+ self.volume = volume_liters
757
+ self.results = {}
758
+ self.final_profile = {}
759
+ self.total_ppm = 0
760
+ self.initial_n_profile = {}
761
+
762
+ def calculate(self, base_profile, total_n, n_ratio):
763
+ total_parts = n_ratio[0] + n_ratio[1]
764
+ no3 = total_n * (n_ratio[0] / total_parts)
765
+ nh4 = total_n * (n_ratio[1] / total_parts)
766
+
767
+ self.initial_n_profile = {
768
+ 'N (NO3-)': round(no3, 1),
769
+ 'N (NH4+)': round(nh4, 1)
770
+ }
771
+
772
+ self.final_profile = base_profile.copy()
773
+ self.final_profile['N (NO3-)'] = no3
774
+ self.final_profile['N (NH4+)'] = nh4
775
+ self.total_ppm = total_n + sum(base_profile.values())
776
+
777
+ # Расчёт удобрений
778
+ self._apply_magnesium_sulfate()
779
+ self._apply_calcium_nitrate()
780
+ self._apply_mkp()
781
+ self._apply_potassium_fertilizers()
782
+ self._apply_ammonium_nitrate()
783
+ return self.results
784
+
785
+ def _apply_fertilizer(self, fert_name, grams, additions):
786
+ self.results[fert_name] = {
787
+ 'граммы': round(grams, 3),
788
+ 'миллиграммы': int(grams * 1000),
789
+ }
790
+ self.results[fert_name].update(additions)
791
+
792
+ def _apply_magnesium_sulfate(self):
793
+ mg_need = self.final_profile['Mg']
794
+ mg_content = fertilizers_db["Сульфат магния"]["Mg"]
795
+ grams = (mg_need * self.volume) / (mg_content * 1000)
796
+ added_s = grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
797
+
798
+ self.final_profile['S'] -= added_s
799
+ self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
800
+ self.final_profile['Mg'] = 0
801
+
802
+ def _apply_calcium_nitrate(self):
803
+ ca_need = self.final_profile['Ca']
804
+ ca_content = fertilizers_db["Кальциевая селитра"]["Ca"]
805
+ grams = (ca_need * self.volume) / (ca_content * 1000)
806
+ added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
807
+
808
+ self.final_profile['N (NO3-)'] -= added_n
809
+ self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
810
+ self.final_profile['Ca'] = 0
811
+
812
+ def _apply_mkp(self):
813
+ p_need = self.final_profile['P']
814
+ p_content = fertilizers_db["Монофосфат калия"]["P"]
815
+ grams = (p_need * self.volume) / (p_content * 1000)
816
+ added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
817
+
818
+ self.final_profile['K'] -= added_k
819
+ self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
820
+ self.final_profile['P'] = 0
821
+
822
+ def _apply_potassium_fertilizers(self):
823
+ k_need = self.final_profile['K']
824
+ if k_need <= 0:
825
+ return
826
+
827
+ s_deficit = max(0, self.final_profile['S'])
828
+ if s_deficit > 0:
829
+ s_content = fertilizers_db["Калий сернокислый"]["S"]
830
+ k2so4_grams = (s_deficit * self.volume) / (s_content * 1000)
831
+ added_k = k2so4_grams * fertilizers_db["Калий сернокислый"]["K"] * 1000 / self.volume
832
+
833
+ if added_k > k_need:
834
+ k2so4_grams = (k_need * self.volume) / (fertilizers_db["Калий сернокислый"]["K"] * 1000)
835
+ added_k = k_need
836
+ added_s = k2so4_grams * fertilizers_db["Калий сернокислый"]["S"] * 1000 / self.volume
837
+ else:
838
+ added_s = s_deficit
839
+
840
+ self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
841
+ 'внесет K': round(added_k, 1),
842
+ 'внесет S': round(added_s, 1)
843
+ })
844
+ self.final_profile['K'] -= added_k
845
+ self.final_profile['S'] -= added_s
846
+ k_need = self.final_profile['K']
847
+
848
+ if k_need > 0:
849
+ kno3_grams = (k_need * self.volume) / (fertilizers_db["Калий азотнокислый"]["K"] * 1000)
850
+ added_n = kno3_grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
851
+
852
+ self._apply_fertilizer("Калий азотнокислый", kno3_grams, {'внесет NO3': round(added_n, 1)})
853
+ self.final_profile['K'] = 0
854
+ self.final_profile['N (NO3-)'] -= added_n
855
+
856
+ def _apply_ammonium_nitrate(self):
857
+ nh4_need = self.final_profile['N (NH4+)']
858
+ if nh4_need <= 0:
859
+ return
860
+ nh4_content = fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"]
861
+ grams = (nh4_need * self.volume) / (nh4_content * 1000)
862
+ added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
863
+
864
+ self.final_profile['N (NO3-)'] -= added_n
865
+ self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
866
+ self.final_profile['N (NH4+)'] = 0
867
+
868
+ def calculate_ec(self):
869
+ return round(self.total_ppm / 700, 2)
870
+
871
+ def print_report(self):
872
+ print("\n" + "="*60)
873
+ print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
874
+ print("="*60)
875
+ table = [[el, round(val, 1)] for el, val in self.final_profile.items()]
876
+ print(tabulate(table, headers=["Элемент", "Остаток ppm"]))
877
+
878
+ print("\nИсходный расчёт азота:")
879
+ for form, value in self.initial_n_profile.items():
880
+ print(f" {form}: {value} ppm")
881
+
882
+ print("\n" + "="*60)
883
+ print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
884
+ print("="*60)
885
+ print(f"Общая концентрация: {self.total_ppm} ppm")
886
+ print(f"EC: {self.calculate_ec()} mS/cm")
887
+
888
+ print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
889
+ fert_table = []
890
+ for fert, data in self.results.items():
891
+ details = [f"+{k}: {v} ppm" for k, v in data.items() if k.startswith('внесет')]
892
+ fert_table.append([
893
+ fert,
894
+ f"{data['граммы']} г",
895
+ f"{data['миллиграммы']} мг",
896
+ "\n".join(details)
897
+ ])
898
+ print(tabulate(fert_table, headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
899
+
900
+ print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
901
+ deficit = {k: v for k, v in self.final_profile.items() if v > 0.1}
902
+ if deficit:
903
+ for el, val in deficit.items():
904
+ print(f" {el}: {round(val, 1)} ppm")
905
+ else:
906
+ print(" Все элементы покрыты полностью")
907
 
908
  def _apply_potassium_fertilizers(self):
909
  k_need = self.final_profile['K']