source: issm/branches/trunk-larour-NatGeoScience2016/src/m/solve/WriteData.m@ 21243

Last change on this file since 21243 was 21144, checked in by Mathieu Morlighem, 9 years ago

CHG: no more ENums

File size: 6.7 KB
Line 
1function WriteData(fid,prefix,varargin)
2%WRITEDATA - write model field in binary file
3%
4% Usage:
5% WriteData(fid,varargin);
6
7%process options
8options=pairoptions(varargin{:});
9
10%Get data properties
11if exist(options,'object');
12 obj = getfieldvalue(options,'object');
13 fieldname = getfieldvalue(options,'fieldname');
14 classname = getfieldvalue(options,'class',class(obj));
15 name = getfieldvalue(options,'name',[prefix '.' fieldname ]);
16 if exist(options,'data'),
17 data = getfieldvalue(options,'data');
18 else
19 data = obj.(fieldname);
20 end
21else
22 data = getfieldvalue(options,'data');
23 name = getfieldvalue(options,'name');
24end
25format = getfieldvalue(options,'format');
26mattype = getfieldvalue(options,'mattype',0); %only required for matrices
27timeserieslength = getfieldvalue(options,'timeserieslength',-1);
28
29%Process sparse matrices
30if issparse(data),
31 data=full(data);
32end
33
34%Scale data if necesarry
35if exist(options,'scale'),
36 scale = getfieldvalue(options,'scale');
37 if size(data,1)==timeserieslength,
38 data(1:end-1,:) = scale.*data(1:end-1,:);
39 else
40 data = scale.*data;
41 end
42end
43if(size(data,1)==timeserieslength),
44 yts = getfieldvalue(options,'yts');
45 data(end,:) = data(end,:)*yts;
46end
47
48%Step 1: write the name to identify this record uniquely
49fwrite(fid,numel(name),'int');
50fwrite(fid,name,'char');
51
52%Step 2: write the data itself.
53if strcmpi(format,'Boolean'),% {{{
54 if(numel(data)~=1), error(['field ' name ' cannot be marshalled as it has more than one element!']); end
55
56 %first write length of record
57 fwrite(fid,4+4,'int'); %1 bool (disguised as an int)+code
58
59 %write data code:
60 fwrite(fid,FormatToCode(format),'int');
61
62 %now write integer
63 fwrite(fid,data,'int'); %send an int, not easy to send a bool
64 % }}}
65elseif strcmpi(format,'Integer'), % {{{
66 if(numel(data)~=1), error(['field ' name ' cannot be marshalled as it has more than one element!']); end
67
68 %first write length of record
69 fwrite(fid,4+4,'int'); %1 integer + code
70
71 %write data code:
72 fwrite(fid,FormatToCode(format),'int');
73
74 %now write integer
75 fwrite(fid,data,'int');
76 % }}}
77elseif strcmpi(format,'Double'), % {{{
78 if(numel(data)~=1), error(['field ' name ' cannot be marshalled as it has more than one element!']); end
79
80 %first write length of record
81 fwrite(fid,8+4,'int'); %1 double+code
82
83 %write data code:
84 fwrite(fid,FormatToCode(format),'int');
85
86 %now write double
87 fwrite(fid,data,'double');
88 % }}}
89elseif strcmpi(format,'String'), % {{{
90 %first write length of record
91 fwrite(fid,length(data)+4+4,'int'); %string + string size + code
92
93 %write data code:
94 fwrite(fid,FormatToCode(format),'int');
95
96 %now write string
97 fwrite(fid,length(data),'int');
98 fwrite(fid,data,'char');
99 % }}}
100elseif strcmpi(format,'BooleanMat'), % {{{
101
102 %Get size
103 s=size(data);
104 %if matrix = NaN, then do not write anything
105 if (s(1)==1 & s(2)==1 & isnan(data)),
106 s(1)=0; s(2)=0;
107 end
108
109 %first write length of record
110 fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int'); %2 integers (32 bits) + the double matrix + code + matrix type
111
112 %write data code and matrix type:
113 fwrite(fid,FormatToCode(format),'int');
114 fwrite(fid,mattype,'int');
115
116 %now write matrix
117 fwrite(fid,s(1),'int');
118 fwrite(fid,s(2),'int');
119 if s(1)*s(2),
120 fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
121 end
122 % }}}
123elseif strcmpi(format,'IntMat'), % {{{
124
125 %Get size
126 s=size(data);
127 %if matrix = NaN, then do not write anything
128 if (s(1)==1 & s(2)==1 & isnan(data)),
129 s(1)=0; s(2)=0;
130 end
131
132 %first write length of record
133 fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int'); %2 integers (32 bits) + the double matrix + code + matrix type
134
135 %write data code and matrix type:
136 fwrite(fid,FormatToCode(format),'int');
137 fwrite(fid,mattype,'int');
138
139 %now write matrix
140 fwrite(fid,s(1),'int');
141 fwrite(fid,s(2),'int');
142 if s(1)*s(2),
143 fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
144 end
145 % }}}
146elseif strcmpi(format,'DoubleMat'), % {{{
147
148 %Get size
149 s=size(data);
150 %if matrix = NaN, then do not write anything
151 if (s(1)==1 & s(2)==1 & isnan(data)),
152 s(1)=0; s(2)=0;
153 end
154
155 %first write length of record
156 recordlength=4+4+8*s(1)*s(2)+4+4; %2 integers (32 bits) + the double matrix + code + matrix type
157 if recordlength>2^31; error(['field ' name ' cannot be marshalled because it is larger than 2^31 bytes!']); end
158 fwrite(fid,recordlength,'int');
159
160 %write data code and matrix type:
161 fwrite(fid,FormatToCode(format),'int');
162 fwrite(fid,mattype,'int');
163
164 %now write matrix
165 fwrite(fid,s(1),'int');
166 fwrite(fid,s(2),'int');
167 if s(1)*s(2),
168 fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
169 end
170 % }}}
171elseif strcmpi(format,'MatArray'), % {{{
172
173 numrecords=numel(data);
174
175 %first get length of record
176 recordlength=4+4; %number of records + code
177 for i=1:numrecords,
178 matrix=data{i};
179 s=size(matrix);
180 recordlength=recordlength+4*2+... %row and col of matrix
181 s(1)*s(2)*8; %matrix of doubles
182 end
183
184 %write length of record
185 fwrite(fid,recordlength,'int');
186
187 %write data code:
188 fwrite(fid,FormatToCode(format),'int');
189
190 %write data, first number of records
191 fwrite(fid,numrecords,'int');
192
193 %write each matrix:
194 for i=1:numrecords,
195 matrix=data{i};
196 s=size(matrix);
197 fwrite(fid,s(1),'int');
198 fwrite(fid,s(2),'int');
199 fwrite(fid,matrix','double');
200 end
201 % }}}
202elseif strcmpi(format,'StringArray'), % {{{
203
204 %first get length of string array:
205 num=numel(data);
206 if isnumeric(data) & num==1 & isnan(data),
207 num = 0;
208 end
209
210 %now get length of record:
211 recordlength=4+4; %for length of array + code
212 for i=1:num,
213 string=data{i};
214 recordlength=recordlength+4+length(string); %for each string
215 end
216
217 %write length of record
218 fwrite(fid,recordlength,'int');
219
220 %write data code:
221 fwrite(fid,FormatToCode(format),'int');
222
223 %now write length of string array
224 fwrite(fid,num,'int');
225
226 %now write the strings
227 for i=1:num,
228 string=data{i};
229 fwrite(fid,length(string),'int');
230 fwrite(fid,string,'char');
231 end
232 % }}}
233else % {{{
234 error(['WriteData error message: data type: ' num2str(format) ' not supported yet! (' name ')']);
235end % }}}
236end
237
238function code=FormatToCode(format) % {{{
239%This routine takes the format string, and hardcodes it into an integer, which
240%is passed along the record, in order to identify the nature of the dataset being
241%sent.
242 if strcmpi(format,'Boolean'),
243 code=1;
244 elseif strcmpi(format,'Integer'),
245 code=2;
246 elseif strcmpi(format,'Double'),
247 code=3;
248 elseif strcmpi(format,'String'),
249 code=4;
250 elseif strcmpi(format,'BooleanMat'),
251 code=5;
252 elseif strcmpi(format,'IntMat'),
253 code=6;
254 elseif strcmpi(format,'DoubleMat'),
255 code=7;
256 elseif strcmpi(format,'MatArray'),
257 code=8;
258 elseif strcmpi(format,'StringArray'),
259 code=9;
260 else
261 error('FormatToCode error message: data type not supported yet!');
262 end
263end% }}}
Note: See TracBrowser for help on using the repository browser.