APSIM 模型运行脚本优化 - 批量运行并保存结果
APSIM 模型运行脚本优化 - 批量运行并保存结果
本脚本使用 R 语言实现 APSIM 模型批量运行,并优化了代码以确保所有输出文件生成,并提供详细的错误解决思路。
问题描述
运行脚本后,发现部分 APSIM 输出文件 ('.out' 文件) 未生成。手动运行 APSIM 模型则可以成功生成输出文件。
问题原因
经分析,问题可能是因为在写入新的 APSIM 文件时,没有将原始文件中的所有内容写入新文件中。
解决方法
在写入新文件之前,可以尝试先将原始文件的内容读入并存储在一个变量中,然后再将新的参数写入该变量中,并将整个变量写入新的 APSIM 文件。
代码示例
apsim_exe <- 'D:/APSIM/APSIM710-r4158/Model/APSIM.exe'
apsim_file <- 'D:/APSIM/APSIM710-r4158/region1wheat/quyu1xiaomai.apsim'
soil_df <- read.csv('soil_parameters.csv')
output <- list()
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)) {
# Set soil parameters
soil_parameters <- list(
Site = site,
Depth = depth,
LL15 = soil_df$LL15[i],
DUL = soil_df$DUL[i],
SAT = soil_df$SAT[i],
BD = soil_df$BD[i]
)
# Read in original APSIM file
apsim <- readLines(apsim_file, warn = FALSE)
# Replace soil parameters in APSIM file
apsim[grep('Site', apsim)] <- paste0('Site=', site)
apsim[grep('Depth', apsim)] <- paste0('Depth=', depth)
apsim[grep('LL15', apsim)] <- paste0('LL15=', soil_df$LL15[i])
apsim[grep('DUL', apsim)] <- paste0('DUL=', soil_df$DUL[i])
apsim[grep('SAT', apsim)] <- paste0('SAT=', soil_df$SAT[i])
apsim[grep('BD', apsim)] <- paste0('BD=', soil_df$BD[i])
# Write modified APSIM file to disk
file_apsim <- paste0('D:/APSIM/APSIM710-r4158/region1wheat/', site, '_', depth, '.apsim')
writeLines(apsim, file_apsim)
# Run APSIM model
system(paste(apsim_exe, file_apsim), wait = TRUE, ignore.stdout = TRUE, show.output.on.console = FALSE)
# Save results as CSV file
file.copy('D:/APSIM/APSIM710-r4158/region1wheat/SHIYONG.out', paste0('D:/APSIM/APSIM710-r4158/region1wheat/SHIYONG/', site, '_', depth, '.out'))
# Store output in list
output[[paste0(site, '_', depth)]] <- read.csv(paste0('D:/APSIM/APSIM710-r4158/region1wheat/SHIYONG/', site, '_', depth, '.out'))
}
# Save output to CSV file at each iteration
output_file <- 'D:/APSIM/APSIM710-r4158/region1wheat/output.csv'
write.csv(output, file = output_file, row.names = FALSE)
}
代码解释
- 读取原始 APSIM 文件:
apsim <- readLines(apsim_file, warn = FALSE)将原始 APSIM 文件内容读入apsim变量中。 - 替换参数: 使用
grep函数找到需要替换的参数行,并使用paste0函数将新的参数值拼接成新的字符串,并替换原始参数行。 - 写入新的 APSIM 文件: 将修改后的
apsim变量写入新的 APSIM 文件。 - 运行 APSIM 模型: 使用
system函数运行 APSIM 模型。 - 保存结果: 将输出文件复制到指定路径,并读取输出文件内容保存到列表
output中。 - 保存输出列表: 在每次迭代结束后,将
output列表保存到 CSV 文件中,以确保在程序停止时保存所有结果。
总结
通过以上修改,解决了 APSIM 输出文件未生成的问题,并保证了所有输出文件的生成。此外,代码还进行了优化,确保结果能够及时保存,避免数据丢失。
注意: 请根据您的实际情况修改代码中的路径和文件名。
原文地址: https://www.cveoy.top/t/topic/nCPN 著作权归作者所有。请勿转载和采集!