0001 function RecData = mrg_read_dfs0(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 NET.addAssembly('DHI.Generic.MikeZero.DFS');
0049 import DHI.Generic.MikeZero.DFS.*;
0050 import DHI.Generic.MikeZero.DFS.dfs0.*;
0051
0052
0053 if isempty(varargin)
0054 [fname,path] = uigetfile('*.dfs0','Select the .dfs0');
0055 name = [path,fname];
0056 elseif (~exist(char(varargin),'file'))
0057 warning([mfilename, ':filenotfound'], 'The file you supplied was not found.')
0058 [fname,path] = uigetfile('*.dfs0','Select the .dfs0');
0059 name = [path,fname];
0060 else
0061 name = char(varargin);
0062 end
0063
0064 dfs0File = DfsFileFactory.DfsGenericOpen(name);
0065
0066
0067
0068 dd = single(Dfs0Util.ReadDfs0DataDouble(dfs0File));
0069 t = dd(:,1);
0070 data = dd(:,2:end);
0071
0072
0073 try
0074 start_date_vec = [dfs0File.FileInfo.TimeAxis.StartDateTime.Year, ...
0075 dfs0File.FileInfo.TimeAxis.StartDateTime.Month, ...
0076 dfs0File.FileInfo.TimeAxis.StartDateTime.Day, ...
0077 dfs0File.FileInfo.TimeAxis.StartDateTime.Hour, ...
0078 dfs0File.FileInfo.TimeAxis.StartDateTime.Minute, ...
0079 dfs0File.FileInfo.TimeAxis.StartDateTime.Second];
0080 catch err
0081 disp(err.message);
0082 warning([mfilename, ':startdatefail'], 'Start date could not be determined from the DFS0 file. Using 0000-00-00 00:00:00.')
0083 start_date_vec = [0,0,0,0,0,0];
0084 end
0085
0086 start_date_num = datenum(double(start_date_vec));
0087
0088
0089 items = cell(dfs0File.ItemInfo.Count, 3);
0090 for i = 0:dfs0File.ItemInfo.Count-1
0091 item = dfs0File.ItemInfo.Item(i);
0092 items{i+1,1} = char(item.Name);
0093 items{i+1,2} = char(item.Quantity.Unit);
0094 items{i+1,3} = char(item.Quantity.UnitAbbreviation);
0095 end
0096
0097
0098 RecData = struct();
0099
0100 RecData.dData = data;
0101
0102
0103 RecData.dTime = NaN(1,4);
0104 RecData.dTime(1) = dfs0File.FileInfo.TimeAxis.NumberOfTimeSteps;
0105 try
0106 RecData.dTime(2) = dfs0File.FileInfo.TimeAxis.TimeStep;
0107 catch err
0108 disp(err.message);
0109 warning([mfilename, ':timestepfail'], 'Timestep length could not be determined from the DFS0 file. Using NaN.')
0110 RecData.dTime(2) = NaN;
0111 end
0112 RecData.dTime(3) = RecData.dTime(2)/(60*60*24);
0113 RecData.dTime(4) = start_date_num;
0114 nameinfo = regexp(char(dfs0File.FileInfo.FileName),'\\','split');
0115 RecData.name = char(nameinfo(end));
0116 RecData.title = char(dfs0File.FileInfo.FileTitle);
0117 RecData.DeleteFloat = single(dfs0File.FileInfo.DeleteValueFloat);
0118
0119
0120
0121
0122 RecData.NumberOfTimeSteps = dfs0File.FileInfo.TimeAxis.NumberOfTimeSteps;
0123 RecData.TimeStepSec = RecData.dTime(2);
0124 RecData.TimeStepHour = RecData.dTime(2)/(60*60);
0125 RecData.TimeStepMat = RecData.dTime(2)/(60*60*24);
0126 RecData.StartDateNum = start_date_num;
0127 RecData.StartDateVec = start_date_vec;
0128 RecData.Fullname = char(dfs0File.FileInfo.FileName);
0129 RecData.TimeAxisType = char(dfs0File.FileInfo.TimeAxis.TimeAxisType);
0130
0131
0132
0133 if ~isempty(strfind(RecData.TimeAxisType, 'NonEquidistant'))
0134 if strcmp(char(dfs0File.FileInfo.TimeAxis.TimeUnit), 'eumUsec')
0135 tmat = double(t)/60/60/24;
0136 RecData.TimeAxis = RecData.StartDateNum+tmat;
0137 else
0138 warning([mfilename, ':timeaxisbuildfail'], 'Tried to build a time axis for NonEquidistant, but failed becuase the timestep is not "eumUsec".')
0139 end
0140 end
0141
0142
0143
0144 RecData.items = items;
0145
0146 dfs0File.Close();
0147
0148