使用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')

注意:

  • 该代码示例中假设您已经安装了APSIM R包,并设置了apsim_exe变量,指向APSIM可执行文件路径。
  • 代码示例中包含一些示例文件路径,请根据您的实际情况进行修改。
  • 代码示例中的df$name可能需要根据您的实际情况进行修改。
  • 该代码示例仅展示了基本的操作步骤,您可以根据自己的需求进行扩展和修改。

通过以上步骤,您可以使用R语言运行APSIM模型,并将结果保存为CSV文件进行分析。

APSIM模型运行及结果分析 - R语言实现

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

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