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)
}

代码解释

  1. 读取原始 APSIM 文件: apsim <- readLines(apsim_file, warn = FALSE) 将原始 APSIM 文件内容读入 apsim 变量中。
  2. 替换参数: 使用 grep 函数找到需要替换的参数行,并使用 paste0 函数将新的参数值拼接成新的字符串,并替换原始参数行。
  3. 写入新的 APSIM 文件: 将修改后的 apsim 变量写入新的 APSIM 文件。
  4. 运行 APSIM 模型: 使用 system 函数运行 APSIM 模型。
  5. 保存结果: 将输出文件复制到指定路径,并读取输出文件内容保存到列表 output 中。
  6. 保存输出列表: 在每次迭代结束后,将 output 列表保存到 CSV 文件中,以确保在程序停止时保存所有结果。

总结

通过以上修改,解决了 APSIM 输出文件未生成的问题,并保证了所有输出文件的生成。此外,代码还进行了优化,确保结果能够及时保存,避免数据丢失。

注意: 请根据您的实际情况修改代码中的路径和文件名。

APSIM 模型运行脚本优化 - 批量运行并保存结果

原文地址: https://www.cveoy.top/t/topic/nCPN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录