当前位置: 首页 > news >正文

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’)

相关文章:

  • yolov11安装,训练模型,tensorrtx加速,Qt预测图像
  • mac触摸板设置右键
  • python pyecharts 数据分析及可视化(2)
  • 八股文——JAVA基础:hashCode()方法的作用与意义以及与equals方法的联动
  • 通过阿里云部署n8n工作流自动备份GitHub
  • Gartner《Everything Technical Professionals Need to KnowAbout DA Strategy》学习心得
  • RuoYi-Vue学习环境搭建
  • docker compose基本使用以及示例
  • 云端可视化耦合电磁场:麦克斯韦方程组的应用-AI云计算数值分析和代码验证
  • 学习使用Visual Studio分析.net内存转储文件的基本用法
  • MybatisPlus-03.快速入门-常用注解
  • 横向移动01
  • leetcode437-路径总和III
  • FLOPS、FLOP/s、TOPS概念
  • 手机流量监控App(GlassWire)使用指南
  • 自学嵌入式 day27 进程
  • Java 大视界 -- 基于 Java 的大数据分布式存储在科研大数据归档与长期保存中的应用(328)
  • Web应用开发 --- Tips
  • Tomcat服务概述
  • C++基础(FreeRDP编译)