APSIM模型运行及结果分析 - R语言实现
使用R语言运行APSIM模型并分析结果
该代码示例演示了如何使用R语言读取土壤数据、设置APSIM模型运行参数,并运行APSIM模型,最终将结果保存为CSV文件进行分析。
1. 读取土壤信息
首先,使用read.csv()函数读取包含土壤信息的CSV文件,并将其存储为一个数据框。
# 读取土壤信息
soil_df <- read.csv('E:/weidan/SOIL.csv')
2. 安装和加载APSIM R包,设置模型运行参数
安装并加载APSIM R包,并设置模型运行参数,包括模拟名称、是否使用默认气象数据、数据文件夹路径、土壤文件夹路径、APSIM版本号、起始日期、结束日期、运行类型以及并行运行的进程数等。
# 安装和加载APSIM R包
#install.packages('APSIM')
library(APSIM)
# 读取APSIM文件
apsim <- readLines('E:/weidan/region1wheat/quyu1xiaomai.apsim', warn = FALSE)
# 设置模型运行参数
sim_parameters <- list(
simulation_name = 'my_simulation',
override_met = TRUE, # 是否使用默认气象数据
datapath = '.', # 数据文件夹路径
soilpath = '.', # 土壤文件夹路径
version = '7413.3', # APSIM版本号
start_date = as.Date('1990-01-01'),
end_date = as.Date('2000-12-31'),
run_type = 'auto', # 运行类型(auto或batch)
num_workers = 1 # 并行运行的进程数
)
3. 设置土壤参数并运行APSIM模型
根据每个站点和深度,设置土壤参数,包括站点名称、经纬度、深度、田间持水量、饱和含水量、容重等。然后,运行APSIM模型,将结果保存为CSV文件。
for (i in 1:nrow(soil_df)) {
site <- soil_df$site[i]
lat <- soil_df$lat[i]
lon <- soil_df$lon[i]
for (depth in c(5, 15, 30, 60, 100, 200)) {
# 设置土壤参数
soil_parameters <- list(
Site = site,
Latitude = lat,
Longitude = lon,
Depth = depth,
LL15 = soil_df$LL15[i],
DUL = soil_df$DUL[i],
SAT = soil_df$SAT[i],
BD = soil_df$BD[i]
)
# 运行APSIM模型
#output <- run_APSIM(sim_parameters, soil_parameters)
system(paste(apsim_exe, file_apsim),wait = TRUE,ignore.stdout=TRUE,show.output.on.console=FALSE)
# 将结果保存为CSV文件
# 需要定义一个新的apsim文件!
file_apsim <- paste0('E:/weidan/region1wheat/SHIYONG.apsim')
writeLines(apsim, file_apsim)
system(paste(apsim_exe, file_apsim),wait = TRUE,ignore.stdout=TRUE,show.output.on.console=FALSE)
file.copy('E:/weidan/region1wheat/SHIYONG.out',paste0('E:/weidan/region1wheat/SHIYONG/',df$name[i],'.out'))
print(i)
}
}
4. 读取并处理APSIM输出结果
使用data.table::fread()函数读取APSIM输出文件,并将其存储为一个数据框。然后,对数据框进行整理和处理,将日期、站点、深度、经纬度等信息添加到数据框中,并对数值型变量进行类型转换。
# 将结果保存为CSV文件
result <- data.table::fread('E:/weidan/region1wheat/SHIYONG.out', skip = 4)
output_df <- result[4:nrow(result), ]
colnames(output_df) <- result[3, ]
output_df[, 'Date' := as.Date('Date', format = '%Y/%m/%d')]
output_df[, Site := site]
output_df[, Depth := depth]
output_df[, Latitude := lat]
output_df[, Longitude := lon]
output_df[, 'Rain (mm)' := as.numeric('Rain (mm)')]
output_df[, 'MaxT (oC)' := as.numeric('MaxT (oC)')]
output_df[, 'MinT (oC)' := as.numeric('MinT (oC)')]
output_df[, 'Radn (MJ/m^2)' := as.numeric('Radn (MJ/m^2)')]
output_df[, 'ETc (mm)' := as.numeric('ETc (mm)')]
output_df[, 'Runoff (mm)' := as.numeric('Runoff (mm)')]
output_df[, 'Drainage (mm)' := as.numeric('Drainage (mm)')]
output_df[, 'SW (mm)' := as.numeric('SW (mm)')]
output_df[, 'SW Available (mm)' := as.numeric('SW Available (mm)')]
output_df[, 'NO3 (kg/ha)' := as.numeric('NO3 (kg/ha)')]
output_df[, 'NH4 (kg/ha)' := as.numeric('NH4 (kg/ha)')]
output_df[, 'Crop LAI (m^2/m^2)' := as.numeric('Crop LAI (m^2/m^2)')]
output_df[, 'Crop Biomass (kg/ha)' := as.numeric('Crop Biomass (kg/ha)')]
output_df[, 'Grain Yield (kg/ha)' := as.numeric('Grain Yield (kg/ha)')]
output_df[, 'Water Use Efficiency (kg/ha/mm)' := as.numeric('Water Use Efficiency (kg/ha/mm)')]
output_df[, 'N Uptake (kg/ha)' := as.numeric('N Uptake (kg/ha)')]
output_df[, 'N Leaching (kg/ha)' := as.numeric('N Leaching (kg/ha)')]
output_df[, 'N Denitrification (kg/ha)' := as.numeric('N Denitrification (kg/ha)')]
output_df[, 'N2O Emissions (kg/ha)' := as.numeric('N2O Emissions (kg/ha)')]
output_df[, 'N2O-N (kg/ha)' := as.numeric('N2O-N (kg/ha)')]
output_df[, 'N2O-N Emissions (kg/ha)' := as.numeric('N2O-N Emissions (kg/ha)')]
output_df[, 'NO Emissions (kg/ha)' := as.numeric('NO Emissions (kg/ha)')]
output_df[, 'NO-N (kg/ha)' := as.numeric('NO-N (kg/ha)')]
output_df[, 'NO-N Emissions (kg/ha)' := as.numeric('NO-N Emissions (kg/ha)')]
output_df[, 'Residue (kg/ha)' := as.numeric('Residue (kg/ha)')]
output_df[, 'Residue C (kg/ha)' := as.numeric('Residue C (kg/ha)')]
output_df[, 'Residue N (kg/ha)' := as.numeric('Residue N (kg/ha)')]
output_df[, 'Soil Organic Matter (kg/ha)' := as.numeric('Soil Organic Matter (kg/ha)')]
output_df[, 'Soil Organic C (kg/ha)' := as.numeric('Soil Organic C (kg/ha)')]
output_df[, 'Soil Organic N (kg/ha)' := as.numeric('Soil Organic N (kg/ha)')]
output_df[, 'Soil Mineral N (kg/ha)' := as.numeric('Soil Mineral N (kg/ha)')]
output_df[, 'Soil NO3 (kg/ha)' := as.numeric('Soil NO3 (kg/ha)')]
output_df[, 'Soil NH4 (kg/ha)' := as.numeric('Soil NH4 (kg/ha)')]
output_df[, 'Soil Water (mm)' := as.numeric('Soil Water (mm)')]
output_df[, 'Soil Water Available (mm)' := as.numeric('Soil Water Available (mm)')]
output_df[, 'Soil Nitrogen (kg/ha)' := as.numeric('Soil Nitrogen (kg/ha)')]
output_df[, 'Soil C:N Ratio' := as.numeric('Soil C:N Ratio')]
output_df[, 'Soil pH' := as.numeric('Soil pH')]
output_df[, 'Soil EC (dS/m)' := as.numeric('Soil EC (dS/m)')]
output_df[, 'Soil Bulk Density (g/cm^3)' := as.numeric('Soil Bulk Density (g/cm^3)')]
output_df[, 'Soil Water Content (v/v)' := as.numeric('Soil Water Content (v/v)')]
output_df[, 'Soil Temperature (oC)' := as.numeric('Soil Temperature (oC)')]
output_df[, 'Soil Carbon (kg/ha)' := as.numeric('Soil Carbon (kg/ha)')]
output_df[, 'Soil Nitrogen (kg/ha).1' := as.numeric('Soil Nitrogen (kg/ha).1')]
output_df[, 'Soil Ammonium (kg/ha)' := as.numeric('Soil Ammonium (kg/ha)')]
output_df[, 'Soil Nitrate (kg/ha)' := as.numeric('Soil Nitrate (kg/ha)')]
output_df[, 'Soil Water Content (mm)' := as.numeric('Soil Water Content (mm)')]
output_df[, 'Soil N2O Emissions (kg/ha)' := as.numeric('Soil N2O Emissions (kg/ha)')]
output_df[, 'Soil NO Emissions (kg/ha)' := as.numeric('Soil NO Emissions (kg/ha)')]
output_df[, 'Crop Root Length Density (cm/cm^3)' := as.numeric('Crop Root Length Density (cm/cm^3)')]
output_df[, 'Total Root Length (m/m^2)' := as.numeric('Total Root Length (m/m^2)')]
output_df[, 'Average Root Depth (cm)' := as.numeric('Average Root Depth (cm)')]
output_df[, 'Cumulative Water (mm)' := as.numeric('Cumulative Water (mm)')]
output_df[, 'Cumulative ET (mm)' := as.numeric('Cumulative ET (mm)')]
output_df[, 'Cumulative Drainage (mm)' := as.numeric('Cumulative Drainage (mm)')]
output_df[, 'Cumulative Runoff (mm)' := as.numeric('Cumulative Runoff (mm)')]
# 保存结果
data.table::fwrite(output_df, 'E:/weidan/shiyongresult.csv')
注意:
- 该代码示例中假设您已经安装了
APSIMR包,并设置了apsim_exe变量,指向APSIM可执行文件路径。 - 代码示例中包含一些示例文件路径,请根据您的实际情况进行修改。
- 代码示例中的
df$name可能需要根据您的实际情况进行修改。 - 该代码示例仅展示了基本的操作步骤,您可以根据自己的需求进行扩展和修改。
通过以上步骤,您可以使用R语言运行APSIM模型,并将结果保存为CSV文件进行分析。
原文地址: https://www.cveoy.top/t/topic/nCfL 著作权归作者所有。请勿转载和采集!