此系列博文的目的是学习AquaCrop-OSPy作物模型的基本使用。
AquaCrop模型是一款水分驱动模型,可以用于进行灌溉策略优化,此文主要基于Kelly的AquaCrop_OSPy_Notebook_2学习如何开展基于AquaCrop-OSPy模型的不同灌溉策略下的玉米产量模拟。
基于AquaCrop-OSPy来探索不同灌溉管理策略对用水和作物产量的影响;
学习如何在AquaCrop-OSPy模型中定义不同的灌溉管理实践
# %% 相关包的导入
import aquacrop.classes as apclass # 导入aquacrop.classes
import aquacrop.core as apcore # 导入aquacrop.core
# 导入pandas库,辅助整理模拟结果
import pandas as pd
# 导入制图库,辅助制图
import matplotlib.pyplot as plt
import seaborn as sns
# %% 模型输入设置
'''
说明
(1) 模型输入设置的基础是已经理解了各类模型输入参数的含义,只有如此,才能:
1) 知道哪些参数需要保持默认,哪些参数需要实际测量,哪些参数需要本地化校验
2) 才能依据模拟需要,灵活设置模拟方案
'''
# 气象数据
weather_file = rootdir + '01_WeatherData\\champion_climate.txt'
weather_data = apcore.prepare_weather(weather_file)
# 土壤数据设置
'''
设置说明
(1) 通过class模块设置中的SoilClass类设置土壤属性,设置方法包括:
1) 依据土壤质地类别名称,确定土壤基本属性,此时的属性是对应类别的默认属性
2) 或基于实测数据,对默认属性进行相应的修改
'''
sandy_loam = apclass.SoilClass(soilType='SandyLoam') # 沙壤土
#print('沙壤土(Sand Loam)的默认属性:\n',sandy_loam)
print('---------')
# 初始含水量文件设置
'''
设置说明
(1) 模型土壤初始含水量是模拟开始时,土壤水分的初始状况
(2) 初始含水量设置的基础是理解InitWCClass里面每一个指标的含义,并通过InitWCClass
源码理解设置方法
'''
InitWC = apclass.InitWCClass(value=['FC']) # 将每一层的初始含水量设置为田间持水量
# 作物
'''
说明
(1) AquaCrop-OSPy在Classes类中对玉米、小麦、土豆和水稻的默认作物参数进行了设置
(2) AquaCrop-OSPy允许使用者构建其他作物的作物参数文件
(3) 实际应用时,对于作物参数里的部分参数需要通过本地化校验确定,此时就需要对这部分
参数进行修改。
(4) 查看CropClass部分的源码会知道如何对某些参数进行修改
1) 除了必要的输入参数,**kwargs可以用于对默认参数进行修改
'''
crop = apclass.CropClass('Maize', PlantingDate='05/01')
# 在输入设置基础上,构建玉米的AquaCrop模型,并指定模拟的开始和结束时间
# 关于AquaCropModel类,需要参考其源码,了解如何设置其参数
sim_start = '1982/05/01'
sim_end = '2018/10/30'
labels = []
outputs = []
for smt in range(0,110,20):
crop.Name = str(smt)
labels.append(str(smt))
irr_mngt = apclass.IrrMngtClass(IrrMethod=1,SMT=[smt]*4) # 设置灌溉管理方案
maizemodel = apcore.AquaCropModel(SimStartTime=sim_start,
SimEndTime=sim_end,
wdf=weather_data,
Soil=sandy_loam,
Crop=crop,
InitWC=InitWC,
IrrMngt=irr_mngt)
maizemodel.initialize() # 模型初始化
maizemodel.step(till_termination=True) # 执行模型直到终止
outputs.append(maizemodel.Outputs.Final) # 保存模拟结果
# %% 模拟结果合并,便于可视化
dflist=outputs
labels[0]='Rainfed'
outlist=[]
for i in range(len(dflist)):
temp = pd.DataFrame(dflist[i][['Yield (tonne/ha)',
'Seasonal irrigation (mm)']])
temp['label']=labels[i]
outlist.append(temp)
all_outputs = pd.concat(outlist,axis=0)
# 合并所有结果
results=pd.concat(outlist)
# %% 制图展示
# 生成制图框架
fig,ax=plt.subplots(2,1,figsize=(10,14))
# 产生箱图
sns.boxplot(data=results,x='label',y='Yield (tonne/ha)',ax=ax[0])
sns.boxplot(data=results,x='label',y='Seasonal irrigation (mm)',ax=ax[1])
# 坐标轴标签
ax[0].tick_params(labelsize=15)
ax[0].set_xlabel('Soil-moisture threshold (%TAW)',fontsize=18)
ax[0].set_ylabel('Yield (t/ha)',fontsize=18)
ax[1].tick_params(labelsize=15)
ax[1].set_xlabel('Soil-moisture threshold (%TAW)',fontsize=18)
ax[1].set_ylabel('Total Irrigation (ha-mm)',fontsize=18)
plt.legend(fontsize=18)
[1] Kelly, T. D.; Foster, T. (2021): AquaCrop-OSPy:Bridging the gap between research and practice in crop-water modeling. InAgricultural Water Management 254, p. 106976.
[2] AquaCrop_OSPy_Notebook_2
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务