DmitrMakeev commited on
Commit
1cad2ac
·
verified ·
1 Parent(s): 76d85f7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -74
app.py CHANGED
@@ -826,40 +826,24 @@ NUTRIENT_CONTENT_IN_FERTILIZERS = {
826
 
827
  class NutrientCalculator:
828
  def __init__(self, volume_liters=1.0):
829
- self.volume = volume_liters
830
- self.results = {}
831
- self.target_profile = BASE_PROFILE.copy()
832
- self.actual_profile = {k: 0.0 for k in BASE_PROFILE}
833
- self.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
834
- self.total_ec = 0.0
835
-
836
- # Веса компенсации для элементов (кроме азотов)
837
  self.element_compensation_weights = {
838
  "POTASSIUM_SULFATE": {"weight": -0.18, "fert": "Калий сернокислый", "main_element": "K"},
839
  "MAGNESIUM_SULFATE": {"weight": -0.1, "fert": "Сульфат магния", "main_element": "Mg"},
840
- "MONOPOTASSIUM_PHOSPHATE": {"weight": -0.14, "fert": "Монофосфат калия", "main_element": "P"}
 
 
841
  }
842
 
843
- # Расчёт азота
844
- total_parts = NO3_RATIO + NH4_RATIO
845
- self.target_profile['N (NO3-)'] = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
846
- self.target_profile['N (NH4+)'] = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
847
-
848
- def _label(self, element):
849
- """Форматирование названий элементов для вывода"""
850
- labels = {
851
- 'N (NO3-)': 'NO3',
852
- 'N (NH4+)': 'NH4'
853
- }
854
- return labels.get(element, element)
855
-
856
  def calculate(self):
857
  try:
858
  # Вносим магний через компенсацию
859
  self._compensate_element("Mg")
860
 
861
- # Вносим кальций напрямую
862
- self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
863
 
864
  # Вносим фосфор через компенсацию
865
  self._compensate_element("P")
@@ -867,11 +851,8 @@ class NutrientCalculator:
867
  # Вносим аммонийный азот напрямую
868
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
869
 
870
- # Компенсируем нитратный азот напрямую
871
- current_no3 = self.actual_profile['N (NO3-)']
872
- no3_needed = self.target_profile['N (NO3-)'] - current_no3
873
- if no3_needed > 0.1:
874
- self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
875
 
876
  # Компенсируем серу через компенсацию
877
  self._compensate_element("S")
@@ -884,61 +865,48 @@ class NutrientCalculator:
884
  print(f"Ошибка при расчёте: {str(e)}")
885
  raise
886
 
887
- def _apply(self, fert_name, main_element, required_ppm):
888
- if required_ppm <= 0:
889
- return
890
-
891
- try:
892
- content = self.fertilizers[fert_name][main_element]
893
- grams = (required_ppm * self.volume) / (content * 1000)
894
-
895
- if fert_name not in self.results:
896
- result = {
897
- 'граммы': 0.0,
898
- 'миллиграммы': 0,
899
- 'вклад в EC': 0.0
900
- }
901
- for element in self.fertilizers[fert_name]:
902
- result[f'внесет {self._label(element)}'] = 0.0
903
- self.results[fert_name] = result
904
-
905
- self.results[fert_name]['граммы'] += grams
906
- self.results[fert_name]['миллиграммы'] += int(grams * 1000)
907
-
908
- fert_ec = 0.0
909
- for element, percent in self.fertilizers[fert_name].items():
910
- added_ppm = (grams * percent * 1000) / self.volume
911
- self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
912
- self.actual_profile[element] += added_ppm
913
- fert_ec += added_ppm * EC_COEFFICIENTS.get(element, 0.0015)
914
-
915
- self.results[fert_name]['вклад в EC'] += fert_ec
916
- self.total_ec += fert_ec
917
- except KeyError as e:
918
- print(f"Ошибка: отсутствует элемент {str(e)} в удобрении {fert_name}")
919
- raise
920
-
921
  def _compensate_element(self, element):
922
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
923
- if needed <= 0:
924
  return
925
 
926
  candidates = []
927
- for weight_key, weight_data in self.element_compensation_weights.items():
928
- fert_name = weight_data["fert"]
929
- if element in self.fertilizers.get(fert_name, {}):
930
- candidates.append({
931
- 'name': fert_name,
932
- 'weight': weight_data["weight"],
933
- 'content': self.fertilizers[fert_name][element]
934
- })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
935
 
936
  if not candidates:
937
  raise ValueError(f"Нет удобрений для элемента {element}")
938
 
939
- total_weight = sum(c['weight'] for c in candidates)
940
  for candidate in candidates:
941
- share = candidate['weight'] / total_weight
942
  ppm_to_apply = needed * share
943
  self._apply(candidate['name'], element, ppm_to_apply)
944
 
 
826
 
827
  class NutrientCalculator:
828
  def __init__(self, volume_liters=1.0):
829
+ # ... остальной код инициализации ...
830
+
831
+ # Веса компенсации с добавлением кальциевой селитры для NO3
 
 
 
 
 
832
  self.element_compensation_weights = {
833
  "POTASSIUM_SULFATE": {"weight": -0.18, "fert": "Калий сернокислый", "main_element": "K"},
834
  "MAGNESIUM_SULFATE": {"weight": -0.1, "fert": "Сульфат магния", "main_element": "Mg"},
835
+ "MONOPOTASSIUM_PHOSPHATE": {"weight": -0.14, "fert": "Монофосфат калия", "main_element": "P"},
836
+ "CALCIUM_NITRATE": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "Ca"},
837
+ "CALCIUM_NITRATE_NO3": {"weight": 0.15, "fert": "Кальциевая селитра", "main_element": "N (NO3-)"}
838
  }
839
 
 
 
 
 
 
 
 
 
 
 
 
 
 
840
  def calculate(self):
841
  try:
842
  # Вносим магний через компенсацию
843
  self._compensate_element("Mg")
844
 
845
+ # Теперь вносим кальций через компенсацию, а не напрямую
846
+ self._compensate_element("Ca")
847
 
848
  # Вносим фосфор через компенсацию
849
  self._compensate_element("P")
 
851
  # Вносим аммонийный азот напрямую
852
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
853
 
854
+ # Компенсируем нитратный азот через компенсацию
855
+ self._compensate_element("N (NO3-)")
 
 
 
856
 
857
  # Компенсируем серу через компенсацию
858
  self._compensate_element("S")
 
865
  print(f"Ошибка при расчёте: {str(e)}")
866
  raise
867
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
868
  def _compensate_element(self, element):
869
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
870
+ if abs(needed) < 0.1: # Игнорируем незначительные отклонения
871
  return
872
 
873
  candidates = []
874
+
875
+ # Для кальциевой селитры особый случай
876
+ if element == "Ca":
877
+ candidates.append({
878
+ 'name': "Кальциевая селитра",
879
+ 'weight': 0.7, # Основной вес для кальция
880
+ 'content': self.fertilizers["Кальциевая селитра"]["Ca"]
881
+ })
882
+ elif element == "N (NO3-)":
883
+ candidates.append({
884
+ 'name': "Кальциевая селитра",
885
+ 'weight': 0.3, # Дополнительный вес для NO3 из кальциевой селитры
886
+ 'content': self.fertilizers["Кальциевая селитра"]["N (NO3-)"]
887
+ })
888
+ candidates.append({
889
+ 'name': "Калий азотнокислый",
890
+ 'weight': 0.7, # Основной вес для NO3
891
+ 'content': self.fertilizers["Калий азотнокислый"]["N (NO3-)"]
892
+ })
893
+ else:
894
+ # Стандартная компенсация для других элементов
895
+ for weight_key, weight_data in self.element_compensation_weights.items():
896
+ fert_name = weight_data["fert"]
897
+ if element in self.fertilizers.get(fert_name, {}):
898
+ candidates.append({
899
+ 'name': fert_name,
900
+ 'weight': weight_data["weight"],
901
+ 'content': self.fertilizers[fert_name][element]
902
+ })
903
 
904
  if not candidates:
905
  raise ValueError(f"Нет удобрений для элемента {element}")
906
 
907
+ total_weight = sum(abs(c['weight']) for c in candidates)
908
  for candidate in candidates:
909
+ share = abs(candidate['weight']) / total_weight
910
  ppm_to_apply = needed * share
911
  self._apply(candidate['name'], element, ppm_to_apply)
912