WOFOST(World Food Studies)生长模型是由世界粮食研究中心(CWFS)和荷兰瓦格宁根大学开发的一个机理模型。
WOFOST模拟的主要过程是物候发育,叶片发育和光截获,CO2同化,根生长,蒸腾,呼吸,同化物分配到各个器官以及干物质形成。在WOFOST中,以一天作为模拟步长以生态生理过程为基础模拟作物生长,它可以模拟潜在条件下(作物生长仅受辐射,温度,大气中二氧化碳浓度和作物特征的限制)、水和养分限制条件下的作物生长状况。
WOFOST运行需要文件
作物文件
土壤文件
位点参数
管理文件
天气文件
模型的运行示例
模型运行必要的包导入
import os
import pandas as pd
import datetime
# from pcse.db import NASAPowerWeatherDataProvider # 可以从NASA上获取天气
from pcse.fileinput import CABOFileReader # 读取CABO文件(作物土壤文件)
from pcse.fileinput import YAMLAgroManagementReader # 管理文件读取
from pcse.models import Wofost71_WLP_FD, Wofost71_PP # 导入模型,Wofost71_PP潜在模型
from pcse.base import ParameterProvider # 综合作物、土壤、位点参数
from pcse.fileinput import ExcelWeatherDataProvider # 读取气象文件 文件读取
data_dir = r"F:\pcse run\wofost模型运行" # 读取参数文件夹
data_weather = r'F:\pcse run\2020气象数据' # 读取气象文件夹
cropdata = CABOFileReader(os.path.join(data_dir,'WWH101.CAB')) # 读取作物文件夹
soildata = CABOFileReader(os.path.join(data_dir,'EC3.NEW')) # 读取土壤文件夹
sitedata = {'SSMAX' : 0.,
'IFUNRN' : 0,
'NOTINF' : 0,
'SSI' : 0,
'WAV' : 20,
'SMLIM' : 0.03,
'RDMSOL' : 120} #定义位点参数数据
parameters = ParameterProvider(cropdata=cropdata, soildata=soildata, sitedata=sitedata) #综合参数
agromanagement = YAMLAgroManagementReader(os.path.join(data_dir,'wheat.agro')) #作物管理参数设置
weatherdataprovider = ExcelWeatherDataProvider(os.path.join(data_weather,'NASA天气文件lat=36.0,lon=114.5.xlsx')) #读取天气数据
# weatherdataprovider = NASAPowerWeatherDataProvider(latitude=32, longitude=114)
agromanagement[0][datetime.date(2018, 10, 1)]['CropCalendar']['crop_start_date'] = datetime.date(2019, 1, 4) #替换选择作物管理数据
# agromanagement[0][datetime.date(2019, 10, 1)]['CropCalendar']['crop_start_date'] 运行WOFOST
# Start WOFOST
# import datetime
# parameters['CVO']=1.12
# agromanagement[0][datetime.date(2019, 10, 1)]['CropCalendar']['crop_start_date']=datetime.date(2019, 10,20)
wf = Wofost71_WLP_FD(parameters, weatherdataprovider, agromanagement) # 定义模型
wf.run_till_terminate() # 运行模型直到终止
summary_output=wf.get_summary_output() # 获取概要输出
print(summary_output) # 打印概要输出
output=pd.DataFrame(wf.get_output()) # 获取详细输出
# output.to_excel(os.path.join(data_dir,'result.xlsx')) # 将输出结果存为Excel
agromanagement [{'DVS': 2.0, 'LAIMAX': 4.576182888479307, 'TAGP': 10742.515100465607, 'TWSO': 3473.9546847116694, 'TWLV': 2169.0323854798744, 'TWST': 5099.528030274064, 'TWRT': 948.5685769974932, 'CTRAT': 28.5336082639531, 'RD': 120.0, 'DOS': datetime.date(2019, 1, 4), 'DOE': datetime.date(2019, 1, 16), 'DOA': datetime.date(2019, 5, 5), 'DOM': datetime.date(2019, 6, 12), 'DOH': None, 'DOV': None}]
Out:
[{datetime.date(2018, 10, 1): {'CropCalendar': {'crop_name': 'wheat', 'variety_name': 'winter-wheat', 'crop_start_date': datetime.date(2019, 1, 4), 'crop_start_type': 'sowing', 'crop_end_date': None, 'crop_end_type': 'maturity', 'max_duration': 300}, 'TimedEvents': [{'event_signal': 'irrigate', 'name': 'Timed irrigation events', 'comment': 'All irrigation amounts in cm', 'events_table': [{datetime.date(2019, 3, 2): {'amount': 7.0, 'efficiency': 0.7}}, {datetime.date(2019, 5, 1): {'amount': 7.5, 'efficiency': 0.7}}]}], 'StateEvents': None}}]
提取不同结果获得图像
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
result = output.set_index('day')
fig, ((axis1, axis2),(ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10,10))
result['LAI'].plot(ax=axis1, label="LAI")
result.TAGP.plot(ax=axis2, label="Total biomass")
result.TWLV.plot(ax=axis2, label="Yield")
result.TRA.plot(ax=ax3, label="TRA")
result.SM.plot(ax=ax4, label="Soil moisture")
axis1.set_title("Leaf Area Index")
axis2.set_title("Crop biomass")
fig.autofmt_xdate()
plt.show()
result 
更改不同参数数据获取不同LAI的变化图像
# parameters['TBASE'] = -5
parameters['KDIFTB'][1] = 0.3
# parameters['SLATB'][3] = 0.002
# parameters['CVO'] = 0.88
# parameters['AMAXTB'][5] = 56
# parameters['AMAXTB'][3] = 56
# parameters['EFFTB'][3] = 0.7
# parameters['FSTB'][1] = 1-parameters['FLTB'][1]
# agromanagement = YAMLAgroManagementReader(os.path.join(data_dir,'wheatSA0.agro'))
wf = Wofost71_PP(parameters, weatherdataprovider, agromanagement) # 定义模型
wf.run_till_terminate() # 运行模型直到
# print(summary_output) # 打印概要输出
output=pd.DataFrame(wf.get_output()) # 获取详细输出
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
result = output.set_index('day')
fig, axis1 = plt.subplots(figsize=(10,20))
result.TAGP.plot(ax=axis1, label="LAI")
parameters['KDIFTB'][1] = 0.4
wf = Wofost71_PP(parameters, weatherdataprovider, agromanagement) # 定义模型
wf.run_till_terminate() # 运行模型直到
# print(summary_output) # 打印概要输出
output=pd.DataFrame(wf.get_output()) # 获取详细输出
result = output.set_index('day')
result.TAGP.plot(ax=axis1, label="LAI2")
parameters['KDIFTB'][1] = 0.5
wf = Wofost71_PP(parameters, weatherdataprovider, agromanagement) # 定义模型
wf.run_till_terminate() # 运行模型直到
# print(summary_output) # 打印概要输出
output=pd.DataFrame(wf.get_output()) # 获取详细输出
result = output.set_index('day')
result.TAGP.plot(ax=axis1, label="LAI3")
parameters['KDIFTB'][1] = 0.6
wf = Wofost71_PP(parameters, weatherdataprovider, agromanagement) # 定义模型
wf.run_till_terminate() # 运行模型直到
# print(summary_output) # 打印概要输出
output=pd.DataFrame(wf.get_output()) # 获取详细输出
result = output.set_index('day')
result.TAGP.plot(ax=axis1, label="LAI4")
parameters['KDIFTB'][1] = 0.7
wf = Wofost71_PP(parameters, weatherdataprovider, agromanagement) # 定义模型
wf.run_till_terminate() # 运行模型直到
# print(summary_output) # 打印概要输出
output=pd.DataFrame(wf.get_output()) # 获取详细输出
result = output.set_index('day')
result.TAGP.plot(ax=axis1, label="LAI5")
parameters['KDIFTB'][1] = 0.8
wf = Wofost71_PP(parameters, weatherdataprovider, agromanagement) # 定义模型
wf.run_till_terminate() # 运行模型直到
# print(summary_output) # 打印概要输出
output=pd.DataFrame(wf.get_output()) # 获取详细输出
result = output.set_index('day')
result.TAGP.plot(ax=axis1, label="LAI6")
plt.legend()
# result.TAGP.plot(ax=axis2, label="Total biomass")
# result.TWSO.plot(ax=axis2, label="Yield")
# result.TRA.plot(ax=ax3, label="TRA")
# result.SM.plot(ax=ax4, label="Soil moisture")
# axis1.set_title("Leaf Area Index")
# axis2.set_title("Crop biomass")
fig.autofmt_xdate()
