FluxCd_input.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from sqlalchemy import Column, Integer, Float
  2. from sqlalchemy import ForeignKeyConstraint
  3. from app.database import Base # 统一的基础模型
  4. class FluxCdInputData(Base):
  5. """
  6. 通量镉预测模型输入数据模型
  7. 收集计算土壤镉通量平衡所需的输入参数:
  8. - 初始土壤镉总量
  9. - 四大输入通量(大气沉降、灌溉水、农业投入品、其他)
  10. - 四大输出通量(地下渗漏、地表径流、籽粒移除、秸秆移除)
  11. 注:所有通量单位均为g/ha/a
  12. """
  13. __tablename__ = 'FluxCd_input_data'
  14. # 主键配置
  15. id = Column('ID', Integer, primary_key=True, autoincrement=True,
  16. comment='自增主键')
  17. # 外键字段 - 关联农田样点
  18. farmland_id = Column('Farmland_ID', Integer, nullable=False,
  19. comment='关联农地ID')
  20. sample_id = Column('Sample_ID', Integer, nullable=False,
  21. comment='关联样点ID')
  22. # 初始土壤镉总量
  23. initial_cd = Column('Initial_Cd', Float, nullable=False,
  24. comment='土壤初始Cd总量[g/ha](100m×100m栅格)')
  25. # 输入通量
  26. atmospheric_deposition = Column('DQCJ_Cd', Float, nullable=False,
  27. comment='大气沉降输入镉[g/ha/a]')
  28. irrigation_input = Column('GGS_Cd', Float, nullable=False,
  29. comment='灌溉水输入镉[g/ha/a]')
  30. agro_chemicals_input = Column('NCP_Cd', Float, nullable=False,
  31. comment='农业投入品输入镉[g/ha/a]')
  32. # 输出通量 (带默认值)
  33. groundwater_leaching = Column('DX_Cd', Float, default=0.023,
  34. comment='地下渗漏输出镉[g/ha/a]')
  35. surface_runoff = Column('DB_Cd', Float, default=0.368,
  36. comment='地表径流输出镉[g/ha/a]')
  37. grain_removal = Column('ZL_Cd', Float, nullable=False,
  38. comment='籽粒移除输出镉[g/ha/a]')
  39. straw_removal = Column('JG_Cd', Float, nullable=False,
  40. comment='秸秆移除输出镉[g/ha/a]')
  41. # 复合外键约束
  42. __table_args__ = (
  43. ForeignKeyConstraint(
  44. ['Farmland_ID', 'Sample_ID'],
  45. ['Farmland_data.Farmland_ID', 'Farmland_data.Sample_ID']
  46. ),
  47. {'comment': '通量镉预测模型输入数据'}
  48. )
  49. # 计算输入总通量
  50. def input_flux(self):
  51. """计算镉输入总通量[g/ha/a]"""
  52. return self.atmospheric_deposition + self.irrigation_input + self.agro_chemicals_input
  53. # 计算输出总通量
  54. def output_flux(self):
  55. """计算镉输出总通量[g/ha/a]"""
  56. return self.groundwater_leaching + self.surface_runoff + self.grain_removal + self.straw_removal
  57. # 计算净通量
  58. def net_flux(self):
  59. """计算镉净通量[g/ha/a](输入-输出)"""
  60. return self.input_flux() - self.output_flux()