fvcom 网格文件grd制作
==fvcom 网格文件grd制作====持续更新====20250629===
本次案例网格和水深展示
image
Figure 1 Model domain
本次制作其它驱动文件的输入文件为yellowsea.2dm
格式2dm; 文件内容格式详细介绍参考:
https://www.xmswiki.com/wiki/SMS:2D_Mesh_Files_*.2dm
制作方法可以参考往期教学:
matlab读取shp文件做SMS的输入文件cst【FVCOM,SCHISM】
【教程制作】从google map提取作为SMS可使用的cst格式的岸线
【matlab教程】matlab画fvcom网格sms网格==仅是展示作用;
模式打网格不只SMS
模式网格制作:SMS===这里最后一步选择保存为2dm格式. 而不是grd格式
【再次感谢烟台海岸带所的学者来稿】制作FVCOM边界潮汐高程的输入文件
上节我们跑通了河流案例=====
我们可以打开看里面文件的格式:
tst_grd.dat:
图片
图片
格式很简单:
先两行网格点数目和三角形数目
后续就是跟上三角形坐标以及网格点坐标
因此,写了一个matlab/python代码用于读取yellowsea.2dm然后输出为yellowsea_grd.dat
好几种做法:
第一个直接调用fvcom 函数包:
PyFVCOM
pip install PyFVCOM
引用:Cazenave, P. W. et al. (2018). PyFVCOM (version x.x.x) [software]. Plymouth, Devon, United Kingdom: Plymouth Marine Laboratory. https://doi.org/10.5281/zenodo.1422462
运行如下命令:
from datetime import datetime
import PyFVCOM as pf
import multiprocessing
def main():
Define a start, end and sampling interval for the tidal data
start = datetime.strptime(‘2016-01-01’, ‘%Y-%m-%d’)
end = datetime.strptime(‘2016-12-31’, ‘%Y-%m-%d’)
interval = 1 / 24 # 1 hourly in units of days
model = pf.preproc.Model(start, end, ‘yellowsea.2dm’, sampling=interval,
native_coordinates=‘spherical’, zone=50)
Write out the files for FVCOM.
model.write_grid(‘yellowsea_grd.dat’, depth_file=‘yellowsea_dep.dat’)
if name == ‘main’:
multiprocessing.freeze_support() # Windows上防止多进程问题
main()
图片
即可得到!
但这里的grd文件有一处不一样:
对于三角形,他的最后一列是和第一列一样了序号增长:
对于node点,最后一列你存储了水深也没改为0;应该不耽误跑。但
图片
图片
为此,可以自己写一个,直接读取python_2dm_write_grd.py符合格式的:python 和matlab 双版本的,目的格式和示例格式一致!两种都跑通!经过测试。但最终需要经过fvcom运行测试!
图片
图片
第三列为1;
水深最后一列为0;
图片
图片
python (python_2dm_write_grd.py)
python_2dm_write_grd.py==
def read_2dm_file(filename):
elements = []
nodes = []
with open(filename, ‘r’) as file:
for line in file:
if line.startswith(“E3T”):# 读取三角形
parts = line.strip().split()
E3T id n1 n2 n3 material
elements.append([int(parts[1]), int(parts[2]), int(parts[3]), int(parts[4]), int(parts[5])])
elif line.startswith(“ND”):# 读取node点
parts = line.strip().split()
ND id x y z
nodes.append([int(parts[1]), float(parts[2]), float(parts[3]), float(parts[4])])
return elements, nodes
def write_grd_file(output_filename, elements, nodes):
with open(output_filename, ‘w’) as f:# 写到grd文件
f.write(f"Node Number = {len(nodes)}\n")
f.write(f"Cell Number = {len(elements)}\n")
写入每个单元(单元编号、节点编号1、2、3、材质)
for elem in elements:
f.write(f"{elem[0]:6d} {elem[1]:6d} {elem[2]:6d} {elem[3]:6d} {elem[4]:6d}\n")
写入每个节点(节点编号、x、y、z)
for node in nodes:
设置最后一列为 0.0(你要求 ND 的 z 统一为 0)
f.write(f"{node[0]:6d} {node[1]:.8e} {node[2]:.8e} 0.00000000e+00\n")
def main():
input_2dm = “yellowsea.2dm”
output_grd = “yellowsea_grd_myself.dat”
elements, nodes = read_2dm_file(input_2dm)
按照元素编号和节点编号排序(可选)
elements.sort(key=lambda x: x[0])
nodes.sort(key=lambda x: x[0])
write_grd_file(output_grd, elements, nodes)
print(f"Successfully converted {input_2dm} to {output_grd}")
if name == “main”:
main()
海洋与大气科学
==convert_2dm_to_grd_main.m
clear;clc;close all;
% use function ===
% 海洋与大气科学: 20250629
convert_2dm_to_grd(‘yellowsea.2dm’, ‘yellowsea_grd.dat’)