农业生产离不开水水资源的优化配置水平直接关系到灌溉面积、农作物产量以及农业经济效益。由于目前大部分农业灌区缺乏科学管理导致灌区水资源短缺和浪费的现象比比皆是。为及时满足灌区农作物不同生长生育期对水分的差别要求、减少渠道输配水过程中的水量损失对灌区渠系水网进行实时的优化调度技术研究对实现节水增产推动农业经济的可持续发展具有重要而深远的意义。目前结合土壤墒情、天气预报和不同田块作物的实时需水情况动态的调整灌溉时间和灌水量是灌区输配水调度的主要研究方向。同时结合灌区场地地形特征实现先灌高地先灌远田先灌散田缩短输配水时间也是实现优化调度的重要目标。一般的灌区节制闸与分水口的相对位置如下图所示。通过控制算法控制明渠输配水联合调度过程最常用到的方法之一就是RTCReal-time-control实时控制模型。图1 节制闸与分水口的相对位置RTC模型将水动力学一维、二维和现代控制理论相结合可用于水工结构反馈控制的建模常为节制闸、溢流堰等。可应用于降雨-径流、水动力和水质计算。RTC模块通过设定的水深水面高程流速等若干逻辑判断要求在计算过程对模型中的结构物进行调节如通过控制节制闸开度节制闸的开启时刻/关闭时刻泵的流量等以达到输配水联合调度的目的。典型的逻辑控制流程如下图所示。图2 逻辑控制流程图为实现灌区河网的输配水调度我们将分三期的内容从具体的应用案例出发详细的阐述各阶段的建模和分析过程。渠系河网水动力模型建立干支渠衬砌渠道和田块调蓄池的输水明渠一维非恒定流数学模型。渠系河网水动力耦合结构物模型通过定义和模化节制闸、倒虹吸和多孔并联暗涵等类型的内边界条件实现对输水明渠水力过渡过程中水位、流量变化过程的无间断模拟。基于调度规则的渠系河网水动力耦合结构物模型应用比例-积分-微分proportional-integral-derivative, PID控制模型实现以闸前水位田块总进水量等为目标的节制闸开度反馈控制。通过PLC编程将模拟得到的最优控制指令传输至终端自控闸门设备驱动设备执行相应的操作。建立渠系河网水动力模型的流程如下图所示图3 渠系河网水动力模型流程图1.基本控制方程一维河道水流计算可以通过求解一维非恒定圣维南方程组得到。考虑旁侧入流条件、以及风驱动等影响的连续性方程和动量方程如下式所示式中AT为过水断面面积和蓄水断面面积之和Q为流量qlat为旁侧入流或出流入流为正出流为负C为谢才系数g为重力加速度R为水力半径x为轴线桩号圣维南方程组适用条件可为单一河道也可以是分支河网比如本算例的灌区渠系河网。2.地形预处理结合灌区的设计资料利用渠系的设计横纵断面数据重建灌区河网的数字高程模型如下图所示。图4 依据设计资料建立干支渠DEM将渠系DEM与整个场区的公开数据DEM融合见下图所示。图5 干支渠DEM与12.5m分辨率DEM融合3.水力拓朴图以河道中心线和采样线建立干支斗渠衬砌渠道的水力模型如下图所示。图中的红点为概化的田块调蓄池对象以高程-水面面积曲线表征。图6 水力拓朴图从gis数据生成调蓄池对象的c代码如下storageCoordinateMap.clear(); storageNameMap.clear(); storageAreaMap.clear(); storageElevationMap.clear(); GDALRasterImage image(geoTiffFile.c_str()); GDALDataset* riverNetDS (GDALDataset*)GDALOpenEx(riverNetShpFile.c_str(), GDAL_OF_VECTOR, NULL, NULL, NULL); GDALDataset* fieldDS (GDALDataset*)GDALOpenEx(fieldShpFile.c_str(), GDAL_OF_VECTOR, NULL, NULL, NULL); OGRLayer* riverNetLayer riverNetDS-GetLayer(0); OGRLayer* fieldLayer fieldDS-GetLayer(0); riverNetLayer-SetAttributeFilter(river LIKE %斗渠%); int douquCount riverNetLayer-GetFeatureCount(true);//斗渠的数量 OGRPoint startPt; //斗渠起始点 OGRPoint endPt; //斗渠终点 vectordouble endPtCoordinateVec;//斗渠终点坐标 std::string fieldNameAttributeStr name; pt::ptree fieldParentNode; for (int i 0; i douquCount; i)//遍历所有的斗渠 { pt::ptree fieldInfoNode; pt::ptree centerXNode, centerYNode, centerZNode; pt::ptree fieldCenterNode,fieldCenterChildNode; endPtCoordinateVec.clear(); OGRFeature* douquFeature riverNetLayer-GetNextFeature(); const char* fieldName douquFeature-GetFieldAsString(fieldNameStr.c_str());//斗渠所属的田块名 fieldInfoNode.put(fieldName, fieldName); const char* riverName douquFeature-GetFieldAsString(riverNameStr.c_str());//斗渠的riveName string fieldNameStr(fieldName); string riverNameStr(riverName); storageNameMap.insert(std::pairstring, string(fieldNameStr, riverNameStr)); fieldLayer-ResetReading(); std::string filterSQL fieldNameAttributeStr fieldNameStr ;//查找当前斗渠所属的田块名获取田块的面积 fieldLayer-SetAttributeFilter(filterSQL.c_str()); if (fieldLayer-GetFeatureCount(true) 0) { OGRGeometry* fieldGeometry fieldLayer-GetNextFeature()-GetGeometryRef(); OGRPoint poPoint; fieldGeometry-Centroid(poPoint); ostringstream oss; oss std::fixed std::setprecision(2) poPoint.getX(); centerXNode.put_value(oss.str()); oss.str(); oss std::fixed std::setprecision(2) poPoint.getY(); centerYNode.put_value(oss.str()); fieldCenterNode.push_back(std::make_pair(, centerXNode)); fieldCenterNode.push_back(std::make_pair(, centerYNode)); // 转换为 OGRPolygon OGRSurface* polygon dynamic_castOGRSurface*(fieldGeometry); if (polygon ! nullptr) { double area polygon-get_GeodesicArea(); oss.str(); oss std::fixed std::setprecision(2) area; fieldInfoNode.put(fieldArea, oss.str()); if (area 0) { //std::cout Polygon area: area std::endl; storageAreaMap.insert(std::pairstring, double(fieldNameStr, area)); } else { std::cerr Failed to calculate area std::endl; } } } fieldInfoNode.add_child(fieldCenterPoint, fieldCenterNode); OGRGeometry* douquGeometry douquFeature-GetGeometryRef(); OGRCurve* douquCurve douquGeometry-toCurve(); OGRSimpleCurve* douquSimpleCurve dynamic_castOGRSimpleCurve*(douquCurve); douquSimpleCurve-getPoint(0, startPt); douquSimpleCurve-getPoint(douquSimpleCurve-getNumPoints() - 1, endPt); endPtCoordinateVec.push_back(endPt.getX()); endPtCoordinateVec.push_back(endPt.getY()); storageCoordinateMap.insert(std::pair string, vectordouble(fieldNameStr, endPtCoordinateVec)); double zValue image.valueAt(endPt.getY(), endPt.getX()); storageElevationMap.insert(std::pairstring, double(fieldNameStr, zValue)); fieldParentNode.push_back(std::make_pair(, fieldInfoNode)); } root.add_child(fieldInfo, fieldParentNode); GDALClose(riverNetDS); GDALClose(fieldDS);生成的调蓄池数据如下调蓄池的容积应足够大[StorageNode] id field1 name field1 nodeType unspecified branchId branches160 chainage 43.83079 useTable 1 storageType reservoir numLevels 10 levels 99.25800 99.35800 99.45800 99.55800 99.65800 99.75800 99.85800 99.95800 100.05800 100.15800 storageArea 187320.41986 187320.41986 187320.41986 187320.41986 187320.41986 187320.41986 187320.41986 187320.41986 187320.41986 187320.41986 interpolate block [StorageNode] id field10 name field10 nodeType unspecified branchId branches177 chainage 104.48693 useTable 1 storageType reservoir numLevels 10 levels 103.93900 104.03900 104.13900 104.23900 104.33900 104.43900 104.53900 104.63900 104.73900 104.83900 storageArea 279413.19924 279413.19924 279413.19924 279413.19924 279413.19924 279413.19924 279413.19924 279413.19924 279413.19924 279413.19924 interpolate block水流进调蓄池即认为流入田块。可粗略的用调蓄池的水量与田块作物的生长需水量的比值评价灌溉的效率。作物在不同生长期的需水量和灌溉定额由下式计算得到。作物需水量釆用联合国粮农组织FAO推荐的Penman-Montieth公式计算计算灌溉定额计算模型计算所需的水力拓扑数据见下图所示图7 水力拓朴数据4.边界条件对灌区水动力模型灌溉和排水两种情景应用两种不同的出口边界条件。对渠道末端有节制闸的情况对灌溉的情景认为此节点的流量为0为完全封闭状态对排水情景应该设置为自由出流条件如果有强排泵站应该设置为强排流量。对入流边界条件在灌溉情景下可以为引水流量过程对排水情景下可以为上游集水区的产汇流计算结果。5.计算结果通过与服务器建立websocket连接将相应的灌排情景下的流量过程时序数据以json字段的形式发送到服务器端请求计算任务并实时的回传计算任务进度计算任务请求报文及实施进度如下图所示。图8 实时计算请求报文图9 计算过程的实时反馈服务器的计算结果数据包括断面的水面高程、流速、流量等数据同时为了方便在webgis中的云图展示将一维结果数据插值到mesh网格为减少网络传输开销并进行了gz压缩。图10 服务器返回报文渠系水网的横断面时序结果查询如下图所示图11 渠系水网的横断面时序结果渠系水网的纵断面时序结果查询如下图所示同时将为了建立水力联系而分开的河流-河段river-reach作为整体按照河段牵引进行再拼接。图12渠系水网的纵断面时序结果灌区渠系水网的水动力预演结果如下视频所示注灌溉效率的计算分子为入田块的水量非作物直接利用的水量渠系河网水动力模型6.结论综上所述灌区渠系水网优化调度技术研究是破解当前农业灌溉水资源困境的关键路径。从理论模型构建到实际算法应用从数据处理到实时控制每一个环节的深入探索都为实现节水增产、推动农业可持续发展奠定了坚实基础。未来随着技术的不断进步与实践经验的持续积累灌区输配水调度系统必将更加智能、高效为农业生产注入新的活力助力农业经济迈向更高质量的发展阶段。