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