本人专注于运用Mike软件开展数值模拟相关研究工作。历经过去数月的努力,终于取得了研究成果。
近期,导师安排了一项任务,即需要将Mike软件生成的结果文件,具体来说就是DFSU文件中的数据,转换为NetCDF文件。
值得一提的是,此前在处理nc文件时,例如风场数据等,我们曾借助matlab软件,将nc格式文件成功转化为dfs文件。
基于此经验,我便思考是否能够反向操作,将dfsu文件转换回nc文件。
最终,通过运用Matlab软件,该项转换任务得以顺利完成。
现将相关具体内容罗列如下,旨在为大家提供参考与借鉴。
% 功能:读取MIKE模型的.dfsu文件,提取水流速度(u、v),转换为NetCDF格式,
% 并插值到规则经纬网格,生成可通用的NetCDF文件
% 解决问题:修复了m_map依赖、NetCDF格式冲突、变量重复创建等错误
%% 1. 初始化与环境配置
clear all; clc;
% 加载MIKE的DFS库(用于读取.dfsu文件)
NET.addAssembly('DHI.Generic.MikeZero.DFS');
import DHI.Generic.MikeZero.DFS.*;
% 配置参数
hr = 0.01; % 规则网格精度(单位:度,约1.11km)
starttime = datetime(2024,6,5,22,40,0); % 模型起始时间(需与dfsu文件匹配)
infile = '1014 - 2024MT.dfsu'; % 输入dfsu文件路径
%% 2. 读取dfsu文件与网格信息
% 若文件不存在,手动选择
if ~exist(infile, 'file')
[filename, filepath] = uigetfile('*.dfsu', '选择.dfsu文件');
infile = fullfile(filepath, filename); % 用fullfile避免路径拼接错误
end
% 打开dfsu文件
dfsu2 = DfsFileFactory.DfsuFileOpen(infile);
% 读取节点坐标(非结构化网格的顶点)
xn = double(dfsu2.X); % x坐标(投影坐标,如UTM)
yn = double(dfsu2.Y); % y坐标(投影坐标)
zn = double(dfsu2.Z); % z坐标(高程)
% 转换元素表为MATLAB格式,计算元素中心坐标(每个网格单元的中心)
tn = mzNetFromElmtArray(dfsu2.ElementTable); % 元素-节点索引表
[xe, ye, ze] = mzCalcElmtCenterCoords(tn, xn, yn, zn); % 元素中心坐标
%% 3. 坐标转换(投影坐标→经纬度)
% 方法1:使用m_map工具箱(需提前安装并添加路径)
% 若未安装m_map,注释此部分,使用方法2
m_proj('UTM', 'zone', 51); % 配置UTM投影(51N带,WGS84)
[lon_e, lat_e] = m_xy2ll(double(xe(:)), double(ye(:))); % 转换为经纬度
lon_e = reshape(lon_e, size(xe)); % 恢复与元素中心匹配的维度
lat_e = reshape(lat_e, size(ye));
% % 方法2:使用MATLAB自带的utm2degrees(R2020b及以上版本)
% % 若使用此方法,需注释方法1的3行代码
% [lat_e_vec, lon_e_vec] = utm2degrees(double(ye(:)), double(xe(:)), 51, 1); % UTM→经纬度
% lon_e = reshape(lon_e_vec, size(xe));
% lat_e = reshape(lat_e_vec, size(ye));
%% 4. 提取变量与时间信息
% 提取dfsu中的变量信息(名称、单位等)
items = {
};
for i = 0:dfsu2.ItemInfo.Count-1
item = dfsu2.ItemInfo.Item(i);
items{
i+1, 1} = char(item.Name); % 变量名称
items{
i+1, 2} = char(item.Quantity.Unit); % 单位全称
items{
i+1, 3} = char(item.Quantity.UnitAbbreviation); % 单位缩写
end
disp('dfsu文件中的变量列表:'); disp(items); % 显示变量,确认u、v的索引
% 提取时间信息
nsteps = dfsu2.NumberOfTimeSteps; % 时间步数
nstep = dfsu2.TimeStepInSeconds; % 时间步长(秒)
t_dt = starttime + seconds((

最低0.47元/天 解锁文章
3856

被折叠的 条评论
为什么被折叠?



