高级建模技术
1. 复杂地形建模
在空气质量仿真软件中,地形对污染物的扩散和传输有重要影响。ADMS软件提供了强大的地形处理功能,可以模拟复杂地形条件下的大气扩散过程。本节将详细介绍如何在ADMS中处理复杂地形,并提供具体的代码示例和数据样例。
1.1 地形数据的准备
在进行复杂地形建模之前,需要准备高精度的地形数据。地形数据通常以数字高程模型(DEM)的形式提供,格式可以是ASCII、GeoTIFF等。以下是一个从GeoTIFF文件中读取地形数据并转换为ADMS所需的格式的例子。
import rasterio
import numpy as np
# 读取GeoTIFF文件
with rasterio.open("terrain_data.tif") as src:
terrain_array = src.read(1) # 读取第一个波段的数据
transform = src.transform # 获取仿射变换参数
crs = src.crs # 获取坐标参考系统
# 获取地形数据的范围
min_x, min_y = transform * (0, 0)
max_x, max_y = transform * (src.width, src.height)
# 保存为ADMS所需的ASCII格式
np.savetxt("terrain_data.asc", terrain_array, fmt="%1.2f", delimiter=" ", header=f"{src.width} {src.height} {min_x} {min_y} {max_x} {max_y}", comments="")
1.2 地形数据的导入
在ADMS中,可以通过以下步骤将地形数据导入模型中:
-
打开ADMS软件。
-
选择“File” -> “Import” -> “Terrain”。
-
选择之前准备好的ASCII格式地形数据文件。
-
在导入对话框中设置相应的参数,如数据格式、坐标系统等。
-
确认导入并检查地形数据的正确性。
1.3 地形影响的模拟
地形对污染物扩散的影响主要体现在以下几个方面:
-
风速和风向的改变:地形可以改变风速和风向,从而影响污染物的传输路径。
-
污染物沉降:地形可以增加污染物的沉降,特别是在山谷或低洼地区。
-
扩散系数的调整:地形可以调整扩散系数,影响污染物在空气中的扩散速率。
以下是一个示例,展示如何在ADMS中设置地形影响参数:
# ADMS地形影响参数设置示例
terrain_impact_parameters = {
"terrain_file": "terrain_data.asc", # 地形数据文件路径
"coordinate_system": "WGS84", # 坐标系统
"grid_spacing": 50, # 网格间距,单位:米
"terrain_elevation": "relative", # 地形高度:相对或绝对
"wind_adjustment": True, # 是否调整风速和风向
"deposition_factor": 1.5, # 沉降因子
"diffusion_factor": 1.2 # 扩散因子
}
# 将参数写入ADMS配置文件
with open("adms_config.txt", "w") as config_file:
for key, value in terrain_impact_parameters.items():
config_file.write(f"{key}: {value}\n")
1.4 地形数据的可视化
地形数据的可视化可以帮助用户更好地理解地形对空气质量的影响。ADMS提供了地形数据的可视化功能,用户可以查看地形的高度图和等高线图。
-
在ADMS中选择“View” -> “Terrain”。
-
选择要可视化的地形数据文件。
-
调整可视化参数,如颜色映射、等高线间隔等。
1.5 地形数据的校验
为了确保地形数据的准确性和可靠性,需要进行数据校验。ADMS提供了数据校验工具,可以帮助用户检查地形数据的完整性、一致性和合理性。
-
选择“Tools” -> “Terrain Validation”。
-
选择要校验的地形数据文件。
-
运行校验工具并查看校验结果。
1.6 复杂地形下的案例分析
以下是一个复杂地形下的案例分析,展示如何使用ADMS进行地形影响的模拟。
案例背景
某城市位于山区,需要评估工业排放对空气质量的影响。地形数据已准备完毕,并导入到ADMS中。
模拟步骤
-
设置模型参数:包括排放源位置、排放速率、气象参数等。
-
导入地形数据:使用上述代码示例导入地形数据。
-
运行模拟:在ADMS中运行模拟,生成空气质量报告。
-
分析结果:查看污染物浓度分布图,分析地形对污染物扩散的影响。
模拟结果
通过模拟,可以发现:
-
山谷地区的污染物浓度明显高于其他地区。
-
风速和风向在地形影响下发生改变,导致污染物传输路径的变化。
-
沉降因子和扩散因子的调整对污染物浓度分布有显著影响。
1.7 高级地形建模技巧
在进行高级地形建模时,可以考虑以下技巧:
-
多分辨率地形数据:使用不同分辨率的地形数据,提高模型的准确性和效率。
-
动态地形数据:考虑地形变化对空气质量的影响,使用动态地形数据进行模拟。
-
地形修正:根据实际地形进行修正,提高模型的适用性。
以下是一个使用多分辨率地形数据的示例:
# 多分辨率地形数据处理示例
# 读取高分辨率地形数据
with rasterio.open("high_resolution_terrain_data.tif") as high_res_src:
high_res_terrain_array = high_res_src.read(1)
high_res_transform = high_res_src.transform
high_res_crs = high_res_src.crs
# 读取低分辨率地形数据
with rasterio.open("low_resolution_terrain_data.tif") as low_res_src:
low_res_terrain_array = low_res_src.read(1)
low_res_transform = low_res_src.transform
low_res_crs = low_res_src.crs
# 将低分辨率数据重采样到高分辨率
low_res_terrain_array_resampled = rasterio.warp.reproject(
source=low_res_terrain_array,
src_transform=low_res_transform,
src_crs=low_res_crs,
destination=np.zeros_like(high_res_terrain_array),
dst_transform=high_res_transform,
dst_crs=high_res_crs,
resampling=rasterio.enums.Resampling.bilinear
)
# 保存重采样后的地形数据
np.savetxt("resampled_terrain_data.asc", low_res_terrain_array_resampled, fmt="%1.2f", delimiter=" ", header=f"{high_res_src.width} {high_res_src.height} {min_x} {min_y} {max_x} {max_y}", comments="")
2. 计算网格优化
计算网格是空气质量仿真中的一个重要环节,合理的网格设置可以提高模拟的准确性和效率。本节将详细介绍如何在ADMS中进行计算网格的优化,并提供具体的代码示例和数据样例。
2.1 网格划分原则
网格划分需要遵循以下原则:
-
分辨率:网格的分辨率应根据研究区域的大小和地形复杂性进行设置。
-
网格类型:可以选择均匀网格或非均匀网格,非均匀网格可以更好地捕捉复杂地形。
-
网格边界:网格的边界应覆盖研究区域,并适当扩展,以减少边界效应。
2.2 网格划分方法
ADMS提供了多种网格划分方法,包括:
-
均匀网格:网格大小一致,适用于地形较为简单的区域。
-
非均匀网格:网格大小根据地形复杂性进行调整,适用于地形复杂的区域。
以下是一个使用Python进行非均匀网格划分的示例:
import numpy as np
# 定义研究区域的边界
min_x, min_y = 0, 0
max_x, max_y = 10000, 10000
# 定义网格分辨率
grid_resolution = 100
# 创建均匀网格
x = np.arange(min_x, max_x + grid_resolution, grid_resolution)
y = np.arange(min_y, max_y + grid_resolution, grid_resolution)
uniform_grid = np.meshgrid(x, y)
# 创建非均匀网格
# 假设地形复杂区域在 (3000, 3000) 到 (7000, 7000) 之间
complex_region_resolution = 20
x_complex = np.arange(3000, 7000 + complex_region_resolution, complex_region_resolution)
y_complex = np.arange(3000, 7000 + complex_region_resolution, complex_region_resolution)
non_uniform_grid = np.meshgrid(x_complex, y_complex)
# 合并均匀网格和非均匀网格
combined_x = np.concatenate((x[:30], x_complex, x[70:]))
combined_y = np.concatenate((y[:30], y_complex, y[70:]))
combined_grid = np.meshgrid(combined_x, combined_y)
# 保存网格数据
np.savetxt("combined_grid.txt", combined_grid, fmt="%1.2f", delimiter=" ", header=f"{len(combined_x)} {len(combined_y)}", comments="")
2.3 网格数据的导入
在ADMS中,可以通过以下步骤将网格数据导入模型中:
-
打开ADMS软件。
-
选择“File” -> “Import” -> “Grid”。
-
选择之前准备好的网格数据文件。
-
在导入对话框中设置相应的参数,如网格类型、坐标系统等。
-
确认导入并检查网格数据的正确性。
2.4 网格优化的模拟
网格优化可以显著提高模拟的准确性和效率。以下是一个示例,展示如何在ADMS中设置网格优化参数并进行模拟。
# ADMS网格优化参数设置示例
grid_optimization_parameters = {
"grid_file": "combined_grid.txt", # 网格数据文件路径
"coordinate_system": "WGS84", # 坐标系统
"grid_type": "non_uniform", # 网格类型:均匀或非均匀
"boundary_extension": 500, # 网格边界扩展,单位:米
"resolution_adjustment": True # 是否调整分辨率
}
# 将参数写入ADMS配置文件
with open("adms_config.txt", "a") as config_file:
for key, value in grid_optimization_parameters.items():
config_file.write(f"{key}: {value}\n")
2.5 网格优化的结果分析
通过网格优化,可以发现:
-
精度提高:非均匀网格在地形复杂区域的分辨率更高,模拟结果的精度显著提高。
-
效率提升:非均匀网格减少了计算量,提高了模拟的效率。
-
边界效应减少:适当的网格边界扩展可以减少边界效应对模拟结果的影响。
2.6 高级网格优化技巧
在进行高级网格优化时,可以考虑以下技巧:
-
自适应网格:根据模拟结果动态调整网格分辨率,提高模型的适应性。
-
多尺度网格:使用多尺度网格,捕捉不同尺度下的地形特征。
-
网格分区:将研究区域划分为多个子区域,每个子区域使用不同的网格分辨率。
以下是一个使用自适应网格的示例:
# 自适应网格划分示例
# 初始网格分辨率
initial_resolution = 100
# 创建初始均匀网格
x_initial = np.arange(min_x, max_x + initial_resolution, initial_resolution)
y_initial = np.arange(min_y, max_y + initial_resolution, initial_resolution)
initial_grid = np.meshgrid(x_initial, y_initial)
# 根据模拟结果动态调整网格分辨率
def adjust_grid_resolution(simulation_results, threshold):
adjusted_grid = []
for i in range(len(x_initial) - 1):
for j in range(len(y_initial) - 1):
if simulation_results[i, j] > threshold:
# 在浓度较高的区域提高分辨率
x_local = np.arange(x_initial[i], x_initial[i + 1] + complex_region_resolution, complex_region_resolution)
y_local = np.arange(y_initial[j], y_initial[j + 1] + complex_region_resolution, complex_region_resolution)
local_grid = np.meshgrid(x_local, y_local)
adjusted_grid.append(local_grid)
else:
# 在浓度较低的区域保持初始分辨率
local_grid = np.meshgrid([x_initial[i], x_initial[i + 1]], [y_initial[j], y_initial[j + 1]])
adjusted_grid.append(local_grid)
return adjusted_grid
# 假设 simulation_results 是模拟结果数组
simulation_results = np.random.rand(len(x_initial) - 1, len(y_initial) - 1)
threshold = 0.5
# 调整网格分辨率
adjusted_grid = adjust_grid_resolution(simulation_results, threshold)
# 保存调整后的网格数据
np.savetxt("adjusted_grid.txt", adjusted_grid, fmt="%1.2f", delimiter=" ", header=f"{len(x_initial)} {len(y_initial)}", comments="")
3. 多源排放建模
多源排放建模是空气质量仿真中的一个重要组成部分。ADMS可以模拟多个排放源的空气质量影响,本节将详细介绍如何在ADMS中进行多源排放建模,并提供具体的代码示例和数据样例。
3.1 多源排放数据的准备
多源排放数据通常包括以下几个方面:
-
排放源位置:经纬度或坐标。
-
排放速率:单位时间内的排放量。
-
排放高度:排放源的高度。
-
排放物种类:如SO2、NOx等。
以下是一个准备多源排放数据的示例:
# 多源排放数据准备示例
emission_sources = [
{"name": "Source1", "x": 1000, "y": 2000, "z": 50, "rate": 100, "species": "SO2"},
{"name": "Source2", "x": 3000, "y": 4000, "z": 100, "rate": 150, "species": "NOx"},
{"name": "Source3", "x": 5000, "y": 6000, "z": 75, "rate": 120, "species": "PM10"}
]
# 保存为ADMS所需的格式
with open("emission_sources.txt", "w") as emission_file:
for source in emission_sources:
emission_file.write(f"{source['name']} {source['x']} {source['y']} {source['z']} {source['rate']} {source['species']}\n")
3.2 多源排放数据的导入
在ADMS中,可以通过以下步骤将多源排放数据导入模型中:
-
打开ADMS软件。
-
选择“File” -> “Import” -> “Emission Sources”。
-
选择之前准备好的多源排放数据文件。
-
在导入对话框中设置相应的参数,如数据格式、坐标系统等。
-
确认导入并检查排放源数据的正确性。
3.3 多源排放的模拟
多源排放的模拟可以更准确地评估多个排放源对空气质量的综合影响。以下是一个示例,展示如何在ADMS中设置多源排放参数并进行模拟。
# ADMS多源排放参数设置示例
emission_parameters = {
"emission_file": "emission_sources.txt", # 多源排放数据文件路径
"coordinate_system": "WGS84", # 坐标系统
"emission_height_unit": "m", # 排放高度单位
"emission_rate_unit": "g/s", # 排放速率单位
"simulation_duration": 24 # 模拟持续时间,单位:小时
}
# 将参数写入ADMS配置文件
with open("adms_config.txt", "a") as config_file:
for key, value in emission_parameters.items():
config_file.write(f"{key}: {value}\n")
3.4 多源排放的结果分析
通过多源排放的模拟,可以发现以下几个方面的结果和影响:
-
污染物浓度分布:多个排放源对空气质量的综合影响,污染物浓度分布更加复杂。
-
主要贡献源:识别主要贡献源,评估其对空气质量的影响。
-
时空变化:分析污染物在时间和空间上的变化趋势。
3.5 高级多源排放建模技巧
在进行高级多源排放建模时,可以考虑以下技巧:
-
动态排放源:考虑排放源的动态变化,如时间变化、风速变化等。
-
多污染物模拟:同时模拟多种污染物的扩散和传输。
-
排放源分区:将研究区域划分为多个子区域,每个子区域设置不同的排放源参数。
以下是一个考虑动态排放源的示例:
# 动态排放源示例
import pandas as pd
# 读取动态排放源数据
dynamic_emission_data = pd.read_csv("dynamic_emission_sources.csv")
# 生成动态排放源配置文件
with open("dynamic_emission_sources.txt", "w") as emission_file:
for index, row in dynamic_emission_data.iterrows():
emission_file.write(f"{row['name']} {row['x']} {row['y']} {row['z']} {row['rate']} {row['species']} {row['time']}\n")
# ADMS动态多源排放参数设置示例
dynamic_emission_parameters = {
"emission_file": "dynamic_emission_sources.txt", # 动态多源排放数据文件路径
"coordinate_system": "WGS84", # 坐标系统
"emission_height_unit": "m", # 排放高度单位
"emission_rate_unit": "g/s", # 排放速率单位
"simulation_duration": 24 # 模拟持续时间,单位:小时
}
# 将参数写入ADMS配置文件
with open("adms_config.txt", "a") as config_file:
for key, value in dynamic_emission_parameters.items():
config_file.write(f"{key}: {value}\n")
3.6 动态排放源的数据准备
动态排放源的数据通常包括时间变化的信息。以下是动态排放源数据的准备示例:
假设动态排放源数据存储在CSV文件中,包含以下列:name
(排放源名称)、x
(x坐标)、y
(y坐标)、z
(排放高度)、rate
(排放速率)、species
(污染物种类)、time
(时间)。
# 动态排放源数据准备示例
import pandas as pd
# 生成动态排放源数据
dynamic_emission_data = pd.DataFrame({
"name": ["Source1", "Source1", "Source2", "Source2", "Source3", "Source3"],
"x": [1000, 1000, 3000, 3000, 5000, 5000],
"y": [2000, 2000, 4000, 4000, 6000, 6000],
"z": [50, 50, 100, 100, 75, 75],
"rate": [100, 120, 150, 130, 120, 110],
"species": ["SO2", "SO2", "NOx", "NOx", "PM10", "PM10"],
"time": [0, 12, 0, 12, 0, 12]
})
# 保存为CSV文件
dynamic_emission_data.to_csv("dynamic_emission_sources.csv", index=False)
3.7 动态排放源的导入
在ADMS中,导入动态排放源数据的步骤与静态排放源类似,但需要额外设置时间相关的参数:
-
打开ADMS软件。
-
选择“File” -> “Import” -> “Emission Sources”。
-
选择之前准备好的动态排放源数据文件。
-
在导入对话框中设置相应的参数,如数据格式、坐标系统、时间单位等。
-
确认导入并检查排放源数据的正确性。
3.8 动态排放源的模拟
动态排放源的模拟可以更准确地反映实际排放情况,特别是在排放源的排放速率随时间变化时。以下是一个示例,展示如何在ADMS中设置动态排放源参数并进行模拟。
# ADMS动态多源排放参数设置示例
dynamic_emission_parameters = {
"emission_file": "dynamic_emission_sources.txt", # 动态多源排放数据文件路径
"coordinate_system": "WGS84", # 坐标系统
"emission_height_unit": "m", # 排放高度单位
"emission_rate_unit": "g/s", # 排放速率单位
"simulation_duration": 24, # 模拟持续时间,单位:小时
"time_step": 1 # 时间步长,单位:小时
}
# 将参数写入ADMS配置文件
with open("adms_config.txt", "a") as config_file:
for key, value in dynamic_emission_parameters.items():
config_file.write(f"{key}: {value}\n")
3.9 动态排放源的案例分析
以下是一个动态排放源的案例分析,展示如何使用ADMS进行动态排放源的模拟。
案例背景
某城市有多个工业排放源,这些排放源的排放速率随时间变化。需要评估这些动态排放源对空气质量的影响。动态排放数据已准备完毕,并导入到ADMS中。
模拟步骤
-
设置模型参数:包括研究区域的网格划分、气象参数等。
-
导入动态排放源数据:使用上述代码示例导入动态排放源数据。
-
运行模拟:在ADMS中运行模拟,生成空气质量报告。
-
分析结果:查看污染物浓度分布图,分析动态排放源对空气质量的影响。
模拟结果
通过模拟,可以发现:
-
时间变化:不同时间段内,污染物浓度分布有显著变化。
-
主要贡献源:某些排放源在特定时间段内对空气质量的影响更大。
-
时空变化:分析污染物在时间和空间上的变化趋势,为污染控制提供依据。
3.10 高级多污染物模拟技巧
在进行高级多污染物模拟时,可以考虑以下技巧:
-
多污染物耦合:考虑多种污染物之间的相互作用,进行耦合模拟。
-
动态气象参数:使用动态气象参数,如风速、风向等,提高模拟的准确性。
-
综合评估:结合地形、气象和排放源数据,进行综合评估。
以下是一个多污染物耦合模拟的示例:
# 多污染物耦合模拟示例
import pandas as pd
# 生成多污染物排放源数据
emission_sources = pd.DataFrame({
"name": ["Source1", "Source2", "Source3"],
"x": [1000, 3000, 5000],
"y": [2000, 4000, 6000],
"z": [50, 100, 75],
"rate_SO2": [100, 150, 120],
"rate_NOx": [50, 75, 60],
"rate_PM10": [30, 45, 36]
})
# 保存为ADMS所需的格式
with open("multi_species_emission_sources.txt", "w") as emission_file:
for index, row in emission_sources.iterrows():
emission_file.write(f"{row['name']} {row['x']} {row['y']} {row['z']} {row['rate_SO2']} SO2 {row['rate_NOx']} NOx {row['rate_PM10']} PM10\n")
# ADMS多污染物排放参数设置示例
multi_species_emission_parameters = {
"emission_file": "multi_species_emission_sources.txt", # 多污染物排放数据文件路径
"coordinate_system": "WGS84", # 坐标系统
"emission_height_unit": "m", # 排放高度单位
"emission_rate_unit": "g/s", # 排放速率单位
"simulation_duration": 24 # 模拟持续时间,单位:小时
}
# 将参数写入ADMS配置文件
with open("adms_config.txt", "a") as config_file:
for key, value in multi_species_emission_parameters.items():
config_file.write(f"{key}: {value}\n")
通过以上步骤,可以更全面地评估多个排放源对空气质量的综合影响,并为污染控制提供科学依据。希望这些示例和技巧对您的空气质量模拟工作有所帮助。