SWMM模型代码LID(Low Impact Development)模块分析
LID 英文的全称是Low Impact Development,是20世纪90年代末发展起的暴雨管理和面源污染处理技术,旨在通过分散的,小规模的源头控制来达到对暴雨所产生的径流和污染的控制,使开发地区尽量接近于自然的水文循环。
LID 低影响开发是一种可轻松实现城市雨水收集利用的生态技术体系,其关键在于原位收集、自然净化、就近利用或回补地下水。
主要包含:生态植草沟、下凹式绿地、雨水花园、绿色屋顶、地下蓄渗、透水路面。
SWMM模型LID部分的代码在lid.c 和lid.h文件中,
SWMM模型中支持的LID措施类型包含了五种:BIO_CELL ( bio-retention cell 生物截留单元) , INFIL_TRENCH ( infiltration trench 渗透沟), POROUS_PAVEMENT( porous pavement 透水铺装), RAIN_BARREL( rain barrel 雨水桶) ,VEG_SWALE( vegetative swale 植被浅沟). 类型定义位于lid.c文件中。 如果需要增加自定义的类型可以在lidTypes 枚举类型中增加。
enum LidTypes { BIO_CELL, // bio-retention cell INFIL_TRENCH, // infiltration trench POROUS_PAVEMENT, // porous pavement RAIN_BARREL, // rain barrel VEG_SWALE // vegetative swale }
每种LID措施在模型计算过程最多含有5层。分别是SURF,SOIL,STOR,PAVE,DRAIN。 定义在lid.c中
enum LidLayerTypes { SURF, // surface layer SOIL, // soil layer STOR, // storage layer PAVE, // pavement layer DRAIN}; // underdrain system
模型开始计算前,在Project.c文件中根据INP文件的输入创建lid objects。代码位于 Project.c文件createObjects函数中。
// --- create LID objects //(5.0.019 - LR) lid_create(Nobjects[LID], Nobjects[SUBCATCH]); //(5.0.019 - LR)
validateLidProc函数对每个lid措施的参数进行校验,如果参数出错会打印异常,这些异常就是在SWMM模型运行时候经常出现的,比如和LID措施相关的错误:
1 //// Error messages added for SWMM5 LID edition. //// //(5.0.019 - LR) 2 #define ERR183 "\n ERROR 183: no type specified for LID %s." 3 #define ERR184 "\n ERROR 184: missing layer for LID %s." 4 #define ERR185 "\n ERROR 185: invalid parameter value for LID %s." 5 #define ERR186 "\n ERROR 186: invalid parameter value for LID placed in Subcatchment %s." 6 #define ERR187 "\n ERROR 187: LID area exceeds total area for Subcatchment %s."
参数校验主要时候检查每个LID措施是否有相应的层。另外还会对一些参数的大小进行比较,比如萎蔫点的值应当小于田间持水量的值等。
//... check pavement layer parameters if ( LidProcs[j].lidType == POROUS_PAVEMENT ) { if ( LidProcs[j].pavement.thickness <= 0.0 || LidProcs[j].pavement.kSat <= 0.0 || LidProcs[j].pavement.voidFrac <= 0.0 || LidProcs[j].pavement.voidFrac > 1.0 || LidProcs[j].pavement.impervFrac > 1.0 ) report_writeErrorMsg(ERR_LID_PARAMS, LidProcs[j].ID); } //... check soil layer parameters if ( LidProcs[j].soil.thickness > 0.0 ) { if ( LidProcs[j].soil.porosity <= 0.0 || LidProcs[j].soil.fieldCap >= LidProcs[j].soil.porosity || LidProcs[j].soil.wiltPoint >= LidProcs[j].soil.fieldCap || LidProcs[j].soil.kSat <= 0.0 || LidProcs[j].soil.kSlope < 0.0 ) report_writeErrorMsg(ERR_LID_PARAMS, LidProcs[j].ID); } //... check storage layer parameters if ( LidProcs[j].storage.thickness > 0.0 ) {
完成了LID措施的参数校验后,开始进行循环计算。
getLidOutflow函数中计算每个LID措施在单位面积上的出流。在getLidOutflow函数中有fluxRates这个变量,这是一个函数指针,通过这个函数指针,根据每个LID措施的类型,指向某个类型的计算函数。这样保证每个LID措施调用的计算方式都是一致的。
//... determine which flux rate function to use switch (theLidProc->lidType) { case BIO_CELL: fluxRates = &biocellFluxRates; break; case INFIL_TRENCH: fluxRates = &trenchFluxRates; break; case POROUS_PAVEMENT: fluxRates = &pavementFluxRates; break; case RAIN_BARREL: fluxRates = &barrelFluxRates; break; case VEG_SWALE: fluxRates = &swaleFluxRates; break;
完成计算后,返回单位面积上的出流。