大家好!第5期,和大家一起交流一下如何从FVCOM网格提取边界信息。 三角形网格是FVCOM最特别的地方,构建三角形网格也是我们使用FVCOM最开始需要做的工作。一般的,通过SMS软件构建三角形网格,我们会得到一个2dm文件,里面会包含每个网格点的坐标以及nv矩阵。nv矩阵是一个二维矩阵(nele*2,nele为三角形个数),里面包含了每个三角元三个顶点的网格点id。如果不考虑开边界信息,有这三个数据,我们就可以绘制完整的三角形网格。 然而,针对某些问题,我们需要对这三个变量进行处理,提取网格的边界信息。比如,涉及从FVCOM区域向更大区域(比如WRF模拟区域)插值时,我们希望只让落在FVCOM区域内的网格点进行插值,而区域外的网格点保持原值。这时,我们就需要使用网格的边界信息,区分FVCOM区域内和区域外的点,进行不同的计算。 为找出FVCOM网格的边界,lon,lat(或x,y)和nv三个变量就足够解决以上问题了。大体的思路是,将nv转换成nele*3条线段,其中,FVCOM的边界线段,只出现了一次;而区域内部线段出现了两次。 通过这个区分边界线段和内部线段的条件,我们还可以优化网格画图程序。一般的,在画FVCOM三角形网格图时,我们会写循环,把每个三角形的三条边都画一遍。然而,在这个过程中,内部线段都被画了两遍,由于内部线段的个数往往远大于边界线段,这种方法使得画图时间慢了大约1倍。所以,我们可以使用这个判断条件,让每条线段只画一遍。 下面以NECOFS(The Northeast Coastal Ocean Forecast System)的网格为例,展示一下通过这种方法得到的结果。下图中,黑线表示NECOFS的GOM(Gulf of Maine)网格边界。随机生成该经纬度范围内的2000个点,根据边界信息,我们可以判断出GOM区域内的点(红色)和区域外的点(蓝色)。
另外,我们看到,在模型区域内部,有几处岛屿,它们的轮廓线也应是边界。下图为放大长岛后的效果。可以看到,有两个随机点落在了长岛上,这两个点被大边界和长岛边界双重包围,它们的颜色依然是蓝色,即区域外。实现这一结果的方法是,将区域大边界的网格点按顺时针顺序排列,而内部的岛屿边界按相反的逆时针顺序排列,再使用MATLAB中的inpolygon命令进行判断即可。
感兴趣的朋友可以下载我的程序试一下。我把程序放在了腾讯微云上: https://share.weiyun.com/ee26c04e23e2f12dd27f69556f3a3313 NECOFS的网格信息请从NECOFS网站下载: http://www.smast.umassd.edu:8080/thredds/catalog/models/fvcom/NECOFS/Archive/Seaplan_33_Hindcast_v1/catalog.html |