library(data.table)

# 链接apsim.exe
apsim_exe <- 'D:/APSIM/APSIM710-r4158/Model/APSIM.exe'

# 读取土壤信息文件
df_soil <- fread('D:/APSIM_work/scenario_585/soil_info.csv')

# 循环遍历每个土壤信息
for (i in 1:nrow(df_soil)) {
  # 读取apsim文件
apsim <- readLines('D:/APSIM_work/scenario_585/SW/chuan_HT33.apsim')
  
  # 替换经纬度和土壤信息
apsim[4] <- gsub('57237', df_soil$station_id[i], apsim[4])
apsim[12] <- gsub('0.150', df_soil$clay_pct[i], apsim[12])
apsim[13] <- gsub('0.080', df_soil$sand_pct[i], apsim[13])
apsim[14] <- gsub('0.770', df_soil$om_pct[i], apsim[14])
apsim[15] <- gsub('120', df_soil$bd[i], apsim[15])
apsim[16] <- gsub('6.5', df_soil$ph[i], apsim[16])
  
  # 设置met文件路径
met_site <- paste0('D:/APSIM_work/scenario_585/met_585/', df_soil$station_id[i], '_SSP585_BCCC_r1i1p1f1.MET')
  
  ## 替换气象数据####
met <- readLines(met_site, n = 33)
b <- which(grepl('! AMP', met))
  
  # 替换CO2浓度
apsim[583] <- gsub('!', '', met[b + 6]) # C02
  
  # 读取met文件数据
met_data <- fread(met_site, skip = 35)
  # 固定1961-2019
met_data1 <- subset(met_data, met_data$V1 %in% c(1961:2019))
  # 修改2020-2100
met_data2 <- subset(met_data, met_data$V1 %in% c(2020:2100))
met_data2 <- subset(met_data2, met_data2$V2 != 366)
  
  # 替换2020-2099年的辐射数据
a <- met_data$V3[which(met_data$V1 == 2020 & met_data$V2 == 1):which(met_data$V1 == 2029 & met_data$V2 == 365)]
met_data2$V3[which(met_data2$V1 == 2020 & met_data$V2 == 1):which(met_data2$V1 == 2099 & met_data$V2 == 365)] <- rep(a, 8)
  
  # 补全闰年
for (year in seq(2020, 2096, 4)) {
    n <- which(met_data2$V1 == year & met_data2$V2 == 365)
    df_up <- met_data2[1:n, ]
    df_bottom <- met_data2[(n + 1):nrow(met_data2), ]
    insert_row <- df_up[nrow(df_up), ]
    insert_row$V2 <- 366
    met_data2 <- rbind(df_up, insert_row, df_bottom)
  }
  
  # 将修改后的met数据写入文件
writeLines(met, met_site)
write.table(met_data2, met_site, append = T, row.names = F, col.names = F)
  
  # 将修改后的apsim文件写入新文件
file_apsim <- paste0('D:/APSIM_work/scenario_585/SW/chuan_HT33_run_', df_soil$station_id[i], '.apsim')
writeLines(apsim, file_apsim)

  # 运行模型
system(paste(apsim_exe, file_apsim), wait = TRUE, ignore.stdout = TRUE, show.output.on.console = FALSE)
  
  # 将输出文件复制到新目录
file.copy('D:/APSIM_work/scenario_585/SW/chuan_HT33.out', paste0('D:/APSIM_work/result585_radn/SW/HT33/', df_soil$station_id[i], '.out'))
  
  print(paste0('Finished running APSIM for station ', df_soil$station_id[i]))
}

# 将所有输出文件合并为一个CSV文件
out_files <- list.files('D:/APSIM_work/result585_radn/SW/HT33', pattern = '\.out$', full.names = TRUE)
out_data <- do.call(rbind, lapply(out_files, fread, skip = 9))
write.csv(out_data, 'D:/APSIM_work/result585_radn/SW/HT33_all_out.csv', row.names = FALSE)
使用R语言和APSIM模型模拟不同经纬度土壤条件下的作物生长

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

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