WOFOST入门简介
天地无甪
编辑于 2021年02月18日 20:08
收录于文集
共4篇

  WOFOST(World Food Studies)生长模型是由世界粮食研究中心(CWFS)和荷兰瓦格宁根大学开发的一个机理模型。

  WOFOST模拟的主要过程是物候发育,叶片发育和光截获,CO2同化,根生长,蒸腾,呼吸,同化物分配到各个器官以及干物质形成。在WOFOST中,以一天作为模拟步长以生态生理过程为基础模拟作物生长,它可以模拟潜在条件下(作物生长仅受辐射,温度,大气中二氧化碳浓度和作物特征的限制)、水和养分限制条件下的作物生长状况。

WOFOST运行需要文件

  1. 作物文件

  2. 土壤文件

  3. 位点参数

  4. 管理文件

  5. 天气文件


模型的运行示例

模型运行必要的包导入

代码块
Python
自动换行
复制代码
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  # 读取气象文件
复制成功

文件读取

代码块
Python
自动换行
复制代码
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

代码块
Python
自动换行
复制代码
# 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&#​39;: 2.0, 'LAIMAX&#​39;: 4.576182888479307, 'TAGP&#​39;: 10742.515100465607, 'TWSO&#​39;: 3473.9546847116694, 'TWLV&#​39;: 2169.0323854798744, 'TWST&#​39;: 5099.528030274064, 'TWRT&#​39;: 948.5685769974932, 'CTRAT&#​39;: 28.5336082639531, 'RD&#​39;: 120.0, 'DOS&#​39;: datetime.date(2019, 1, 4), 'DOE&#​39;: datetime.date(2019, 1, 16), 'DOA&#​39;: datetime.date(2019, 5, 5), 'DOM&#​39;: datetime.date(2019, 6, 12), 'DOH&#​39;: None, 'DOV&#​39;: None}]

Out:

[{datetime.date(2018, 10, 1): {'CropCalendar&#​39;: {'crop_name&#​39;: 'wheat&#​39;,    'variety_name&#​39;: 'winter-wheat&#​39;,    'crop_start_date&#​39;: datetime.date(2019, 1, 4),    'crop_start_type&#​39;: 'sowing&#​39;,    'crop_end_date&#​39;: None,    'crop_end_type&#​39;: 'maturity&#​39;,    'max_duration&#​39;: 300},   'TimedEvents&#​39;: [{'event_signal&#​39;: 'irrigate&#​39;,     'name&#​39;: 'Timed irrigation events&#​39;,     'comment&#​39;: 'All irrigation amounts in cm&#​39;,     'events_table&#​39;: [{datetime.date(2019, 3, 2): {'amount&#​39;: 7.0,        'efficiency&#​39;: 0.7}},      {datetime.date(2019, 5, 1): {'amount&#​39;: 7.5, 'efficiency&#​39;: 0.7}}]}],   'StateEvents&#​39;: None}}]

提取不同结果获得图像

代码块
Python
自动换行
复制代码
%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的变化图像

代码块
Python
自动换行
复制代码
# 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()
复制成功