随笔- 4  评论- 2  文章- 0 

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;

完成计算后,返回单位面积上的出流。                                                                                                
                                                          

 

 参考链接:http://www2.epa.gov/science-and-technology/water

               http://gp.zhulong.com/topic_LID.html

posted on 2013-02-02 14:32 WaterInfor 阅读(...) 评论(...) 编辑 收藏